From 9f18b065762328288600c33a43992208ee6d8bcb Mon Sep 17 00:00:00 2001 From: Sven Verdoolaege Date: Tue, 21 Jun 2011 17:40:50 +0200 Subject: [PATCH] initial version of ppcg This code was previously released in the cuda branch of the Pluto repository but is now being rereleased under the LGPL license. Signed-off-by: Sven Verdoolaege --- .gitignore | 22 + .gitmodules | 6 + LICENSE | 458 ++ Makefile.am | 52 + autogen.sh | 9 + clan/AUTHORS | 11 + clan/COPYING.LESSER | 165 + clan/ChangeLog | 727 +++ clan/Makefile.am | 80 + clan/NEWS | 2 + clan/README | 40 + clan/THANKS | 11 + clan/autoconf/depcomp | 589 ++ clan/autoconf/missing | 367 ++ clan/autoconf/texinfo.tex | 8962 ++++++++++++++++++++++++++++ clan/autoconf/ylwrap | 223 + clan/configure.in | 175 + clan/doc/Doxyfile.in | 1295 ++++ clan/doc/Makefile.am | 92 + clan/doc/S4.cloog | 44 + clan/doc/ascii-art.txt | 25 + clan/doc/clan.info | 2130 +++++++ clan/doc/clan.pdf | Bin 0 -> 270279 bytes clan/doc/clan.texi | 2429 ++++++++ clan/doc/htmldoc.tar.gz | Bin 0 -> 241395 bytes clan/doc/images/basic.eps | 402 ++ clan/doc/images/basic.fig | 100 + clan/doc/images/basic.jpg | Bin 0 -> 21180 bytes clan/doc/images/basic.pdf | Bin 0 -> 40073 bytes clan/doc/images/basic.txt | 13 + clan/doc/images/basic1.eps | 332 ++ clan/doc/images/basic1.fig | 86 + clan/doc/images/basic1.jpg | Bin 0 -> 18353 bytes clan/doc/images/basic1.pdf | Bin 0 -> 7051 bytes clan/doc/images/basic1.txt | 12 + clan/doc/images/basic2.eps | 256 + clan/doc/images/basic2.fig | 62 + clan/doc/images/basic2.jpg | Bin 0 -> 12369 bytes clan/doc/images/basic2.pdf | Bin 0 -> 6240 bytes clan/doc/images/basic2.txt | 10 + clan/doc/images/tree.eps | 258 + clan/doc/images/tree.fig | 54 + clan/doc/images/tree.jpg | Bin 0 -> 13713 bytes clan/doc/images/tree.pdf | Bin 0 -> 4558 bytes clan/doc/images/tree.txt | 25 + clan/include/Makefile.am | 59 + clan/include/clan/clan.h | 58 + clan/include/clan/clan.h.in | 58 + clan/include/clan/macros.h | 49 + clan/include/clan/matrix.h | 64 + clan/include/clan/options.h | 99 + clan/include/clan/scop.h | 64 + clan/include/clan/statement.h | 62 + clan/include/clan/symbol.h | 95 + clan/include/clan/vector.h | 68 + clan/scoplib/scoplib-0.2.0.tar.gz | Bin 0 -> 942376 bytes clan/source/Makefile.am | 82 + clan/source/clan.c | 80 + clan/source/matrix.c | 166 + clan/source/options.c | 362 ++ clan/source/parser.c | 2945 +++++++++ clan/source/parser.h | 173 + clan/source/parser.y | 1305 ++++ clan/source/scanner.c | 2269 +++++++ clan/source/scanner.l | 190 + clan/source/scop.c | 186 + clan/source/statement.c | 80 + clan/source/symbol.c | 483 ++ clan/source/vector.c | 83 + clan/tests/Makefile.am | 131 + clan/tests/ax-do.c | 21 + clan/tests/ax-do.c.scop | 129 + clan/tests/check_complex.sh | 40 + clan/tests/check_unitary.sh | 40 + clan/tests/checker.sh | 85 + clan/tests/gauss.c | 21 + clan/tests/gauss.c.scop | 180 + clan/tests/gemver.c | 28 + clan/tests/gemver.c.scop | 230 + clan/tests/iir_4_64.c | 83 + clan/tests/iir_4_64.c.scop | 371 ++ clan/tests/matmul.c | 40 + clan/tests/matmul.c.scop | 141 + clan/tests/swim.c | 153 + clan/tests/swim.c.scop | 2582 ++++++++ clan/tests/unitary/assigniter.c | 5 + clan/tests/unitary/assigniter.c.scop | 88 + clan/tests/unitary/assigniter2.c | 5 + clan/tests/unitary/assigniter2.c.scop | 89 + clan/tests/unitary/basicnest.c | 7 + clan/tests/unitary/basicnest.c.scop | 124 + clan/tests/unitary/binop.c | 5 + clan/tests/unitary/binop.c.scop | 154 + clan/tests/unitary/classicloop.c | 4 + clan/tests/unitary/classicloop.c.scop | 84 + clan/tests/unitary/comments.c | 7 + clan/tests/unitary/comments.c.scop | 84 + clan/tests/unitary/complexcond.c | 14 + clan/tests/unitary/complexcond.c.scop | 196 + clan/tests/unitary/complexop.c | 3 + clan/tests/unitary/complexop.c.scop | 89 + clan/tests/unitary/complexprog.c | 10 + clan/tests/unitary/complexprog.c.scop | 164 + clan/tests/unitary/empty.c | 2 + clan/tests/unitary/empty.c.scop | 46 + clan/tests/unitary/field.c | 6 + clan/tests/unitary/field.c.scop | 122 + clan/tests/unitary/float.c | 6 + clan/tests/unitary/float.c.scop | 186 + clan/tests/unitary/functioncall.c | 4 + clan/tests/unitary/functioncall.c.scop | 86 + clan/tests/unitary/functioncall2.c | 4 + clan/tests/unitary/functioncall2.c.scop | 88 + clan/tests/unitary/increment.c | 4 + clan/tests/unitary/increment.c.scop | 84 + clan/tests/unitary/intaddit.c | 7 + clan/tests/unitary/intaddit.c.scop | 96 + clan/tests/unitary/maxloopcomplex.c | 4 + clan/tests/unitary/maxloopcomplex.c.scop | 87 + clan/tests/unitary/maxloopsimple.c | 4 + clan/tests/unitary/maxloopsimple.c.scop | 85 + clan/tests/unitary/minloopcomplex.c | 4 + clan/tests/unitary/minloopcomplex.c.scop | 88 + clan/tests/unitary/minloopsimple.c | 4 + clan/tests/unitary/minloopsimple.c.scop | 85 + clan/tests/unitary/minmax.c | 5 + clan/tests/unitary/minmax.c.scop | 93 + clan/tests/unitary/multiparenthcond.c | 4 + clan/tests/unitary/multiparenthcond.c.scop | 84 + clan/tests/unitary/negassign.c | 6 + clan/tests/unitary/negassign.c.scop | 86 + clan/tests/unitary/nestedcurly.c | 13 + clan/tests/unitary/nestedcurly.c.scop | 89 + clan/tests/unitary/noloop.c | 3 + clan/tests/unitary/noloop.c.scop | 81 + clan/tests/unitary/noloop2.c | 4 + clan/tests/unitary/noloop2.c.scop | 116 + clan/tests/unitary/object.c | 9 + clan/tests/unitary/object.c.scop | 157 + clan/tests/unitary/parenthesis.c | 4 + clan/tests/unitary/parenthesis.c.scop | 86 + clan/tests/unitary/redefiter.c | 9 + clan/tests/unitary/redefiter.c.scop | 132 + clan/tests/unitary/simplecond.c | 5 + clan/tests/unitary/simplecond.c.scop | 85 + clan/tests/unitary/simpleloop.c | 4 + clan/tests/unitary/simpleloop.c.scop | 84 + clan/tests/unitary/ternary.c | 3 + clan/tests/unitary/ternary.c.scop | 88 + clan/tests/unitary/twocondincond.c | 8 + clan/tests/unitary/twocondincond.c.scop | 157 + clan/tests/unitary/twoconds.c | 6 + clan/tests/unitary/twoconds.c.scop | 120 + clan/tests/unitary/underscore.c | 6 + clan/tests/unitary/underscore.c.scop | 102 + cloog | 1 + configure.ac | 96 + cuda.c | 4124 +++++++++++++ cuda.h | 124 + cuda_common.c | 116 + cuda_common.h | 16 + gpucode.c | 291 + gpucode.h | 25 + isl | 1 + m4/ax_submodule.m4 | 83 + ppcg.c | 60 + ppcg_options.c | 23 + ppcg_options.h | 20 + schedule.c | 337 ++ schedule.h | 50 + scoplib_isl.c | 231 + scoplib_isl.h | 22 + 172 files changed, 42382 insertions(+) create mode 100644 .gitignore create mode 100644 .gitmodules create mode 100644 LICENSE create mode 100644 Makefile.am create mode 100755 autogen.sh create mode 100644 clan/AUTHORS create mode 100644 clan/COPYING.LESSER create mode 100644 clan/ChangeLog create mode 100644 clan/Makefile.am create mode 100644 clan/NEWS create mode 100644 clan/README create mode 100644 clan/THANKS create mode 100755 clan/autoconf/depcomp create mode 100755 clan/autoconf/missing create mode 100644 clan/autoconf/texinfo.tex create mode 100755 clan/autoconf/ylwrap create mode 100644 clan/configure.in create mode 100644 clan/doc/Doxyfile.in create mode 100644 clan/doc/Makefile.am create mode 100644 clan/doc/S4.cloog create mode 100644 clan/doc/ascii-art.txt create mode 100644 clan/doc/clan.info create mode 100644 clan/doc/clan.pdf create mode 100644 clan/doc/clan.texi create mode 100644 clan/doc/htmldoc.tar.gz create mode 100644 clan/doc/images/basic.eps create mode 100644 clan/doc/images/basic.fig create mode 100644 clan/doc/images/basic.jpg create mode 100644 clan/doc/images/basic.pdf create mode 100644 clan/doc/images/basic.txt create mode 100644 clan/doc/images/basic1.eps create mode 100644 clan/doc/images/basic1.fig create mode 100644 clan/doc/images/basic1.jpg create mode 100644 clan/doc/images/basic1.pdf create mode 100644 clan/doc/images/basic1.txt create mode 100644 clan/doc/images/basic2.eps create mode 100644 clan/doc/images/basic2.fig create mode 100644 clan/doc/images/basic2.jpg create mode 100644 clan/doc/images/basic2.pdf create mode 100644 clan/doc/images/basic2.txt create mode 100644 clan/doc/images/tree.eps create mode 100644 clan/doc/images/tree.fig create mode 100644 clan/doc/images/tree.jpg create mode 100644 clan/doc/images/tree.pdf create mode 100644 clan/doc/images/tree.txt create mode 100644 clan/include/Makefile.am create mode 100644 clan/include/clan/clan.h create mode 100644 clan/include/clan/clan.h.in create mode 100644 clan/include/clan/macros.h create mode 100644 clan/include/clan/matrix.h create mode 100644 clan/include/clan/options.h create mode 100644 clan/include/clan/scop.h create mode 100644 clan/include/clan/statement.h create mode 100644 clan/include/clan/symbol.h create mode 100644 clan/include/clan/vector.h create mode 100644 clan/scoplib/scoplib-0.2.0.tar.gz create mode 100644 clan/source/Makefile.am create mode 100644 clan/source/clan.c create mode 100644 clan/source/matrix.c create mode 100644 clan/source/options.c create mode 100644 clan/source/parser.c create mode 100644 clan/source/parser.h create mode 100644 clan/source/parser.y create mode 100644 clan/source/scanner.c create mode 100644 clan/source/scanner.l create mode 100644 clan/source/scop.c create mode 100644 clan/source/statement.c create mode 100644 clan/source/symbol.c create mode 100644 clan/source/vector.c create mode 100644 clan/tests/Makefile.am create mode 100644 clan/tests/ax-do.c create mode 100644 clan/tests/ax-do.c.scop create mode 100755 clan/tests/check_complex.sh create mode 100755 clan/tests/check_unitary.sh create mode 100755 clan/tests/checker.sh create mode 100644 clan/tests/gauss.c create mode 100644 clan/tests/gauss.c.scop create mode 100644 clan/tests/gemver.c create mode 100644 clan/tests/gemver.c.scop create mode 100644 clan/tests/iir_4_64.c create mode 100644 clan/tests/iir_4_64.c.scop create mode 100644 clan/tests/matmul.c create mode 100644 clan/tests/matmul.c.scop create mode 100644 clan/tests/swim.c create mode 100644 clan/tests/swim.c.scop create mode 100644 clan/tests/unitary/assigniter.c create mode 100644 clan/tests/unitary/assigniter.c.scop create mode 100644 clan/tests/unitary/assigniter2.c create mode 100644 clan/tests/unitary/assigniter2.c.scop create mode 100644 clan/tests/unitary/basicnest.c create mode 100644 clan/tests/unitary/basicnest.c.scop create mode 100644 clan/tests/unitary/binop.c create mode 100644 clan/tests/unitary/binop.c.scop create mode 100644 clan/tests/unitary/classicloop.c create mode 100644 clan/tests/unitary/classicloop.c.scop create mode 100644 clan/tests/unitary/comments.c create mode 100644 clan/tests/unitary/comments.c.scop create mode 100644 clan/tests/unitary/complexcond.c create mode 100644 clan/tests/unitary/complexcond.c.scop create mode 100644 clan/tests/unitary/complexop.c create mode 100644 clan/tests/unitary/complexop.c.scop create mode 100644 clan/tests/unitary/complexprog.c create mode 100644 clan/tests/unitary/complexprog.c.scop create mode 100644 clan/tests/unitary/empty.c create mode 100644 clan/tests/unitary/empty.c.scop create mode 100644 clan/tests/unitary/field.c create mode 100644 clan/tests/unitary/field.c.scop create mode 100644 clan/tests/unitary/float.c create mode 100644 clan/tests/unitary/float.c.scop create mode 100644 clan/tests/unitary/functioncall.c create mode 100644 clan/tests/unitary/functioncall.c.scop create mode 100644 clan/tests/unitary/functioncall2.c create mode 100644 clan/tests/unitary/functioncall2.c.scop create mode 100644 clan/tests/unitary/increment.c create mode 100644 clan/tests/unitary/increment.c.scop create mode 100644 clan/tests/unitary/intaddit.c create mode 100644 clan/tests/unitary/intaddit.c.scop create mode 100644 clan/tests/unitary/maxloopcomplex.c create mode 100644 clan/tests/unitary/maxloopcomplex.c.scop create mode 100644 clan/tests/unitary/maxloopsimple.c create mode 100644 clan/tests/unitary/maxloopsimple.c.scop create mode 100644 clan/tests/unitary/minloopcomplex.c create mode 100644 clan/tests/unitary/minloopcomplex.c.scop create mode 100644 clan/tests/unitary/minloopsimple.c create mode 100644 clan/tests/unitary/minloopsimple.c.scop create mode 100644 clan/tests/unitary/minmax.c create mode 100644 clan/tests/unitary/minmax.c.scop create mode 100644 clan/tests/unitary/multiparenthcond.c create mode 100644 clan/tests/unitary/multiparenthcond.c.scop create mode 100644 clan/tests/unitary/negassign.c create mode 100644 clan/tests/unitary/negassign.c.scop create mode 100644 clan/tests/unitary/nestedcurly.c create mode 100644 clan/tests/unitary/nestedcurly.c.scop create mode 100644 clan/tests/unitary/noloop.c create mode 100644 clan/tests/unitary/noloop.c.scop create mode 100644 clan/tests/unitary/noloop2.c create mode 100644 clan/tests/unitary/noloop2.c.scop create mode 100644 clan/tests/unitary/object.c create mode 100644 clan/tests/unitary/object.c.scop create mode 100644 clan/tests/unitary/parenthesis.c create mode 100644 clan/tests/unitary/parenthesis.c.scop create mode 100644 clan/tests/unitary/redefiter.c create mode 100644 clan/tests/unitary/redefiter.c.scop create mode 100644 clan/tests/unitary/simplecond.c create mode 100644 clan/tests/unitary/simplecond.c.scop create mode 100644 clan/tests/unitary/simpleloop.c create mode 100644 clan/tests/unitary/simpleloop.c.scop create mode 100644 clan/tests/unitary/ternary.c create mode 100644 clan/tests/unitary/ternary.c.scop create mode 100644 clan/tests/unitary/twocondincond.c create mode 100644 clan/tests/unitary/twocondincond.c.scop create mode 100644 clan/tests/unitary/twoconds.c create mode 100644 clan/tests/unitary/twoconds.c.scop create mode 100644 clan/tests/unitary/underscore.c create mode 100644 clan/tests/unitary/underscore.c.scop create mode 160000 cloog create mode 100644 configure.ac create mode 100644 cuda.c create mode 100644 cuda.h create mode 100644 cuda_common.c create mode 100644 cuda_common.h create mode 100644 gpucode.c create mode 100644 gpucode.h create mode 160000 isl create mode 100644 m4/ax_submodule.m4 create mode 100644 ppcg.c create mode 100644 ppcg_options.c create mode 100644 ppcg_options.h create mode 100644 schedule.c create mode 100644 schedule.h create mode 100644 scoplib_isl.c create mode 100644 scoplib_isl.h diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..f899010 --- /dev/null +++ b/.gitignore @@ -0,0 +1,22 @@ +Makefile.in +aclocal.m4 +autom4te.cache/ +config.guess +config.sub +configure +depcomp +install-sh +ltmain.sh +m4/libtool.m4 +m4/ltoptions.m4 +m4/ltsugar.m4 +m4/ltversion.m4 +m4/lt~obsolete.m4 +missing + +clan/autoconf/libtool.m4 +clan/autoconf/ltoptions.m4 +clan/autoconf/ltsugar.m4 +clan/autoconf/ltversion.m4 +clan/autoconf/lt~obsolete.m4 +clan/scoplib/scoplib-0.2.0/ diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 0000000..89e466e --- /dev/null +++ b/.gitmodules @@ -0,0 +1,6 @@ +[submodule "cloog"] + path = cloog + url = git://repo.or.cz/cloog.git +[submodule "isl"] + path = isl + url = git://repo.or.cz/isl.git diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..3b473db --- /dev/null +++ b/LICENSE @@ -0,0 +1,458 @@ + GNU LESSER GENERAL PUBLIC LICENSE + Version 2.1, February 1999 + + Copyright (C) 1991, 1999 Free Software Foundation, Inc. + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + +[This is the first released version of the Lesser GPL. It also counts + as the successor of the GNU Library Public License, version 2, hence + the version number 2.1.] + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +Licenses are intended to guarantee your freedom to share and change +free software--to make sure the software is free for all its users. + + This license, the Lesser General Public License, applies to some +specially designated software packages--typically libraries--of the +Free Software Foundation and other authors who decide to use it. You +can use it too, but we suggest you first think carefully about whether +this license or the ordinary General Public License is the better +strategy to use in any particular case, based on the explanations below. + + When we speak of free software, we are referring to freedom of use, +not price. Our General Public Licenses are designed to make sure that +you have the freedom to distribute copies of free software (and charge +for this service if you wish); that you receive source code or can get +it if you want it; that you can change the software and use pieces of +it in new free programs; and that you are informed that you can do +these things. + + To protect your rights, we need to make restrictions that forbid +distributors to deny you these rights or to ask you to surrender these +rights. These restrictions translate to certain responsibilities for +you if you distribute copies of the library or if you modify it. + + For example, if you distribute copies of the library, whether gratis +or for a fee, you must give the recipients all the rights that we gave +you. You must make sure that they, too, receive or can get the source +code. If you link other code with the library, you must provide +complete object files to the recipients, so that they can relink them +with the library after making changes to the library and recompiling +it. And you must show them these terms so they know their rights. + + We protect your rights with a two-step method: (1) we copyright the +library, and (2) we offer you this license, which gives you legal +permission to copy, distribute and/or modify the library. + + To protect each distributor, we want to make it very clear that +there is no warranty for the free library. Also, if the library is +modified by someone else and passed on, the recipients should know +that what they have is not the original version, so that the original +author's reputation will not be affected by problems that might be +introduced by others. + + Finally, software patents pose a constant threat to the existence of +any free program. We wish to make sure that a company cannot +effectively restrict the users of a free program by obtaining a +restrictive license from a patent holder. Therefore, we insist that +any patent license obtained for a version of the library must be +consistent with the full freedom of use specified in this license. + + Most GNU software, including some libraries, is covered by the +ordinary GNU General Public License. This license, the GNU Lesser +General Public License, applies to certain designated libraries, and +is quite different from the ordinary General Public License. We use +this license for certain libraries in order to permit linking those +libraries into non-free programs. + + When a program is linked with a library, whether statically or using +a shared library, the combination of the two is legally speaking a +combined work, a derivative of the original library. The ordinary +General Public License therefore permits such linking only if the +entire combination fits its criteria of freedom. The Lesser General +Public License permits more lax criteria for linking other code with +the library. + + We call this license the "Lesser" General Public License because it +does Less to protect the user's freedom than the ordinary General +Public License. It also provides other free software developers Less +of an advantage over competing non-free programs. These disadvantages +are the reason we use the ordinary General Public License for many +libraries. However, the Lesser license provides advantages in certain +special circumstances. + + For example, on rare occasions, there may be a special need to +encourage the widest possible use of a certain library, so that it becomes +a de-facto standard. To achieve this, non-free programs must be +allowed to use the library. A more frequent case is that a free +library does the same job as widely used non-free libraries. In this +case, there is little to gain by limiting the free library to free +software only, so we use the Lesser General Public License. + + In other cases, permission to use a particular library in non-free +programs enables a greater number of people to use a large body of +free software. For example, permission to use the GNU C Library in +non-free programs enables many more people to use the whole GNU +operating system, as well as its variant, the GNU/Linux operating +system. + + Although the Lesser General Public License is Less protective of the +users' freedom, it does ensure that the user of a program that is +linked with the Library has the freedom and the wherewithal to run +that program using a modified version of the Library. + + The precise terms and conditions for copying, distribution and +modification follow. Pay close attention to the difference between a +"work based on the library" and a "work that uses the library". The +former contains code derived from the library, whereas the latter must +be combined with the library in order to run. + + GNU LESSER GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License Agreement applies to any software library or other +program which contains a notice placed by the copyright holder or +other authorized party saying it may be distributed under the terms of +this Lesser General Public License (also called "this License"). +Each licensee is addressed as "you". + + A "library" means a collection of software functions and/or data +prepared so as to be conveniently linked with application programs +(which use some of those functions and data) to form executables. + + The "Library", below, refers to any such software library or work +which has been distributed under these terms. A "work based on the +Library" means either the Library or any derivative work under +copyright law: that is to say, a work containing the Library or a +portion of it, either verbatim or with modifications and/or translated +straightforwardly into another language. (Hereinafter, translation is +included without limitation in the term "modification".) + + "Source code" for a work means the preferred form of the work for +making modifications to it. For a library, complete source code means +all the source code for all modules it contains, plus any associated +interface definition files, plus the scripts used to control compilation +and installation of the library. + + Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running a program using the Library is not restricted, and output from +such a program is covered only if its contents constitute a work based +on the Library (independent of the use of the Library in a tool for +writing it). Whether that is true depends on what the Library does +and what the program that uses the Library does. + + 1. You may copy and distribute verbatim copies of the Library's +complete source code as you receive it, in any medium, provided that +you conspicuously and appropriately publish on each copy an +appropriate copyright notice and disclaimer of warranty; keep intact +all the notices that refer to this License and to the absence of any +warranty; and distribute a copy of this License along with the +Library. + + You may charge a fee for the physical act of transferring a copy, +and you may at your option offer warranty protection in exchange for a +fee. + + 2. You may modify your copy or copies of the Library or any portion +of it, thus forming a work based on the Library, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) The modified work must itself be a software library. + + b) You must cause the files modified to carry prominent notices + stating that you changed the files and the date of any change. + + c) You must cause the whole of the work to be licensed at no + charge to all third parties under the terms of this License. + + d) If a facility in the modified Library refers to a function or a + table of data to be supplied by an application program that uses + the facility, other than as an argument passed when the facility + is invoked, then you must make a good faith effort to ensure that, + in the event an application does not supply such function or + table, the facility still operates, and performs whatever part of + its purpose remains meaningful. + + (For example, a function in a library to compute square roots has + a purpose that is entirely well-defined independent of the + application. Therefore, Subsection 2d requires that any + application-supplied function or table used by this function must + be optional: if the application does not supply it, the square + root function must still compute square roots.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Library, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Library, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote +it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Library. + +In addition, mere aggregation of another work not based on the Library +with the Library (or with a work based on the Library) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may opt to apply the terms of the ordinary GNU General Public +License instead of this License to a given copy of the Library. To do +this, you must alter all the notices that refer to this License, so +that they refer to the ordinary GNU General Public License, version 2, +instead of to this License. (If a newer version than version 2 of the +ordinary GNU General Public License has appeared, then you can specify +that version instead if you wish.) Do not make any other change in +these notices. + + Once this change is made in a given copy, it is irreversible for +that copy, so the ordinary GNU General Public License applies to all +subsequent copies and derivative works made from that copy. + + This option is useful when you wish to copy part of the code of +the Library into a program that is not a library. + + 4. You may copy and distribute the Library (or a portion or +derivative of it, under Section 2) in object code or executable form +under the terms of Sections 1 and 2 above provided that you accompany +it with the complete corresponding machine-readable source code, which +must be distributed under the terms of Sections 1 and 2 above on a +medium customarily used for software interchange. + + If distribution of object code is made by offering access to copy +from a designated place, then offering equivalent access to copy the +source code from the same place satisfies the requirement to +distribute the source code, even though third parties are not +compelled to copy the source along with the object code. + + 5. A program that contains no derivative of any portion of the +Library, but is designed to work with the Library by being compiled or +linked with it, is called a "work that uses the Library". Such a +work, in isolation, is not a derivative work of the Library, and +therefore falls outside the scope of this License. + + However, linking a "work that uses the Library" with the Library +creates an executable that is a derivative of the Library (because it +contains portions of the Library), rather than a "work that uses the +library". The executable is therefore covered by this License. +Section 6 states terms for distribution of such executables. + + When a "work that uses the Library" uses material from a header file +that is part of the Library, the object code for the work may be a +derivative work of the Library even though the source code is not. +Whether this is true is especially significant if the work can be +linked without the Library, or if the work is itself a library. The +threshold for this to be true is not precisely defined by law. + + If such an object file uses only numerical parameters, data +structure layouts and accessors, and small macros and small inline +functions (ten lines or less in length), then the use of the object +file is unrestricted, regardless of whether it is legally a derivative +work. (Executables containing this object code plus portions of the +Library will still fall under Section 6.) + + Otherwise, if the work is a derivative of the Library, you may +distribute the object code for the work under the terms of Section 6. +Any executables containing that work also fall under Section 6, +whether or not they are linked directly with the Library itself. + + 6. As an exception to the Sections above, you may also combine or +link a "work that uses the Library" with the Library to produce a +work containing portions of the Library, and distribute that work +under terms of your choice, provided that the terms permit +modification of the work for the customer's own use and reverse +engineering for debugging such modifications. + + You must give prominent notice with each copy of the work that the +Library is used in it and that the Library and its use are covered by +this License. You must supply a copy of this License. If the work +during execution displays copyright notices, you must include the +copyright notice for the Library among them, as well as a reference +directing the user to the copy of this License. Also, you must do one +of these things: + + a) Accompany the work with the complete corresponding + machine-readable source code for the Library including whatever + changes were used in the work (which must be distributed under + Sections 1 and 2 above); and, if the work is an executable linked + with the Library, with the complete machine-readable "work that + uses the Library", as object code and/or source code, so that the + user can modify the Library and then relink to produce a modified + executable containing the modified Library. (It is understood + that the user who changes the contents of definitions files in the + Library will not necessarily be able to recompile the application + to use the modified definitions.) + + b) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (1) uses at run time a + copy of the library already present on the user's computer system, + rather than copying library functions into the executable, and (2) + will operate properly with a modified version of the library, if + the user installs one, as long as the modified version is + interface-compatible with the version that the work was made with. + + c) Accompany the work with a written offer, valid for at + least three years, to give the same user the materials + specified in Subsection 6a, above, for a charge no more + than the cost of performing this distribution. + + d) If distribution of the work is made by offering access to copy + from a designated place, offer equivalent access to copy the above + specified materials from the same place. + + e) Verify that the user has already received a copy of these + materials or that you have already sent this user a copy. + + For an executable, the required form of the "work that uses the +Library" must include any data and utility programs needed for +reproducing the executable from it. However, as a special exception, +the materials to be distributed need not include anything that is +normally distributed (in either source or binary form) with the major +components (compiler, kernel, and so on) of the operating system on +which the executable runs, unless that component itself accompanies +the executable. + + It may happen that this requirement contradicts the license +restrictions of other proprietary libraries that do not normally +accompany the operating system. Such a contradiction means you cannot +use both them and the Library together in an executable that you +distribute. + + 7. You may place library facilities that are a work based on the +Library side-by-side in a single library together with other library +facilities not covered by this License, and distribute such a combined +library, provided that the separate distribution of the work based on +the Library and of the other library facilities is otherwise +permitted, and provided that you do these two things: + + a) Accompany the combined library with a copy of the same work + based on the Library, uncombined with any other library + facilities. This must be distributed under the terms of the + Sections above. + + b) Give prominent notice with the combined library of the fact + that part of it is a work based on the Library, and explaining + where to find the accompanying uncombined form of the same work. + + 8. You may not copy, modify, sublicense, link with, or distribute +the Library except as expressly provided under this License. Any +attempt otherwise to copy, modify, sublicense, link with, or +distribute the Library is void, and will automatically terminate your +rights under this License. However, parties who have received copies, +or rights, from you under this License will not have their licenses +terminated so long as such parties remain in full compliance. + + 9. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Library or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Library (or any work based on the +Library), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Library or works based on it. + + 10. Each time you redistribute the Library (or any work based on the +Library), the recipient automatically receives a license from the +original licensor to copy, distribute, link with or modify the Library +subject to these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties with +this License. + + 11. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Library at all. For example, if a patent +license would not permit royalty-free redistribution of the Library by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Library. + +If any portion of this section is held invalid or unenforceable under any +particular circumstance, the balance of the section is intended to apply, +and the section as a whole is intended to apply in other circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 12. If the distribution and/or use of the Library is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Library under this License may add +an explicit geographical distribution limitation excluding those countries, +so that distribution is permitted only in or among countries not thus +excluded. In such case, this License incorporates the limitation as if +written in the body of this License. + + 13. The Free Software Foundation may publish revised and/or new +versions of the Lesser General Public License from time to time. +Such new versions will be similar in spirit to the present version, +but may differ in detail to address new problems or concerns. + +Each version is given a distinguishing version number. If the Library +specifies a version number of this License which applies to it and +"any later version", you have the option of following the terms and +conditions either of that version or of any later version published by +the Free Software Foundation. If the Library does not specify a +license version number, you may choose any version ever published by +the Free Software Foundation. + + 14. If you wish to incorporate parts of the Library into other free +programs whose distribution conditions are incompatible with these, +write to the author to ask for permission. For software which is +copyrighted by the Free Software Foundation, write to the Free +Software Foundation; we sometimes make exceptions for this. Our +decision will be guided by the two goals of preserving the free status +of all derivatives of our free software and of promoting the sharing +and reuse of software generally. + + NO WARRANTY + + 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO +WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. +EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR +OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY +KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE +LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME +THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN +WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY +AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU +FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR +CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE +LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING +RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A +FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF +SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +DAMAGES. + + END OF TERMS AND CONDITIONS diff --git a/Makefile.am b/Makefile.am new file mode 100644 index 0000000..c4b2d71 --- /dev/null +++ b/Makefile.am @@ -0,0 +1,52 @@ +if BUNDLED_ISL + MAYBE_ISL = isl + ISL_LA = $(top_builddir)/isl/libisl.la + LOCAL_ISL_LA = isl/libisl.la +endif +if BUNDLED_CLOOG + MAYBE_CLOOG = cloog + CLOOG_LA = $(top_builddir)/cloog/libcloog-isl.la +endif +if BUNDLED_CLAN + MAYBE_CLAN = clan + CLAN_LA = \ + $(top_builddir)/clan/source/libclan.la \ + $(top_builddir)/clan/scoplib/scoplib-0.2.0/source/libscoplib.la +endif + +SUBDIRS = $(MAYBE_ISL) $(MAYBE_CLOOG) $(MAYBE_CLAN) . + +FORCE: +isl/libisl.la: FORCE + cd isl; $(MAKE) $(AM_MAKEFLAGS) libisl.la +cloog/libcloog-isl.la: $(LOCAL_ISL_LA) FORCE + cd cloog; $(MAKE) $(AM_MAKEFLAGS) libcloog-isl.la +clan/source/libclan.la: FORCE + cd clan/source; $(MAKE) $(AM_MAKEFLAGS) libclan.la +clan/scoplib/scoplib-0.2.0/source/libscoplib.la: FORCE + cd clan/scoplib/scoplib-0.2.0/source; $(MAKE) $(AM_MAKEFLAGS) libscoplib.la + +ACLOCAL_AMFLAGS = -I m4 + +LIB_ISL = $(ISL_LA) @ISL_LIBS@ +LIB_CLOOG = $(CLOOG_LA) @CLOOG_LIBS@ +LIB_CLAN = $(CLAN_LA) @CLAN_LIBS@ + +AM_CPPFLAGS = @ISL_CFLAGS@ @CLOOG_CFLAGS@ @CLAN_CFLAGS@ +LDADD = $(LIB_CLOOG) $(LIB_ISL) $(LIB_CLAN) + +bin_PROGRAMS = ppcg +ppcg_SOURCES = \ + cuda.c \ + cuda.h \ + cuda_common.h \ + cuda_common.c \ + gpucode.c \ + gpucode.h \ + schedule.c \ + schedule.h \ + scoplib_isl.c \ + scoplib_isl.h \ + ppcg_options.c \ + ppcg_options.h \ + ppcg.c diff --git a/autogen.sh b/autogen.sh new file mode 100755 index 0000000..1f24df9 --- /dev/null +++ b/autogen.sh @@ -0,0 +1,9 @@ +#!/bin/sh +if test -f isl/autogen.sh; then + (cd isl; ./autogen.sh) +fi +if test -f cloog/autogen.sh; then + (cd cloog; ./autogen.sh) +fi +(cd clan; autoreconf -i) +autoreconf -i diff --git a/clan/AUTHORS b/clan/AUTHORS new file mode 100644 index 0000000..437c845 --- /dev/null +++ b/clan/AUTHORS @@ -0,0 +1,11 @@ +* * * * * +* Clan * +* * * * * + +Version 0.5.0 + +Current maintainer: +* Louis-Noel Pouchet + +Author of Clan: +* Cedric Bastoul diff --git a/clan/COPYING.LESSER b/clan/COPYING.LESSER new file mode 100644 index 0000000..3f9959f --- /dev/null +++ b/clan/COPYING.LESSER @@ -0,0 +1,165 @@ + GNU LESSER GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + + This version of the GNU Lesser General Public License incorporates +the terms and conditions of version 3 of the GNU General Public +License, supplemented by the additional permissions listed below. + + 0. Additional Definitions. + + As used herein, "this License" refers to version 3 of the GNU Lesser +General Public License, and the "GNU GPL" refers to version 3 of the GNU +General Public License. + + "The Library" refers to a covered work governed by this License, +other than an Application or a Combined Work as defined below. + + An "Application" is any work that makes use of an interface provided +by the Library, but which is not otherwise based on the Library. +Defining a subclass of a class defined by the Library is deemed a mode +of using an interface provided by the Library. + + A "Combined Work" is a work produced by combining or linking an +Application with the Library. The particular version of the Library +with which the Combined Work was made is also called the "Linked +Version". + + The "Minimal Corresponding Source" for a Combined Work means the +Corresponding Source for the Combined Work, excluding any source code +for portions of the Combined Work that, considered in isolation, are +based on the Application, and not on the Linked Version. + + The "Corresponding Application Code" for a Combined Work means the +object code and/or source code for the Application, including any data +and utility programs needed for reproducing the Combined Work from the +Application, but excluding the System Libraries of the Combined Work. + + 1. Exception to Section 3 of the GNU GPL. + + You may convey a covered work under sections 3 and 4 of this License +without being bound by section 3 of the GNU GPL. + + 2. Conveying Modified Versions. + + If you modify a copy of the Library, and, in your modifications, a +facility refers to a function or data to be supplied by an Application +that uses the facility (other than as an argument passed when the +facility is invoked), then you may convey a copy of the modified +version: + + a) under this License, provided that you make a good faith effort to + ensure that, in the event an Application does not supply the + function or data, the facility still operates, and performs + whatever part of its purpose remains meaningful, or + + b) under the GNU GPL, with none of the additional permissions of + this License applicable to that copy. + + 3. Object Code Incorporating Material from Library Header Files. + + The object code form of an Application may incorporate material from +a header file that is part of the Library. You may convey such object +code under terms of your choice, provided that, if the incorporated +material is not limited to numerical parameters, data structure +layouts and accessors, or small macros, inline functions and templates +(ten or fewer lines in length), you do both of the following: + + a) Give prominent notice with each copy of the object code that the + Library is used in it and that the Library and its use are + covered by this License. + + b) Accompany the object code with a copy of the GNU GPL and this license + document. + + 4. Combined Works. + + You may convey a Combined Work under terms of your choice that, +taken together, effectively do not restrict modification of the +portions of the Library contained in the Combined Work and reverse +engineering for debugging such modifications, if you also do each of +the following: + + a) Give prominent notice with each copy of the Combined Work that + the Library is used in it and that the Library and its use are + covered by this License. + + b) Accompany the Combined Work with a copy of the GNU GPL and this license + document. + + c) For a Combined Work that displays copyright notices during + execution, include the copyright notice for the Library among + these notices, as well as a reference directing the user to the + copies of the GNU GPL and this license document. + + d) Do one of the following: + + 0) Convey the Minimal Corresponding Source under the terms of this + License, and the Corresponding Application Code in a form + suitable for, and under terms that permit, the user to + recombine or relink the Application with a modified version of + the Linked Version to produce a modified Combined Work, in the + manner specified by section 6 of the GNU GPL for conveying + Corresponding Source. + + 1) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (a) uses at run time + a copy of the Library already present on the user's computer + system, and (b) will operate properly with a modified version + of the Library that is interface-compatible with the Linked + Version. + + e) Provide Installation Information, but only if you would otherwise + be required to provide such information under section 6 of the + GNU GPL, and only to the extent that such information is + necessary to install and execute a modified version of the + Combined Work produced by recombining or relinking the + Application with a modified version of the Linked Version. (If + you use option 4d0, the Installation Information must accompany + the Minimal Corresponding Source and Corresponding Application + Code. If you use option 4d1, you must provide the Installation + Information in the manner specified by section 6 of the GNU GPL + for conveying Corresponding Source.) + + 5. Combined Libraries. + + You may place library facilities that are a work based on the +Library side by side in a single library together with other library +facilities that are not Applications and are not covered by this +License, and convey such a combined library under terms of your +choice, if you do both of the following: + + a) Accompany the combined library with a copy of the same work based + on the Library, uncombined with any other library facilities, + conveyed under the terms of this License. + + b) Give prominent notice with the combined library that part of it + is a work based on the Library, and explaining where to find the + accompanying uncombined form of the same work. + + 6. Revised Versions of the GNU Lesser General Public License. + + The Free Software Foundation may publish revised and/or new versions +of the GNU Lesser General Public License from time to time. Such new +versions will be similar in spirit to the present version, but may +differ in detail to address new problems or concerns. + + Each version is given a distinguishing version number. If the +Library as you received it specifies that a certain numbered version +of the GNU Lesser General Public License "or any later version" +applies to it, you have the option of following the terms and +conditions either of that published version or of any later version +published by the Free Software Foundation. If the Library as you +received it does not specify a version number of the GNU Lesser +General Public License, you may choose any version of the GNU Lesser +General Public License ever published by the Free Software Foundation. + + If the Library as you received it specifies that a proxy can decide +whether future versions of the GNU Lesser General Public License shall +apply, that proxy's public statement of acceptance of any version is +permanent authorization for you to choose that version for the +Library. \ No newline at end of file diff --git a/clan/ChangeLog b/clan/ChangeLog new file mode 100644 index 0000000..2b746ae --- /dev/null +++ b/clan/ChangeLog @@ -0,0 +1,727 @@ +2010-06-01 Louis-Noel Pouchet + + * source/parser.y: Extend the grammar to support 'var * INTEGER' + expressions and not only 'INTEGER * var' ones. + +2010-05-29 Louis-Noel Pouchet + This patch provides support for literal floats, eg. 0.6f, 4.5d. + + * source/scanner.l: Extend the scanner to parse literal float + numbers. + * tests/unitary/float.c, + * tests/unitary/float.c.scop: New test file. + * tests/Makefile.am: Update accordingly. + +2010-04-17 Louis-Noel Pouchet + + * source/parser.y: Fix a bug in the grammar when facing multiple + curly brackets in instructions. + + * tests/unitary/nestedcurly.c, + * tests/unitary/nestedcurly.c.scop: New. Test file for the new + case. + * tests/Makefile.am: Update accordingly. + +2010-03-29 Louis-Noel Pouchet + + * source/parser.y: Allow special mathematical functions (min, max, + ceild, floord) as RHS of assignments. + +2010-03-08 Louis-Noel Pouchet + + * configure.in: Bump to 0.6.0. Update to latest version of + ScopLib. + * scoplib/scoplib-0.1.0.tar.gz: Delete. + * scoplib/scoplib-0.2.0.tar.gz: New. Latest version of ScopLib. + +2010-02-24 Louis-Noel Pouchet + This patch provides Clan with the ability to pase, inside a SCoP, + a construct of the form: + #pragma live-out a, b, c + + a, b, c are variables that lives after the scop execution. They + are dumped in the option tag of the scoplib: + + 1 2 3 + + + This pragma is read by the array contraction pass of PoCC. + + * include/clan/scop.h, + * source/parser.y, + * source/scanner.l, + * source/scop.c: Manage #pragma live-out. + +2010-02-05 Louis-Noel Pouchet + This patch provides Clan with the ability to parse, inside a SCoP, + a construct of the form: + #pragma local-vars a,b,c,d + + a,b,c,d are variables which may or may not be encountered in the + scop. Their variable id list is dumped in the option tag of the + scoplib: + + 1 2 3 4 + + + This pragma is used by the array compaction pass of PoCC, which + requires a list of variables which lives only within the SCoP. + + * include/clan/macros.h, + * include/clan/scop.h, + * source/parser.y, + * source/scanner.l, + * source/scop.c: Manage #pragma local-vars. Fix a small bug in the + parser for the parsing of affine expressions starting with '-'. + +2010-01-29 Louis-Noel Pouchet + This patch fixes a bug when parsing iterators and parameters as + read variables in the RHS of an expression. The fake_array trick + has been made useless, parsing is clean now. + + * source/parser.y: Fix the grammar. + + * include/clan/symbol.h, + * source/symbol.c: Add function clan_symbol_remove. + + * tests/unitary/assigniter.c.scop: Fix the old test. + * tests/unitary/assigniter2.c.scop, + * tests/unitary/assigniter2.c: Add a new regression test. + * tests/Makefile.am: Update accordingly. + +2010-01-27 Louis-Noel Pouchet + + * source/parser.y: Revert previous patch to support type cast. It + must be done in a robust and tested fashion, it was not the case. + +2010-01-26 Louis-Noel Pouchet + This patch adds an experimental support of C type cast. For + instance c = (double) (0); + The casted value must be in parenthesis also, syntax as: + c = (double) 0; are not supported. + + * source/parser.y: Support basic type cast in expressions. + +2010-01-26 Louis-Noel Pouchet + + * source/scanner.l, + * source/parser.y: Extend to support re-entrance of tiled + code. Now the ceild and floord are supported (with special + token). Only an integer term as the dividor is supported. + +2010-01-26 Louis-Noel Pouchet + + * source/parser.y: Reinitialize the symbol global variables at the + start of the parsing process. + +2009-10-20 Louis-Noel Pouchet + This patch adds the support of basic arithmetic + expressions (numbers operations only) in function arguments, such + as foo(1+2*(3/4),bar). More complex patterns such as foo(2 * bar) are + not supported. + + * source/parser.y: Improve grammar to suport also basic arithmetic + expressions as argument in a function call. + * tests/unitary/functioncall2.c, + * tests/unitary/functioncall2.c.scop: New. Associated unitary test + files. + * tests/Makefile.am: Update accordingly. + +2009-10-20 Louis-Noel Pouchet + This patch improves the grammar by supporting fields and methods + syntax, such as a.b, a->b as fields, and a.b() or a->b() as method + calls. Getter/Setter syntax such as a->b() = 42 is not supported. + + * source/parser.y, + * source/scanner.l: Modify the lexer and parser to support fields + and objects-like syntax (id.id and id->id). + * tests/unitary/object.c, + * tests/unitary/object.c.scop, + * tests/unitary/field.c, + * tests/unitary/field.c.scop: New. Associated unitary test files. + * tests/Makefile.am: Update accordingly. + +2009-07-26 Louis-Noel Pouchet + This patch provides the option -boundedctxt, which produces a + context where all parameters have their lower bound set to -1. + + * include/clan/options.h, + * source/parser.y, + * source/options.c: Provide option -boundedctxt. + +2009-05-13 Louis-Noel Pouchet + + * include/clan/statement.h: Add missing include. + +2009-05-02 Louis-Noel Pouchet + This patch updates Clan to use the ScopLib. All "generic" + functions on scop_t, statement_t, matrix_t and vector_t have been + substituted by their version from the ScopLib. Embed a version of + the ScopLib, which is compiled by default if no option is + given. To use another installed version of the ScopLib, use + --disable-internal-scoplib [--with-scoplib=xxx]. + + * include/clan/options.h, + * include/clan/clan.h.in, + * include/clan/vector.h, + * include/clan/macros.h, + * include/clan/matrix.h, + * include/clan/scop.h, + * include/clan/statement.h, + * include/clan/symbol.h, + * configure.in, + * source/parser.y, + * source/scanner.l, + * source/vector.c, + * source/matrix.c, + * source/scop.c, + * source/statement.c, + * source/symbol.c, + * source/options.c, + * source/clan.c, + * tests/checker.sh, + * Makefile.am: Remove all functions included in ScopLib, + accordingly substitute clan_xx_ types and functions to + scoplib_xx_. + + * scoplib/scoplib-0.1.0.tar.gz: New. ScopLib hard copy. + +2009-04-27 Louis-Noel Pouchet + + * source/scop.c: Add clan_scop_dup function. + +2009-03-21 Uday K Bondhugula + Fixes for gmp compilation + + * trunk/configure.in: def of LINEAR_VALUE_IS_MP under + --enable-mp-version. + * trunk/include/clan/macros.h: include gmp.h. + * trunk/source/matrix.c: missing var decls for gmp code. + +2009-02-10 Louis-Noel Pouchet + This patch adds the support of iterators as RHS of assignments, + for instance x = i * j. + + * include/clan/clan.h.in, + * include/clan/macros.h, + * source/parser.y, + * source/matrix.c, + * source/statement.c: Support the assignment of an iterator as an + RHS of a statement. + + * tests/unitary/assigniter.c, + * tests/unitary/assigniter.c.scop: New. Test case for iterator + assignment. + * tests/Makefile.am: Update accordingly. + +2009-02-06 Louis-Noel Pouchet + + * source/parser.y: Fix a minor regression. + + * tests/unitary/intaddit.c, + * tests/unitary/intaddit.c.scop: New. Test case for the + regression. + * tests/Makefile.am: Update accordingly. + +2009-02-05 Louis-Noel Pouchet + This patch adds the support for expression such as + ..(i).. everywhere. Expressions such as ..(i+..).. are not + handled yet: for ex 2 * (i+1). + + * source/parser.y: Fix the grammar to handle parenthesis around an + identifier. + + * tests/unitary/parenthesis.c, + * tests/unitary/parenthesis.scop: New. Unitary test files for + parenthesis around identifiers. + * tests/Makefile.am: Update accordingly. + +2009-02-01 Louis-Noel Pouchet + + * include/clan/macros.h: Increase the maximal sizes of loops. + +2009-02-01 Louis-Noel Pouchet + + * source/parser.y: Ensure null read/written info is always a + 0-sized matrix. + +2009-01-30 Louis-Noel Pouchet + + * NEWS, + * README, + * THANKS, + * AUTHORS, + * COPYING.LESSER: Add standard GNU/LGPL files. + +2009-01-30 Louis-Noel Pouchet + + * tests/checker.sh: Add --ignore-matching-line diff option to + avoid failures on test reference files when Clan version changes. + +2009-01-30 Louis-Noel Pouchet + NOTE: Clan has been bumped to 0.5.0 at some point. + + * tests/change_clan_version_in_refs.sh: New. Test script to update + the version of clan in the test files. Must be used after each + modification of the version in configure.ac. + + * tests/matmul.c.scop, + * tests/unitary/empty.c.scop, + * tests/unitary/minloopcomplex.c.scop, + * tests/unitary/maxloopcomplex.c.scop, + * tests/unitary/redefiter.c.scop, + * tests/unitary/classicloop.c.scop, + * tests/unitary/complexcond.c.scop, + * tests/unitary/multiparenthcond.c.scop, + * tests/unitary/functioncall.c.scop, + * tests/unitary/ternary.c.scop, + * tests/unitary/increment.c.scop, + * tests/unitary/comments.c.scop, + * tests/unitary/minloopsimple.c.scop, + * tests/unitary/maxloopsimple.c.scop, + * tests/unitary/minmax.c.scop, + * tests/unitary/simplecond.c.scop, + * tests/unitary/complexprog.c.scop, + * tests/unitary/twoconds.c.scop, + * tests/unitary/complexop.c.scop, + * tests/unitary/noloop.c.scop, + * tests/unitary/binop.c.scop, + * tests/unitary/twocondincond.c.scop, + * tests/unitary/basicnest.c.scop, + * tests/unitary/negassign.c.scop, + * tests/unitary/simpleloop.c.scop, + * tests/unitary/noloop2.c.scop, + * tests/ax-do.c.scop, + * tests/swim.c.scop, + * tests/iir_4_64.c.scop, + * tests/gauss.c.scop, + * tests/gemver.c.scop: Update the reference files. + +2009-01-30 Louis-Noel Pouchet + + * source/scanner.l: Allow variable id to start with _. + + * tests/unitary/underscore.c, + * tests/unitary/underscore.c.scop: Add test case. + * tests/Makefile.am: Update accordingly. + +2008-11-01 Cedric Bastoul + Replace Polylib "Value" with "clan_int_t" to denote the integer type. + Plus some fixes on matrix list handling. + + * source/vector.c + * source/matrix.c: Fix matrix list handling + * include/vector.c + * include/macros.c + * doc/clan.texi: Completely add support for clan_matrix_list_p + +2008-11-01 Louis-Noel Pouchet + + * Makefile.am: Remove useless re-copy of config/clan.m4 in dist-hook. + +2008-10-15 Louis-Noel Pouchet + + * source/scanner.l: Remove systematic print of unknown characters. + +2008-10-07 Louis-Noel Pouchet + This patch fixes a bug in the parser. Assignments such as 'a = -b' + were incorrectly handled. + + * source/parser.y: Fix the parser grammar. + + * tests/unitary/negassign.c, + * tests/unitary/negassign.c.scop: New test file covering the case. + + * tests/Makefile.am: Update accordingly. + +2008-08-26 Louis-Noel Pouchet + This patch allows C-like ternary operator to be correctly + parsed in assignment statements. Example: + b = c < d ? a + 1 : 2 * b; + + * source/parser.y, + * source/scanner.l: Extend the grammar to deal with ternary operator. + + * tests/unitary/ternary.c, + * tests/unitary/ternary.c.scop: New. Test files for ternary operator. + * tests/Makefile.am: Update accordingly. + +2008-08-25 Louis-Noel Pouchet + This patch (1) fixes, cleans and comments the grammar (2) + changes the type of 'condition' from to (3) allows + conjunction of conditions (A && B) to be correctly parsed. + + * source/parser.y, + * source/scanner.l: Fix, clean and improve the lexer/parser. + + * source/vector.c: Fix a potential bug in clan_vector_free. + + * include/clan/matrix.h, + * source/matrix.c: Add clan_matrix_add_vector and + clan_matrix_sub_vector functions. + + * tests/unitary/twocondincond.c, + * tests/unitary/twocondincond.c.scop: New. Test files for multiple + affine expressions in a condition. + * tests/Makefile.am: Update accordingly. + +2008-08-23 Louis-Noel Pouchet + This patch allows complex C unary and binary operators to be correctly + parsed when present in assignments. Examples: + a ^= (b | (c + 2)) % 2 - !(a[n]/2); + a--; + + * source/scanner.l, + * source/parser.y: Improve the lexer/scanner to deal with various + C-like operators in assignments. + + * tests/unitary/binop.c, + * tests/unitary/binop.c.scop, + * tests/unitary/complexop.c, + * tests/unitary/complexop.c.scop: New. Test files for complex + operators in assignments. + + * tests/Makefile.am: Update accordingly. + + * tests/checker.sh: Minor fix to improve verbosity. + +2008-08-23 Louis-Noel Pouchet + This patch enables correct parsing of multiple parenthesis in + conditions. + + * source/parser.y: Support multiple parenthesis in conditions. + + * tests/unitary/multiparenthcond.c, + * tests/unitary/multiparenthcond.c.scop: New. Test files for + multiple parenthesis inside a condition. + * tests/Makefile.am: Update accordingly. + +2008-08-23 Louis-Noel Pouchet + This patch fixes a bug in the parser: statements not surrounded by + any loop were having an infinite domain. Fix the parser by + creating a fake iterator "fakeiter" for those statements. + + * source/parser.y: Fix the parser. + + * tests/unitary/twoconds.c, + * tests/unitary/noloop.c, + * tests/unitary/noloop2.c, + * tests/unitary/complexprog.c, + * tests/unitary/complexprog.c.scop, + * tests/unitary/twoconds.c.scop, + * tests/unitary/noloop.c.scop, + * tests/unitary/noloop2.c.scop: New. Test files for statements + surrounded by no loop, in several situations. + * tests/Makefile.am: Update accordingly. + + * tests/iir_4_64.c.scop: Fix the test. + +2008-08-23 Louis-Noel Pouchet + + * source/parser.y: Minor fix to clean useless rule type. + +2008-08-23 Louis-Noel Pouchet + This patch provides support for cascading min/max functions in + loop bound specification. min/max is not supported in regular + conditions, only in loop bounds. + + * source/parser.y, + * source/scanner.l: Improve the lexer/parser to deal with min/max + in loop bounds. + + * tests/unitary/minloopsimple.c, + * tests/unitary/minloopsimple.c.scop, + * tests/unitary/minloopcomplex.c, + * tests/unitary/minloopcomplex.c.scop, + * tests/unitary/maxloopsimple.c, + * tests/unitary/maxloopsimple.c.scop, + * tests/unitary/maxloopcomplex.c, + * tests/unitary/maxloopcomplex.c.scop, + * tests/unitary/minmax.c, + * tests/unitary/minmax.c.scop: New. Test files for min/max in loop + bounds. + * tests/Makefile.am: Update accordingly. + +2008-08-22 Louis-Noel Pouchet + + * tests/unitary/redefiter.c, + * tests/unitary/redefiter.c.scop: Add missing test files. + +2008-08-22 Louis-Noel Pouchet + This patch improves the parser by allowing the support of: (1) + function calls in statements (function arguments are marked as + read items); (2) conditionals (without OR and AND operators); (3) + error detection when an iterator is assigned to a variable (this + is not a SCoP). The test suite passes now. + + * source/scanner.l, + * source/parser.y: Fix the lexer/parser. + + * tests/unitary/assigniter.c, + * tests/unitary/assigniter.c.scop: Remove this test. + * tests/unitary/simplecond.c.scop, + * tests/unitary/simpleloop.c.scop, + * tests/unitary/basicnest.c.scop: Fix the reference files. + * tests/unitary/complexcond.c, + * tests/unitary/complexcond.c.scop: New. Test files for complex + conditionals in the SCoP. + * tests/unitary/functioncall.c, + * tests/unitary/functioncall.c.scop: New. Test files for function + calls. + * tests/Makefile.am: Update accordingly. + + * tests/checker.sh: Minor fix to improve output. + +2008-08-22 Louis-Noel Pouchet + + * source/parser.y, + * source/scanner.l: Merge from trunk. + + * tests/unitary/comments.c: Make the test harder. + +2008-08-21 Louis-Noel Pouchet + + * source/scop.c: Minor fix in option tags handling. + * include/clan/options.h: Typo. + +2008-07-24 Louis-Noel Pouchet + + * include/clan/scop.h, + * source/scop.c: Add the clan_scop_tag_content_from_string + function, which returns the content between two tags in a given + string. Fix a small bug in clan_scop_print_dot_scop. + +2008-07-20 Louis-Noel Pouchet + This patch adds the support of the tag, to dump + the table of referenced arrays in the optional section. The option + section is made persistent for the clan_scop_read + function. Finally, a 'usr' void* pointer is added for library + users convenience. + + * include/clan/scop.h: Add two new fields in the scop_t structure: + a 'usr' void* field, managed by the user, and a field to store the + options provided after the statement definitions. + * source/scop.c: Add support for the new fields. Dump the array + list in the tags. + + * tests/matmul.c.scop, + * tests/unitary/simplecond.c.scop, + * tests/unitary/empty.c.scop, + * tests/unitary/assigniter.c.scop, + * tests/unitary/classicloop.c.scop, + * tests/unitary/basicnest.c.scop, + * tests/unitary/simpleloop.c.scop, + * tests/unitary/increment.c.scop, + * tests/unitary/comments.c.scop, + * tests/ax-do.c.scop, + * tests/iir_4_64.c.scop, + * tests/swim.c.scop, + * tests/gauss.c.scop, + * tests/gemver.c.scop: Update the reference files. + * tests/checker.sh: Use the -arraystag option. + + * doc/clan.texi: Update the documentation. + +2008-07-14 Louis-Noel Pouchet + + * tests/check_unitary.sh, + * tests/check_complex.sh, + * tests/Makefile.am: Fix make distcheck. + +2008-07-13 Louis-Noel Pouchet + + * tests/gauss.c: Add pragma scop. + * tests/gauss.c.scop: Fix reference file. + +2008-07-13 Louis-Noel Pouchet + This patch fixes a bug in the parser. Problem occured when an + iterator which was previously encountered at a given loop level + was parsed again, but at a different level. + + * source/parser.y, + * source/scanner.l: Fix the parser. + + * tests/swim.c.scop: Fix the reference file. + * tests/unitary/redefiter.c, + * tests/unitary/redefiter.c.scop: New. Add unitary test for the + bug. + * tests/Makefile.am: Update accordingly. + + * tests/checker.sh: Don't systematically delete the test output. + +2008-07-13 Louis-Noel Pouchet + This patch re-enables the possibility to access any function of the + clan library by including simply clan.h. + + * include/clan/macros.h: New. Create a file storing all the macros. + + * source/parser.y, + * source/scanner.l, + * source/scop.c, + * source/options.c, + * include/Makefile.am, + * include/clan/options.h, + * include/clan/clan.h.in, + * include/clan/vector.h, + * include/clan/matrix.h, + * include/clan/scop.h, + * include/clan/statement.h, + * include/clan/symbol.h: Update accordingly. + +2008-07-13 Louis-Noel Pouchet + This patch fixes the includes of the library. To use a specific + function of the clan library, like clan_xxx_func, one MUST include + clan/xxx.h. + + * source/parser.y, + * source/scanner.l, + * source/vector.c, + * source/matrix.c, + * source/scop.c, + * source/statement.c, + * source/symbol.c, + * source/options.c, + * source/clan.c, + * include/clan/options.h, + * include/clan/vector.h, + * include/clan/statement.h, + * include/clan/symbol.h: Fix incorrect includes. + +2008-07-11 Louis-Noel Pouchet + + * tests/unitary/checker.sh: Delete. + + * tests/checker.sh: Merge the tester in a single script. + + * tests/check_unitary.sh, + * tests/check_complex.sh: New. Wrapper for test suite. + + * tests/Makefile.am: Update accordingly. + +2008-07-11 Louis-Noel Pouchet + + * tests/unitary/assigniter.c.scop: Fix reference file. + +2008-07-11 Louis-Noel Pouchet + + * tests/unitary/simpleloop.c.scop: Add missing reference file. + + * tests/Makefile.am, + * tests/checker.sh, + * tests/unitary/checker.sh: Improve the test procedure. + +2008-07-10 Louis-Noel Pouchet + + * tests/unitary/checker.sh: Fix check of base .scop, add .scop + parser test. + +2008-07-10 Louis-Noel Pouchet + + * tests/unitary/empty.c, + * tests/unitary/simplecond.c.scop, + * tests/unitary/empty.c.scop, + * tests/unitary/assigniter.c, + * tests/unitary/assigniter.c.scop, + * tests/unitary/basicnest.c, + * tests/unitary/classicloop.c, + * tests/unitary/basicnest.c.scop, + * tests/unitary/classicloop.c.scop, + * tests/unitary/simpleloop.c, + * tests/unitary/increment.c, + * tests/unitary/comments.c, + * tests/unitary/increment.c.scop, + * tests/unitary/comments.c.scop, + * tests/unitary/simplecond.c: New. Unitary test suite. + * tests/unitary/checker.sh: New. Checker script for the new suite. + + * tests/Makefile.am: Update accordingly, include unitary tests in + make check. + +2008-07-10 Louis-Noel Pouchet + + * source/scop.c, + * source/statement.c, + * include/clan/scop.h: Minor fix in the .scop parser, to handle + weird cases. + +2008-07-10 Louis-Noel Pouchet + + * doc/clan.texi: Update the documentation for new iteration domain + type. + +2008-07-10 Louis-Noel Pouchet + Provide a parser for .scop files (reentrant with clan output). + Change iteration domain type from matrix to matrix list, and + provide functions on matrix list. + + * source/parser.y, + * source/statement.c, + * source/scop.c, + * include/clan/scop.h, + * include/clan/statement.h, + * include/clan/matrix.h, + * source/matrix.c: Move iteration domain from matrix to + matrix_list. Add support for parsing .scop files. + + * include/clan/options.h, + * source/options.c: Add option -inputscop to read .scop files. + * source/clan.c: Add support for option -inputscop. + + * tests/swim.c, + * tests/swim.c.scop: Fix the test (formerly in DOS format). + + * tests/checker.sh: Add the SCoP parser in the test suite. + +2008-07-09 Louis-Noel Pouchet + Provide a working test suite, fix the generation of the + documentation. + + * tests/iir_4_64.c.scop, + * tests/matmul.c.scop, + * tests/swim.c.scop, + * tests/gauss.c.scop, + * tests/gemver.c.scop, + * tests/ax-do.c.scop: New. Add test suite reference files. + * tests/checker.sh: New. Add tester script for make check. + * tests/Makefile.am: New. Distribute the tests. + + * configure.in, + * Makefile.am: Update accordingly. + + * doc/clan.texi, + * doc/Doxyfile.in, + * doc/Makefile.am: Fix the documentation generation. + +2008-07-09 Louis-Noel Pouchet + + * configclan: New. Configuration script to hook configure into + build/ directory. + +2008-07-09 Louis-Noel Pouchet + + * source/parser.y, + * source/scanner.l, + * source/vector.c, + * source/matrix.c, + * source/scop.c, + * source/statement.c, + * source/symbol.c, + * source/options.c, + * source/clan.c, + * include/clan/options.h, + * include/clan/clan.h.in, + * include/clan/vector.h, + * include/clan/matrix.h, + * include/clan/scop.h, + * include/clan/symbol.h: Make code 80 columns compliant, fix wrong + includes, add missing ones. + +2008-07-09 Louis-Noel Pouchet + Severe rewriting of the Auto{conf,make} architecture. + + * doc/Makefile.am, + * source/Makefile.am, + * include/Makefile.am: New. Split Makefile.am in those files. + + * configure.in: severe update, add doxygen detection + diff --git a/clan/Makefile.am b/clan/Makefile.am new file mode 100644 index 0000000..ff8249a --- /dev/null +++ b/clan/Makefile.am @@ -0,0 +1,80 @@ +# +# /**------- <| --------------------------------------------------------** +# ** A Clan ** +# **--- /.\ -----------------------------------------------------** +# ** <| [""M# makefile.am ** +# **- A | # -----------------------------------------------------** +# ** /.\ [""M# First version: 30/04/2008 ** +# **- [""M# | # U"U#U -----------------------------------------------** +# | # | # \ .:/ +# | # | #___| # +# ****** | "--' .-" ***************************************************** +# * |"-"-"-"-"-#-#-## Clan : the Chunky Loop Analyser (experimental) * +# **** | # ## ###### **************************************************** +# * \ .::::'/ * +# * \ ::::'/ Copyright (C) 2008 Cedric Bastoul * +# * :8a| # # ## * +# * ::88a ### This is free software; you can redistribute it * +# * ::::888a 8a ##::. and/or modify it under the terms of the GNU * +# * ::::::::888a88a[]::: Lesser General Public License as published by * +# *::8:::::::::SUNDOGa8a::. the Free Software Foundation, either version 3 of * +# *::::::::8::::888:Y8888:: the License, or (at your option) * +# *::::':::88::::888::Y88a::::::::::::... any later version. * +# *::'::.. . ..... .. ... . * +# * This software is distributed in the hope that it will be useful, but * +# * WITHOUT ANY WARRANTY; without even the implied warranty of * +# * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General * +# * Public License for more details. * +# * * +# * You should have received a copy of the GNU Lesser General Public * +# * License along with software; if not, write to the Free Software * +# * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * +# * * +# * Clan, the Chunky Loop Analyser * +# * Written by Cedric Bastoul, Cedric.Bastoul@inria.fr * +# * * +# *****************************************************************************/ +# +# Makefile.am (or makefile if generated) of Clan, the Chunky Loop Analyser. +# Makefile.am is not a makefile, you must run the 'autogen.sh' THEN the +# configure shellscript to generate the Makefile thanks to this file. + + + +############################################################################# +SUBDIRS = @BUILD_SCOPLIB@ doc source include tests + + +############################################################################# +ACLOCAL_AMFLAGS = -I autoconf + +m4datadir = $(datadir)/aclocal + + +AUX_DIST = \ + $(ac_aux_dir)/config.guess \ + $(ac_aux_dir)/config.sub \ + $(ac_aux_dir)/install-sh \ + $(ac_aux_dir)/ltmain.sh \ + $(ac_aux_dir)/missing \ + $(ac_aux_dir)/depcomp + +MAINTAINERCLEANFILES = \ + Makefile.in \ + aclocal.m4 \ + configure \ + source/stamp-h.in \ + $(AUX_DIST) + + +############################################################################# +dist-hook: + (cd $(distdir) && mkdir -p $(ac_aux_dir)) + for file in $(AUX_DIST); do \ + cp $$file $(distdir)/$$file; \ + done + +maintainer-clean-hook: + (cd $(abs_top_srcdir)/scoplib && rm -rf scoplib-0.1.0) + +############################################################################# diff --git a/clan/NEWS b/clan/NEWS new file mode 100644 index 0000000..75daa9c --- /dev/null +++ b/clan/NEWS @@ -0,0 +1,2 @@ +Some news... + diff --git a/clan/README b/clan/README new file mode 100644 index 0000000..8205b38 --- /dev/null +++ b/clan/README @@ -0,0 +1,40 @@ +# +# /**------- <| --------------------------------------------------------** +# ** A Clan ** +# **--- /.\ -----------------------------------------------------** +# ** <| [""M# ** +# **- A | # -----------------------------------------------------** +# ** /.\ [""M# ** +# **- [""M# | # U"U#U -----------------------------------------------** +# | # | # \ .:/ +# | # | #___| # +# ****** | "--' .-" ***************************************************** +# * |"-"-"-"-"-#-#-## Clan : the Chunky Loop Analyser (experimental) * +# **** | # ## ###### **************************************************** +# * \ .::::'/ * +# * \ ::::'/ Copyright (C) 2008 Cedric Bastoul * +# * :8a| # # ## * +# * ::88a ### This is free software; you can redistribute it * +# * ::::888a 8a ##::. and/or modify it under the terms of the GNU * +# * ::::::::888a88a[]::: Lesser General Public License as published by * +# *::8:::::::::SUNDOGa8a::. the Free Software Foundation, either version 3 of * +# *::::::::8::::888:Y8888:: the License, or (at your option) * +# *::::':::88::::888::Y88a::::::::::::... any later version. * +# *::'::.. . ..... .. ... . * +# * This software is distributed in the hope that it will be useful, but * +# * WITHOUT ANY WARRANTY; without even the implied warranty of * +# * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General * +# * Public License for more details. * +# * * +# * You should have received a copy of the GNU Lesser General Public * +# * License along with software; if not, write to the Free Software * +# * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * +# * * +# * Clan, the Chunky Loop Analyser * +# * Written by Cedric Bastoul, Cedric.Bastoul@inria.fr * +# * * +# *****************************************************************************/ + +install procedure: + +... \ No newline at end of file diff --git a/clan/THANKS b/clan/THANKS new file mode 100644 index 0000000..59aa432 --- /dev/null +++ b/clan/THANKS @@ -0,0 +1,11 @@ +THANKS +====== + +The author would like to gratefully thank: + +* Louis-Noel Pouchet + For his valuable help in contributing and maintaining Clan. + +* Uday Bondhugula + For his help in bug reporting. + diff --git a/clan/autoconf/depcomp b/clan/autoconf/depcomp new file mode 100755 index 0000000..e5f9736 --- /dev/null +++ b/clan/autoconf/depcomp @@ -0,0 +1,589 @@ +#! /bin/sh +# depcomp - compile a program generating dependencies as side-effects + +scriptversion=2007-03-29.01 + +# Copyright (C) 1999, 2000, 2003, 2004, 2005, 2006, 2007 Free Software +# Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA +# 02110-1301, USA. + +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + +# Originally written by Alexandre Oliva . + +case $1 in + '') + echo "$0: No command. Try \`$0 --help' for more information." 1>&2 + exit 1; + ;; + -h | --h*) + cat <<\EOF +Usage: depcomp [--help] [--version] PROGRAM [ARGS] + +Run PROGRAMS ARGS to compile a file, generating dependencies +as side-effects. + +Environment variables: + depmode Dependency tracking mode. + source Source file read by `PROGRAMS ARGS'. + object Object file output by `PROGRAMS ARGS'. + DEPDIR directory where to store dependencies. + depfile Dependency file to output. + tmpdepfile Temporary file to use when outputing dependencies. + libtool Whether libtool is used (yes/no). + +Report bugs to . +EOF + exit $? + ;; + -v | --v*) + echo "depcomp $scriptversion" + exit $? + ;; +esac + +if test -z "$depmode" || test -z "$source" || test -z "$object"; then + echo "depcomp: Variables source, object and depmode must be set" 1>&2 + exit 1 +fi + +# Dependencies for sub/bar.o or sub/bar.obj go into sub/.deps/bar.Po. +depfile=${depfile-`echo "$object" | + sed 's|[^\\/]*$|'${DEPDIR-.deps}'/&|;s|\.\([^.]*\)$|.P\1|;s|Pobj$|Po|'`} +tmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`} + +rm -f "$tmpdepfile" + +# Some modes work just like other modes, but use different flags. We +# parameterize here, but still list the modes in the big case below, +# to make depend.m4 easier to write. Note that we *cannot* use a case +# here, because this file can only contain one case statement. +if test "$depmode" = hp; then + # HP compiler uses -M and no extra arg. + gccflag=-M + depmode=gcc +fi + +if test "$depmode" = dashXmstdout; then + # This is just like dashmstdout with a different argument. + dashmflag=-xM + depmode=dashmstdout +fi + +case "$depmode" in +gcc3) +## gcc 3 implements dependency tracking that does exactly what +## we want. Yay! Note: for some reason libtool 1.4 doesn't like +## it if -MD -MP comes after the -MF stuff. Hmm. +## Unfortunately, FreeBSD c89 acceptance of flags depends upon +## the command line argument order; so add the flags where they +## appear in depend2.am. Note that the slowdown incurred here +## affects only configure: in makefiles, %FASTDEP% shortcuts this. + for arg + do + case $arg in + -c) set fnord "$@" -MT "$object" -MD -MP -MF "$tmpdepfile" "$arg" ;; + *) set fnord "$@" "$arg" ;; + esac + shift # fnord + shift # $arg + done + "$@" + stat=$? + if test $stat -eq 0; then : + else + rm -f "$tmpdepfile" + exit $stat + fi + mv "$tmpdepfile" "$depfile" + ;; + +gcc) +## There are various ways to get dependency output from gcc. Here's +## why we pick this rather obscure method: +## - Don't want to use -MD because we'd like the dependencies to end +## up in a subdir. Having to rename by hand is ugly. +## (We might end up doing this anyway to support other compilers.) +## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like +## -MM, not -M (despite what the docs say). +## - Using -M directly means running the compiler twice (even worse +## than renaming). + if test -z "$gccflag"; then + gccflag=-MD, + fi + "$@" -Wp,"$gccflag$tmpdepfile" + stat=$? + if test $stat -eq 0; then : + else + rm -f "$tmpdepfile" + exit $stat + fi + rm -f "$depfile" + echo "$object : \\" > "$depfile" + alpha=ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz +## The second -e expression handles DOS-style file names with drive letters. + sed -e 's/^[^:]*: / /' \ + -e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile" +## This next piece of magic avoids the `deleted header file' problem. +## The problem is that when a header file which appears in a .P file +## is deleted, the dependency causes make to die (because there is +## typically no way to rebuild the header). We avoid this by adding +## dummy dependencies for each header file. Too bad gcc doesn't do +## this for us directly. + tr ' ' ' +' < "$tmpdepfile" | +## Some versions of gcc put a space before the `:'. On the theory +## that the space means something, we add a space to the output as +## well. +## Some versions of the HPUX 10.20 sed can't process this invocation +## correctly. Breaking it into two sed invocations is a workaround. + sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile" + rm -f "$tmpdepfile" + ;; + +hp) + # This case exists only to let depend.m4 do its work. It works by + # looking at the text of this script. This case will never be run, + # since it is checked for above. + exit 1 + ;; + +sgi) + if test "$libtool" = yes; then + "$@" "-Wp,-MDupdate,$tmpdepfile" + else + "$@" -MDupdate "$tmpdepfile" + fi + stat=$? + if test $stat -eq 0; then : + else + rm -f "$tmpdepfile" + exit $stat + fi + rm -f "$depfile" + + if test -f "$tmpdepfile"; then # yes, the sourcefile depend on other files + echo "$object : \\" > "$depfile" + + # Clip off the initial element (the dependent). Don't try to be + # clever and replace this with sed code, as IRIX sed won't handle + # lines with more than a fixed number of characters (4096 in + # IRIX 6.2 sed, 8192 in IRIX 6.5). We also remove comment lines; + # the IRIX cc adds comments like `#:fec' to the end of the + # dependency line. + tr ' ' ' +' < "$tmpdepfile" \ + | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' | \ + tr ' +' ' ' >> $depfile + echo >> $depfile + + # The second pass generates a dummy entry for each header file. + tr ' ' ' +' < "$tmpdepfile" \ + | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \ + >> $depfile + else + # The sourcefile does not contain any dependencies, so just + # store a dummy comment line, to avoid errors with the Makefile + # "include basename.Plo" scheme. + echo "#dummy" > "$depfile" + fi + rm -f "$tmpdepfile" + ;; + +aix) + # The C for AIX Compiler uses -M and outputs the dependencies + # in a .u file. In older versions, this file always lives in the + # current directory. Also, the AIX compiler puts `$object:' at the + # start of each line; $object doesn't have directory information. + # Version 6 uses the directory in both cases. + dir=`echo "$object" | sed -e 's|/[^/]*$|/|'` + test "x$dir" = "x$object" && dir= + base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'` + if test "$libtool" = yes; then + tmpdepfile1=$dir$base.u + tmpdepfile2=$base.u + tmpdepfile3=$dir.libs/$base.u + "$@" -Wc,-M + else + tmpdepfile1=$dir$base.u + tmpdepfile2=$dir$base.u + tmpdepfile3=$dir$base.u + "$@" -M + fi + stat=$? + + if test $stat -eq 0; then : + else + rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" + exit $stat + fi + + for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" + do + test -f "$tmpdepfile" && break + done + if test -f "$tmpdepfile"; then + # Each line is of the form `foo.o: dependent.h'. + # Do two passes, one to just change these to + # `$object: dependent.h' and one to simply `dependent.h:'. + sed -e "s,^.*\.[a-z]*:,$object:," < "$tmpdepfile" > "$depfile" + # That's a tab and a space in the []. + sed -e 's,^.*\.[a-z]*:[ ]*,,' -e 's,$,:,' < "$tmpdepfile" >> "$depfile" + else + # The sourcefile does not contain any dependencies, so just + # store a dummy comment line, to avoid errors with the Makefile + # "include basename.Plo" scheme. + echo "#dummy" > "$depfile" + fi + rm -f "$tmpdepfile" + ;; + +icc) + # Intel's C compiler understands `-MD -MF file'. However on + # icc -MD -MF foo.d -c -o sub/foo.o sub/foo.c + # ICC 7.0 will fill foo.d with something like + # foo.o: sub/foo.c + # foo.o: sub/foo.h + # which is wrong. We want: + # sub/foo.o: sub/foo.c + # sub/foo.o: sub/foo.h + # sub/foo.c: + # sub/foo.h: + # ICC 7.1 will output + # foo.o: sub/foo.c sub/foo.h + # and will wrap long lines using \ : + # foo.o: sub/foo.c ... \ + # sub/foo.h ... \ + # ... + + "$@" -MD -MF "$tmpdepfile" + stat=$? + if test $stat -eq 0; then : + else + rm -f "$tmpdepfile" + exit $stat + fi + rm -f "$depfile" + # Each line is of the form `foo.o: dependent.h', + # or `foo.o: dep1.h dep2.h \', or ` dep3.h dep4.h \'. + # Do two passes, one to just change these to + # `$object: dependent.h' and one to simply `dependent.h:'. + sed "s,^[^:]*:,$object :," < "$tmpdepfile" > "$depfile" + # Some versions of the HPUX 10.20 sed can't process this invocation + # correctly. Breaking it into two sed invocations is a workaround. + sed 's,^[^:]*: \(.*\)$,\1,;s/^\\$//;/^$/d;/:$/d' < "$tmpdepfile" | + sed -e 's/$/ :/' >> "$depfile" + rm -f "$tmpdepfile" + ;; + +hp2) + # The "hp" stanza above does not work with aCC (C++) and HP's ia64 + # compilers, which have integrated preprocessors. The correct option + # to use with these is +Maked; it writes dependencies to a file named + # 'foo.d', which lands next to the object file, wherever that + # happens to be. + # Much of this is similar to the tru64 case; see comments there. + dir=`echo "$object" | sed -e 's|/[^/]*$|/|'` + test "x$dir" = "x$object" && dir= + base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'` + if test "$libtool" = yes; then + tmpdepfile1=$dir$base.d + tmpdepfile2=$dir.libs/$base.d + "$@" -Wc,+Maked + else + tmpdepfile1=$dir$base.d + tmpdepfile2=$dir$base.d + "$@" +Maked + fi + stat=$? + if test $stat -eq 0; then : + else + rm -f "$tmpdepfile1" "$tmpdepfile2" + exit $stat + fi + + for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" + do + test -f "$tmpdepfile" && break + done + if test -f "$tmpdepfile"; then + sed -e "s,^.*\.[a-z]*:,$object:," "$tmpdepfile" > "$depfile" + # Add `dependent.h:' lines. + sed -ne '2,${; s/^ *//; s/ \\*$//; s/$/:/; p;}' "$tmpdepfile" >> "$depfile" + else + echo "#dummy" > "$depfile" + fi + rm -f "$tmpdepfile" "$tmpdepfile2" + ;; + +tru64) + # The Tru64 compiler uses -MD to generate dependencies as a side + # effect. `cc -MD -o foo.o ...' puts the dependencies into `foo.o.d'. + # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put + # dependencies in `foo.d' instead, so we check for that too. + # Subdirectories are respected. + dir=`echo "$object" | sed -e 's|/[^/]*$|/|'` + test "x$dir" = "x$object" && dir= + base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'` + + if test "$libtool" = yes; then + # With Tru64 cc, shared objects can also be used to make a + # static library. This mechanism is used in libtool 1.4 series to + # handle both shared and static libraries in a single compilation. + # With libtool 1.4, dependencies were output in $dir.libs/$base.lo.d. + # + # With libtool 1.5 this exception was removed, and libtool now + # generates 2 separate objects for the 2 libraries. These two + # compilations output dependencies in $dir.libs/$base.o.d and + # in $dir$base.o.d. We have to check for both files, because + # one of the two compilations can be disabled. We should prefer + # $dir$base.o.d over $dir.libs/$base.o.d because the latter is + # automatically cleaned when .libs/ is deleted, while ignoring + # the former would cause a distcleancheck panic. + tmpdepfile1=$dir.libs/$base.lo.d # libtool 1.4 + tmpdepfile2=$dir$base.o.d # libtool 1.5 + tmpdepfile3=$dir.libs/$base.o.d # libtool 1.5 + tmpdepfile4=$dir.libs/$base.d # Compaq CCC V6.2-504 + "$@" -Wc,-MD + else + tmpdepfile1=$dir$base.o.d + tmpdepfile2=$dir$base.d + tmpdepfile3=$dir$base.d + tmpdepfile4=$dir$base.d + "$@" -MD + fi + + stat=$? + if test $stat -eq 0; then : + else + rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" "$tmpdepfile4" + exit $stat + fi + + for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" "$tmpdepfile4" + do + test -f "$tmpdepfile" && break + done + if test -f "$tmpdepfile"; then + sed -e "s,^.*\.[a-z]*:,$object:," < "$tmpdepfile" > "$depfile" + # That's a tab and a space in the []. + sed -e 's,^.*\.[a-z]*:[ ]*,,' -e 's,$,:,' < "$tmpdepfile" >> "$depfile" + else + echo "#dummy" > "$depfile" + fi + rm -f "$tmpdepfile" + ;; + +#nosideeffect) + # This comment above is used by automake to tell side-effect + # dependency tracking mechanisms from slower ones. + +dashmstdout) + # Important note: in order to support this mode, a compiler *must* + # always write the preprocessed file to stdout, regardless of -o. + "$@" || exit $? + + # Remove the call to Libtool. + if test "$libtool" = yes; then + while test $1 != '--mode=compile'; do + shift + done + shift + fi + + # Remove `-o $object'. + IFS=" " + for arg + do + case $arg in + -o) + shift + ;; + $object) + shift + ;; + *) + set fnord "$@" "$arg" + shift # fnord + shift # $arg + ;; + esac + done + + test -z "$dashmflag" && dashmflag=-M + # Require at least two characters before searching for `:' + # in the target name. This is to cope with DOS-style filenames: + # a dependency such as `c:/foo/bar' could be seen as target `c' otherwise. + "$@" $dashmflag | + sed 's:^[ ]*[^: ][^:][^:]*\:[ ]*:'"$object"'\: :' > "$tmpdepfile" + rm -f "$depfile" + cat < "$tmpdepfile" > "$depfile" + tr ' ' ' +' < "$tmpdepfile" | \ +## Some versions of the HPUX 10.20 sed can't process this invocation +## correctly. Breaking it into two sed invocations is a workaround. + sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile" + rm -f "$tmpdepfile" + ;; + +dashXmstdout) + # This case only exists to satisfy depend.m4. It is never actually + # run, as this mode is specially recognized in the preamble. + exit 1 + ;; + +makedepend) + "$@" || exit $? + # Remove any Libtool call + if test "$libtool" = yes; then + while test $1 != '--mode=compile'; do + shift + done + shift + fi + # X makedepend + shift + cleared=no + for arg in "$@"; do + case $cleared in + no) + set ""; shift + cleared=yes ;; + esac + case "$arg" in + -D*|-I*) + set fnord "$@" "$arg"; shift ;; + # Strip any option that makedepend may not understand. Remove + # the object too, otherwise makedepend will parse it as a source file. + -*|$object) + ;; + *) + set fnord "$@" "$arg"; shift ;; + esac + done + obj_suffix="`echo $object | sed 's/^.*\././'`" + touch "$tmpdepfile" + ${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@" + rm -f "$depfile" + cat < "$tmpdepfile" > "$depfile" + sed '1,2d' "$tmpdepfile" | tr ' ' ' +' | \ +## Some versions of the HPUX 10.20 sed can't process this invocation +## correctly. Breaking it into two sed invocations is a workaround. + sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile" + rm -f "$tmpdepfile" "$tmpdepfile".bak + ;; + +cpp) + # Important note: in order to support this mode, a compiler *must* + # always write the preprocessed file to stdout. + "$@" || exit $? + + # Remove the call to Libtool. + if test "$libtool" = yes; then + while test $1 != '--mode=compile'; do + shift + done + shift + fi + + # Remove `-o $object'. + IFS=" " + for arg + do + case $arg in + -o) + shift + ;; + $object) + shift + ;; + *) + set fnord "$@" "$arg" + shift # fnord + shift # $arg + ;; + esac + done + + "$@" -E | + sed -n -e '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \ + -e '/^#line [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' | + sed '$ s: \\$::' > "$tmpdepfile" + rm -f "$depfile" + echo "$object : \\" > "$depfile" + cat < "$tmpdepfile" >> "$depfile" + sed < "$tmpdepfile" '/^$/d;s/^ //;s/ \\$//;s/$/ :/' >> "$depfile" + rm -f "$tmpdepfile" + ;; + +msvisualcpp) + # Important note: in order to support this mode, a compiler *must* + # always write the preprocessed file to stdout, regardless of -o, + # because we must use -o when running libtool. + "$@" || exit $? + IFS=" " + for arg + do + case "$arg" in + "-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI") + set fnord "$@" + shift + shift + ;; + *) + set fnord "$@" "$arg" + shift + shift + ;; + esac + done + "$@" -E | + sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::echo "`cygpath -u \\"\1\\"`":p' | sort | uniq > "$tmpdepfile" + rm -f "$depfile" + echo "$object : \\" > "$depfile" + . "$tmpdepfile" | sed 's% %\\ %g' | sed -n '/^\(.*\)$/ s:: \1 \\:p' >> "$depfile" + echo " " >> "$depfile" + . "$tmpdepfile" | sed 's% %\\ %g' | sed -n '/^\(.*\)$/ s::\1\::p' >> "$depfile" + rm -f "$tmpdepfile" + ;; + +none) + exec "$@" + ;; + +*) + echo "Unknown depmode $depmode" 1>&2 + exit 1 + ;; +esac + +exit 0 + +# Local Variables: +# mode: shell-script +# sh-indentation: 2 +# eval: (add-hook 'write-file-hooks 'time-stamp) +# time-stamp-start: "scriptversion=" +# time-stamp-format: "%:y-%02m-%02d.%02H" +# time-stamp-end: "$" +# End: diff --git a/clan/autoconf/missing b/clan/autoconf/missing new file mode 100755 index 0000000..1c8ff70 --- /dev/null +++ b/clan/autoconf/missing @@ -0,0 +1,367 @@ +#! /bin/sh +# Common stub for a few missing GNU programs while installing. + +scriptversion=2006-05-10.23 + +# Copyright (C) 1996, 1997, 1999, 2000, 2002, 2003, 2004, 2005, 2006 +# Free Software Foundation, Inc. +# Originally by Fran,cois Pinard , 1996. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA +# 02110-1301, USA. + +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + +if test $# -eq 0; then + echo 1>&2 "Try \`$0 --help' for more information" + exit 1 +fi + +run=: +sed_output='s/.* --output[ =]\([^ ]*\).*/\1/p' +sed_minuso='s/.* -o \([^ ]*\).*/\1/p' + +# In the cases where this matters, `missing' is being run in the +# srcdir already. +if test -f configure.ac; then + configure_ac=configure.ac +else + configure_ac=configure.in +fi + +msg="missing on your system" + +case $1 in +--run) + # Try to run requested program, and just exit if it succeeds. + run= + shift + "$@" && exit 0 + # Exit code 63 means version mismatch. This often happens + # when the user try to use an ancient version of a tool on + # a file that requires a minimum version. In this case we + # we should proceed has if the program had been absent, or + # if --run hadn't been passed. + if test $? = 63; then + run=: + msg="probably too old" + fi + ;; + + -h|--h|--he|--hel|--help) + echo "\ +$0 [OPTION]... PROGRAM [ARGUMENT]... + +Handle \`PROGRAM [ARGUMENT]...' for when PROGRAM is missing, or return an +error status if there is no known handling for PROGRAM. + +Options: + -h, --help display this help and exit + -v, --version output version information and exit + --run try to run the given command, and emulate it if it fails + +Supported PROGRAM values: + aclocal touch file \`aclocal.m4' + autoconf touch file \`configure' + autoheader touch file \`config.h.in' + autom4te touch the output file, or create a stub one + automake touch all \`Makefile.in' files + bison create \`y.tab.[ch]', if possible, from existing .[ch] + flex create \`lex.yy.c', if possible, from existing .c + help2man touch the output file + lex create \`lex.yy.c', if possible, from existing .c + makeinfo touch the output file + tar try tar, gnutar, gtar, then tar without non-portable flags + yacc create \`y.tab.[ch]', if possible, from existing .[ch] + +Send bug reports to ." + exit $? + ;; + + -v|--v|--ve|--ver|--vers|--versi|--versio|--version) + echo "missing $scriptversion (GNU Automake)" + exit $? + ;; + + -*) + echo 1>&2 "$0: Unknown \`$1' option" + echo 1>&2 "Try \`$0 --help' for more information" + exit 1 + ;; + +esac + +# Now exit if we have it, but it failed. Also exit now if we +# don't have it and --version was passed (most likely to detect +# the program). +case $1 in + lex|yacc) + # Not GNU programs, they don't have --version. + ;; + + tar) + if test -n "$run"; then + echo 1>&2 "ERROR: \`tar' requires --run" + exit 1 + elif test "x$2" = "x--version" || test "x$2" = "x--help"; then + exit 1 + fi + ;; + + *) + if test -z "$run" && ($1 --version) > /dev/null 2>&1; then + # We have it, but it failed. + exit 1 + elif test "x$2" = "x--version" || test "x$2" = "x--help"; then + # Could not run --version or --help. This is probably someone + # running `$TOOL --version' or `$TOOL --help' to check whether + # $TOOL exists and not knowing $TOOL uses missing. + exit 1 + fi + ;; +esac + +# If it does not exist, or fails to run (possibly an outdated version), +# try to emulate it. +case $1 in + aclocal*) + echo 1>&2 "\ +WARNING: \`$1' is $msg. You should only need it if + you modified \`acinclude.m4' or \`${configure_ac}'. You might want + to install the \`Automake' and \`Perl' packages. Grab them from + any GNU archive site." + touch aclocal.m4 + ;; + + autoconf) + echo 1>&2 "\ +WARNING: \`$1' is $msg. You should only need it if + you modified \`${configure_ac}'. You might want to install the + \`Autoconf' and \`GNU m4' packages. Grab them from any GNU + archive site." + touch configure + ;; + + autoheader) + echo 1>&2 "\ +WARNING: \`$1' is $msg. You should only need it if + you modified \`acconfig.h' or \`${configure_ac}'. You might want + to install the \`Autoconf' and \`GNU m4' packages. Grab them + from any GNU archive site." + files=`sed -n 's/^[ ]*A[CM]_CONFIG_HEADER(\([^)]*\)).*/\1/p' ${configure_ac}` + test -z "$files" && files="config.h" + touch_files= + for f in $files; do + case $f in + *:*) touch_files="$touch_files "`echo "$f" | + sed -e 's/^[^:]*://' -e 's/:.*//'`;; + *) touch_files="$touch_files $f.in";; + esac + done + touch $touch_files + ;; + + automake*) + echo 1>&2 "\ +WARNING: \`$1' is $msg. You should only need it if + you modified \`Makefile.am', \`acinclude.m4' or \`${configure_ac}'. + You might want to install the \`Automake' and \`Perl' packages. + Grab them from any GNU archive site." + find . -type f -name Makefile.am -print | + sed 's/\.am$/.in/' | + while read f; do touch "$f"; done + ;; + + autom4te) + echo 1>&2 "\ +WARNING: \`$1' is needed, but is $msg. + You might have modified some files without having the + proper tools for further handling them. + You can get \`$1' as part of \`Autoconf' from any GNU + archive site." + + file=`echo "$*" | sed -n "$sed_output"` + test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"` + if test -f "$file"; then + touch $file + else + test -z "$file" || exec >$file + echo "#! /bin/sh" + echo "# Created by GNU Automake missing as a replacement of" + echo "# $ $@" + echo "exit 0" + chmod +x $file + exit 1 + fi + ;; + + bison|yacc) + echo 1>&2 "\ +WARNING: \`$1' $msg. You should only need it if + you modified a \`.y' file. You may need the \`Bison' package + in order for those modifications to take effect. You can get + \`Bison' from any GNU archive site." + rm -f y.tab.c y.tab.h + if test $# -ne 1; then + eval LASTARG="\${$#}" + case $LASTARG in + *.y) + SRCFILE=`echo "$LASTARG" | sed 's/y$/c/'` + if test -f "$SRCFILE"; then + cp "$SRCFILE" y.tab.c + fi + SRCFILE=`echo "$LASTARG" | sed 's/y$/h/'` + if test -f "$SRCFILE"; then + cp "$SRCFILE" y.tab.h + fi + ;; + esac + fi + if test ! -f y.tab.h; then + echo >y.tab.h + fi + if test ! -f y.tab.c; then + echo 'main() { return 0; }' >y.tab.c + fi + ;; + + lex|flex) + echo 1>&2 "\ +WARNING: \`$1' is $msg. You should only need it if + you modified a \`.l' file. You may need the \`Flex' package + in order for those modifications to take effect. You can get + \`Flex' from any GNU archive site." + rm -f lex.yy.c + if test $# -ne 1; then + eval LASTARG="\${$#}" + case $LASTARG in + *.l) + SRCFILE=`echo "$LASTARG" | sed 's/l$/c/'` + if test -f "$SRCFILE"; then + cp "$SRCFILE" lex.yy.c + fi + ;; + esac + fi + if test ! -f lex.yy.c; then + echo 'main() { return 0; }' >lex.yy.c + fi + ;; + + help2man) + echo 1>&2 "\ +WARNING: \`$1' is $msg. You should only need it if + you modified a dependency of a manual page. You may need the + \`Help2man' package in order for those modifications to take + effect. You can get \`Help2man' from any GNU archive site." + + file=`echo "$*" | sed -n "$sed_output"` + test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"` + if test -f "$file"; then + touch $file + else + test -z "$file" || exec >$file + echo ".ab help2man is required to generate this page" + exit 1 + fi + ;; + + makeinfo) + echo 1>&2 "\ +WARNING: \`$1' is $msg. You should only need it if + you modified a \`.texi' or \`.texinfo' file, or any other file + indirectly affecting the aspect of the manual. The spurious + call might also be the consequence of using a buggy \`make' (AIX, + DU, IRIX). You might want to install the \`Texinfo' package or + the \`GNU make' package. Grab either from any GNU archive site." + # The file to touch is that specified with -o ... + file=`echo "$*" | sed -n "$sed_output"` + test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"` + if test -z "$file"; then + # ... or it is the one specified with @setfilename ... + infile=`echo "$*" | sed 's/.* \([^ ]*\) *$/\1/'` + file=`sed -n ' + /^@setfilename/{ + s/.* \([^ ]*\) *$/\1/ + p + q + }' $infile` + # ... or it is derived from the source name (dir/f.texi becomes f.info) + test -z "$file" && file=`echo "$infile" | sed 's,.*/,,;s,.[^.]*$,,'`.info + fi + # If the file does not exist, the user really needs makeinfo; + # let's fail without touching anything. + test -f $file || exit 1 + touch $file + ;; + + tar) + shift + + # We have already tried tar in the generic part. + # Look for gnutar/gtar before invocation to avoid ugly error + # messages. + if (gnutar --version > /dev/null 2>&1); then + gnutar "$@" && exit 0 + fi + if (gtar --version > /dev/null 2>&1); then + gtar "$@" && exit 0 + fi + firstarg="$1" + if shift; then + case $firstarg in + *o*) + firstarg=`echo "$firstarg" | sed s/o//` + tar "$firstarg" "$@" && exit 0 + ;; + esac + case $firstarg in + *h*) + firstarg=`echo "$firstarg" | sed s/h//` + tar "$firstarg" "$@" && exit 0 + ;; + esac + fi + + echo 1>&2 "\ +WARNING: I can't seem to be able to run \`tar' with the given arguments. + You may want to install GNU tar or Free paxutils, or check the + command line arguments." + exit 1 + ;; + + *) + echo 1>&2 "\ +WARNING: \`$1' is needed, and is $msg. + You might have modified some files without having the + proper tools for further handling them. Check the \`README' file, + it often tells you about the needed prerequisites for installing + this package. You may also peek at any GNU archive site, in case + some other package would contain this missing \`$1' program." + exit 1 + ;; +esac + +exit 0 + +# Local variables: +# eval: (add-hook 'write-file-hooks 'time-stamp) +# time-stamp-start: "scriptversion=" +# time-stamp-format: "%:y-%02m-%02d.%02H" +# time-stamp-end: "$" +# End: diff --git a/clan/autoconf/texinfo.tex b/clan/autoconf/texinfo.tex new file mode 100644 index 0000000..d2b264d --- /dev/null +++ b/clan/autoconf/texinfo.tex @@ -0,0 +1,8962 @@ +% texinfo.tex -- TeX macros to handle Texinfo files. +% +% Load plain if necessary, i.e., if running under initex. +\expandafter\ifx\csname fmtname\endcsname\relax\input plain\fi +% +\def\texinfoversion{2007-12-02.17} +% +% Copyright (C) 1985, 1986, 1988, 1990, 1991, 1992, 1993, 1994, 1995, 2007, +% 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, +% 2007 Free Software Foundation, Inc. +% +% This texinfo.tex file is free software: you can redistribute it and/or +% modify it under the terms of the GNU General Public License as +% published by the Free Software Foundation, either version 3 of the +% License, or (at your option) any later version. +% +% This texinfo.tex file is distributed in the hope that it will be +% useful, but WITHOUT ANY WARRANTY; without even the implied warranty +% of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +% General Public License for more details. +% +% You should have received a copy of the GNU General Public License +% along with this program. If not, see . +% +% As a special exception, when this file is read by TeX when processing +% a Texinfo source document, you may use the result without +% restriction. (This has been our intent since Texinfo was invented.) +% +% Please try the latest version of texinfo.tex before submitting bug +% reports; you can get the latest version from: +% http://www.gnu.org/software/texinfo/ (the Texinfo home page), or +% ftp://tug.org/tex/texinfo.tex +% (and all CTAN mirrors, see http://www.ctan.org). +% The texinfo.tex in any given distribution could well be out +% of date, so if that's what you're using, please check. +% +% Send bug reports to bug-texinfo@gnu.org. Please include including a +% complete document in each bug report with which we can reproduce the +% problem. Patches are, of course, greatly appreciated. +% +% To process a Texinfo manual with TeX, it's most reliable to use the +% texi2dvi shell script that comes with the distribution. For a simple +% manual foo.texi, however, you can get away with this: +% tex foo.texi +% texindex foo.?? +% tex foo.texi +% tex foo.texi +% dvips foo.dvi -o # or whatever; this makes foo.ps. +% The extra TeX runs get the cross-reference information correct. +% Sometimes one run after texindex suffices, and sometimes you need more +% than two; texi2dvi does it as many times as necessary. +% +% It is possible to adapt texinfo.tex for other languages, to some +% extent. You can get the existing language-specific files from the +% full Texinfo distribution. +% +% The GNU Texinfo home page is http://www.gnu.org/software/texinfo. + + +\message{Loading texinfo [version \texinfoversion]:} + +% If in a .fmt file, print the version number +% and turn on active characters that we couldn't do earlier because +% they might have appeared in the input file name. +\everyjob{\message{[Texinfo version \texinfoversion]}% + \catcode`+=\active \catcode`\_=\active} + + +\chardef\other=12 + +% We never want plain's \outer definition of \+ in Texinfo. +% For @tex, we can use \tabalign. +\let\+ = \relax + +% Save some plain tex macros whose names we will redefine. +\let\ptexb=\b +\let\ptexbullet=\bullet +\let\ptexc=\c +\let\ptexcomma=\, +\let\ptexdot=\. +\let\ptexdots=\dots +\let\ptexend=\end +\let\ptexequiv=\equiv +\let\ptexexclam=\! +\let\ptexfootnote=\footnote +\let\ptexgtr=> +\let\ptexhat=^ +\let\ptexi=\i +\let\ptexindent=\indent +\let\ptexinsert=\insert +\let\ptexlbrace=\{ +\let\ptexless=< +\let\ptexnewwrite\newwrite +\let\ptexnoindent=\noindent +\let\ptexplus=+ +\let\ptexrbrace=\} +\let\ptexslash=\/ +\let\ptexstar=\* +\let\ptext=\t + +% If this character appears in an error message or help string, it +% starts a new line in the output. +\newlinechar = `^^J + +% Use TeX 3.0's \inputlineno to get the line number, for better error +% messages, but if we're using an old version of TeX, don't do anything. +% +\ifx\inputlineno\thisisundefined + \let\linenumber = \empty % Pre-3.0. +\else + \def\linenumber{l.\the\inputlineno:\space} +\fi + +% Set up fixed words for English if not already set. +\ifx\putwordAppendix\undefined \gdef\putwordAppendix{Appendix}\fi +\ifx\putwordChapter\undefined \gdef\putwordChapter{Chapter}\fi +\ifx\putwordfile\undefined \gdef\putwordfile{file}\fi +\ifx\putwordin\undefined \gdef\putwordin{in}\fi +\ifx\putwordIndexIsEmpty\undefined \gdef\putwordIndexIsEmpty{(Index is empty)}\fi +\ifx\putwordIndexNonexistent\undefined \gdef\putwordIndexNonexistent{(Index is nonexistent)}\fi +\ifx\putwordInfo\undefined \gdef\putwordInfo{Info}\fi +\ifx\putwordInstanceVariableof\undefined \gdef\putwordInstanceVariableof{Instance Variable of}\fi +\ifx\putwordMethodon\undefined \gdef\putwordMethodon{Method on}\fi +\ifx\putwordNoTitle\undefined \gdef\putwordNoTitle{No Title}\fi +\ifx\putwordof\undefined \gdef\putwordof{of}\fi +\ifx\putwordon\undefined \gdef\putwordon{on}\fi +\ifx\putwordpage\undefined \gdef\putwordpage{page}\fi +\ifx\putwordsection\undefined \gdef\putwordsection{section}\fi +\ifx\putwordSection\undefined \gdef\putwordSection{Section}\fi +\ifx\putwordsee\undefined \gdef\putwordsee{see}\fi +\ifx\putwordSee\undefined \gdef\putwordSee{See}\fi +\ifx\putwordShortTOC\undefined \gdef\putwordShortTOC{Short Contents}\fi +\ifx\putwordTOC\undefined \gdef\putwordTOC{Table of Contents}\fi +% +\ifx\putwordMJan\undefined \gdef\putwordMJan{January}\fi +\ifx\putwordMFeb\undefined \gdef\putwordMFeb{February}\fi +\ifx\putwordMMar\undefined \gdef\putwordMMar{March}\fi +\ifx\putwordMApr\undefined \gdef\putwordMApr{April}\fi +\ifx\putwordMMay\undefined \gdef\putwordMMay{May}\fi +\ifx\putwordMJun\undefined \gdef\putwordMJun{June}\fi +\ifx\putwordMJul\undefined \gdef\putwordMJul{July}\fi +\ifx\putwordMAug\undefined \gdef\putwordMAug{August}\fi +\ifx\putwordMSep\undefined \gdef\putwordMSep{September}\fi +\ifx\putwordMOct\undefined \gdef\putwordMOct{October}\fi +\ifx\putwordMNov\undefined \gdef\putwordMNov{November}\fi +\ifx\putwordMDec\undefined \gdef\putwordMDec{December}\fi +% +\ifx\putwordDefmac\undefined \gdef\putwordDefmac{Macro}\fi +\ifx\putwordDefspec\undefined \gdef\putwordDefspec{Special Form}\fi +\ifx\putwordDefvar\undefined \gdef\putwordDefvar{Variable}\fi +\ifx\putwordDefopt\undefined \gdef\putwordDefopt{User Option}\fi +\ifx\putwordDeffunc\undefined \gdef\putwordDeffunc{Function}\fi + +% Since the category of space is not known, we have to be careful. +\chardef\spacecat = 10 +\def\spaceisspace{\catcode`\ =\spacecat} + +% sometimes characters are active, so we need control sequences. +\chardef\colonChar = `\: +\chardef\commaChar = `\, +\chardef\dashChar = `\- +\chardef\dotChar = `\. +\chardef\exclamChar= `\! +\chardef\lquoteChar= `\` +\chardef\questChar = `\? +\chardef\rquoteChar= `\' +\chardef\semiChar = `\; +\chardef\underChar = `\_ + +% Ignore a token. +% +\def\gobble#1{} + +% The following is used inside several \edef's. +\def\makecsname#1{\expandafter\noexpand\csname#1\endcsname} + +% Hyphenation fixes. +\hyphenation{ + Flor-i-da Ghost-script Ghost-view Mac-OS Post-Script + ap-pen-dix bit-map bit-maps + data-base data-bases eshell fall-ing half-way long-est man-u-script + man-u-scripts mini-buf-fer mini-buf-fers over-view par-a-digm + par-a-digms rath-er rec-tan-gu-lar ro-bot-ics se-vere-ly set-up spa-ces + spell-ing spell-ings + stand-alone strong-est time-stamp time-stamps which-ever white-space + wide-spread wrap-around +} + +% Margin to add to right of even pages, to left of odd pages. +\newdimen\bindingoffset +\newdimen\normaloffset +\newdimen\pagewidth \newdimen\pageheight + +% For a final copy, take out the rectangles +% that mark overfull boxes (in case you have decided +% that the text looks ok even though it passes the margin). +% +\def\finalout{\overfullrule=0pt} + +% @| inserts a changebar to the left of the current line. It should +% surround any changed text. This approach does *not* work if the +% change spans more than two lines of output. To handle that, we would +% have adopt a much more difficult approach (putting marks into the main +% vertical list for the beginning and end of each change). +% +\def\|{% + % \vadjust can only be used in horizontal mode. + \leavevmode + % + % Append this vertical mode material after the current line in the output. + \vadjust{% + % We want to insert a rule with the height and depth of the current + % leading; that is exactly what \strutbox is supposed to record. + \vskip-\baselineskip + % + % \vadjust-items are inserted at the left edge of the type. So + % the \llap here moves out into the left-hand margin. + \llap{% + % + % For a thicker or thinner bar, change the `1pt'. + \vrule height\baselineskip width1pt + % + % This is the space between the bar and the text. + \hskip 12pt + }% + }% +} + +% Sometimes it is convenient to have everything in the transcript file +% and nothing on the terminal. We don't just call \tracingall here, +% since that produces some useless output on the terminal. We also make +% some effort to order the tracing commands to reduce output in the log +% file; cf. trace.sty in LaTeX. +% +\def\gloggingall{\begingroup \globaldefs = 1 \loggingall \endgroup}% +\def\loggingall{% + \tracingstats2 + \tracingpages1 + \tracinglostchars2 % 2 gives us more in etex + \tracingparagraphs1 + \tracingoutput1 + \tracingmacros2 + \tracingrestores1 + \showboxbreadth\maxdimen \showboxdepth\maxdimen + \ifx\eTeXversion\undefined\else % etex gives us more logging + \tracingscantokens1 + \tracingifs1 + \tracinggroups1 + \tracingnesting2 + \tracingassigns1 + \fi + \tracingcommands3 % 3 gives us more in etex + \errorcontextlines16 +}% + +% add check for \lastpenalty to plain's definitions. If the last thing +% we did was a \nobreak, we don't want to insert more space. +% +\def\smallbreak{\ifnum\lastpenalty<10000\par\ifdim\lastskip<\smallskipamount + \removelastskip\penalty-50\smallskip\fi\fi} +\def\medbreak{\ifnum\lastpenalty<10000\par\ifdim\lastskip<\medskipamount + \removelastskip\penalty-100\medskip\fi\fi} +\def\bigbreak{\ifnum\lastpenalty<10000\par\ifdim\lastskip<\bigskipamount + \removelastskip\penalty-200\bigskip\fi\fi} + +% For @cropmarks command. +% Do @cropmarks to get crop marks. +% +\newif\ifcropmarks +\let\cropmarks = \cropmarkstrue +% +% Dimensions to add cropmarks at corners. +% Added by P. A. MacKay, 12 Nov. 1986 +% +\newdimen\outerhsize \newdimen\outervsize % set by the paper size routines +\newdimen\cornerlong \cornerlong=1pc +\newdimen\cornerthick \cornerthick=.3pt +\newdimen\topandbottommargin \topandbottommargin=.75in + +% Output a mark which sets \thischapter, \thissection and \thiscolor. +% We dump everything together because we only have one kind of mark. +% This works because we only use \botmark / \topmark, not \firstmark. +% +% A mark contains a subexpression of the \ifcase ... \fi construct. +% \get*marks macros below extract the needed part using \ifcase. +% +% Another complication is to let the user choose whether \thischapter +% (\thissection) refers to the chapter (section) in effect at the top +% of a page, or that at the bottom of a page. The solution is +% described on page 260 of The TeXbook. It involves outputting two +% marks for the sectioning macros, one before the section break, and +% one after. I won't pretend I can describe this better than DEK... +\def\domark{% + \toks0=\expandafter{\lastchapterdefs}% + \toks2=\expandafter{\lastsectiondefs}% + \toks4=\expandafter{\prevchapterdefs}% + \toks6=\expandafter{\prevsectiondefs}% + \toks8=\expandafter{\lastcolordefs}% + \mark{% + \the\toks0 \the\toks2 + \noexpand\or \the\toks4 \the\toks6 + \noexpand\else \the\toks8 + }% +} +% \topmark doesn't work for the very first chapter (after the title +% page or the contents), so we use \firstmark there -- this gets us +% the mark with the chapter defs, unless the user sneaks in, e.g., +% @setcolor (or @url, or @link, etc.) between @contents and the very +% first @chapter. +\def\gettopheadingmarks{% + \ifcase0\topmark\fi + \ifx\thischapter\empty \ifcase0\firstmark\fi \fi +} +\def\getbottomheadingmarks{\ifcase1\botmark\fi} +\def\getcolormarks{\ifcase2\topmark\fi} + +% Avoid "undefined control sequence" errors. +\def\lastchapterdefs{} +\def\lastsectiondefs{} +\def\prevchapterdefs{} +\def\prevsectiondefs{} +\def\lastcolordefs{} + +% Main output routine. +\chardef\PAGE = 255 +\output = {\onepageout{\pagecontents\PAGE}} + +\newbox\headlinebox +\newbox\footlinebox + +% \onepageout takes a vbox as an argument. Note that \pagecontents +% does insertions, but you have to call it yourself. +\def\onepageout#1{% + \ifcropmarks \hoffset=0pt \else \hoffset=\normaloffset \fi + % + \ifodd\pageno \advance\hoffset by \bindingoffset + \else \advance\hoffset by -\bindingoffset\fi + % + % Do this outside of the \shipout so @code etc. will be expanded in + % the headline as they should be, not taken literally (outputting ''code). + \ifodd\pageno \getoddheadingmarks \else \getevenheadingmarks \fi + \setbox\headlinebox = \vbox{\let\hsize=\pagewidth \makeheadline}% + \ifodd\pageno \getoddfootingmarks \else \getevenfootingmarks \fi + \setbox\footlinebox = \vbox{\let\hsize=\pagewidth \makefootline}% + % + {% + % Have to do this stuff outside the \shipout because we want it to + % take effect in \write's, yet the group defined by the \vbox ends + % before the \shipout runs. + % + \indexdummies % don't expand commands in the output. + \normalturnoffactive % \ in index entries must not stay \, e.g., if + % the page break happens to be in the middle of an example. + % We don't want .vr (or whatever) entries like this: + % \entry{{\tt \indexbackslash }acronym}{32}{\code {\acronym}} + % "\acronym" won't work when it's read back in; + % it needs to be + % {\code {{\tt \backslashcurfont }acronym} + \shipout\vbox{% + % Do this early so pdf references go to the beginning of the page. + \ifpdfmakepagedest \pdfdest name{\the\pageno} xyz\fi + % + \ifcropmarks \vbox to \outervsize\bgroup + \hsize = \outerhsize + \vskip-\topandbottommargin + \vtop to0pt{% + \line{\ewtop\hfil\ewtop}% + \nointerlineskip + \line{% + \vbox{\moveleft\cornerthick\nstop}% + \hfill + \vbox{\moveright\cornerthick\nstop}% + }% + \vss}% + \vskip\topandbottommargin + \line\bgroup + \hfil % center the page within the outer (page) hsize. + \ifodd\pageno\hskip\bindingoffset\fi + \vbox\bgroup + \fi + % + \unvbox\headlinebox + \pagebody{#1}% + \ifdim\ht\footlinebox > 0pt + % Only leave this space if the footline is nonempty. + % (We lessened \vsize for it in \oddfootingyyy.) + % The \baselineskip=24pt in plain's \makefootline has no effect. + \vskip 24pt + \unvbox\footlinebox + \fi + % + \ifcropmarks + \egroup % end of \vbox\bgroup + \hfil\egroup % end of (centering) \line\bgroup + \vskip\topandbottommargin plus1fill minus1fill + \boxmaxdepth = \cornerthick + \vbox to0pt{\vss + \line{% + \vbox{\moveleft\cornerthick\nsbot}% + \hfill + \vbox{\moveright\cornerthick\nsbot}% + }% + \nointerlineskip + \line{\ewbot\hfil\ewbot}% + }% + \egroup % \vbox from first cropmarks clause + \fi + }% end of \shipout\vbox + }% end of group with \indexdummies + \advancepageno + \ifnum\outputpenalty>-20000 \else\dosupereject\fi +} + +\newinsert\margin \dimen\margin=\maxdimen + +\def\pagebody#1{\vbox to\pageheight{\boxmaxdepth=\maxdepth #1}} +{\catcode`\@ =11 +\gdef\pagecontents#1{\ifvoid\topins\else\unvbox\topins\fi +% marginal hacks, juha@viisa.uucp (Juha Takala) +\ifvoid\margin\else % marginal info is present + \rlap{\kern\hsize\vbox to\z@{\kern1pt\box\margin \vss}}\fi +\dimen@=\dp#1\relax \unvbox#1\relax +\ifvoid\footins\else\vskip\skip\footins\footnoterule \unvbox\footins\fi +\ifr@ggedbottom \kern-\dimen@ \vfil \fi} +} + +% Here are the rules for the cropmarks. Note that they are +% offset so that the space between them is truly \outerhsize or \outervsize +% (P. A. MacKay, 12 November, 1986) +% +\def\ewtop{\vrule height\cornerthick depth0pt width\cornerlong} +\def\nstop{\vbox + {\hrule height\cornerthick depth\cornerlong width\cornerthick}} +\def\ewbot{\vrule height0pt depth\cornerthick width\cornerlong} +\def\nsbot{\vbox + {\hrule height\cornerlong depth\cornerthick width\cornerthick}} + +% Parse an argument, then pass it to #1. The argument is the rest of +% the input line (except we remove a trailing comment). #1 should be a +% macro which expects an ordinary undelimited TeX argument. +% +\def\parsearg{\parseargusing{}} +\def\parseargusing#1#2{% + \def\argtorun{#2}% + \begingroup + \obeylines + \spaceisspace + #1% + \parseargline\empty% Insert the \empty token, see \finishparsearg below. +} + +{\obeylines % + \gdef\parseargline#1^^M{% + \endgroup % End of the group started in \parsearg. + \argremovecomment #1\comment\ArgTerm% + }% +} + +% First remove any @comment, then any @c comment. +\def\argremovecomment#1\comment#2\ArgTerm{\argremovec #1\c\ArgTerm} +\def\argremovec#1\c#2\ArgTerm{\argcheckspaces#1\^^M\ArgTerm} + +% Each occurence of `\^^M' or `\^^M' is replaced by a single space. +% +% \argremovec might leave us with trailing space, e.g., +% @end itemize @c foo +% This space token undergoes the same procedure and is eventually removed +% by \finishparsearg. +% +\def\argcheckspaces#1\^^M{\argcheckspacesX#1\^^M \^^M} +\def\argcheckspacesX#1 \^^M{\argcheckspacesY#1\^^M} +\def\argcheckspacesY#1\^^M#2\^^M#3\ArgTerm{% + \def\temp{#3}% + \ifx\temp\empty + % Do not use \next, perhaps the caller of \parsearg uses it; reuse \temp: + \let\temp\finishparsearg + \else + \let\temp\argcheckspaces + \fi + % Put the space token in: + \temp#1 #3\ArgTerm +} + +% If a _delimited_ argument is enclosed in braces, they get stripped; so +% to get _exactly_ the rest of the line, we had to prevent such situation. +% We prepended an \empty token at the very beginning and we expand it now, +% just before passing the control to \argtorun. +% (Similarily, we have to think about #3 of \argcheckspacesY above: it is +% either the null string, or it ends with \^^M---thus there is no danger +% that a pair of braces would be stripped. +% +% But first, we have to remove the trailing space token. +% +\def\finishparsearg#1 \ArgTerm{\expandafter\argtorun\expandafter{#1}} + +% \parseargdef\foo{...} +% is roughly equivalent to +% \def\foo{\parsearg\Xfoo} +% \def\Xfoo#1{...} +% +% Actually, I use \csname\string\foo\endcsname, ie. \\foo, as it is my +% favourite TeX trick. --kasal, 16nov03 + +\def\parseargdef#1{% + \expandafter \doparseargdef \csname\string#1\endcsname #1% +} +\def\doparseargdef#1#2{% + \def#2{\parsearg#1}% + \def#1##1% +} + +% Several utility definitions with active space: +{ + \obeyspaces + \gdef\obeyedspace{ } + + % Make each space character in the input produce a normal interword + % space in the output. Don't allow a line break at this space, as this + % is used only in environments like @example, where each line of input + % should produce a line of output anyway. + % + \gdef\sepspaces{\obeyspaces\let =\tie} + + % If an index command is used in an @example environment, any spaces + % therein should become regular spaces in the raw index file, not the + % expansion of \tie (\leavevmode \penalty \@M \ ). + \gdef\unsepspaces{\let =\space} +} + + +\def\flushcr{\ifx\par\lisppar \def\next##1{}\else \let\next=\relax \fi \next} + +% Define the framework for environments in texinfo.tex. It's used like this: +% +% \envdef\foo{...} +% \def\Efoo{...} +% +% It's the responsibility of \envdef to insert \begingroup before the +% actual body; @end closes the group after calling \Efoo. \envdef also +% defines \thisenv, so the current environment is known; @end checks +% whether the environment name matches. The \checkenv macro can also be +% used to check whether the current environment is the one expected. +% +% Non-false conditionals (@iftex, @ifset) don't fit into this, so they +% are not treated as enviroments; they don't open a group. (The +% implementation of @end takes care not to call \endgroup in this +% special case.) + + +% At runtime, environments start with this: +\def\startenvironment#1{\begingroup\def\thisenv{#1}} +% initialize +\let\thisenv\empty + +% ... but they get defined via ``\envdef\foo{...}'': +\long\def\envdef#1#2{\def#1{\startenvironment#1#2}} +\def\envparseargdef#1#2{\parseargdef#1{\startenvironment#1#2}} + +% Check whether we're in the right environment: +\def\checkenv#1{% + \def\temp{#1}% + \ifx\thisenv\temp + \else + \badenverr + \fi +} + +% Evironment mismatch, #1 expected: +\def\badenverr{% + \errhelp = \EMsimple + \errmessage{This command can appear only \inenvironment\temp, + not \inenvironment\thisenv}% +} +\def\inenvironment#1{% + \ifx#1\empty + out of any environment% + \else + in environment \expandafter\string#1% + \fi +} + +% @end foo executes the definition of \Efoo. +% But first, it executes a specialized version of \checkenv +% +\parseargdef\end{% + \if 1\csname iscond.#1\endcsname + \else + % The general wording of \badenverr may not be ideal, but... --kasal, 06nov03 + \expandafter\checkenv\csname#1\endcsname + \csname E#1\endcsname + \endgroup + \fi +} + +\newhelp\EMsimple{Press RETURN to continue.} + + +%% Simple single-character @ commands + +% @@ prints an @ +% Kludge this until the fonts are right (grr). +\def\@{{\tt\char64}} + +% This is turned off because it was never documented +% and you can use @w{...} around a quote to suppress ligatures. +%% Define @` and @' to be the same as ` and ' +%% but suppressing ligatures. +%\def\`{{`}} +%\def\'{{'}} + +% Used to generate quoted braces. +\def\mylbrace {{\tt\char123}} +\def\myrbrace {{\tt\char125}} +\let\{=\mylbrace +\let\}=\myrbrace +\begingroup + % Definitions to produce \{ and \} commands for indices, + % and @{ and @} for the aux/toc files. + \catcode`\{ = \other \catcode`\} = \other + \catcode`\[ = 1 \catcode`\] = 2 + \catcode`\! = 0 \catcode`\\ = \other + !gdef!lbracecmd[\{]% + !gdef!rbracecmd[\}]% + !gdef!lbraceatcmd[@{]% + !gdef!rbraceatcmd[@}]% +!endgroup + +% @comma{} to avoid , parsing problems. +\let\comma = , + +% Accents: @, @dotaccent @ringaccent @ubaraccent @udotaccent +% Others are defined by plain TeX: @` @' @" @^ @~ @= @u @v @H. +\let\, = \c +\let\dotaccent = \. +\def\ringaccent#1{{\accent23 #1}} +\let\tieaccent = \t +\let\ubaraccent = \b +\let\udotaccent = \d + +% Other special characters: @questiondown @exclamdown @ordf @ordm +% Plain TeX defines: @AA @AE @O @OE @L (plus lowercase versions) @ss. +\def\questiondown{?`} +\def\exclamdown{!`} +\def\ordf{\leavevmode\raise1ex\hbox{\selectfonts\lllsize \underbar{a}}} +\def\ordm{\leavevmode\raise1ex\hbox{\selectfonts\lllsize \underbar{o}}} + +% Dotless i and dotless j, used for accents. +\def\imacro{i} +\def\jmacro{j} +\def\dotless#1{% + \def\temp{#1}% + \ifx\temp\imacro \ptexi + \else\ifx\temp\jmacro \j + \else \errmessage{@dotless can be used only with i or j}% + \fi\fi +} + +% The \TeX{} logo, as in plain, but resetting the spacing so that a +% period following counts as ending a sentence. (Idea found in latex.) +% +\edef\TeX{\TeX \spacefactor=1000 } + +% @LaTeX{} logo. Not quite the same results as the definition in +% latex.ltx, since we use a different font for the raised A; it's most +% convenient for us to use an explicitly smaller font, rather than using +% the \scriptstyle font (since we don't reset \scriptstyle and +% \scriptscriptstyle). +% +\def\LaTeX{% + L\kern-.36em + {\setbox0=\hbox{T}% + \vbox to \ht0{\hbox{\selectfonts\lllsize A}\vss}}% + \kern-.15em + \TeX +} + +% Be sure we're in horizontal mode when doing a tie, since we make space +% equivalent to this in @example-like environments. Otherwise, a space +% at the beginning of a line will start with \penalty -- and +% since \penalty is valid in vertical mode, we'd end up putting the +% penalty on the vertical list instead of in the new paragraph. +{\catcode`@ = 11 + % Avoid using \@M directly, because that causes trouble + % if the definition is written into an index file. + \global\let\tiepenalty = \@M + \gdef\tie{\leavevmode\penalty\tiepenalty\ } +} + +% @: forces normal size whitespace following. +\def\:{\spacefactor=1000 } + +% @* forces a line break. +\def\*{\hfil\break\hbox{}\ignorespaces} + +% @/ allows a line break. +\let\/=\allowbreak + +% @. is an end-of-sentence period. +\def\.{.\spacefactor=\endofsentencespacefactor\space} + +% @! is an end-of-sentence bang. +\def\!{!\spacefactor=\endofsentencespacefactor\space} + +% @? is an end-of-sentence query. +\def\?{?\spacefactor=\endofsentencespacefactor\space} + +% @frenchspacing on|off says whether to put extra space after punctuation. +% +\def\onword{on} +\def\offword{off} +% +\parseargdef\frenchspacing{% + \def\temp{#1}% + \ifx\temp\onword \plainfrenchspacing + \else\ifx\temp\offword \plainnonfrenchspacing + \else + \errhelp = \EMsimple + \errmessage{Unknown @frenchspacing option `\temp', must be on/off}% + \fi\fi +} + +% @w prevents a word break. Without the \leavevmode, @w at the +% beginning of a paragraph, when TeX is still in vertical mode, would +% produce a whole line of output instead of starting the paragraph. +\def\w#1{\leavevmode\hbox{#1}} + +% @group ... @end group forces ... to be all on one page, by enclosing +% it in a TeX vbox. We use \vtop instead of \vbox to construct the box +% to keep its height that of a normal line. According to the rules for +% \topskip (p.114 of the TeXbook), the glue inserted is +% max (\topskip - \ht (first item), 0). If that height is large, +% therefore, no glue is inserted, and the space between the headline and +% the text is small, which looks bad. +% +% Another complication is that the group might be very large. This can +% cause the glue on the previous page to be unduly stretched, because it +% does not have much material. In this case, it's better to add an +% explicit \vfill so that the extra space is at the bottom. The +% threshold for doing this is if the group is more than \vfilllimit +% percent of a page (\vfilllimit can be changed inside of @tex). +% +\newbox\groupbox +\def\vfilllimit{0.7} +% +\envdef\group{% + \ifnum\catcode`\^^M=\active \else + \errhelp = \groupinvalidhelp + \errmessage{@group invalid in context where filling is enabled}% + \fi + \startsavinginserts + % + \setbox\groupbox = \vtop\bgroup + % Do @comment since we are called inside an environment such as + % @example, where each end-of-line in the input causes an + % end-of-line in the output. We don't want the end-of-line after + % the `@group' to put extra space in the output. Since @group + % should appear on a line by itself (according to the Texinfo + % manual), we don't worry about eating any user text. + \comment +} +% +% The \vtop produces a box with normal height and large depth; thus, TeX puts +% \baselineskip glue before it, and (when the next line of text is done) +% \lineskip glue after it. Thus, space below is not quite equal to space +% above. But it's pretty close. +\def\Egroup{% + % To get correct interline space between the last line of the group + % and the first line afterwards, we have to propagate \prevdepth. + \endgraf % Not \par, as it may have been set to \lisppar. + \global\dimen1 = \prevdepth + \egroup % End the \vtop. + % \dimen0 is the vertical size of the group's box. + \dimen0 = \ht\groupbox \advance\dimen0 by \dp\groupbox + % \dimen2 is how much space is left on the page (more or less). + \dimen2 = \pageheight \advance\dimen2 by -\pagetotal + % if the group doesn't fit on the current page, and it's a big big + % group, force a page break. + \ifdim \dimen0 > \dimen2 + \ifdim \pagetotal < \vfilllimit\pageheight + \page + \fi + \fi + \box\groupbox + \prevdepth = \dimen1 + \checkinserts +} +% +% TeX puts in an \escapechar (i.e., `@') at the beginning of the help +% message, so this ends up printing `@group can only ...'. +% +\newhelp\groupinvalidhelp{% +group can only be used in environments such as @example,^^J% +where each line of input produces a line of output.} + +% @need space-in-mils +% forces a page break if there is not space-in-mils remaining. + +\newdimen\mil \mil=0.001in + +% Old definition--didn't work. +%\parseargdef\need{\par % +%% This method tries to make TeX break the page naturally +%% if the depth of the box does not fit. +%{\baselineskip=0pt% +%\vtop to #1\mil{\vfil}\kern -#1\mil\nobreak +%\prevdepth=-1000pt +%}} + +\parseargdef\need{% + % Ensure vertical mode, so we don't make a big box in the middle of a + % paragraph. + \par + % + % If the @need value is less than one line space, it's useless. + \dimen0 = #1\mil + \dimen2 = \ht\strutbox + \advance\dimen2 by \dp\strutbox + \ifdim\dimen0 > \dimen2 + % + % Do a \strut just to make the height of this box be normal, so the + % normal leading is inserted relative to the preceding line. + % And a page break here is fine. + \vtop to #1\mil{\strut\vfil}% + % + % TeX does not even consider page breaks if a penalty added to the + % main vertical list is 10000 or more. But in order to see if the + % empty box we just added fits on the page, we must make it consider + % page breaks. On the other hand, we don't want to actually break the + % page after the empty box. So we use a penalty of 9999. + % + % There is an extremely small chance that TeX will actually break the + % page at this \penalty, if there are no other feasible breakpoints in + % sight. (If the user is using lots of big @group commands, which + % almost-but-not-quite fill up a page, TeX will have a hard time doing + % good page breaking, for example.) However, I could not construct an + % example where a page broke at this \penalty; if it happens in a real + % document, then we can reconsider our strategy. + \penalty9999 + % + % Back up by the size of the box, whether we did a page break or not. + \kern -#1\mil + % + % Do not allow a page break right after this kern. + \nobreak + \fi +} + +% @br forces paragraph break (and is undocumented). + +\let\br = \par + +% @page forces the start of a new page. +% +\def\page{\par\vfill\supereject} + +% @exdent text.... +% outputs text on separate line in roman font, starting at standard page margin + +% This records the amount of indent in the innermost environment. +% That's how much \exdent should take out. +\newskip\exdentamount + +% This defn is used inside fill environments such as @defun. +\parseargdef\exdent{\hfil\break\hbox{\kern -\exdentamount{\rm#1}}\hfil\break} + +% This defn is used inside nofill environments such as @example. +\parseargdef\nofillexdent{{\advance \leftskip by -\exdentamount + \leftline{\hskip\leftskip{\rm#1}}}} + +% @inmargin{WHICH}{TEXT} puts TEXT in the WHICH margin next to the current +% paragraph. For more general purposes, use the \margin insertion +% class. WHICH is `l' or `r'. +% +\newskip\inmarginspacing \inmarginspacing=1cm +\def\strutdepth{\dp\strutbox} +% +\def\doinmargin#1#2{\strut\vadjust{% + \nobreak + \kern-\strutdepth + \vtop to \strutdepth{% + \baselineskip=\strutdepth + \vss + % if you have multiple lines of stuff to put here, you'll need to + % make the vbox yourself of the appropriate size. + \ifx#1l% + \llap{\ignorespaces #2\hskip\inmarginspacing}% + \else + \rlap{\hskip\hsize \hskip\inmarginspacing \ignorespaces #2}% + \fi + \null + }% +}} +\def\inleftmargin{\doinmargin l} +\def\inrightmargin{\doinmargin r} +% +% @inmargin{TEXT [, RIGHT-TEXT]} +% (if RIGHT-TEXT is given, use TEXT for left page, RIGHT-TEXT for right; +% else use TEXT for both). +% +\def\inmargin#1{\parseinmargin #1,,\finish} +\def\parseinmargin#1,#2,#3\finish{% not perfect, but better than nothing. + \setbox0 = \hbox{\ignorespaces #2}% + \ifdim\wd0 > 0pt + \def\lefttext{#1}% have both texts + \def\righttext{#2}% + \else + \def\lefttext{#1}% have only one text + \def\righttext{#1}% + \fi + % + \ifodd\pageno + \def\temp{\inrightmargin\righttext}% odd page -> outside is right margin + \else + \def\temp{\inleftmargin\lefttext}% + \fi + \temp +} + +% @include file insert text of that file as input. +% +\def\include{\parseargusing\filenamecatcodes\includezzz} +\def\includezzz#1{% + \pushthisfilestack + \def\thisfile{#1}% + {% + \makevalueexpandable + \def\temp{\input #1 }% + \expandafter + }\temp + \popthisfilestack +} +\def\filenamecatcodes{% + \catcode`\\=\other + \catcode`~=\other + \catcode`^=\other + \catcode`_=\other + \catcode`|=\other + \catcode`<=\other + \catcode`>=\other + \catcode`+=\other + \catcode`-=\other +} + +\def\pushthisfilestack{% + \expandafter\pushthisfilestackX\popthisfilestack\StackTerm +} +\def\pushthisfilestackX{% + \expandafter\pushthisfilestackY\thisfile\StackTerm +} +\def\pushthisfilestackY #1\StackTerm #2\StackTerm {% + \gdef\popthisfilestack{\gdef\thisfile{#1}\gdef\popthisfilestack{#2}}% +} + +\def\popthisfilestack{\errthisfilestackempty} +\def\errthisfilestackempty{\errmessage{Internal error: + the stack of filenames is empty.}} + +\def\thisfile{} + +% @center line +% outputs that line, centered. +% +\parseargdef\center{% + \ifhmode + \let\next\centerH + \else + \let\next\centerV + \fi + \next{\hfil \ignorespaces#1\unskip \hfil}% +} +\def\centerH#1{% + {% + \hfil\break + \advance\hsize by -\leftskip + \advance\hsize by -\rightskip + \line{#1}% + \break + }% +} +\def\centerV#1{\line{\kern\leftskip #1\kern\rightskip}} + +% @sp n outputs n lines of vertical space + +\parseargdef\sp{\vskip #1\baselineskip} + +% @comment ...line which is ignored... +% @c is the same as @comment +% @ignore ... @end ignore is another way to write a comment + +\def\comment{\begingroup \catcode`\^^M=\other% +\catcode`\@=\other \catcode`\{=\other \catcode`\}=\other% +\commentxxx} +{\catcode`\^^M=\other \gdef\commentxxx#1^^M{\endgroup}} + +\let\c=\comment + +% @paragraphindent NCHARS +% We'll use ems for NCHARS, close enough. +% NCHARS can also be the word `asis' or `none'. +% We cannot feasibly implement @paragraphindent asis, though. +% +\def\asisword{asis} % no translation, these are keywords +\def\noneword{none} +% +\parseargdef\paragraphindent{% + \def\temp{#1}% + \ifx\temp\asisword + \else + \ifx\temp\noneword + \defaultparindent = 0pt + \else + \defaultparindent = #1em + \fi + \fi + \parindent = \defaultparindent +} + +% @exampleindent NCHARS +% We'll use ems for NCHARS like @paragraphindent. +% It seems @exampleindent asis isn't necessary, but +% I preserve it to make it similar to @paragraphindent. +\parseargdef\exampleindent{% + \def\temp{#1}% + \ifx\temp\asisword + \else + \ifx\temp\noneword + \lispnarrowing = 0pt + \else + \lispnarrowing = #1em + \fi + \fi +} + +% @firstparagraphindent WORD +% If WORD is `none', then suppress indentation of the first paragraph +% after a section heading. If WORD is `insert', then do indent at such +% paragraphs. +% +% The paragraph indentation is suppressed or not by calling +% \suppressfirstparagraphindent, which the sectioning commands do. +% We switch the definition of this back and forth according to WORD. +% By default, we suppress indentation. +% +\def\suppressfirstparagraphindent{\dosuppressfirstparagraphindent} +\def\insertword{insert} +% +\parseargdef\firstparagraphindent{% + \def\temp{#1}% + \ifx\temp\noneword + \let\suppressfirstparagraphindent = \dosuppressfirstparagraphindent + \else\ifx\temp\insertword + \let\suppressfirstparagraphindent = \relax + \else + \errhelp = \EMsimple + \errmessage{Unknown @firstparagraphindent option `\temp'}% + \fi\fi +} + +% Here is how we actually suppress indentation. Redefine \everypar to +% \kern backwards by \parindent, and then reset itself to empty. +% +% We also make \indent itself not actually do anything until the next +% paragraph. +% +\gdef\dosuppressfirstparagraphindent{% + \gdef\indent{% + \restorefirstparagraphindent + \indent + }% + \gdef\noindent{% + \restorefirstparagraphindent + \noindent + }% + \global\everypar = {% + \kern -\parindent + \restorefirstparagraphindent + }% +} + +\gdef\restorefirstparagraphindent{% + \global \let \indent = \ptexindent + \global \let \noindent = \ptexnoindent + \global \everypar = {}% +} + + +% @asis just yields its argument. Used with @table, for example. +% +\def\asis#1{#1} + +% @math outputs its argument in math mode. +% +% One complication: _ usually means subscripts, but it could also mean +% an actual _ character, as in @math{@var{some_variable} + 1}. So make +% _ active, and distinguish by seeing if the current family is \slfam, +% which is what @var uses. +{ + \catcode`\_ = \active + \gdef\mathunderscore{% + \catcode`\_=\active + \def_{\ifnum\fam=\slfam \_\else\sb\fi}% + } +} +% Another complication: we want \\ (and @\) to output a \ character. +% FYI, plain.tex uses \\ as a temporary control sequence (why?), but +% this is not advertised and we don't care. Texinfo does not +% otherwise define @\. +% +% The \mathchar is class=0=ordinary, family=7=ttfam, position=5C=\. +\def\mathbackslash{\ifnum\fam=\ttfam \mathchar"075C \else\backslash \fi} +% +\def\math{% + \tex + \mathunderscore + \let\\ = \mathbackslash + \mathactive + $\finishmath +} +\def\finishmath#1{#1$\endgroup} % Close the group opened by \tex. + +% Some active characters (such as <) are spaced differently in math. +% We have to reset their definitions in case the @math was an argument +% to a command which sets the catcodes (such as @item or @section). +% +{ + \catcode`^ = \active + \catcode`< = \active + \catcode`> = \active + \catcode`+ = \active + \gdef\mathactive{% + \let^ = \ptexhat + \let< = \ptexless + \let> = \ptexgtr + \let+ = \ptexplus + } +} + +% @bullet and @minus need the same treatment as @math, just above. +\def\bullet{$\ptexbullet$} +\def\minus{$-$} + +% @dots{} outputs an ellipsis using the current font. +% We do .5em per period so that it has the same spacing in the cm +% typewriter fonts as three actual period characters; on the other hand, +% in other typewriter fonts three periods are wider than 1.5em. So do +% whichever is larger. +% +\def\dots{% + \leavevmode + \setbox0=\hbox{...}% get width of three periods + \ifdim\wd0 > 1.5em + \dimen0 = \wd0 + \else + \dimen0 = 1.5em + \fi + \hbox to \dimen0{% + \hskip 0pt plus.25fil + .\hskip 0pt plus1fil + .\hskip 0pt plus1fil + .\hskip 0pt plus.5fil + }% +} + +% @enddots{} is an end-of-sentence ellipsis. +% +\def\enddots{% + \dots + \spacefactor=\endofsentencespacefactor +} + +% @comma{} is so commas can be inserted into text without messing up +% Texinfo's parsing. +% +\let\comma = , + +% @refill is a no-op. +\let\refill=\relax + +% If working on a large document in chapters, it is convenient to +% be able to disable indexing, cross-referencing, and contents, for test runs. +% This is done with @novalidate (before @setfilename). +% +\newif\iflinks \linkstrue % by default we want the aux files. +\let\novalidate = \linksfalse + +% @setfilename is done at the beginning of every texinfo file. +% So open here the files we need to have open while reading the input. +% This makes it possible to make a .fmt file for texinfo. +\def\setfilename{% + \fixbackslash % Turn off hack to swallow `\input texinfo'. + \iflinks + \tryauxfile + % Open the new aux file. TeX will close it automatically at exit. + \immediate\openout\auxfile=\jobname.aux + \fi % \openindices needs to do some work in any case. + \openindices + \let\setfilename=\comment % Ignore extra @setfilename cmds. + % + % If texinfo.cnf is present on the system, read it. + % Useful for site-wide @afourpaper, etc. + \openin 1 texinfo.cnf + \ifeof 1 \else \input texinfo.cnf \fi + \closein 1 + % + \comment % Ignore the actual filename. +} + +% Called from \setfilename. +% +\def\openindices{% + \newindex{cp}% + \newcodeindex{fn}% + \newcodeindex{vr}% + \newcodeindex{tp}% + \newcodeindex{ky}% + \newcodeindex{pg}% +} + +% @bye. +\outer\def\bye{\pagealignmacro\tracingstats=1\ptexend} + + +\message{pdf,} +% adobe `portable' document format +\newcount\tempnum +\newcount\lnkcount +\newtoks\filename +\newcount\filenamelength +\newcount\pgn +\newtoks\toksA +\newtoks\toksB +\newtoks\toksC +\newtoks\toksD +\newbox\boxA +\newcount\countA +\newif\ifpdf +\newif\ifpdfmakepagedest + +% when pdftex is run in dvi mode, \pdfoutput is defined (so \pdfoutput=1 +% can be set). So we test for \relax and 0 as well as \undefined, +% borrowed from ifpdf.sty. +\ifx\pdfoutput\undefined +\else + \ifx\pdfoutput\relax + \else + \ifcase\pdfoutput + \else + \pdftrue + \fi + \fi +\fi + +% PDF uses PostScript string constants for the names of xref targets, +% for display in the outlines, and in other places. Thus, we have to +% double any backslashes. Otherwise, a name like "\node" will be +% interpreted as a newline (\n), followed by o, d, e. Not good. +% http://www.ntg.nl/pipermail/ntg-pdftex/2004-July/000654.html +% (and related messages, the final outcome is that it is up to the TeX +% user to double the backslashes and otherwise make the string valid, so +% that's what we do). + +% double active backslashes. +% +{\catcode`\@=0 \catcode`\\=\active + @gdef@activebackslashdouble{% + @catcode`@\=@active + @let\=@doublebackslash} +} + +% To handle parens, we must adopt a different approach, since parens are +% not active characters. hyperref.dtx (which has the same problem as +% us) handles it with this amazing macro to replace tokens, with minor +% changes for Texinfo. It is included here under the GPL by permission +% from the author, Heiko Oberdiek. +% +% #1 is the tokens to replace. +% #2 is the replacement. +% #3 is the control sequence with the string. +% +\def\HyPsdSubst#1#2#3{% + \def\HyPsdReplace##1#1##2\END{% + ##1% + \ifx\\##2\\% + \else + #2% + \HyReturnAfterFi{% + \HyPsdReplace##2\END + }% + \fi + }% + \xdef#3{\expandafter\HyPsdReplace#3#1\END}% +} +\long\def\HyReturnAfterFi#1\fi{\fi#1} + +% #1 is a control sequence in which to do the replacements. +\def\backslashparens#1{% + \xdef#1{#1}% redefine it as its expansion; the definition is simply + % \lastnode when called from \setref -> \pdfmkdest. + \HyPsdSubst{(}{\realbackslash(}{#1}% + \HyPsdSubst{)}{\realbackslash)}{#1}% +} + +\newhelp\nopdfimagehelp{Texinfo supports .png, .jpg, .jpeg, and .pdf images +with PDF output, and none of those formats could be found. (.eps cannot +be supported due to the design of the PDF format; use regular TeX (DVI +output) for that.)} + +\ifpdf + % + % Color manipulation macros based on pdfcolor.tex. + \def\cmykDarkRed{0.28 1 1 0.35} + \def\cmykBlack{0 0 0 1} + % + \def\pdfsetcolor#1{\pdfliteral{#1 k}} + % Set color, and create a mark which defines \thiscolor accordingly, + % so that \makeheadline knows which color to restore. + \def\setcolor#1{% + \xdef\lastcolordefs{\gdef\noexpand\thiscolor{#1}}% + \domark + \pdfsetcolor{#1}% + } + % + \def\maincolor{\cmykBlack} + \pdfsetcolor{\maincolor} + \edef\thiscolor{\maincolor} + \def\lastcolordefs{} + % + \def\makefootline{% + \baselineskip24pt + \line{\pdfsetcolor{\maincolor}\the\footline}% + } + % + \def\makeheadline{% + \vbox to 0pt{% + \vskip-22.5pt + \line{% + \vbox to8.5pt{}% + % Extract \thiscolor definition from the marks. + \getcolormarks + % Typeset the headline with \maincolor, then restore the color. + \pdfsetcolor{\maincolor}\the\headline\pdfsetcolor{\thiscolor}% + }% + \vss + }% + \nointerlineskip + } + % + % + \pdfcatalog{/PageMode /UseOutlines} + % + % #1 is image name, #2 width (might be empty/whitespace), #3 height (ditto). + \def\dopdfimage#1#2#3{% + \def\imagewidth{#2}\setbox0 = \hbox{\ignorespaces #2}% + \def\imageheight{#3}\setbox2 = \hbox{\ignorespaces #3}% + % + % pdftex (and the PDF format) support .png, .jpg, .pdf (among + % others). Let's try in that order. + \let\pdfimgext=\empty + \begingroup + \openin 1 #1.png \ifeof 1 + \openin 1 #1.jpg \ifeof 1 + \openin 1 #1.jpeg \ifeof 1 + \openin 1 #1.JPG \ifeof 1 + \openin 1 #1.pdf \ifeof 1 + \errhelp = \nopdfimagehelp + \errmessage{Could not find image file #1 for pdf}% + \else \gdef\pdfimgext{pdf}% + \fi + \else \gdef\pdfimgext{JPG}% + \fi + \else \gdef\pdfimgext{jpeg}% + \fi + \else \gdef\pdfimgext{jpg}% + \fi + \else \gdef\pdfimgext{png}% + \fi + \closein 1 + \endgroup + % + % without \immediate, pdftex seg faults when the same image is + % included twice. (Version 3.14159-pre-1.0-unofficial-20010704.) + \ifnum\pdftexversion < 14 + \immediate\pdfimage + \else + \immediate\pdfximage + \fi + \ifdim \wd0 >0pt width \imagewidth \fi + \ifdim \wd2 >0pt height \imageheight \fi + \ifnum\pdftexversion<13 + #1.\pdfimgext + \else + {#1.\pdfimgext}% + \fi + \ifnum\pdftexversion < 14 \else + \pdfrefximage \pdflastximage + \fi} + % + \def\pdfmkdest#1{{% + % We have to set dummies so commands such as @code, and characters + % such as \, aren't expanded when present in a section title. + \indexnofonts + \turnoffactive + \activebackslashdouble + \makevalueexpandable + \def\pdfdestname{#1}% + \backslashparens\pdfdestname + \safewhatsit{\pdfdest name{\pdfdestname} xyz}% + }} + % + % used to mark target names; must be expandable. + \def\pdfmkpgn#1{#1} + % + % by default, use a color that is dark enough to print on paper as + % nearly black, but still distinguishable for online viewing. + \def\urlcolor{\cmykDarkRed} + \def\linkcolor{\cmykDarkRed} + \def\endlink{\setcolor{\maincolor}\pdfendlink} + % + % Adding outlines to PDF; macros for calculating structure of outlines + % come from Petr Olsak + \def\expnumber#1{\expandafter\ifx\csname#1\endcsname\relax 0% + \else \csname#1\endcsname \fi} + \def\advancenumber#1{\tempnum=\expnumber{#1}\relax + \advance\tempnum by 1 + \expandafter\xdef\csname#1\endcsname{\the\tempnum}} + % + % #1 is the section text, which is what will be displayed in the + % outline by the pdf viewer. #2 is the pdf expression for the number + % of subentries (or empty, for subsubsections). #3 is the node text, + % which might be empty if this toc entry had no corresponding node. + % #4 is the page number + % + \def\dopdfoutline#1#2#3#4{% + % Generate a link to the node text if that exists; else, use the + % page number. We could generate a destination for the section + % text in the case where a section has no node, but it doesn't + % seem worth the trouble, since most documents are normally structured. + \def\pdfoutlinedest{#3}% + \ifx\pdfoutlinedest\empty + \def\pdfoutlinedest{#4}% + \else + % Doubled backslashes in the name. + {\activebackslashdouble \xdef\pdfoutlinedest{#3}% + \backslashparens\pdfoutlinedest}% + \fi + % + % Also double the backslashes in the display string. + {\activebackslashdouble \xdef\pdfoutlinetext{#1}% + \backslashparens\pdfoutlinetext}% + % + \pdfoutline goto name{\pdfmkpgn{\pdfoutlinedest}}#2{\pdfoutlinetext}% + } + % + \def\pdfmakeoutlines{% + \begingroup + % Thanh's hack / proper braces in bookmarks + \edef\mylbrace{\iftrue \string{\else}\fi}\let\{=\mylbrace + \edef\myrbrace{\iffalse{\else\string}\fi}\let\}=\myrbrace + % + % Read toc silently, to get counts of subentries for \pdfoutline. + \def\numchapentry##1##2##3##4{% + \def\thischapnum{##2}% + \def\thissecnum{0}% + \def\thissubsecnum{0}% + }% + \def\numsecentry##1##2##3##4{% + \advancenumber{chap\thischapnum}% + \def\thissecnum{##2}% + \def\thissubsecnum{0}% + }% + \def\numsubsecentry##1##2##3##4{% + \advancenumber{sec\thissecnum}% + \def\thissubsecnum{##2}% + }% + \def\numsubsubsecentry##1##2##3##4{% + \advancenumber{subsec\thissubsecnum}% + }% + \def\thischapnum{0}% + \def\thissecnum{0}% + \def\thissubsecnum{0}% + % + % use \def rather than \let here because we redefine \chapentry et + % al. a second time, below. + \def\appentry{\numchapentry}% + \def\appsecentry{\numsecentry}% + \def\appsubsecentry{\numsubsecentry}% + \def\appsubsubsecentry{\numsubsubsecentry}% + \def\unnchapentry{\numchapentry}% + \def\unnsecentry{\numsecentry}% + \def\unnsubsecentry{\numsubsecentry}% + \def\unnsubsubsecentry{\numsubsubsecentry}% + \readdatafile{toc}% + % + % Read toc second time, this time actually producing the outlines. + % The `-' means take the \expnumber as the absolute number of + % subentries, which we calculated on our first read of the .toc above. + % + % We use the node names as the destinations. + \def\numchapentry##1##2##3##4{% + \dopdfoutline{##1}{count-\expnumber{chap##2}}{##3}{##4}}% + \def\numsecentry##1##2##3##4{% + \dopdfoutline{##1}{count-\expnumber{sec##2}}{##3}{##4}}% + \def\numsubsecentry##1##2##3##4{% + \dopdfoutline{##1}{count-\expnumber{subsec##2}}{##3}{##4}}% + \def\numsubsubsecentry##1##2##3##4{% count is always zero + \dopdfoutline{##1}{}{##3}{##4}}% + % + % PDF outlines are displayed using system fonts, instead of + % document fonts. Therefore we cannot use special characters, + % since the encoding is unknown. For example, the eogonek from + % Latin 2 (0xea) gets translated to a | character. Info from + % Staszek Wawrykiewicz, 19 Jan 2004 04:09:24 +0100. + % + % xx to do this right, we have to translate 8-bit characters to + % their "best" equivalent, based on the @documentencoding. Right + % now, I guess we'll just let the pdf reader have its way. + \indexnofonts + \setupdatafile + \catcode`\\=\active \otherbackslash + \input \tocreadfilename + \endgroup + } + % + \def\skipspaces#1{\def\PP{#1}\def\D{|}% + \ifx\PP\D\let\nextsp\relax + \else\let\nextsp\skipspaces + \ifx\p\space\else\addtokens{\filename}{\PP}% + \advance\filenamelength by 1 + \fi + \fi + \nextsp} + \def\getfilename#1{\filenamelength=0\expandafter\skipspaces#1|\relax} + \ifnum\pdftexversion < 14 + \let \startlink \pdfannotlink + \else + \let \startlink \pdfstartlink + \fi + % make a live url in pdf output. + \def\pdfurl#1{% + \begingroup + % it seems we really need yet another set of dummies; have not + % tried to figure out what each command should do in the context + % of @url. for now, just make @/ a no-op, that's the only one + % people have actually reported a problem with. + % + \normalturnoffactive + \def\@{@}% + \let\/=\empty + \makevalueexpandable + \leavevmode\setcolor{\urlcolor}% + \startlink attr{/Border [0 0 0]}% + user{/Subtype /Link /A << /S /URI /URI (#1) >>}% + \endgroup} + \def\pdfgettoks#1.{\setbox\boxA=\hbox{\toksA={#1.}\toksB={}\maketoks}} + \def\addtokens#1#2{\edef\addtoks{\noexpand#1={\the#1#2}}\addtoks} + \def\adn#1{\addtokens{\toksC}{#1}\global\countA=1\let\next=\maketoks} + \def\poptoks#1#2|ENDTOKS|{\let\first=#1\toksD={#1}\toksA={#2}} + \def\maketoks{% + \expandafter\poptoks\the\toksA|ENDTOKS|\relax + \ifx\first0\adn0 + \else\ifx\first1\adn1 \else\ifx\first2\adn2 \else\ifx\first3\adn3 + \else\ifx\first4\adn4 \else\ifx\first5\adn5 \else\ifx\first6\adn6 + \else\ifx\first7\adn7 \else\ifx\first8\adn8 \else\ifx\first9\adn9 + \else + \ifnum0=\countA\else\makelink\fi + \ifx\first.\let\next=\done\else + \let\next=\maketoks + \addtokens{\toksB}{\the\toksD} + \ifx\first,\addtokens{\toksB}{\space}\fi + \fi + \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi + \next} + \def\makelink{\addtokens{\toksB}% + {\noexpand\pdflink{\the\toksC}}\toksC={}\global\countA=0} + \def\pdflink#1{% + \startlink attr{/Border [0 0 0]} goto name{\pdfmkpgn{#1}} + \setcolor{\linkcolor}#1\endlink} + \def\done{\edef\st{\global\noexpand\toksA={\the\toksB}}\st} +\else + \let\pdfmkdest = \gobble + \let\pdfurl = \gobble + \let\endlink = \relax + \let\setcolor = \gobble + \let\pdfsetcolor = \gobble + \let\pdfmakeoutlines = \relax +\fi % \ifx\pdfoutput + + +\message{fonts,} + +% Change the current font style to #1, remembering it in \curfontstyle. +% For now, we do not accumulate font styles: @b{@i{foo}} prints foo in +% italics, not bold italics. +% +\def\setfontstyle#1{% + \def\curfontstyle{#1}% not as a control sequence, because we are \edef'd. + \csname ten#1\endcsname % change the current font +} + +% Select #1 fonts with the current style. +% +\def\selectfonts#1{\csname #1fonts\endcsname \csname\curfontstyle\endcsname} + +\def\rm{\fam=0 \setfontstyle{rm}} +\def\it{\fam=\itfam \setfontstyle{it}} +\def\sl{\fam=\slfam \setfontstyle{sl}} +\def\bf{\fam=\bffam \setfontstyle{bf}}\def\bfstylename{bf} +\def\tt{\fam=\ttfam \setfontstyle{tt}} + +% Texinfo sort of supports the sans serif font style, which plain TeX does not. +% So we set up a \sf. +\newfam\sffam +\def\sf{\fam=\sffam \setfontstyle{sf}} +\let\li = \sf % Sometimes we call it \li, not \sf. + +% We don't need math for this font style. +\def\ttsl{\setfontstyle{ttsl}} + + +% Default leading. +\newdimen\textleading \textleading = 13.2pt + +% Set the baselineskip to #1, and the lineskip and strut size +% correspondingly. There is no deep meaning behind these magic numbers +% used as factors; they just match (closely enough) what Knuth defined. +% +\def\lineskipfactor{.08333} +\def\strutheightpercent{.70833} +\def\strutdepthpercent {.29167} +% +% can get a sort of poor man's double spacing by redefining this. +\def\baselinefactor{1} +% +\def\setleading#1{% + \dimen0 = #1\relax + \normalbaselineskip = \baselinefactor\dimen0 + \normallineskip = \lineskipfactor\normalbaselineskip + \normalbaselines + \setbox\strutbox =\hbox{% + \vrule width0pt height\strutheightpercent\baselineskip + depth \strutdepthpercent \baselineskip + }% +} + +% PDF CMaps. See also LaTeX's t1.cmap. +% +% do nothing with this by default. +\expandafter\let\csname cmapOT1\endcsname\gobble +\expandafter\let\csname cmapOT1IT\endcsname\gobble +\expandafter\let\csname cmapOT1TT\endcsname\gobble + +% if we are producing pdf, and we have \pdffontattr, then define cmaps. +% (\pdffontattr was introduced many years ago, but people still run +% older pdftex's; it's easy to conditionalize, so we do.) +\ifpdf \ifx\pdffontattr\undefined \else + \begingroup + \catcode`\^^M=\active \def^^M{^^J}% Output line endings as the ^^J char. + \catcode`\%=12 \immediate\pdfobj stream {%!PS-Adobe-3.0 Resource-CMap +%%DocumentNeededResources: ProcSet (CIDInit) +%%IncludeResource: ProcSet (CIDInit) +%%BeginResource: CMap (TeX-OT1-0) +%%Title: (TeX-OT1-0 TeX OT1 0) +%%Version: 1.000 +%%EndComments +/CIDInit /ProcSet findresource begin +12 dict begin +begincmap +/CIDSystemInfo +<< /Registry (TeX) +/Ordering (OT1) +/Supplement 0 +>> def +/CMapName /TeX-OT1-0 def +/CMapType 2 def +1 begincodespacerange +<00> <7F> +endcodespacerange +8 beginbfrange +<00> <01> <0393> +<09> <0A> <03A8> +<23> <26> <0023> +<28> <3B> <0028> +<3F> <5B> <003F> +<5D> <5E> <005D> +<61> <7A> <0061> +<7B> <7C> <2013> +endbfrange +40 beginbfchar +<02> <0398> +<03> <039B> +<04> <039E> +<05> <03A0> +<06> <03A3> +<07> <03D2> +<08> <03A6> +<0B> <00660066> +<0C> <00660069> +<0D> <0066006C> +<0E> <006600660069> +<0F> <00660066006C> +<10> <0131> +<11> <0237> +<12> <0060> +<13> <00B4> +<14> <02C7> +<15> <02D8> +<16> <00AF> +<17> <02DA> +<18> <00B8> +<19> <00DF> +<1A> <00E6> +<1B> <0153> +<1C> <00F8> +<1D> <00C6> +<1E> <0152> +<1F> <00D8> +<21> <0021> +<22> <201D> +<27> <2019> +<3C> <00A1> +<3D> <003D> +<3E> <00BF> +<5C> <201C> +<5F> <02D9> +<60> <2018> +<7D> <02DD> +<7E> <007E> +<7F> <00A8> +endbfchar +endcmap +CMapName currentdict /CMap defineresource pop +end +end +%%EndResource +%%EOF + }\endgroup + \expandafter\edef\csname cmapOT1\endcsname#1{% + \pdffontattr#1{/ToUnicode \the\pdflastobj\space 0 R}% + }% +% +% \cmapOT1IT + \begingroup + \catcode`\^^M=\active \def^^M{^^J}% Output line endings as the ^^J char. + \catcode`\%=12 \immediate\pdfobj stream {%!PS-Adobe-3.0 Resource-CMap +%%DocumentNeededResources: ProcSet (CIDInit) +%%IncludeResource: ProcSet (CIDInit) +%%BeginResource: CMap (TeX-OT1IT-0) +%%Title: (TeX-OT1IT-0 TeX OT1IT 0) +%%Version: 1.000 +%%EndComments +/CIDInit /ProcSet findresource begin +12 dict begin +begincmap +/CIDSystemInfo +<< /Registry (TeX) +/Ordering (OT1IT) +/Supplement 0 +>> def +/CMapName /TeX-OT1IT-0 def +/CMapType 2 def +1 begincodespacerange +<00> <7F> +endcodespacerange +8 beginbfrange +<00> <01> <0393> +<09> <0A> <03A8> +<25> <26> <0025> +<28> <3B> <0028> +<3F> <5B> <003F> +<5D> <5E> <005D> +<61> <7A> <0061> +<7B> <7C> <2013> +endbfrange +42 beginbfchar +<02> <0398> +<03> <039B> +<04> <039E> +<05> <03A0> +<06> <03A3> +<07> <03D2> +<08> <03A6> +<0B> <00660066> +<0C> <00660069> +<0D> <0066006C> +<0E> <006600660069> +<0F> <00660066006C> +<10> <0131> +<11> <0237> +<12> <0060> +<13> <00B4> +<14> <02C7> +<15> <02D8> +<16> <00AF> +<17> <02DA> +<18> <00B8> +<19> <00DF> +<1A> <00E6> +<1B> <0153> +<1C> <00F8> +<1D> <00C6> +<1E> <0152> +<1F> <00D8> +<21> <0021> +<22> <201D> +<23> <0023> +<24> <00A3> +<27> <2019> +<3C> <00A1> +<3D> <003D> +<3E> <00BF> +<5C> <201C> +<5F> <02D9> +<60> <2018> +<7D> <02DD> +<7E> <007E> +<7F> <00A8> +endbfchar +endcmap +CMapName currentdict /CMap defineresource pop +end +end +%%EndResource +%%EOF + }\endgroup + \expandafter\edef\csname cmapOT1IT\endcsname#1{% + \pdffontattr#1{/ToUnicode \the\pdflastobj\space 0 R}% + }% +% +% \cmapOT1TT + \begingroup + \catcode`\^^M=\active \def^^M{^^J}% Output line endings as the ^^J char. + \catcode`\%=12 \immediate\pdfobj stream {%!PS-Adobe-3.0 Resource-CMap +%%DocumentNeededResources: ProcSet (CIDInit) +%%IncludeResource: ProcSet (CIDInit) +%%BeginResource: CMap (TeX-OT1TT-0) +%%Title: (TeX-OT1TT-0 TeX OT1TT 0) +%%Version: 1.000 +%%EndComments +/CIDInit /ProcSet findresource begin +12 dict begin +begincmap +/CIDSystemInfo +<< /Registry (TeX) +/Ordering (OT1TT) +/Supplement 0 +>> def +/CMapName /TeX-OT1TT-0 def +/CMapType 2 def +1 begincodespacerange +<00> <7F> +endcodespacerange +5 beginbfrange +<00> <01> <0393> +<09> <0A> <03A8> +<21> <26> <0021> +<28> <5F> <0028> +<61> <7E> <0061> +endbfrange +32 beginbfchar +<02> <0398> +<03> <039B> +<04> <039E> +<05> <03A0> +<06> <03A3> +<07> <03D2> +<08> <03A6> +<0B> <2191> +<0C> <2193> +<0D> <0027> +<0E> <00A1> +<0F> <00BF> +<10> <0131> +<11> <0237> +<12> <0060> +<13> <00B4> +<14> <02C7> +<15> <02D8> +<16> <00AF> +<17> <02DA> +<18> <00B8> +<19> <00DF> +<1A> <00E6> +<1B> <0153> +<1C> <00F8> +<1D> <00C6> +<1E> <0152> +<1F> <00D8> +<20> <2423> +<27> <2019> +<60> <2018> +<7F> <00A8> +endbfchar +endcmap +CMapName currentdict /CMap defineresource pop +end +end +%%EndResource +%%EOF + }\endgroup + \expandafter\edef\csname cmapOT1TT\endcsname#1{% + \pdffontattr#1{/ToUnicode \the\pdflastobj\space 0 R}% + }% +\fi\fi + + +% Set the font macro #1 to the font named #2, adding on the +% specified font prefix (normally `cm'). +% #3 is the font's design size, #4 is a scale factor, #5 is the CMap +% encoding (currently only OT1, OT1IT and OT1TT are allowed, pass +% empty to omit). +\def\setfont#1#2#3#4#5{% + \font#1=\fontprefix#2#3 scaled #4 + \csname cmap#5\endcsname#1% +} +% This is what gets called when #5 of \setfont is empty. +\let\cmap\gobble +% emacs-page end of cmaps + +% Use cm as the default font prefix. +% To specify the font prefix, you must define \fontprefix +% before you read in texinfo.tex. +\ifx\fontprefix\undefined +\def\fontprefix{cm} +\fi +% Support font families that don't use the same naming scheme as CM. +\def\rmshape{r} +\def\rmbshape{bx} %where the normal face is bold +\def\bfshape{b} +\def\bxshape{bx} +\def\ttshape{tt} +\def\ttbshape{tt} +\def\ttslshape{sltt} +\def\itshape{ti} +\def\itbshape{bxti} +\def\slshape{sl} +\def\slbshape{bxsl} +\def\sfshape{ss} +\def\sfbshape{ss} +\def\scshape{csc} +\def\scbshape{csc} + +% Definitions for a main text size of 11pt. This is the default in +% Texinfo. +% +\def\definetextfontsizexi{% +% Text fonts (11.2pt, magstep1). +\def\textnominalsize{11pt} +\edef\mainmagstep{\magstephalf} +\setfont\textrm\rmshape{10}{\mainmagstep}{OT1} +\setfont\texttt\ttshape{10}{\mainmagstep}{OT1TT} +\setfont\textbf\bfshape{10}{\mainmagstep}{OT1} +\setfont\textit\itshape{10}{\mainmagstep}{OT1IT} +\setfont\textsl\slshape{10}{\mainmagstep}{OT1} +\setfont\textsf\sfshape{10}{\mainmagstep}{OT1} +\setfont\textsc\scshape{10}{\mainmagstep}{OT1} +\setfont\textttsl\ttslshape{10}{\mainmagstep}{OT1TT} +\font\texti=cmmi10 scaled \mainmagstep +\font\textsy=cmsy10 scaled \mainmagstep +\def\textecsize{1095} + +% A few fonts for @defun names and args. +\setfont\defbf\bfshape{10}{\magstep1}{OT1} +\setfont\deftt\ttshape{10}{\magstep1}{OT1TT} +\setfont\defttsl\ttslshape{10}{\magstep1}{OT1TT} +\def\df{\let\tentt=\deftt \let\tenbf = \defbf \let\tenttsl=\defttsl \bf} + +% Fonts for indices, footnotes, small examples (9pt). +\def\smallnominalsize{9pt} +\setfont\smallrm\rmshape{9}{1000}{OT1} +\setfont\smalltt\ttshape{9}{1000}{OT1TT} +\setfont\smallbf\bfshape{10}{900}{OT1} +\setfont\smallit\itshape{9}{1000}{OT1IT} +\setfont\smallsl\slshape{9}{1000}{OT1} +\setfont\smallsf\sfshape{9}{1000}{OT1} +\setfont\smallsc\scshape{10}{900}{OT1} +\setfont\smallttsl\ttslshape{10}{900}{OT1TT} +\font\smalli=cmmi9 +\font\smallsy=cmsy9 +\def\smallecsize{0900} + +% Fonts for small examples (8pt). +\def\smallernominalsize{8pt} +\setfont\smallerrm\rmshape{8}{1000}{OT1} +\setfont\smallertt\ttshape{8}{1000}{OT1TT} +\setfont\smallerbf\bfshape{10}{800}{OT1} +\setfont\smallerit\itshape{8}{1000}{OT1IT} +\setfont\smallersl\slshape{8}{1000}{OT1} +\setfont\smallersf\sfshape{8}{1000}{OT1} +\setfont\smallersc\scshape{10}{800}{OT1} +\setfont\smallerttsl\ttslshape{10}{800}{OT1TT} +\font\smalleri=cmmi8 +\font\smallersy=cmsy8 +\def\smallerecsize{0800} + +% Fonts for title page (20.4pt): +\def\titlenominalsize{20pt} +\setfont\titlerm\rmbshape{12}{\magstep3}{OT1} +\setfont\titleit\itbshape{10}{\magstep4}{OT1IT} +\setfont\titlesl\slbshape{10}{\magstep4}{OT1} +\setfont\titlett\ttbshape{12}{\magstep3}{OT1TT} +\setfont\titlettsl\ttslshape{10}{\magstep4}{OT1TT} +\setfont\titlesf\sfbshape{17}{\magstep1}{OT1} +\let\titlebf=\titlerm +\setfont\titlesc\scbshape{10}{\magstep4}{OT1} +\font\titlei=cmmi12 scaled \magstep3 +\font\titlesy=cmsy10 scaled \magstep4 +\def\authorrm{\secrm} +\def\authortt{\sectt} +\def\titleecsize{2074} + +% Chapter (and unnumbered) fonts (17.28pt). +\def\chapnominalsize{17pt} +\setfont\chaprm\rmbshape{12}{\magstep2}{OT1} +\setfont\chapit\itbshape{10}{\magstep3}{OT1IT} +\setfont\chapsl\slbshape{10}{\magstep3}{OT1} +\setfont\chaptt\ttbshape{12}{\magstep2}{OT1TT} +\setfont\chapttsl\ttslshape{10}{\magstep3}{OT1TT} +\setfont\chapsf\sfbshape{17}{1000}{OT1} +\let\chapbf=\chaprm +\setfont\chapsc\scbshape{10}{\magstep3}{OT1} +\font\chapi=cmmi12 scaled \magstep2 +\font\chapsy=cmsy10 scaled \magstep3 +\def\chapecsize{1728} + +% Section fonts (14.4pt). +\def\secnominalsize{14pt} +\setfont\secrm\rmbshape{12}{\magstep1}{OT1} +\setfont\secit\itbshape{10}{\magstep2}{OT1IT} +\setfont\secsl\slbshape{10}{\magstep2}{OT1} +\setfont\sectt\ttbshape{12}{\magstep1}{OT1TT} +\setfont\secttsl\ttslshape{10}{\magstep2}{OT1TT} +\setfont\secsf\sfbshape{12}{\magstep1}{OT1} +\let\secbf\secrm +\setfont\secsc\scbshape{10}{\magstep2}{OT1} +\font\seci=cmmi12 scaled \magstep1 +\font\secsy=cmsy10 scaled \magstep2 +\def\sececsize{1440} + +% Subsection fonts (13.15pt). +\def\ssecnominalsize{13pt} +\setfont\ssecrm\rmbshape{12}{\magstephalf}{OT1} +\setfont\ssecit\itbshape{10}{1315}{OT1IT} +\setfont\ssecsl\slbshape{10}{1315}{OT1} +\setfont\ssectt\ttbshape{12}{\magstephalf}{OT1TT} +\setfont\ssecttsl\ttslshape{10}{1315}{OT1TT} +\setfont\ssecsf\sfbshape{12}{\magstephalf}{OT1} +\let\ssecbf\ssecrm +\setfont\ssecsc\scbshape{10}{1315}{OT1} +\font\sseci=cmmi12 scaled \magstephalf +\font\ssecsy=cmsy10 scaled 1315 +\def\ssececsize{1200} + +% Reduced fonts for @acro in text (10pt). +\def\reducednominalsize{10pt} +\setfont\reducedrm\rmshape{10}{1000}{OT1} +\setfont\reducedtt\ttshape{10}{1000}{OT1TT} +\setfont\reducedbf\bfshape{10}{1000}{OT1} +\setfont\reducedit\itshape{10}{1000}{OT1IT} +\setfont\reducedsl\slshape{10}{1000}{OT1} +\setfont\reducedsf\sfshape{10}{1000}{OT1} +\setfont\reducedsc\scshape{10}{1000}{OT1} +\setfont\reducedttsl\ttslshape{10}{1000}{OT1TT} +\font\reducedi=cmmi10 +\font\reducedsy=cmsy10 +\def\reducedecsize{1000} + +% reset the current fonts +\textfonts +\rm +} % end of 11pt text font size definitions + + +% Definitions to make the main text be 10pt Computer Modern, with +% section, chapter, etc., sizes following suit. This is for the GNU +% Press printing of the Emacs 22 manual. Maybe other manuals in the +% future. Used with @smallbook, which sets the leading to 12pt. +% +\def\definetextfontsizex{% +% Text fonts (10pt). +\def\textnominalsize{10pt} +\edef\mainmagstep{1000} +\setfont\textrm\rmshape{10}{\mainmagstep}{OT1} +\setfont\texttt\ttshape{10}{\mainmagstep}{OT1TT} +\setfont\textbf\bfshape{10}{\mainmagstep}{OT1} +\setfont\textit\itshape{10}{\mainmagstep}{OT1IT} +\setfont\textsl\slshape{10}{\mainmagstep}{OT1} +\setfont\textsf\sfshape{10}{\mainmagstep}{OT1} +\setfont\textsc\scshape{10}{\mainmagstep}{OT1} +\setfont\textttsl\ttslshape{10}{\mainmagstep}{OT1TT} +\font\texti=cmmi10 scaled \mainmagstep +\font\textsy=cmsy10 scaled \mainmagstep +\def\textecsize{1000} + +% A few fonts for @defun names and args. +\setfont\defbf\bfshape{10}{\magstephalf}{OT1} +\setfont\deftt\ttshape{10}{\magstephalf}{OT1TT} +\setfont\defttsl\ttslshape{10}{\magstephalf}{OT1TT} +\def\df{\let\tentt=\deftt \let\tenbf = \defbf \let\tenttsl=\defttsl \bf} + +% Fonts for indices, footnotes, small examples (9pt). +\def\smallnominalsize{9pt} +\setfont\smallrm\rmshape{9}{1000}{OT1} +\setfont\smalltt\ttshape{9}{1000}{OT1TT} +\setfont\smallbf\bfshape{10}{900}{OT1} +\setfont\smallit\itshape{9}{1000}{OT1IT} +\setfont\smallsl\slshape{9}{1000}{OT1} +\setfont\smallsf\sfshape{9}{1000}{OT1} +\setfont\smallsc\scshape{10}{900}{OT1} +\setfont\smallttsl\ttslshape{10}{900}{OT1TT} +\font\smalli=cmmi9 +\font\smallsy=cmsy9 +\def\smallecsize{0900} + +% Fonts for small examples (8pt). +\def\smallernominalsize{8pt} +\setfont\smallerrm\rmshape{8}{1000}{OT1} +\setfont\smallertt\ttshape{8}{1000}{OT1TT} +\setfont\smallerbf\bfshape{10}{800}{OT1} +\setfont\smallerit\itshape{8}{1000}{OT1IT} +\setfont\smallersl\slshape{8}{1000}{OT1} +\setfont\smallersf\sfshape{8}{1000}{OT1} +\setfont\smallersc\scshape{10}{800}{OT1} +\setfont\smallerttsl\ttslshape{10}{800}{OT1TT} +\font\smalleri=cmmi8 +\font\smallersy=cmsy8 +\def\smallerecsize{0800} + +% Fonts for title page (20.4pt): +\def\titlenominalsize{20pt} +\setfont\titlerm\rmbshape{12}{\magstep3}{OT1} +\setfont\titleit\itbshape{10}{\magstep4}{OT1IT} +\setfont\titlesl\slbshape{10}{\magstep4}{OT1} +\setfont\titlett\ttbshape{12}{\magstep3}{OT1TT} +\setfont\titlettsl\ttslshape{10}{\magstep4}{OT1TT} +\setfont\titlesf\sfbshape{17}{\magstep1}{OT1} +\let\titlebf=\titlerm +\setfont\titlesc\scbshape{10}{\magstep4}{OT1} +\font\titlei=cmmi12 scaled \magstep3 +\font\titlesy=cmsy10 scaled \magstep4 +\def\authorrm{\secrm} +\def\authortt{\sectt} +\def\titleecsize{2074} + +% Chapter fonts (14.4pt). +\def\chapnominalsize{14pt} +\setfont\chaprm\rmbshape{12}{\magstep1}{OT1} +\setfont\chapit\itbshape{10}{\magstep2}{OT1IT} +\setfont\chapsl\slbshape{10}{\magstep2}{OT1} +\setfont\chaptt\ttbshape{12}{\magstep1}{OT1TT} +\setfont\chapttsl\ttslshape{10}{\magstep2}{OT1TT} +\setfont\chapsf\sfbshape{12}{\magstep1}{OT1} +\let\chapbf\chaprm +\setfont\chapsc\scbshape{10}{\magstep2}{OT1} +\font\chapi=cmmi12 scaled \magstep1 +\font\chapsy=cmsy10 scaled \magstep2 +\def\chapecsize{1440} + +% Section fonts (12pt). +\def\secnominalsize{12pt} +\setfont\secrm\rmbshape{12}{1000}{OT1} +\setfont\secit\itbshape{10}{\magstep1}{OT1IT} +\setfont\secsl\slbshape{10}{\magstep1}{OT1} +\setfont\sectt\ttbshape{12}{1000}{OT1TT} +\setfont\secttsl\ttslshape{10}{\magstep1}{OT1TT} +\setfont\secsf\sfbshape{12}{1000}{OT1} +\let\secbf\secrm +\setfont\secsc\scbshape{10}{\magstep1}{OT1} +\font\seci=cmmi12 +\font\secsy=cmsy10 scaled \magstep1 +\def\sececsize{1200} + +% Subsection fonts (10pt). +\def\ssecnominalsize{10pt} +\setfont\ssecrm\rmbshape{10}{1000}{OT1} +\setfont\ssecit\itbshape{10}{1000}{OT1IT} +\setfont\ssecsl\slbshape{10}{1000}{OT1} +\setfont\ssectt\ttbshape{10}{1000}{OT1TT} +\setfont\ssecttsl\ttslshape{10}{1000}{OT1TT} +\setfont\ssecsf\sfbshape{10}{1000}{OT1} +\let\ssecbf\ssecrm +\setfont\ssecsc\scbshape{10}{1000}{OT1} +\font\sseci=cmmi10 +\font\ssecsy=cmsy10 +\def\ssececsize{1000} + +% Reduced fonts for @acro in text (9pt). +\def\reducednominalsize{9pt} +\setfont\reducedrm\rmshape{9}{1000}{OT1} +\setfont\reducedtt\ttshape{9}{1000}{OT1TT} +\setfont\reducedbf\bfshape{10}{900}{OT1} +\setfont\reducedit\itshape{9}{1000}{OT1IT} +\setfont\reducedsl\slshape{9}{1000}{OT1} +\setfont\reducedsf\sfshape{9}{1000}{OT1} +\setfont\reducedsc\scshape{10}{900}{OT1} +\setfont\reducedttsl\ttslshape{10}{900}{OT1TT} +\font\reducedi=cmmi9 +\font\reducedsy=cmsy9 +\def\reducedecsize{0900} + +% reduce space between paragraphs +\divide\parskip by 2 + +% reset the current fonts +\textfonts +\rm +} % end of 10pt text font size definitions + + +% We provide the user-level command +% @fonttextsize 10 +% (or 11) to redefine the text font size. pt is assumed. +% +\def\xword{10} +\def\xiword{11} +% +\parseargdef\fonttextsize{% + \def\textsizearg{#1}% + \wlog{doing @fonttextsize \textsizearg}% + % + % Set \globaldefs so that documents can use this inside @tex, since + % makeinfo 4.8 does not support it, but we need it nonetheless. + % + \begingroup \globaldefs=1 + \ifx\textsizearg\xword \definetextfontsizex + \else \ifx\textsizearg\xiword \definetextfontsizexi + \else + \errhelp=\EMsimple + \errmessage{@fonttextsize only supports `10' or `11', not `\textsizearg'} + \fi\fi + \endgroup +} + + +% In order for the font changes to affect most math symbols and letters, +% we have to define the \textfont of the standard families. Since +% texinfo doesn't allow for producing subscripts and superscripts except +% in the main text, we don't bother to reset \scriptfont and +% \scriptscriptfont (which would also require loading a lot more fonts). +% +\def\resetmathfonts{% + \textfont0=\tenrm \textfont1=\teni \textfont2=\tensy + \textfont\itfam=\tenit \textfont\slfam=\tensl \textfont\bffam=\tenbf + \textfont\ttfam=\tentt \textfont\sffam=\tensf +} + +% The font-changing commands redefine the meanings of \tenSTYLE, instead +% of just \STYLE. We do this because \STYLE needs to also set the +% current \fam for math mode. Our \STYLE (e.g., \rm) commands hardwire +% \tenSTYLE to set the current font. +% +% Each font-changing command also sets the names \lsize (one size lower) +% and \lllsize (three sizes lower). These relative commands are used in +% the LaTeX logo and acronyms. +% +% This all needs generalizing, badly. +% +\def\textfonts{% + \let\tenrm=\textrm \let\tenit=\textit \let\tensl=\textsl + \let\tenbf=\textbf \let\tentt=\texttt \let\smallcaps=\textsc + \let\tensf=\textsf \let\teni=\texti \let\tensy=\textsy + \let\tenttsl=\textttsl + \def\curfontsize{text}% + \def\lsize{reduced}\def\lllsize{smaller}% + \resetmathfonts \setleading{\textleading}} +\def\titlefonts{% + \let\tenrm=\titlerm \let\tenit=\titleit \let\tensl=\titlesl + \let\tenbf=\titlebf \let\tentt=\titlett \let\smallcaps=\titlesc + \let\tensf=\titlesf \let\teni=\titlei \let\tensy=\titlesy + \let\tenttsl=\titlettsl + \def\curfontsize{title}% + \def\lsize{chap}\def\lllsize{subsec}% + \resetmathfonts \setleading{25pt}} +\def\titlefont#1{{\titlefonts\rm #1}} +\def\chapfonts{% + \let\tenrm=\chaprm \let\tenit=\chapit \let\tensl=\chapsl + \let\tenbf=\chapbf \let\tentt=\chaptt \let\smallcaps=\chapsc + \let\tensf=\chapsf \let\teni=\chapi \let\tensy=\chapsy + \let\tenttsl=\chapttsl + \def\curfontsize{chap}% + \def\lsize{sec}\def\lllsize{text}% + \resetmathfonts \setleading{19pt}} +\def\secfonts{% + \let\tenrm=\secrm \let\tenit=\secit \let\tensl=\secsl + \let\tenbf=\secbf \let\tentt=\sectt \let\smallcaps=\secsc + \let\tensf=\secsf \let\teni=\seci \let\tensy=\secsy + \let\tenttsl=\secttsl + \def\curfontsize{sec}% + \def\lsize{subsec}\def\lllsize{reduced}% + \resetmathfonts \setleading{16pt}} +\def\subsecfonts{% + \let\tenrm=\ssecrm \let\tenit=\ssecit \let\tensl=\ssecsl + \let\tenbf=\ssecbf \let\tentt=\ssectt \let\smallcaps=\ssecsc + \let\tensf=\ssecsf \let\teni=\sseci \let\tensy=\ssecsy + \let\tenttsl=\ssecttsl + \def\curfontsize{ssec}% + \def\lsize{text}\def\lllsize{small}% + \resetmathfonts \setleading{15pt}} +\let\subsubsecfonts = \subsecfonts +\def\reducedfonts{% + \let\tenrm=\reducedrm \let\tenit=\reducedit \let\tensl=\reducedsl + \let\tenbf=\reducedbf \let\tentt=\reducedtt \let\reducedcaps=\reducedsc + \let\tensf=\reducedsf \let\teni=\reducedi \let\tensy=\reducedsy + \let\tenttsl=\reducedttsl + \def\curfontsize{reduced}% + \def\lsize{small}\def\lllsize{smaller}% + \resetmathfonts \setleading{10.5pt}} +\def\smallfonts{% + \let\tenrm=\smallrm \let\tenit=\smallit \let\tensl=\smallsl + \let\tenbf=\smallbf \let\tentt=\smalltt \let\smallcaps=\smallsc + \let\tensf=\smallsf \let\teni=\smalli \let\tensy=\smallsy + \let\tenttsl=\smallttsl + \def\curfontsize{small}% + \def\lsize{smaller}\def\lllsize{smaller}% + \resetmathfonts \setleading{10.5pt}} +\def\smallerfonts{% + \let\tenrm=\smallerrm \let\tenit=\smallerit \let\tensl=\smallersl + \let\tenbf=\smallerbf \let\tentt=\smallertt \let\smallcaps=\smallersc + \let\tensf=\smallersf \let\teni=\smalleri \let\tensy=\smallersy + \let\tenttsl=\smallerttsl + \def\curfontsize{smaller}% + \def\lsize{smaller}\def\lllsize{smaller}% + \resetmathfonts \setleading{9.5pt}} + +% Set the fonts to use with the @small... environments. +\let\smallexamplefonts = \smallfonts + +% About \smallexamplefonts. If we use \smallfonts (9pt), @smallexample +% can fit this many characters: +% 8.5x11=86 smallbook=72 a4=90 a5=69 +% If we use \scriptfonts (8pt), then we can fit this many characters: +% 8.5x11=90+ smallbook=80 a4=90+ a5=77 +% For me, subjectively, the few extra characters that fit aren't worth +% the additional smallness of 8pt. So I'm making the default 9pt. +% +% By the way, for comparison, here's what fits with @example (10pt): +% 8.5x11=71 smallbook=60 a4=75 a5=58 +% +% I wish the USA used A4 paper. +% --karl, 24jan03. + + +% Set up the default fonts, so we can use them for creating boxes. +% +\definetextfontsizexi + +% Define these so they can be easily changed for other fonts. +\def\angleleft{$\langle$} +\def\angleright{$\rangle$} + +% Count depth in font-changes, for error checks +\newcount\fontdepth \fontdepth=0 + +% Fonts for short table of contents. +\setfont\shortcontrm\rmshape{12}{1000}{OT1} +\setfont\shortcontbf\bfshape{10}{\magstep1}{OT1} % no cmb12 +\setfont\shortcontsl\slshape{12}{1000}{OT1} +\setfont\shortconttt\ttshape{12}{1000}{OT1TT} + +%% Add scribe-like font environments, plus @l for inline lisp (usually sans +%% serif) and @ii for TeX italic + +% \smartitalic{ARG} outputs arg in italics, followed by an italic correction +% unless the following character is such as not to need one. +\def\smartitalicx{\ifx\next,\else\ifx\next-\else\ifx\next.\else + \ptexslash\fi\fi\fi} +\def\smartslanted#1{{\ifusingtt\ttsl\sl #1}\futurelet\next\smartitalicx} +\def\smartitalic#1{{\ifusingtt\ttsl\it #1}\futurelet\next\smartitalicx} + +% like \smartslanted except unconditionally uses \ttsl. +% @var is set to this for defun arguments. +\def\ttslanted#1{{\ttsl #1}\futurelet\next\smartitalicx} + +% like \smartslanted except unconditionally use \sl. We never want +% ttsl for book titles, do we? +\def\cite#1{{\sl #1}\futurelet\next\smartitalicx} + +\let\i=\smartitalic +\let\slanted=\smartslanted +\let\var=\smartslanted +\let\dfn=\smartslanted +\let\emph=\smartitalic + +% @b, explicit bold. +\def\b#1{{\bf #1}} +\let\strong=\b + +% @sansserif, explicit sans. +\def\sansserif#1{{\sf #1}} + +% We can't just use \exhyphenpenalty, because that only has effect at +% the end of a paragraph. Restore normal hyphenation at the end of the +% group within which \nohyphenation is presumably called. +% +\def\nohyphenation{\hyphenchar\font = -1 \aftergroup\restorehyphenation} +\def\restorehyphenation{\hyphenchar\font = `- } + +% Set sfcode to normal for the chars that usually have another value. +% Can't use plain's \frenchspacing because it uses the `\x notation, and +% sometimes \x has an active definition that messes things up. +% +\catcode`@=11 + \def\plainfrenchspacing{% + \sfcode\dotChar =\@m \sfcode\questChar=\@m \sfcode\exclamChar=\@m + \sfcode\colonChar=\@m \sfcode\semiChar =\@m \sfcode\commaChar =\@m + \def\endofsentencespacefactor{1000}% for @. and friends + } + \def\plainnonfrenchspacing{% + \sfcode`\.3000\sfcode`\?3000\sfcode`\!3000 + \sfcode`\:2000\sfcode`\;1500\sfcode`\,1250 + \def\endofsentencespacefactor{3000}% for @. and friends + } +\catcode`@=\other +\def\endofsentencespacefactor{3000}% default + +\def\t#1{% + {\tt \rawbackslash \plainfrenchspacing #1}% + \null +} +\def\samp#1{`\tclose{#1}'\null} +\setfont\keyrm\rmshape{8}{1000}{OT1} +\font\keysy=cmsy9 +\def\key#1{{\keyrm\textfont2=\keysy \leavevmode\hbox{% + \raise0.4pt\hbox{\angleleft}\kern-.08em\vtop{% + \vbox{\hrule\kern-0.4pt + \hbox{\raise0.4pt\hbox{\vphantom{\angleleft}}#1}}% + \kern-0.4pt\hrule}% + \kern-.06em\raise0.4pt\hbox{\angleright}}}} +\def\key #1{{\nohyphenation \uppercase{#1}}\null} +% The old definition, with no lozenge: +%\def\key #1{{\ttsl \nohyphenation \uppercase{#1}}\null} +\def\ctrl #1{{\tt \rawbackslash \hat}#1} + +% @file, @option are the same as @samp. +\let\file=\samp +\let\option=\samp + +% @code is a modification of @t, +% which makes spaces the same size as normal in the surrounding text. +\def\tclose#1{% + {% + % Change normal interword space to be same as for the current font. + \spaceskip = \fontdimen2\font + % + % Switch to typewriter. + \tt + % + % But `\ ' produces the large typewriter interword space. + \def\ {{\spaceskip = 0pt{} }}% + % + % Turn off hyphenation. + \nohyphenation + % + \rawbackslash + \plainfrenchspacing + #1% + }% + \null +} + +% We *must* turn on hyphenation at `-' and `_' in @code. +% Otherwise, it is too hard to avoid overfull hboxes +% in the Emacs manual, the Library manual, etc. + +% Unfortunately, TeX uses one parameter (\hyphenchar) to control +% both hyphenation at - and hyphenation within words. +% We must therefore turn them both off (\tclose does that) +% and arrange explicitly to hyphenate at a dash. +% -- rms. +{ + \catcode`\-=\active \catcode`\_=\active + \catcode`\'=\active \catcode`\`=\active + % + \global\def\code{\begingroup + \catcode\rquoteChar=\active \catcode\lquoteChar=\active + \let'\codequoteright \let`\codequoteleft + % + \catcode\dashChar=\active \catcode\underChar=\active + \ifallowcodebreaks + \let-\codedash + \let_\codeunder + \else + \let-\realdash + \let_\realunder + \fi + \codex + } +} + +\def\realdash{-} +\def\codedash{-\discretionary{}{}{}} +\def\codeunder{% + % this is all so @math{@code{var_name}+1} can work. In math mode, _ + % is "active" (mathcode"8000) and \normalunderscore (or \char95, etc.) + % will therefore expand the active definition of _, which is us + % (inside @code that is), therefore an endless loop. + \ifusingtt{\ifmmode + \mathchar"075F % class 0=ordinary, family 7=ttfam, pos 0x5F=_. + \else\normalunderscore \fi + \discretionary{}{}{}}% + {\_}% +} +\def\codex #1{\tclose{#1}\endgroup} + +% An additional complication: the above will allow breaks after, e.g., +% each of the four underscores in __typeof__. This is undesirable in +% some manuals, especially if they don't have long identifiers in +% general. @allowcodebreaks provides a way to control this. +% +\newif\ifallowcodebreaks \allowcodebreakstrue + +\def\keywordtrue{true} +\def\keywordfalse{false} + +\parseargdef\allowcodebreaks{% + \def\txiarg{#1}% + \ifx\txiarg\keywordtrue + \allowcodebreakstrue + \else\ifx\txiarg\keywordfalse + \allowcodebreaksfalse + \else + \errhelp = \EMsimple + \errmessage{Unknown @allowcodebreaks option `\txiarg'}% + \fi\fi +} + +% @kbd is like @code, except that if the argument is just one @key command, +% then @kbd has no effect. + +% @kbdinputstyle -- arg is `distinct' (@kbd uses slanted tty font always), +% `example' (@kbd uses ttsl only inside of @example and friends), +% or `code' (@kbd uses normal tty font always). +\parseargdef\kbdinputstyle{% + \def\txiarg{#1}% + \ifx\txiarg\worddistinct + \gdef\kbdexamplefont{\ttsl}\gdef\kbdfont{\ttsl}% + \else\ifx\txiarg\wordexample + \gdef\kbdexamplefont{\ttsl}\gdef\kbdfont{\tt}% + \else\ifx\txiarg\wordcode + \gdef\kbdexamplefont{\tt}\gdef\kbdfont{\tt}% + \else + \errhelp = \EMsimple + \errmessage{Unknown @kbdinputstyle option `\txiarg'}% + \fi\fi\fi +} +\def\worddistinct{distinct} +\def\wordexample{example} +\def\wordcode{code} + +% Default is `distinct.' +\kbdinputstyle distinct + +\def\xkey{\key} +\def\kbdfoo#1#2#3\par{\def\one{#1}\def\three{#3}\def\threex{??}% +\ifx\one\xkey\ifx\threex\three \key{#2}% +\else{\tclose{\kbdfont\look}}\fi +\else{\tclose{\kbdfont\look}}\fi} + +% For @indicateurl, @env, @command quotes seem unnecessary, so use \code. +\let\indicateurl=\code +\let\env=\code +\let\command=\code + +% @uref (abbreviation for `urlref') takes an optional (comma-separated) +% second argument specifying the text to display and an optional third +% arg as text to display instead of (rather than in addition to) the url +% itself. First (mandatory) arg is the url. Perhaps eventually put in +% a hypertex \special here. +% +\def\uref#1{\douref #1,,,\finish} +\def\douref#1,#2,#3,#4\finish{\begingroup + \unsepspaces + \pdfurl{#1}% + \setbox0 = \hbox{\ignorespaces #3}% + \ifdim\wd0 > 0pt + \unhbox0 % third arg given, show only that + \else + \setbox0 = \hbox{\ignorespaces #2}% + \ifdim\wd0 > 0pt + \ifpdf + \unhbox0 % PDF: 2nd arg given, show only it + \else + \unhbox0\ (\code{#1})% DVI: 2nd arg given, show both it and url + \fi + \else + \code{#1}% only url given, so show it + \fi + \fi + \endlink +\endgroup} + +% @url synonym for @uref, since that's how everyone uses it. +% +\let\url=\uref + +% rms does not like angle brackets --karl, 17may97. +% So now @email is just like @uref, unless we are pdf. +% +%\def\email#1{\angleleft{\tt #1}\angleright} +\ifpdf + \def\email#1{\doemail#1,,\finish} + \def\doemail#1,#2,#3\finish{\begingroup + \unsepspaces + \pdfurl{mailto:#1}% + \setbox0 = \hbox{\ignorespaces #2}% + \ifdim\wd0>0pt\unhbox0\else\code{#1}\fi + \endlink + \endgroup} +\else + \let\email=\uref +\fi + +% Check if we are currently using a typewriter font. Since all the +% Computer Modern typewriter fonts have zero interword stretch (and +% shrink), and it is reasonable to expect all typewriter fonts to have +% this property, we can check that font parameter. +% +\def\ifmonospace{\ifdim\fontdimen3\font=0pt } + +% Typeset a dimension, e.g., `in' or `pt'. The only reason for the +% argument is to make the input look right: @dmn{pt} instead of @dmn{}pt. +% +\def\dmn#1{\thinspace #1} + +\def\kbd#1{\def\look{#1}\expandafter\kbdfoo\look??\par} + +% @l was never documented to mean ``switch to the Lisp font'', +% and it is not used as such in any manual I can find. We need it for +% Polish suppressed-l. --karl, 22sep96. +%\def\l#1{{\li #1}\null} + +% Explicit font changes: @r, @sc, undocumented @ii. +\def\r#1{{\rm #1}} % roman font +\def\sc#1{{\smallcaps#1}} % smallcaps font +\def\ii#1{{\it #1}} % italic font + +% @acronym for "FBI", "NATO", and the like. +% We print this one point size smaller, since it's intended for +% all-uppercase. +% +\def\acronym#1{\doacronym #1,,\finish} +\def\doacronym#1,#2,#3\finish{% + {\selectfonts\lsize #1}% + \def\temp{#2}% + \ifx\temp\empty \else + \space ({\unsepspaces \ignorespaces \temp \unskip})% + \fi +} + +% @abbr for "Comput. J." and the like. +% No font change, but don't do end-of-sentence spacing. +% +\def\abbr#1{\doabbr #1,,\finish} +\def\doabbr#1,#2,#3\finish{% + {\plainfrenchspacing #1}% + \def\temp{#2}% + \ifx\temp\empty \else + \space ({\unsepspaces \ignorespaces \temp \unskip})% + \fi +} + +% @pounds{} is a sterling sign, which Knuth put in the CM italic font. +% +\def\pounds{{\it\$}} + +% @euro{} comes from a separate font, depending on the current style. +% We use the free feym* fonts from the eurosym package by Henrik +% Theiling, which support regular, slanted, bold and bold slanted (and +% "outlined" (blackboard board, sort of) versions, which we don't need). +% It is available from http://www.ctan.org/tex-archive/fonts/eurosym. +% +% Although only regular is the truly official Euro symbol, we ignore +% that. The Euro is designed to be slightly taller than the regular +% font height. +% +% feymr - regular +% feymo - slanted +% feybr - bold +% feybo - bold slanted +% +% There is no good (free) typewriter version, to my knowledge. +% A feymr10 euro is ~7.3pt wide, while a normal cmtt10 char is ~5.25pt wide. +% Hmm. +% +% Also doesn't work in math. Do we need to do math with euro symbols? +% Hope not. +% +% +\def\euro{{\eurofont e}} +\def\eurofont{% + % We set the font at each command, rather than predefining it in + % \textfonts and the other font-switching commands, so that + % installations which never need the symbol don't have to have the + % font installed. + % + % There is only one designed size (nominal 10pt), so we always scale + % that to the current nominal size. + % + % By the way, simply using "at 1em" works for cmr10 and the like, but + % does not work for cmbx10 and other extended/shrunken fonts. + % + \def\eurosize{\csname\curfontsize nominalsize\endcsname}% + % + \ifx\curfontstyle\bfstylename + % bold: + \font\thiseurofont = \ifusingit{feybo10}{feybr10} at \eurosize + \else + % regular: + \font\thiseurofont = \ifusingit{feymo10}{feymr10} at \eurosize + \fi + \thiseurofont +} + +% Hacks for glyphs from the EC fonts similar to \euro. We don't +% use \let for the aliases, because sometimes we redefine the original +% macro, and the alias should reflect the redefinition. +\def\guillemetleft{{\ecfont \char"13}} +\def\guillemotleft{\guillemetleft} +\def\guillemetright{{\ecfont \char"14}} +\def\guillemotright{\guillemetright} +\def\guilsinglleft{{\ecfont \char"0E}} +\def\guilsinglright{{\ecfont \char"0F}} +\def\quotedblbase{{\ecfont \char"12}} +\def\quotesinglbase{{\ecfont \char"0D}} +% +\def\ecfont{% + % We can't distinguish serif/sanserif and italic/slanted, but this + % is used for crude hacks anyway (like adding French and German + % quotes to documents typeset with CM, where we lose kerning), so + % hopefully nobody will notice/care. + \edef\ecsize{\csname\curfontsize ecsize\endcsname}% + \edef\nominalsize{\csname\curfontsize nominalsize\endcsname}% + \ifx\curfontstyle\bfstylename + % bold: + \font\thisecfont = ecb\ifusingit{i}{x}\ecsize \space at \nominalsize + \else + % regular: + \font\thisecfont = ec\ifusingit{ti}{rm}\ecsize \space at \nominalsize + \fi + \thisecfont +} + +% @registeredsymbol - R in a circle. The font for the R should really +% be smaller yet, but lllsize is the best we can do for now. +% Adapted from the plain.tex definition of \copyright. +% +\def\registeredsymbol{% + $^{{\ooalign{\hfil\raise.07ex\hbox{\selectfonts\lllsize R}% + \hfil\crcr\Orb}}% + }$% +} + +% @textdegree - the normal degrees sign. +% +\def\textdegree{$^\circ$} + +% Laurent Siebenmann reports \Orb undefined with: +% Textures 1.7.7 (preloaded format=plain 93.10.14) (68K) 16 APR 2004 02:38 +% so we'll define it if necessary. +% +\ifx\Orb\undefined +\def\Orb{\mathhexbox20D} +\fi + +% Quotes. +\chardef\quotedblleft="5C +\chardef\quotedblright=`\" +\chardef\quoteleft=`\` +\chardef\quoteright=`\' + + +\message{page headings,} + +\newskip\titlepagetopglue \titlepagetopglue = 1.5in +\newskip\titlepagebottomglue \titlepagebottomglue = 2pc + +% First the title page. Must do @settitle before @titlepage. +\newif\ifseenauthor +\newif\iffinishedtitlepage + +% Do an implicit @contents or @shortcontents after @end titlepage if the +% user says @setcontentsaftertitlepage or @setshortcontentsaftertitlepage. +% +\newif\ifsetcontentsaftertitlepage + \let\setcontentsaftertitlepage = \setcontentsaftertitlepagetrue +\newif\ifsetshortcontentsaftertitlepage + \let\setshortcontentsaftertitlepage = \setshortcontentsaftertitlepagetrue + +\parseargdef\shorttitlepage{\begingroup\hbox{}\vskip 1.5in \chaprm \centerline{#1}% + \endgroup\page\hbox{}\page} + +\envdef\titlepage{% + % Open one extra group, as we want to close it in the middle of \Etitlepage. + \begingroup + \parindent=0pt \textfonts + % Leave some space at the very top of the page. + \vglue\titlepagetopglue + % No rule at page bottom unless we print one at the top with @title. + \finishedtitlepagetrue + % + % Most title ``pages'' are actually two pages long, with space + % at the top of the second. We don't want the ragged left on the second. + \let\oldpage = \page + \def\page{% + \iffinishedtitlepage\else + \finishtitlepage + \fi + \let\page = \oldpage + \page + \null + }% +} + +\def\Etitlepage{% + \iffinishedtitlepage\else + \finishtitlepage + \fi + % It is important to do the page break before ending the group, + % because the headline and footline are only empty inside the group. + % If we use the new definition of \page, we always get a blank page + % after the title page, which we certainly don't want. + \oldpage + \endgroup + % + % Need this before the \...aftertitlepage checks so that if they are + % in effect the toc pages will come out with page numbers. + \HEADINGSon + % + % If they want short, they certainly want long too. + \ifsetshortcontentsaftertitlepage + \shortcontents + \contents + \global\let\shortcontents = \relax + \global\let\contents = \relax + \fi + % + \ifsetcontentsaftertitlepage + \contents + \global\let\contents = \relax + \global\let\shortcontents = \relax + \fi +} + +\def\finishtitlepage{% + \vskip4pt \hrule height 2pt width \hsize + \vskip\titlepagebottomglue + \finishedtitlepagetrue +} + +%%% Macros to be used within @titlepage: + +\let\subtitlerm=\tenrm +\def\subtitlefont{\subtitlerm \normalbaselineskip = 13pt \normalbaselines} + +\def\authorfont{\authorrm \normalbaselineskip = 16pt \normalbaselines + \let\tt=\authortt} + +\parseargdef\title{% + \checkenv\titlepage + \leftline{\titlefonts\rm #1} + % print a rule at the page bottom also. + \finishedtitlepagefalse + \vskip4pt \hrule height 4pt width \hsize \vskip4pt +} + +\parseargdef\subtitle{% + \checkenv\titlepage + {\subtitlefont \rightline{#1}}% +} + +% @author should come last, but may come many times. +% It can also be used inside @quotation. +% +\parseargdef\author{% + \def\temp{\quotation}% + \ifx\thisenv\temp + \def\quotationauthor{#1}% printed in \Equotation. + \else + \checkenv\titlepage + \ifseenauthor\else \vskip 0pt plus 1filll \seenauthortrue \fi + {\authorfont \leftline{#1}}% + \fi +} + + +%%% Set up page headings and footings. + +\let\thispage=\folio + +\newtoks\evenheadline % headline on even pages +\newtoks\oddheadline % headline on odd pages +\newtoks\evenfootline % footline on even pages +\newtoks\oddfootline % footline on odd pages + +% Now make TeX use those variables +\headline={{\textfonts\rm \ifodd\pageno \the\oddheadline + \else \the\evenheadline \fi}} +\footline={{\textfonts\rm \ifodd\pageno \the\oddfootline + \else \the\evenfootline \fi}\HEADINGShook} +\let\HEADINGShook=\relax + +% Commands to set those variables. +% For example, this is what @headings on does +% @evenheading @thistitle|@thispage|@thischapter +% @oddheading @thischapter|@thispage|@thistitle +% @evenfooting @thisfile|| +% @oddfooting ||@thisfile + + +\def\evenheading{\parsearg\evenheadingxxx} +\def\evenheadingxxx #1{\evenheadingyyy #1\|\|\|\|\finish} +\def\evenheadingyyy #1\|#2\|#3\|#4\finish{% +\global\evenheadline={\rlap{\centerline{#2}}\line{#1\hfil#3}}} + +\def\oddheading{\parsearg\oddheadingxxx} +\def\oddheadingxxx #1{\oddheadingyyy #1\|\|\|\|\finish} +\def\oddheadingyyy #1\|#2\|#3\|#4\finish{% +\global\oddheadline={\rlap{\centerline{#2}}\line{#1\hfil#3}}} + +\parseargdef\everyheading{\oddheadingxxx{#1}\evenheadingxxx{#1}}% + +\def\evenfooting{\parsearg\evenfootingxxx} +\def\evenfootingxxx #1{\evenfootingyyy #1\|\|\|\|\finish} +\def\evenfootingyyy #1\|#2\|#3\|#4\finish{% +\global\evenfootline={\rlap{\centerline{#2}}\line{#1\hfil#3}}} + +\def\oddfooting{\parsearg\oddfootingxxx} +\def\oddfootingxxx #1{\oddfootingyyy #1\|\|\|\|\finish} +\def\oddfootingyyy #1\|#2\|#3\|#4\finish{% + \global\oddfootline = {\rlap{\centerline{#2}}\line{#1\hfil#3}}% + % + % Leave some space for the footline. Hopefully ok to assume + % @evenfooting will not be used by itself. + \global\advance\pageheight by -12pt + \global\advance\vsize by -12pt +} + +\parseargdef\everyfooting{\oddfootingxxx{#1}\evenfootingxxx{#1}} + +% @evenheadingmarks top \thischapter <- chapter at the top of a page +% @evenheadingmarks bottom \thischapter <- chapter at the bottom of a page +% +% The same set of arguments for: +% +% @oddheadingmarks +% @evenfootingmarks +% @oddfootingmarks +% @everyheadingmarks +% @everyfootingmarks + +\def\evenheadingmarks{\headingmarks{even}{heading}} +\def\oddheadingmarks{\headingmarks{odd}{heading}} +\def\evenfootingmarks{\headingmarks{even}{footing}} +\def\oddfootingmarks{\headingmarks{odd}{footing}} +\def\everyheadingmarks#1 {\headingmarks{even}{heading}{#1} + \headingmarks{odd}{heading}{#1} } +\def\everyfootingmarks#1 {\headingmarks{even}{footing}{#1} + \headingmarks{odd}{footing}{#1} } +% #1 = even/odd, #2 = heading/footing, #3 = top/bottom. +\def\headingmarks#1#2#3 {% + \expandafter\let\expandafter\temp \csname get#3headingmarks\endcsname + \global\expandafter\let\csname get#1#2marks\endcsname \temp +} + +\everyheadingmarks bottom +\everyfootingmarks bottom + +% @headings double turns headings on for double-sided printing. +% @headings single turns headings on for single-sided printing. +% @headings off turns them off. +% @headings on same as @headings double, retained for compatibility. +% @headings after turns on double-sided headings after this page. +% @headings doubleafter turns on double-sided headings after this page. +% @headings singleafter turns on single-sided headings after this page. +% By default, they are off at the start of a document, +% and turned `on' after @end titlepage. + +\def\headings #1 {\csname HEADINGS#1\endcsname} + +\def\HEADINGSoff{% +\global\evenheadline={\hfil} \global\evenfootline={\hfil} +\global\oddheadline={\hfil} \global\oddfootline={\hfil}} +\HEADINGSoff +% When we turn headings on, set the page number to 1. +% For double-sided printing, put current file name in lower left corner, +% chapter name on inside top of right hand pages, document +% title on inside top of left hand pages, and page numbers on outside top +% edge of all pages. +\def\HEADINGSdouble{% +\global\pageno=1 +\global\evenfootline={\hfil} +\global\oddfootline={\hfil} +\global\evenheadline={\line{\folio\hfil\thistitle}} +\global\oddheadline={\line{\thischapter\hfil\folio}} +\global\let\contentsalignmacro = \chapoddpage +} +\let\contentsalignmacro = \chappager + +% For single-sided printing, chapter title goes across top left of page, +% page number on top right. +\def\HEADINGSsingle{% +\global\pageno=1 +\global\evenfootline={\hfil} +\global\oddfootline={\hfil} +\global\evenheadline={\line{\thischapter\hfil\folio}} +\global\oddheadline={\line{\thischapter\hfil\folio}} +\global\let\contentsalignmacro = \chappager +} +\def\HEADINGSon{\HEADINGSdouble} + +\def\HEADINGSafter{\let\HEADINGShook=\HEADINGSdoublex} +\let\HEADINGSdoubleafter=\HEADINGSafter +\def\HEADINGSdoublex{% +\global\evenfootline={\hfil} +\global\oddfootline={\hfil} +\global\evenheadline={\line{\folio\hfil\thistitle}} +\global\oddheadline={\line{\thischapter\hfil\folio}} +\global\let\contentsalignmacro = \chapoddpage +} + +\def\HEADINGSsingleafter{\let\HEADINGShook=\HEADINGSsinglex} +\def\HEADINGSsinglex{% +\global\evenfootline={\hfil} +\global\oddfootline={\hfil} +\global\evenheadline={\line{\thischapter\hfil\folio}} +\global\oddheadline={\line{\thischapter\hfil\folio}} +\global\let\contentsalignmacro = \chappager +} + +% Subroutines used in generating headings +% This produces Day Month Year style of output. +% Only define if not already defined, in case a txi-??.tex file has set +% up a different format (e.g., txi-cs.tex does this). +\ifx\today\undefined +\def\today{% + \number\day\space + \ifcase\month + \or\putwordMJan\or\putwordMFeb\or\putwordMMar\or\putwordMApr + \or\putwordMMay\or\putwordMJun\or\putwordMJul\or\putwordMAug + \or\putwordMSep\or\putwordMOct\or\putwordMNov\or\putwordMDec + \fi + \space\number\year} +\fi + +% @settitle line... specifies the title of the document, for headings. +% It generates no output of its own. +\def\thistitle{\putwordNoTitle} +\def\settitle{\parsearg{\gdef\thistitle}} + + +\message{tables,} +% Tables -- @table, @ftable, @vtable, @item(x). + +% default indentation of table text +\newdimen\tableindent \tableindent=.8in +% default indentation of @itemize and @enumerate text +\newdimen\itemindent \itemindent=.3in +% margin between end of table item and start of table text. +\newdimen\itemmargin \itemmargin=.1in + +% used internally for \itemindent minus \itemmargin +\newdimen\itemmax + +% Note @table, @ftable, and @vtable define @item, @itemx, etc., with +% these defs. +% They also define \itemindex +% to index the item name in whatever manner is desired (perhaps none). + +\newif\ifitemxneedsnegativevskip + +\def\itemxpar{\par\ifitemxneedsnegativevskip\nobreak\vskip-\parskip\nobreak\fi} + +\def\internalBitem{\smallbreak \parsearg\itemzzz} +\def\internalBitemx{\itemxpar \parsearg\itemzzz} + +\def\itemzzz #1{\begingroup % + \advance\hsize by -\rightskip + \advance\hsize by -\tableindent + \setbox0=\hbox{\itemindicate{#1}}% + \itemindex{#1}% + \nobreak % This prevents a break before @itemx. + % + % If the item text does not fit in the space we have, put it on a line + % by itself, and do not allow a page break either before or after that + % line. We do not start a paragraph here because then if the next + % command is, e.g., @kindex, the whatsit would get put into the + % horizontal list on a line by itself, resulting in extra blank space. + \ifdim \wd0>\itemmax + % + % Make this a paragraph so we get the \parskip glue and wrapping, + % but leave it ragged-right. + \begingroup + \advance\leftskip by-\tableindent + \advance\hsize by\tableindent + \advance\rightskip by0pt plus1fil + \leavevmode\unhbox0\par + \endgroup + % + % We're going to be starting a paragraph, but we don't want the + % \parskip glue -- logically it's part of the @item we just started. + \nobreak \vskip-\parskip + % + % Stop a page break at the \parskip glue coming up. However, if + % what follows is an environment such as @example, there will be no + % \parskip glue; then the negative vskip we just inserted would + % cause the example and the item to crash together. So we use this + % bizarre value of 10001 as a signal to \aboveenvbreak to insert + % \parskip glue after all. Section titles are handled this way also. + % + \penalty 10001 + \endgroup + \itemxneedsnegativevskipfalse + \else + % The item text fits into the space. Start a paragraph, so that the + % following text (if any) will end up on the same line. + \noindent + % Do this with kerns and \unhbox so that if there is a footnote in + % the item text, it can migrate to the main vertical list and + % eventually be printed. + \nobreak\kern-\tableindent + \dimen0 = \itemmax \advance\dimen0 by \itemmargin \advance\dimen0 by -\wd0 + \unhbox0 + \nobreak\kern\dimen0 + \endgroup + \itemxneedsnegativevskiptrue + \fi +} + +\def\item{\errmessage{@item while not in a list environment}} +\def\itemx{\errmessage{@itemx while not in a list environment}} + +% @table, @ftable, @vtable. +\envdef\table{% + \let\itemindex\gobble + \tablecheck{table}% +} +\envdef\ftable{% + \def\itemindex ##1{\doind {fn}{\code{##1}}}% + \tablecheck{ftable}% +} +\envdef\vtable{% + \def\itemindex ##1{\doind {vr}{\code{##1}}}% + \tablecheck{vtable}% +} +\def\tablecheck#1{% + \ifnum \the\catcode`\^^M=\active + \endgroup + \errmessage{This command won't work in this context; perhaps the problem is + that we are \inenvironment\thisenv}% + \def\next{\doignore{#1}}% + \else + \let\next\tablex + \fi + \next +} +\def\tablex#1{% + \def\itemindicate{#1}% + \parsearg\tabley +} +\def\tabley#1{% + {% + \makevalueexpandable + \edef\temp{\noexpand\tablez #1\space\space\space}% + \expandafter + }\temp \endtablez +} +\def\tablez #1 #2 #3 #4\endtablez{% + \aboveenvbreak + \ifnum 0#1>0 \advance \leftskip by #1\mil \fi + \ifnum 0#2>0 \tableindent=#2\mil \fi + \ifnum 0#3>0 \advance \rightskip by #3\mil \fi + \itemmax=\tableindent + \advance \itemmax by -\itemmargin + \advance \leftskip by \tableindent + \exdentamount=\tableindent + \parindent = 0pt + \parskip = \smallskipamount + \ifdim \parskip=0pt \parskip=2pt \fi + \let\item = \internalBitem + \let\itemx = \internalBitemx +} +\def\Etable{\endgraf\afterenvbreak} +\let\Eftable\Etable +\let\Evtable\Etable +\let\Eitemize\Etable +\let\Eenumerate\Etable + +% This is the counter used by @enumerate, which is really @itemize + +\newcount \itemno + +\envdef\itemize{\parsearg\doitemize} + +\def\doitemize#1{% + \aboveenvbreak + \itemmax=\itemindent + \advance\itemmax by -\itemmargin + \advance\leftskip by \itemindent + \exdentamount=\itemindent + \parindent=0pt + \parskip=\smallskipamount + \ifdim\parskip=0pt \parskip=2pt \fi + \def\itemcontents{#1}% + % @itemize with no arg is equivalent to @itemize @bullet. + \ifx\itemcontents\empty\def\itemcontents{\bullet}\fi + \let\item=\itemizeitem +} + +% Definition of @item while inside @itemize and @enumerate. +% +\def\itemizeitem{% + \advance\itemno by 1 % for enumerations + {\let\par=\endgraf \smallbreak}% reasonable place to break + {% + % If the document has an @itemize directly after a section title, a + % \nobreak will be last on the list, and \sectionheading will have + % done a \vskip-\parskip. In that case, we don't want to zero + % parskip, or the item text will crash with the heading. On the + % other hand, when there is normal text preceding the item (as there + % usually is), we do want to zero parskip, or there would be too much + % space. In that case, we won't have a \nobreak before. At least + % that's the theory. + \ifnum\lastpenalty<10000 \parskip=0in \fi + \noindent + \hbox to 0pt{\hss \itemcontents \kern\itemmargin}% + \vadjust{\penalty 1200}}% not good to break after first line of item. + \flushcr +} + +% \splitoff TOKENS\endmark defines \first to be the first token in +% TOKENS, and \rest to be the remainder. +% +\def\splitoff#1#2\endmark{\def\first{#1}\def\rest{#2}}% + +% Allow an optional argument of an uppercase letter, lowercase letter, +% or number, to specify the first label in the enumerated list. No +% argument is the same as `1'. +% +\envparseargdef\enumerate{\enumeratey #1 \endenumeratey} +\def\enumeratey #1 #2\endenumeratey{% + % If we were given no argument, pretend we were given `1'. + \def\thearg{#1}% + \ifx\thearg\empty \def\thearg{1}\fi + % + % Detect if the argument is a single token. If so, it might be a + % letter. Otherwise, the only valid thing it can be is a number. + % (We will always have one token, because of the test we just made. + % This is a good thing, since \splitoff doesn't work given nothing at + % all -- the first parameter is undelimited.) + \expandafter\splitoff\thearg\endmark + \ifx\rest\empty + % Only one token in the argument. It could still be anything. + % A ``lowercase letter'' is one whose \lccode is nonzero. + % An ``uppercase letter'' is one whose \lccode is both nonzero, and + % not equal to itself. + % Otherwise, we assume it's a number. + % + % We need the \relax at the end of the \ifnum lines to stop TeX from + % continuing to look for a . + % + \ifnum\lccode\expandafter`\thearg=0\relax + \numericenumerate % a number (we hope) + \else + % It's a letter. + \ifnum\lccode\expandafter`\thearg=\expandafter`\thearg\relax + \lowercaseenumerate % lowercase letter + \else + \uppercaseenumerate % uppercase letter + \fi + \fi + \else + % Multiple tokens in the argument. We hope it's a number. + \numericenumerate + \fi +} + +% An @enumerate whose labels are integers. The starting integer is +% given in \thearg. +% +\def\numericenumerate{% + \itemno = \thearg + \startenumeration{\the\itemno}% +} + +% The starting (lowercase) letter is in \thearg. +\def\lowercaseenumerate{% + \itemno = \expandafter`\thearg + \startenumeration{% + % Be sure we're not beyond the end of the alphabet. + \ifnum\itemno=0 + \errmessage{No more lowercase letters in @enumerate; get a bigger + alphabet}% + \fi + \char\lccode\itemno + }% +} + +% The starting (uppercase) letter is in \thearg. +\def\uppercaseenumerate{% + \itemno = \expandafter`\thearg + \startenumeration{% + % Be sure we're not beyond the end of the alphabet. + \ifnum\itemno=0 + \errmessage{No more uppercase letters in @enumerate; get a bigger + alphabet} + \fi + \char\uccode\itemno + }% +} + +% Call \doitemize, adding a period to the first argument and supplying the +% common last two arguments. Also subtract one from the initial value in +% \itemno, since @item increments \itemno. +% +\def\startenumeration#1{% + \advance\itemno by -1 + \doitemize{#1.}\flushcr +} + +% @alphaenumerate and @capsenumerate are abbreviations for giving an arg +% to @enumerate. +% +\def\alphaenumerate{\enumerate{a}} +\def\capsenumerate{\enumerate{A}} +\def\Ealphaenumerate{\Eenumerate} +\def\Ecapsenumerate{\Eenumerate} + + +% @multitable macros +% Amy Hendrickson, 8/18/94, 3/6/96 +% +% @multitable ... @end multitable will make as many columns as desired. +% Contents of each column will wrap at width given in preamble. Width +% can be specified either with sample text given in a template line, +% or in percent of \hsize, the current width of text on page. + +% Table can continue over pages but will only break between lines. + +% To make preamble: +% +% Either define widths of columns in terms of percent of \hsize: +% @multitable @columnfractions .25 .3 .45 +% @item ... +% +% Numbers following @columnfractions are the percent of the total +% current hsize to be used for each column. You may use as many +% columns as desired. + + +% Or use a template: +% @multitable {Column 1 template} {Column 2 template} {Column 3 template} +% @item ... +% using the widest term desired in each column. + +% Each new table line starts with @item, each subsequent new column +% starts with @tab. Empty columns may be produced by supplying @tab's +% with nothing between them for as many times as empty columns are needed, +% ie, @tab@tab@tab will produce two empty columns. + +% @item, @tab do not need to be on their own lines, but it will not hurt +% if they are. + +% Sample multitable: + +% @multitable {Column 1 template} {Column 2 template} {Column 3 template} +% @item first col stuff @tab second col stuff @tab third col +% @item +% first col stuff +% @tab +% second col stuff +% @tab +% third col +% @item first col stuff @tab second col stuff +% @tab Many paragraphs of text may be used in any column. +% +% They will wrap at the width determined by the template. +% @item@tab@tab This will be in third column. +% @end multitable + +% Default dimensions may be reset by user. +% @multitableparskip is vertical space between paragraphs in table. +% @multitableparindent is paragraph indent in table. +% @multitablecolmargin is horizontal space to be left between columns. +% @multitablelinespace is space to leave between table items, baseline +% to baseline. +% 0pt means it depends on current normal line spacing. +% +\newskip\multitableparskip +\newskip\multitableparindent +\newdimen\multitablecolspace +\newskip\multitablelinespace +\multitableparskip=0pt +\multitableparindent=6pt +\multitablecolspace=12pt +\multitablelinespace=0pt + +% Macros used to set up halign preamble: +% +\let\endsetuptable\relax +\def\xendsetuptable{\endsetuptable} +\let\columnfractions\relax +\def\xcolumnfractions{\columnfractions} +\newif\ifsetpercent + +% #1 is the @columnfraction, usually a decimal number like .5, but might +% be just 1. We just use it, whatever it is. +% +\def\pickupwholefraction#1 {% + \global\advance\colcount by 1 + \expandafter\xdef\csname col\the\colcount\endcsname{#1\hsize}% + \setuptable +} + +\newcount\colcount +\def\setuptable#1{% + \def\firstarg{#1}% + \ifx\firstarg\xendsetuptable + \let\go = \relax + \else + \ifx\firstarg\xcolumnfractions + \global\setpercenttrue + \else + \ifsetpercent + \let\go\pickupwholefraction + \else + \global\advance\colcount by 1 + \setbox0=\hbox{#1\unskip\space}% Add a normal word space as a + % separator; typically that is always in the input, anyway. + \expandafter\xdef\csname col\the\colcount\endcsname{\the\wd0}% + \fi + \fi + \ifx\go\pickupwholefraction + % Put the argument back for the \pickupwholefraction call, so + % we'll always have a period there to be parsed. + \def\go{\pickupwholefraction#1}% + \else + \let\go = \setuptable + \fi% + \fi + \go +} + +% multitable-only commands. +% +% @headitem starts a heading row, which we typeset in bold. +% Assignments have to be global since we are inside the implicit group +% of an alignment entry. Note that \everycr resets \everytab. +\def\headitem{\checkenv\multitable \crcr \global\everytab={\bf}\the\everytab}% +% +% A \tab used to include \hskip1sp. But then the space in a template +% line is not enough. That is bad. So let's go back to just `&' until +% we encounter the problem it was intended to solve again. +% --karl, nathan@acm.org, 20apr99. +\def\tab{\checkenv\multitable &\the\everytab}% + +% @multitable ... @end multitable definitions: +% +\newtoks\everytab % insert after every tab. +% +\envdef\multitable{% + \vskip\parskip + \startsavinginserts + % + % @item within a multitable starts a normal row. + % We use \def instead of \let so that if one of the multitable entries + % contains an @itemize, we don't choke on the \item (seen as \crcr aka + % \endtemplate) expanding \doitemize. + \def\item{\crcr}% + % + \tolerance=9500 + \hbadness=9500 + \setmultitablespacing + \parskip=\multitableparskip + \parindent=\multitableparindent + \overfullrule=0pt + \global\colcount=0 + % + \everycr = {% + \noalign{% + \global\everytab={}% + \global\colcount=0 % Reset the column counter. + % Check for saved footnotes, etc. + \checkinserts + % Keeps underfull box messages off when table breaks over pages. + %\filbreak + % Maybe so, but it also creates really weird page breaks when the + % table breaks over pages. Wouldn't \vfil be better? Wait until the + % problem manifests itself, so it can be fixed for real --karl. + }% + }% + % + \parsearg\domultitable +} +\def\domultitable#1{% + % To parse everything between @multitable and @item: + \setuptable#1 \endsetuptable + % + % This preamble sets up a generic column definition, which will + % be used as many times as user calls for columns. + % \vtop will set a single line and will also let text wrap and + % continue for many paragraphs if desired. + \halign\bgroup &% + \global\advance\colcount by 1 + \multistrut + \vtop{% + % Use the current \colcount to find the correct column width: + \hsize=\expandafter\csname col\the\colcount\endcsname + % + % In order to keep entries from bumping into each other + % we will add a \leftskip of \multitablecolspace to all columns after + % the first one. + % + % If a template has been used, we will add \multitablecolspace + % to the width of each template entry. + % + % If the user has set preamble in terms of percent of \hsize we will + % use that dimension as the width of the column, and the \leftskip + % will keep entries from bumping into each other. Table will start at + % left margin and final column will justify at right margin. + % + % Make sure we don't inherit \rightskip from the outer environment. + \rightskip=0pt + \ifnum\colcount=1 + % The first column will be indented with the surrounding text. + \advance\hsize by\leftskip + \else + \ifsetpercent \else + % If user has not set preamble in terms of percent of \hsize + % we will advance \hsize by \multitablecolspace. + \advance\hsize by \multitablecolspace + \fi + % In either case we will make \leftskip=\multitablecolspace: + \leftskip=\multitablecolspace + \fi + % Ignoring space at the beginning and end avoids an occasional spurious + % blank line, when TeX decides to break the line at the space before the + % box from the multistrut, so the strut ends up on a line by itself. + % For example: + % @multitable @columnfractions .11 .89 + % @item @code{#} + % @tab Legal holiday which is valid in major parts of the whole country. + % Is automatically provided with highlighting sequences respectively + % marking characters. + \noindent\ignorespaces##\unskip\multistrut + }\cr +} +\def\Emultitable{% + \crcr + \egroup % end the \halign + \global\setpercentfalse +} + +\def\setmultitablespacing{% + \def\multistrut{\strut}% just use the standard line spacing + % + % Compute \multitablelinespace (if not defined by user) for use in + % \multitableparskip calculation. We used define \multistrut based on + % this, but (ironically) that caused the spacing to be off. + % See bug-texinfo report from Werner Lemberg, 31 Oct 2004 12:52:20 +0100. +\ifdim\multitablelinespace=0pt +\setbox0=\vbox{X}\global\multitablelinespace=\the\baselineskip +\global\advance\multitablelinespace by-\ht0 +\fi +%% Test to see if parskip is larger than space between lines of +%% table. If not, do nothing. +%% If so, set to same dimension as multitablelinespace. +\ifdim\multitableparskip>\multitablelinespace +\global\multitableparskip=\multitablelinespace +\global\advance\multitableparskip-7pt %% to keep parskip somewhat smaller + %% than skip between lines in the table. +\fi% +\ifdim\multitableparskip=0pt +\global\multitableparskip=\multitablelinespace +\global\advance\multitableparskip-7pt %% to keep parskip somewhat smaller + %% than skip between lines in the table. +\fi} + + +\message{conditionals,} + +% @iftex, @ifnotdocbook, @ifnothtml, @ifnotinfo, @ifnotplaintext, +% @ifnotxml always succeed. They currently do nothing; we don't +% attempt to check whether the conditionals are properly nested. But we +% have to remember that they are conditionals, so that @end doesn't +% attempt to close an environment group. +% +\def\makecond#1{% + \expandafter\let\csname #1\endcsname = \relax + \expandafter\let\csname iscond.#1\endcsname = 1 +} +\makecond{iftex} +\makecond{ifnotdocbook} +\makecond{ifnothtml} +\makecond{ifnotinfo} +\makecond{ifnotplaintext} +\makecond{ifnotxml} + +% Ignore @ignore, @ifhtml, @ifinfo, and the like. +% +\def\direntry{\doignore{direntry}} +\def\documentdescription{\doignore{documentdescription}} +\def\docbook{\doignore{docbook}} +\def\html{\doignore{html}} +\def\ifdocbook{\doignore{ifdocbook}} +\def\ifhtml{\doignore{ifhtml}} +\def\ifinfo{\doignore{ifinfo}} +\def\ifnottex{\doignore{ifnottex}} +\def\ifplaintext{\doignore{ifplaintext}} +\def\ifxml{\doignore{ifxml}} +\def\ignore{\doignore{ignore}} +\def\menu{\doignore{menu}} +\def\xml{\doignore{xml}} + +% Ignore text until a line `@end #1', keeping track of nested conditionals. +% +% A count to remember the depth of nesting. +\newcount\doignorecount + +\def\doignore#1{\begingroup + % Scan in ``verbatim'' mode: + \obeylines + \catcode`\@ = \other + \catcode`\{ = \other + \catcode`\} = \other + % + % Make sure that spaces turn into tokens that match what \doignoretext wants. + \spaceisspace + % + % Count number of #1's that we've seen. + \doignorecount = 0 + % + % Swallow text until we reach the matching `@end #1'. + \dodoignore{#1}% +} + +{ \catcode`_=11 % We want to use \_STOP_ which cannot appear in texinfo source. + \obeylines % + % + \gdef\dodoignore#1{% + % #1 contains the command name as a string, e.g., `ifinfo'. + % + % Define a command to find the next `@end #1'. + \long\def\doignoretext##1^^M@end #1{% + \doignoretextyyy##1^^M@#1\_STOP_}% + % + % And this command to find another #1 command, at the beginning of a + % line. (Otherwise, we would consider a line `@c @ifset', for + % example, to count as an @ifset for nesting.) + \long\def\doignoretextyyy##1^^M@#1##2\_STOP_{\doignoreyyy{##2}\_STOP_}% + % + % And now expand that command. + \doignoretext ^^M% + }% +} + +\def\doignoreyyy#1{% + \def\temp{#1}% + \ifx\temp\empty % Nothing found. + \let\next\doignoretextzzz + \else % Found a nested condition, ... + \advance\doignorecount by 1 + \let\next\doignoretextyyy % ..., look for another. + % If we're here, #1 ends with ^^M\ifinfo (for example). + \fi + \next #1% the token \_STOP_ is present just after this macro. +} + +% We have to swallow the remaining "\_STOP_". +% +\def\doignoretextzzz#1{% + \ifnum\doignorecount = 0 % We have just found the outermost @end. + \let\next\enddoignore + \else % Still inside a nested condition. + \advance\doignorecount by -1 + \let\next\doignoretext % Look for the next @end. + \fi + \next +} + +% Finish off ignored text. +{ \obeylines% + % Ignore anything after the last `@end #1'; this matters in verbatim + % environments, where otherwise the newline after an ignored conditional + % would result in a blank line in the output. + \gdef\enddoignore#1^^M{\endgroup\ignorespaces}% +} + + +% @set VAR sets the variable VAR to an empty value. +% @set VAR REST-OF-LINE sets VAR to the value REST-OF-LINE. +% +% Since we want to separate VAR from REST-OF-LINE (which might be +% empty), we can't just use \parsearg; we have to insert a space of our +% own to delimit the rest of the line, and then take it out again if we +% didn't need it. +% We rely on the fact that \parsearg sets \catcode`\ =10. +% +\parseargdef\set{\setyyy#1 \endsetyyy} +\def\setyyy#1 #2\endsetyyy{% + {% + \makevalueexpandable + \def\temp{#2}% + \edef\next{\gdef\makecsname{SET#1}}% + \ifx\temp\empty + \next{}% + \else + \setzzz#2\endsetzzz + \fi + }% +} +% Remove the trailing space \setxxx inserted. +\def\setzzz#1 \endsetzzz{\next{#1}} + +% @clear VAR clears (i.e., unsets) the variable VAR. +% +\parseargdef\clear{% + {% + \makevalueexpandable + \global\expandafter\let\csname SET#1\endcsname=\relax + }% +} + +% @value{foo} gets the text saved in variable foo. +\def\value{\begingroup\makevalueexpandable\valuexxx} +\def\valuexxx#1{\expandablevalue{#1}\endgroup} +{ + \catcode`\- = \active \catcode`\_ = \active + % + \gdef\makevalueexpandable{% + \let\value = \expandablevalue + % We don't want these characters active, ... + \catcode`\-=\other \catcode`\_=\other + % ..., but we might end up with active ones in the argument if + % we're called from @code, as @code{@value{foo-bar_}}, though. + % So \let them to their normal equivalents. + \let-\realdash \let_\normalunderscore + } +} + +% We have this subroutine so that we can handle at least some @value's +% properly in indexes (we call \makevalueexpandable in \indexdummies). +% The command has to be fully expandable (if the variable is set), since +% the result winds up in the index file. This means that if the +% variable's value contains other Texinfo commands, it's almost certain +% it will fail (although perhaps we could fix that with sufficient work +% to do a one-level expansion on the result, instead of complete). +% +\def\expandablevalue#1{% + \expandafter\ifx\csname SET#1\endcsname\relax + {[No value for ``#1'']}% + \message{Variable `#1', used in @value, is not set.}% + \else + \csname SET#1\endcsname + \fi +} + +% @ifset VAR ... @end ifset reads the `...' iff VAR has been defined +% with @set. +% +% To get special treatment of `@end ifset,' call \makeond and the redefine. +% +\makecond{ifset} +\def\ifset{\parsearg{\doifset{\let\next=\ifsetfail}}} +\def\doifset#1#2{% + {% + \makevalueexpandable + \let\next=\empty + \expandafter\ifx\csname SET#2\endcsname\relax + #1% If not set, redefine \next. + \fi + \expandafter + }\next +} +\def\ifsetfail{\doignore{ifset}} + +% @ifclear VAR ... @end ifclear reads the `...' iff VAR has never been +% defined with @set, or has been undefined with @clear. +% +% The `\else' inside the `\doifset' parameter is a trick to reuse the +% above code: if the variable is not set, do nothing, if it is set, +% then redefine \next to \ifclearfail. +% +\makecond{ifclear} +\def\ifclear{\parsearg{\doifset{\else \let\next=\ifclearfail}}} +\def\ifclearfail{\doignore{ifclear}} + +% @dircategory CATEGORY -- specify a category of the dir file +% which this file should belong to. Ignore this in TeX. +\let\dircategory=\comment + +% @defininfoenclose. +\let\definfoenclose=\comment + + +\message{indexing,} +% Index generation facilities + +% Define \newwrite to be identical to plain tex's \newwrite +% except not \outer, so it can be used within macros and \if's. +\edef\newwrite{\makecsname{ptexnewwrite}} + +% \newindex {foo} defines an index named foo. +% It automatically defines \fooindex such that +% \fooindex ...rest of line... puts an entry in the index foo. +% It also defines \fooindfile to be the number of the output channel for +% the file that accumulates this index. The file's extension is foo. +% The name of an index should be no more than 2 characters long +% for the sake of vms. +% +\def\newindex#1{% + \iflinks + \expandafter\newwrite \csname#1indfile\endcsname + \openout \csname#1indfile\endcsname \jobname.#1 % Open the file + \fi + \expandafter\xdef\csname#1index\endcsname{% % Define @#1index + \noexpand\doindex{#1}} +} + +% @defindex foo == \newindex{foo} +% +\def\defindex{\parsearg\newindex} + +% Define @defcodeindex, like @defindex except put all entries in @code. +% +\def\defcodeindex{\parsearg\newcodeindex} +% +\def\newcodeindex#1{% + \iflinks + \expandafter\newwrite \csname#1indfile\endcsname + \openout \csname#1indfile\endcsname \jobname.#1 + \fi + \expandafter\xdef\csname#1index\endcsname{% + \noexpand\docodeindex{#1}}% +} + + +% @synindex foo bar makes index foo feed into index bar. +% Do this instead of @defindex foo if you don't want it as a separate index. +% +% @syncodeindex foo bar similar, but put all entries made for index foo +% inside @code. +% +\def\synindex#1 #2 {\dosynindex\doindex{#1}{#2}} +\def\syncodeindex#1 #2 {\dosynindex\docodeindex{#1}{#2}} + +% #1 is \doindex or \docodeindex, #2 the index getting redefined (foo), +% #3 the target index (bar). +\def\dosynindex#1#2#3{% + % Only do \closeout if we haven't already done it, else we'll end up + % closing the target index. + \expandafter \ifx\csname donesynindex#2\endcsname \undefined + % The \closeout helps reduce unnecessary open files; the limit on the + % Acorn RISC OS is a mere 16 files. + \expandafter\closeout\csname#2indfile\endcsname + \expandafter\let\csname\donesynindex#2\endcsname = 1 + \fi + % redefine \fooindfile: + \expandafter\let\expandafter\temp\expandafter=\csname#3indfile\endcsname + \expandafter\let\csname#2indfile\endcsname=\temp + % redefine \fooindex: + \expandafter\xdef\csname#2index\endcsname{\noexpand#1{#3}}% +} + +% Define \doindex, the driver for all \fooindex macros. +% Argument #1 is generated by the calling \fooindex macro, +% and it is "foo", the name of the index. + +% \doindex just uses \parsearg; it calls \doind for the actual work. +% This is because \doind is more useful to call from other macros. + +% There is also \dosubind {index}{topic}{subtopic} +% which makes an entry in a two-level index such as the operation index. + +\def\doindex#1{\edef\indexname{#1}\parsearg\singleindexer} +\def\singleindexer #1{\doind{\indexname}{#1}} + +% like the previous two, but they put @code around the argument. +\def\docodeindex#1{\edef\indexname{#1}\parsearg\singlecodeindexer} +\def\singlecodeindexer #1{\doind{\indexname}{\code{#1}}} + +% Take care of Texinfo commands that can appear in an index entry. +% Since there are some commands we want to expand, and others we don't, +% we have to laboriously prevent expansion for those that we don't. +% +\def\indexdummies{% + \escapechar = `\\ % use backslash in output files. + \def\@{@}% change to @@ when we switch to @ as escape char in index files. + \def\ {\realbackslash\space }% + % + % Need these in case \tex is in effect and \{ is a \delimiter again. + % But can't use \lbracecmd and \rbracecmd because texindex assumes + % braces and backslashes are used only as delimiters. + \let\{ = \mylbrace + \let\} = \myrbrace + % + % I don't entirely understand this, but when an index entry is + % generated from a macro call, the \endinput which \scanmacro inserts + % causes processing to be prematurely terminated. This is, + % apparently, because \indexsorttmp is fully expanded, and \endinput + % is an expandable command. The redefinition below makes \endinput + % disappear altogether for that purpose -- although logging shows that + % processing continues to some further point. On the other hand, it + % seems \endinput does not hurt in the printed index arg, since that + % is still getting written without apparent harm. + % + % Sample source (mac-idx3.tex, reported by Graham Percival to + % help-texinfo, 22may06): + % @macro funindex {WORD} + % @findex xyz + % @end macro + % ... + % @funindex commtest + % + % The above is not enough to reproduce the bug, but it gives the flavor. + % + % Sample whatsit resulting: + % .@write3{\entry{xyz}{@folio }{@code {xyz@endinput }}} + % + % So: + \let\endinput = \empty + % + % Do the redefinitions. + \commondummies +} + +% For the aux and toc files, @ is the escape character. So we want to +% redefine everything using @ as the escape character (instead of +% \realbackslash, still used for index files). When everything uses @, +% this will be simpler. +% +\def\atdummies{% + \def\@{@@}% + \def\ {@ }% + \let\{ = \lbraceatcmd + \let\} = \rbraceatcmd + % + % Do the redefinitions. + \commondummies + \otherbackslash +} + +% Called from \indexdummies and \atdummies. +% +\def\commondummies{% + % + % \definedummyword defines \#1 as \string\#1\space, thus effectively + % preventing its expansion. This is used only for control% words, + % not control letters, because the \space would be incorrect for + % control characters, but is needed to separate the control word + % from whatever follows. + % + % For control letters, we have \definedummyletter, which omits the + % space. + % + % These can be used both for control words that take an argument and + % those that do not. If it is followed by {arg} in the input, then + % that will dutifully get written to the index (or wherever). + % + \def\definedummyword ##1{\def##1{\string##1\space}}% + \def\definedummyletter##1{\def##1{\string##1}}% + \let\definedummyaccent\definedummyletter + % + \commondummiesnofonts + % + \definedummyletter\_% + % + % Non-English letters. + \definedummyword\AA + \definedummyword\AE + \definedummyword\L + \definedummyword\OE + \definedummyword\O + \definedummyword\aa + \definedummyword\ae + \definedummyword\l + \definedummyword\oe + \definedummyword\o + \definedummyword\ss + \definedummyword\exclamdown + \definedummyword\questiondown + \definedummyword\ordf + \definedummyword\ordm + % + % Although these internal commands shouldn't show up, sometimes they do. + \definedummyword\bf + \definedummyword\gtr + \definedummyword\hat + \definedummyword\less + \definedummyword\sf + \definedummyword\sl + \definedummyword\tclose + \definedummyword\tt + % + \definedummyword\LaTeX + \definedummyword\TeX + % + % Assorted special characters. + \definedummyword\bullet + \definedummyword\comma + \definedummyword\copyright + \definedummyword\registeredsymbol + \definedummyword\dots + \definedummyword\enddots + \definedummyword\equiv + \definedummyword\error + \definedummyword\euro + \definedummyword\guillemetleft + \definedummyword\guillemetright + \definedummyword\guilsinglleft + \definedummyword\guilsinglright + \definedummyword\expansion + \definedummyword\minus + \definedummyword\pounds + \definedummyword\point + \definedummyword\print + \definedummyword\quotedblbase + \definedummyword\quotedblleft + \definedummyword\quotedblright + \definedummyword\quoteleft + \definedummyword\quoteright + \definedummyword\quotesinglbase + \definedummyword\result + \definedummyword\textdegree + % + % We want to disable all macros so that they are not expanded by \write. + \macrolist + % + \normalturnoffactive + % + % Handle some cases of @value -- where it does not contain any + % (non-fully-expandable) commands. + \makevalueexpandable +} + +% \commondummiesnofonts: common to \commondummies and \indexnofonts. +% +\def\commondummiesnofonts{% + % Control letters and accents. + \definedummyletter\!% + \definedummyaccent\"% + \definedummyaccent\'% + \definedummyletter\*% + \definedummyaccent\,% + \definedummyletter\.% + \definedummyletter\/% + \definedummyletter\:% + \definedummyaccent\=% + \definedummyletter\?% + \definedummyaccent\^% + \definedummyaccent\`% + \definedummyaccent\~% + \definedummyword\u + \definedummyword\v + \definedummyword\H + \definedummyword\dotaccent + \definedummyword\ringaccent + \definedummyword\tieaccent + \definedummyword\ubaraccent + \definedummyword\udotaccent + \definedummyword\dotless + % + % Texinfo font commands. + \definedummyword\b + \definedummyword\i + \definedummyword\r + \definedummyword\sc + \definedummyword\t + % + % Commands that take arguments. + \definedummyword\acronym + \definedummyword\cite + \definedummyword\code + \definedummyword\command + \definedummyword\dfn + \definedummyword\emph + \definedummyword\env + \definedummyword\file + \definedummyword\kbd + \definedummyword\key + \definedummyword\math + \definedummyword\option + \definedummyword\pxref + \definedummyword\ref + \definedummyword\samp + \definedummyword\strong + \definedummyword\tie + \definedummyword\uref + \definedummyword\url + \definedummyword\var + \definedummyword\verb + \definedummyword\w + \definedummyword\xref +} + +% \indexnofonts is used when outputting the strings to sort the index +% by, and when constructing control sequence names. It eliminates all +% control sequences and just writes whatever the best ASCII sort string +% would be for a given command (usually its argument). +% +\def\indexnofonts{% + % Accent commands should become @asis. + \def\definedummyaccent##1{\let##1\asis}% + % We can just ignore other control letters. + \def\definedummyletter##1{\let##1\empty}% + % Hopefully, all control words can become @asis. + \let\definedummyword\definedummyaccent + % + \commondummiesnofonts + % + % Don't no-op \tt, since it isn't a user-level command + % and is used in the definitions of the active chars like <, >, |, etc. + % Likewise with the other plain tex font commands. + %\let\tt=\asis + % + \def\ { }% + \def\@{@}% + % how to handle braces? + \def\_{\normalunderscore}% + % + % Non-English letters. + \def\AA{AA}% + \def\AE{AE}% + \def\L{L}% + \def\OE{OE}% + \def\O{O}% + \def\aa{aa}% + \def\ae{ae}% + \def\l{l}% + \def\oe{oe}% + \def\o{o}% + \def\ss{ss}% + \def\exclamdown{!}% + \def\questiondown{?}% + \def\ordf{a}% + \def\ordm{o}% + % + \def\LaTeX{LaTeX}% + \def\TeX{TeX}% + % + % Assorted special characters. + % (The following {} will end up in the sort string, but that's ok.) + \def\bullet{bullet}% + \def\comma{,}% + \def\copyright{copyright}% + \def\registeredsymbol{R}% + \def\dots{...}% + \def\enddots{...}% + \def\equiv{==}% + \def\error{error}% + \def\euro{euro}% + \def\guillemetleft{<<}% + \def\guillemetright{>>}% + \def\guilsinglleft{<}% + \def\guilsinglright{>}% + \def\expansion{==>}% + \def\minus{-}% + \def\pounds{pounds}% + \def\point{.}% + \def\print{-|}% + \def\quotedblbase{"}% + \def\quotedblleft{"}% + \def\quotedblright{"}% + \def\quoteleft{`}% + \def\quoteright{'}% + \def\quotesinglbase{,}% + \def\result{=>}% + \def\textdegree{degrees}% + % + % We need to get rid of all macros, leaving only the arguments (if present). + % Of course this is not nearly correct, but it is the best we can do for now. + % makeinfo does not expand macros in the argument to @deffn, which ends up + % writing an index entry, and texindex isn't prepared for an index sort entry + % that starts with \. + % + % Since macro invocations are followed by braces, we can just redefine them + % to take a single TeX argument. The case of a macro invocation that + % goes to end-of-line is not handled. + % + \macrolist +} + +\let\indexbackslash=0 %overridden during \printindex. +\let\SETmarginindex=\relax % put index entries in margin (undocumented)? + +% Most index entries go through here, but \dosubind is the general case. +% #1 is the index name, #2 is the entry text. +\def\doind#1#2{\dosubind{#1}{#2}{}} + +% Workhorse for all \fooindexes. +% #1 is name of index, #2 is stuff to put there, #3 is subentry -- +% empty if called from \doind, as we usually are (the main exception +% is with most defuns, which call us directly). +% +\def\dosubind#1#2#3{% + \iflinks + {% + % Store the main index entry text (including the third arg). + \toks0 = {#2}% + % If third arg is present, precede it with a space. + \def\thirdarg{#3}% + \ifx\thirdarg\empty \else + \toks0 = \expandafter{\the\toks0 \space #3}% + \fi + % + \edef\writeto{\csname#1indfile\endcsname}% + % + \safewhatsit\dosubindwrite + }% + \fi +} + +% Write the entry in \toks0 to the index file: +% +\def\dosubindwrite{% + % Put the index entry in the margin if desired. + \ifx\SETmarginindex\relax\else + \insert\margin{\hbox{\vrule height8pt depth3pt width0pt \the\toks0}}% + \fi + % + % Remember, we are within a group. + \indexdummies % Must do this here, since \bf, etc expand at this stage + \def\backslashcurfont{\indexbackslash}% \indexbackslash isn't defined now + % so it will be output as is; and it will print as backslash. + % + % Process the index entry with all font commands turned off, to + % get the string to sort by. + {\indexnofonts + \edef\temp{\the\toks0}% need full expansion + \xdef\indexsorttmp{\temp}% + }% + % + % Set up the complete index entry, with both the sort key and + % the original text, including any font commands. We write + % three arguments to \entry to the .?? file (four in the + % subentry case), texindex reduces to two when writing the .??s + % sorted result. + \edef\temp{% + \write\writeto{% + \string\entry{\indexsorttmp}{\noexpand\folio}{\the\toks0}}% + }% + \temp +} + +% Take care of unwanted page breaks/skips around a whatsit: +% +% If a skip is the last thing on the list now, preserve it +% by backing up by \lastskip, doing the \write, then inserting +% the skip again. Otherwise, the whatsit generated by the +% \write or \pdfdest will make \lastskip zero. The result is that +% sequences like this: +% @end defun +% @tindex whatever +% @defun ... +% will have extra space inserted, because the \medbreak in the +% start of the @defun won't see the skip inserted by the @end of +% the previous defun. +% +% But don't do any of this if we're not in vertical mode. We +% don't want to do a \vskip and prematurely end a paragraph. +% +% Avoid page breaks due to these extra skips, too. +% +% But wait, there is a catch there: +% We'll have to check whether \lastskip is zero skip. \ifdim is not +% sufficient for this purpose, as it ignores stretch and shrink parts +% of the skip. The only way seems to be to check the textual +% representation of the skip. +% +% The following is almost like \def\zeroskipmacro{0.0pt} except that +% the ``p'' and ``t'' characters have catcode \other, not 11 (letter). +% +\edef\zeroskipmacro{\expandafter\the\csname z@skip\endcsname} +% +\newskip\whatsitskip +\newcount\whatsitpenalty +% +% ..., ready, GO: +% +\def\safewhatsit#1{% +\ifhmode + #1% +\else + % \lastskip and \lastpenalty cannot both be nonzero simultaneously. + \whatsitskip = \lastskip + \edef\lastskipmacro{\the\lastskip}% + \whatsitpenalty = \lastpenalty + % + % If \lastskip is nonzero, that means the last item was a + % skip. And since a skip is discardable, that means this + % -\whatsitskip glue we're inserting is preceded by a + % non-discardable item, therefore it is not a potential + % breakpoint, therefore no \nobreak needed. + \ifx\lastskipmacro\zeroskipmacro + \else + \vskip-\whatsitskip + \fi + % + #1% + % + \ifx\lastskipmacro\zeroskipmacro + % If \lastskip was zero, perhaps the last item was a penalty, and + % perhaps it was >=10000, e.g., a \nobreak. In that case, we want + % to re-insert the same penalty (values >10000 are used for various + % signals); since we just inserted a non-discardable item, any + % following glue (such as a \parskip) would be a breakpoint. For example: + % + % @deffn deffn-whatever + % @vindex index-whatever + % Description. + % would allow a break between the index-whatever whatsit + % and the "Description." paragraph. + \ifnum\whatsitpenalty>9999 \penalty\whatsitpenalty \fi + \else + % On the other hand, if we had a nonzero \lastskip, + % this make-up glue would be preceded by a non-discardable item + % (the whatsit from the \write), so we must insert a \nobreak. + \nobreak\vskip\whatsitskip + \fi +\fi +} + +% The index entry written in the file actually looks like +% \entry {sortstring}{page}{topic} +% or +% \entry {sortstring}{page}{topic}{subtopic} +% The texindex program reads in these files and writes files +% containing these kinds of lines: +% \initial {c} +% before the first topic whose initial is c +% \entry {topic}{pagelist} +% for a topic that is used without subtopics +% \primary {topic} +% for the beginning of a topic that is used with subtopics +% \secondary {subtopic}{pagelist} +% for each subtopic. + +% Define the user-accessible indexing commands +% @findex, @vindex, @kindex, @cindex. + +\def\findex {\fnindex} +\def\kindex {\kyindex} +\def\cindex {\cpindex} +\def\vindex {\vrindex} +\def\tindex {\tpindex} +\def\pindex {\pgindex} + +\def\cindexsub {\begingroup\obeylines\cindexsub} +{\obeylines % +\gdef\cindexsub "#1" #2^^M{\endgroup % +\dosubind{cp}{#2}{#1}}} + +% Define the macros used in formatting output of the sorted index material. + +% @printindex causes a particular index (the ??s file) to get printed. +% It does not print any chapter heading (usually an @unnumbered). +% +\parseargdef\printindex{\begingroup + \dobreak \chapheadingskip{10000}% + % + \smallfonts \rm + \tolerance = 9500 + \plainfrenchspacing + \everypar = {}% don't want the \kern\-parindent from indentation suppression. + % + % See if the index file exists and is nonempty. + % Change catcode of @ here so that if the index file contains + % \initial {@} + % as its first line, TeX doesn't complain about mismatched braces + % (because it thinks @} is a control sequence). + \catcode`\@ = 11 + \openin 1 \jobname.#1s + \ifeof 1 + % \enddoublecolumns gets confused if there is no text in the index, + % and it loses the chapter title and the aux file entries for the + % index. The easiest way to prevent this problem is to make sure + % there is some text. + \putwordIndexNonexistent + \else + % + % If the index file exists but is empty, then \openin leaves \ifeof + % false. We have to make TeX try to read something from the file, so + % it can discover if there is anything in it. + \read 1 to \temp + \ifeof 1 + \putwordIndexIsEmpty + \else + % Index files are almost Texinfo source, but we use \ as the escape + % character. It would be better to use @, but that's too big a change + % to make right now. + \def\indexbackslash{\backslashcurfont}% + \catcode`\\ = 0 + \escapechar = `\\ + \begindoublecolumns + \input \jobname.#1s + \enddoublecolumns + \fi + \fi + \closein 1 +\endgroup} + +% These macros are used by the sorted index file itself. +% Change them to control the appearance of the index. + +\def\initial#1{{% + % Some minor font changes for the special characters. + \let\tentt=\sectt \let\tt=\sectt \let\sf=\sectt + % + % Remove any glue we may have, we'll be inserting our own. + \removelastskip + % + % We like breaks before the index initials, so insert a bonus. + \nobreak + \vskip 0pt plus 3\baselineskip + \penalty 0 + \vskip 0pt plus -3\baselineskip + % + % Typeset the initial. Making this add up to a whole number of + % baselineskips increases the chance of the dots lining up from column + % to column. It still won't often be perfect, because of the stretch + % we need before each entry, but it's better. + % + % No shrink because it confuses \balancecolumns. + \vskip 1.67\baselineskip plus .5\baselineskip + \leftline{\secbf #1}% + % Do our best not to break after the initial. + \nobreak + \vskip .33\baselineskip plus .1\baselineskip +}} + +% \entry typesets a paragraph consisting of the text (#1), dot leaders, and +% then page number (#2) flushed to the right margin. It is used for index +% and table of contents entries. The paragraph is indented by \leftskip. +% +% A straightforward implementation would start like this: +% \def\entry#1#2{... +% But this frozes the catcodes in the argument, and can cause problems to +% @code, which sets - active. This problem was fixed by a kludge--- +% ``-'' was active throughout whole index, but this isn't really right. +% +% The right solution is to prevent \entry from swallowing the whole text. +% --kasal, 21nov03 +\def\entry{% + \begingroup + % + % Start a new paragraph if necessary, so our assignments below can't + % affect previous text. + \par + % + % Do not fill out the last line with white space. + \parfillskip = 0in + % + % No extra space above this paragraph. + \parskip = 0in + % + % Do not prefer a separate line ending with a hyphen to fewer lines. + \finalhyphendemerits = 0 + % + % \hangindent is only relevant when the entry text and page number + % don't both fit on one line. In that case, bob suggests starting the + % dots pretty far over on the line. Unfortunately, a large + % indentation looks wrong when the entry text itself is broken across + % lines. So we use a small indentation and put up with long leaders. + % + % \hangafter is reset to 1 (which is the value we want) at the start + % of each paragraph, so we need not do anything with that. + \hangindent = 2em + % + % When the entry text needs to be broken, just fill out the first line + % with blank space. + \rightskip = 0pt plus1fil + % + % A bit of stretch before each entry for the benefit of balancing + % columns. + \vskip 0pt plus1pt + % + % Swallow the left brace of the text (first parameter): + \afterassignment\doentry + \let\temp = +} +\def\doentry{% + \bgroup % Instead of the swallowed brace. + \noindent + \aftergroup\finishentry + % And now comes the text of the entry. +} +\def\finishentry#1{% + % #1 is the page number. + % + % The following is kludged to not output a line of dots in the index if + % there are no page numbers. The next person who breaks this will be + % cursed by a Unix daemon. + \setbox\boxA = \hbox{#1}% + \ifdim\wd\boxA = 0pt + \ % + \else + % + % If we must, put the page number on a line of its own, and fill out + % this line with blank space. (The \hfil is overwhelmed with the + % fill leaders glue in \indexdotfill if the page number does fit.) + \hfil\penalty50 + \null\nobreak\indexdotfill % Have leaders before the page number. + % + % The `\ ' here is removed by the implicit \unskip that TeX does as + % part of (the primitive) \par. Without it, a spurious underfull + % \hbox ensues. + \ifpdf + \pdfgettoks#1.% + \ \the\toksA + \else + \ #1% + \fi + \fi + \par + \endgroup +} + +% Like plain.tex's \dotfill, except uses up at least 1 em. +\def\indexdotfill{\cleaders + \hbox{$\mathsurround=0pt \mkern1.5mu.\mkern1.5mu$}\hskip 1em plus 1fill} + +\def\primary #1{\line{#1\hfil}} + +\newskip\secondaryindent \secondaryindent=0.5cm +\def\secondary#1#2{{% + \parfillskip=0in + \parskip=0in + \hangindent=1in + \hangafter=1 + \noindent\hskip\secondaryindent\hbox{#1}\indexdotfill + \ifpdf + \pdfgettoks#2.\ \the\toksA % The page number ends the paragraph. + \else + #2 + \fi + \par +}} + +% Define two-column mode, which we use to typeset indexes. +% Adapted from the TeXbook, page 416, which is to say, +% the manmac.tex format used to print the TeXbook itself. +\catcode`\@=11 + +\newbox\partialpage +\newdimen\doublecolumnhsize + +\def\begindoublecolumns{\begingroup % ended by \enddoublecolumns + % Grab any single-column material above us. + \output = {% + % + % Here is a possibility not foreseen in manmac: if we accumulate a + % whole lot of material, we might end up calling this \output + % routine twice in a row (see the doublecol-lose test, which is + % essentially a couple of indexes with @setchapternewpage off). In + % that case we just ship out what is in \partialpage with the normal + % output routine. Generally, \partialpage will be empty when this + % runs and this will be a no-op. See the indexspread.tex test case. + \ifvoid\partialpage \else + \onepageout{\pagecontents\partialpage}% + \fi + % + \global\setbox\partialpage = \vbox{% + % Unvbox the main output page. + \unvbox\PAGE + \kern-\topskip \kern\baselineskip + }% + }% + \eject % run that output routine to set \partialpage + % + % Use the double-column output routine for subsequent pages. + \output = {\doublecolumnout}% + % + % Change the page size parameters. We could do this once outside this + % routine, in each of @smallbook, @afourpaper, and the default 8.5x11 + % format, but then we repeat the same computation. Repeating a couple + % of assignments once per index is clearly meaningless for the + % execution time, so we may as well do it in one place. + % + % First we halve the line length, less a little for the gutter between + % the columns. We compute the gutter based on the line length, so it + % changes automatically with the paper format. The magic constant + % below is chosen so that the gutter has the same value (well, +-<1pt) + % as it did when we hard-coded it. + % + % We put the result in a separate register, \doublecolumhsize, so we + % can restore it in \pagesofar, after \hsize itself has (potentially) + % been clobbered. + % + \doublecolumnhsize = \hsize + \advance\doublecolumnhsize by -.04154\hsize + \divide\doublecolumnhsize by 2 + \hsize = \doublecolumnhsize + % + % Double the \vsize as well. (We don't need a separate register here, + % since nobody clobbers \vsize.) + \vsize = 2\vsize +} + +% The double-column output routine for all double-column pages except +% the last. +% +\def\doublecolumnout{% + \splittopskip=\topskip \splitmaxdepth=\maxdepth + % Get the available space for the double columns -- the normal + % (undoubled) page height minus any material left over from the + % previous page. + \dimen@ = \vsize + \divide\dimen@ by 2 + \advance\dimen@ by -\ht\partialpage + % + % box0 will be the left-hand column, box2 the right. + \setbox0=\vsplit255 to\dimen@ \setbox2=\vsplit255 to\dimen@ + \onepageout\pagesofar + \unvbox255 + \penalty\outputpenalty +} +% +% Re-output the contents of the output page -- any previous material, +% followed by the two boxes we just split, in box0 and box2. +\def\pagesofar{% + \unvbox\partialpage + % + \hsize = \doublecolumnhsize + \wd0=\hsize \wd2=\hsize + \hbox to\pagewidth{\box0\hfil\box2}% +} +% +% All done with double columns. +\def\enddoublecolumns{% + % The following penalty ensures that the page builder is exercised + % _before_ we change the output routine. This is necessary in the + % following situation: + % + % The last section of the index consists only of a single entry. + % Before this section, \pagetotal is less than \pagegoal, so no + % break occurs before the last section starts. However, the last + % section, consisting of \initial and the single \entry, does not + % fit on the page and has to be broken off. Without the following + % penalty the page builder will not be exercised until \eject + % below, and by that time we'll already have changed the output + % routine to the \balancecolumns version, so the next-to-last + % double-column page will be processed with \balancecolumns, which + % is wrong: The two columns will go to the main vertical list, with + % the broken-off section in the recent contributions. As soon as + % the output routine finishes, TeX starts reconsidering the page + % break. The two columns and the broken-off section both fit on the + % page, because the two columns now take up only half of the page + % goal. When TeX sees \eject from below which follows the final + % section, it invokes the new output routine that we've set after + % \balancecolumns below; \onepageout will try to fit the two columns + % and the final section into the vbox of \pageheight (see + % \pagebody), causing an overfull box. + % + % Note that glue won't work here, because glue does not exercise the + % page builder, unlike penalties (see The TeXbook, pp. 280-281). + \penalty0 + % + \output = {% + % Split the last of the double-column material. Leave it on the + % current page, no automatic page break. + \balancecolumns + % + % If we end up splitting too much material for the current page, + % though, there will be another page break right after this \output + % invocation ends. Having called \balancecolumns once, we do not + % want to call it again. Therefore, reset \output to its normal + % definition right away. (We hope \balancecolumns will never be + % called on to balance too much material, but if it is, this makes + % the output somewhat more palatable.) + \global\output = {\onepageout{\pagecontents\PAGE}}% + }% + \eject + \endgroup % started in \begindoublecolumns + % + % \pagegoal was set to the doubled \vsize above, since we restarted + % the current page. We're now back to normal single-column + % typesetting, so reset \pagegoal to the normal \vsize (after the + % \endgroup where \vsize got restored). + \pagegoal = \vsize +} +% +% Called at the end of the double column material. +\def\balancecolumns{% + \setbox0 = \vbox{\unvbox255}% like \box255 but more efficient, see p.120. + \dimen@ = \ht0 + \advance\dimen@ by \topskip + \advance\dimen@ by-\baselineskip + \divide\dimen@ by 2 % target to split to + %debug\message{final 2-column material height=\the\ht0, target=\the\dimen@.}% + \splittopskip = \topskip + % Loop until we get a decent breakpoint. + {% + \vbadness = 10000 + \loop + \global\setbox3 = \copy0 + \global\setbox1 = \vsplit3 to \dimen@ + \ifdim\ht3>\dimen@ + \global\advance\dimen@ by 1pt + \repeat + }% + %debug\message{split to \the\dimen@, column heights: \the\ht1, \the\ht3.}% + \setbox0=\vbox to\dimen@{\unvbox1}% + \setbox2=\vbox to\dimen@{\unvbox3}% + % + \pagesofar +} +\catcode`\@ = \other + + +\message{sectioning,} +% Chapters, sections, etc. + +% \unnumberedno is an oxymoron, of course. But we count the unnumbered +% sections so that we can refer to them unambiguously in the pdf +% outlines by their "section number". We avoid collisions with chapter +% numbers by starting them at 10000. (If a document ever has 10000 +% chapters, we're in trouble anyway, I'm sure.) +\newcount\unnumberedno \unnumberedno = 10000 +\newcount\chapno +\newcount\secno \secno=0 +\newcount\subsecno \subsecno=0 +\newcount\subsubsecno \subsubsecno=0 + +% This counter is funny since it counts through charcodes of letters A, B, ... +\newcount\appendixno \appendixno = `\@ +% +% \def\appendixletter{\char\the\appendixno} +% We do the following ugly conditional instead of the above simple +% construct for the sake of pdftex, which needs the actual +% letter in the expansion, not just typeset. +% +\def\appendixletter{% + \ifnum\appendixno=`A A% + \else\ifnum\appendixno=`B B% + \else\ifnum\appendixno=`C C% + \else\ifnum\appendixno=`D D% + \else\ifnum\appendixno=`E E% + \else\ifnum\appendixno=`F F% + \else\ifnum\appendixno=`G G% + \else\ifnum\appendixno=`H H% + \else\ifnum\appendixno=`I I% + \else\ifnum\appendixno=`J J% + \else\ifnum\appendixno=`K K% + \else\ifnum\appendixno=`L L% + \else\ifnum\appendixno=`M M% + \else\ifnum\appendixno=`N N% + \else\ifnum\appendixno=`O O% + \else\ifnum\appendixno=`P P% + \else\ifnum\appendixno=`Q Q% + \else\ifnum\appendixno=`R R% + \else\ifnum\appendixno=`S S% + \else\ifnum\appendixno=`T T% + \else\ifnum\appendixno=`U U% + \else\ifnum\appendixno=`V V% + \else\ifnum\appendixno=`W W% + \else\ifnum\appendixno=`X X% + \else\ifnum\appendixno=`Y Y% + \else\ifnum\appendixno=`Z Z% + % The \the is necessary, despite appearances, because \appendixletter is + % expanded while writing the .toc file. \char\appendixno is not + % expandable, thus it is written literally, thus all appendixes come out + % with the same letter (or @) in the toc without it. + \else\char\the\appendixno + \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi + \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi} + +% Each @chapter defines these (using marks) as the number+name, number +% and name of the chapter. Page headings and footings can use +% these. @section does likewise. +\def\thischapter{} +\def\thischapternum{} +\def\thischaptername{} +\def\thissection{} +\def\thissectionnum{} +\def\thissectionname{} + +\newcount\absseclevel % used to calculate proper heading level +\newcount\secbase\secbase=0 % @raisesections/@lowersections modify this count + +% @raisesections: treat @section as chapter, @subsection as section, etc. +\def\raisesections{\global\advance\secbase by -1} +\let\up=\raisesections % original BFox name + +% @lowersections: treat @chapter as section, @section as subsection, etc. +\def\lowersections{\global\advance\secbase by 1} +\let\down=\lowersections % original BFox name + +% we only have subsub. +\chardef\maxseclevel = 3 +% +% A numbered section within an unnumbered changes to unnumbered too. +% To achive this, remember the "biggest" unnum. sec. we are currently in: +\chardef\unmlevel = \maxseclevel +% +% Trace whether the current chapter is an appendix or not: +% \chapheadtype is "N" or "A", unnumbered chapters are ignored. +\def\chapheadtype{N} + +% Choose a heading macro +% #1 is heading type +% #2 is heading level +% #3 is text for heading +\def\genhead#1#2#3{% + % Compute the abs. sec. level: + \absseclevel=#2 + \advance\absseclevel by \secbase + % Make sure \absseclevel doesn't fall outside the range: + \ifnum \absseclevel < 0 + \absseclevel = 0 + \else + \ifnum \absseclevel > 3 + \absseclevel = 3 + \fi + \fi + % The heading type: + \def\headtype{#1}% + \if \headtype U% + \ifnum \absseclevel < \unmlevel + \chardef\unmlevel = \absseclevel + \fi + \else + % Check for appendix sections: + \ifnum \absseclevel = 0 + \edef\chapheadtype{\headtype}% + \else + \if \headtype A\if \chapheadtype N% + \errmessage{@appendix... within a non-appendix chapter}% + \fi\fi + \fi + % Check for numbered within unnumbered: + \ifnum \absseclevel > \unmlevel + \def\headtype{U}% + \else + \chardef\unmlevel = 3 + \fi + \fi + % Now print the heading: + \if \headtype U% + \ifcase\absseclevel + \unnumberedzzz{#3}% + \or \unnumberedseczzz{#3}% + \or \unnumberedsubseczzz{#3}% + \or \unnumberedsubsubseczzz{#3}% + \fi + \else + \if \headtype A% + \ifcase\absseclevel + \appendixzzz{#3}% + \or \appendixsectionzzz{#3}% + \or \appendixsubseczzz{#3}% + \or \appendixsubsubseczzz{#3}% + \fi + \else + \ifcase\absseclevel + \chapterzzz{#3}% + \or \seczzz{#3}% + \or \numberedsubseczzz{#3}% + \or \numberedsubsubseczzz{#3}% + \fi + \fi + \fi + \suppressfirstparagraphindent +} + +% an interface: +\def\numhead{\genhead N} +\def\apphead{\genhead A} +\def\unnmhead{\genhead U} + +% @chapter, @appendix, @unnumbered. Increment top-level counter, reset +% all lower-level sectioning counters to zero. +% +% Also set \chaplevelprefix, which we prepend to @float sequence numbers +% (e.g., figures), q.v. By default (before any chapter), that is empty. +\let\chaplevelprefix = \empty +% +\outer\parseargdef\chapter{\numhead0{#1}} % normally numhead0 calls chapterzzz +\def\chapterzzz#1{% + % section resetting is \global in case the chapter is in a group, such + % as an @include file. + \global\secno=0 \global\subsecno=0 \global\subsubsecno=0 + \global\advance\chapno by 1 + % + % Used for \float. + \gdef\chaplevelprefix{\the\chapno.}% + \resetallfloatnos + % + \message{\putwordChapter\space \the\chapno}% + % + % Write the actual heading. + \chapmacro{#1}{Ynumbered}{\the\chapno}% + % + % So @section and the like are numbered underneath this chapter. + \global\let\section = \numberedsec + \global\let\subsection = \numberedsubsec + \global\let\subsubsection = \numberedsubsubsec +} + +\outer\parseargdef\appendix{\apphead0{#1}} % normally apphead0 calls appendixzzz +\def\appendixzzz#1{% + \global\secno=0 \global\subsecno=0 \global\subsubsecno=0 + \global\advance\appendixno by 1 + \gdef\chaplevelprefix{\appendixletter.}% + \resetallfloatnos + % + \def\appendixnum{\putwordAppendix\space \appendixletter}% + \message{\appendixnum}% + % + \chapmacro{#1}{Yappendix}{\appendixletter}% + % + \global\let\section = \appendixsec + \global\let\subsection = \appendixsubsec + \global\let\subsubsection = \appendixsubsubsec +} + +\outer\parseargdef\unnumbered{\unnmhead0{#1}} % normally unnmhead0 calls unnumberedzzz +\def\unnumberedzzz#1{% + \global\secno=0 \global\subsecno=0 \global\subsubsecno=0 + \global\advance\unnumberedno by 1 + % + % Since an unnumbered has no number, no prefix for figures. + \global\let\chaplevelprefix = \empty + \resetallfloatnos + % + % This used to be simply \message{#1}, but TeX fully expands the + % argument to \message. Therefore, if #1 contained @-commands, TeX + % expanded them. For example, in `@unnumbered The @cite{Book}', TeX + % expanded @cite (which turns out to cause errors because \cite is meant + % to be executed, not expanded). + % + % Anyway, we don't want the fully-expanded definition of @cite to appear + % as a result of the \message, we just want `@cite' itself. We use + % \the to achieve this: TeX expands \the only once, + % simply yielding the contents of . (We also do this for + % the toc entries.) + \toks0 = {#1}% + \message{(\the\toks0)}% + % + \chapmacro{#1}{Ynothing}{\the\unnumberedno}% + % + \global\let\section = \unnumberedsec + \global\let\subsection = \unnumberedsubsec + \global\let\subsubsection = \unnumberedsubsubsec +} + +% @centerchap is like @unnumbered, but the heading is centered. +\outer\parseargdef\centerchap{% + % Well, we could do the following in a group, but that would break + % an assumption that \chapmacro is called at the outermost level. + % Thus we are safer this way: --kasal, 24feb04 + \let\centerparametersmaybe = \centerparameters + \unnmhead0{#1}% + \let\centerparametersmaybe = \relax +} + +% @top is like @unnumbered. +\let\top\unnumbered + +% Sections. +\outer\parseargdef\numberedsec{\numhead1{#1}} % normally calls seczzz +\def\seczzz#1{% + \global\subsecno=0 \global\subsubsecno=0 \global\advance\secno by 1 + \sectionheading{#1}{sec}{Ynumbered}{\the\chapno.\the\secno}% +} + +\outer\parseargdef\appendixsection{\apphead1{#1}} % normally calls appendixsectionzzz +\def\appendixsectionzzz#1{% + \global\subsecno=0 \global\subsubsecno=0 \global\advance\secno by 1 + \sectionheading{#1}{sec}{Yappendix}{\appendixletter.\the\secno}% +} +\let\appendixsec\appendixsection + +\outer\parseargdef\unnumberedsec{\unnmhead1{#1}} % normally calls unnumberedseczzz +\def\unnumberedseczzz#1{% + \global\subsecno=0 \global\subsubsecno=0 \global\advance\secno by 1 + \sectionheading{#1}{sec}{Ynothing}{\the\unnumberedno.\the\secno}% +} + +% Subsections. +\outer\parseargdef\numberedsubsec{\numhead2{#1}} % normally calls numberedsubseczzz +\def\numberedsubseczzz#1{% + \global\subsubsecno=0 \global\advance\subsecno by 1 + \sectionheading{#1}{subsec}{Ynumbered}{\the\chapno.\the\secno.\the\subsecno}% +} + +\outer\parseargdef\appendixsubsec{\apphead2{#1}} % normally calls appendixsubseczzz +\def\appendixsubseczzz#1{% + \global\subsubsecno=0 \global\advance\subsecno by 1 + \sectionheading{#1}{subsec}{Yappendix}% + {\appendixletter.\the\secno.\the\subsecno}% +} + +\outer\parseargdef\unnumberedsubsec{\unnmhead2{#1}} %normally calls unnumberedsubseczzz +\def\unnumberedsubseczzz#1{% + \global\subsubsecno=0 \global\advance\subsecno by 1 + \sectionheading{#1}{subsec}{Ynothing}% + {\the\unnumberedno.\the\secno.\the\subsecno}% +} + +% Subsubsections. +\outer\parseargdef\numberedsubsubsec{\numhead3{#1}} % normally numberedsubsubseczzz +\def\numberedsubsubseczzz#1{% + \global\advance\subsubsecno by 1 + \sectionheading{#1}{subsubsec}{Ynumbered}% + {\the\chapno.\the\secno.\the\subsecno.\the\subsubsecno}% +} + +\outer\parseargdef\appendixsubsubsec{\apphead3{#1}} % normally appendixsubsubseczzz +\def\appendixsubsubseczzz#1{% + \global\advance\subsubsecno by 1 + \sectionheading{#1}{subsubsec}{Yappendix}% + {\appendixletter.\the\secno.\the\subsecno.\the\subsubsecno}% +} + +\outer\parseargdef\unnumberedsubsubsec{\unnmhead3{#1}} %normally unnumberedsubsubseczzz +\def\unnumberedsubsubseczzz#1{% + \global\advance\subsubsecno by 1 + \sectionheading{#1}{subsubsec}{Ynothing}% + {\the\unnumberedno.\the\secno.\the\subsecno.\the\subsubsecno}% +} + +% These macros control what the section commands do, according +% to what kind of chapter we are in (ordinary, appendix, or unnumbered). +% Define them by default for a numbered chapter. +\let\section = \numberedsec +\let\subsection = \numberedsubsec +\let\subsubsection = \numberedsubsubsec + +% Define @majorheading, @heading and @subheading + +% NOTE on use of \vbox for chapter headings, section headings, and such: +% 1) We use \vbox rather than the earlier \line to permit +% overlong headings to fold. +% 2) \hyphenpenalty is set to 10000 because hyphenation in a +% heading is obnoxious; this forbids it. +% 3) Likewise, headings look best if no \parindent is used, and +% if justification is not attempted. Hence \raggedright. + + +\def\majorheading{% + {\advance\chapheadingskip by 10pt \chapbreak }% + \parsearg\chapheadingzzz +} + +\def\chapheading{\chapbreak \parsearg\chapheadingzzz} +\def\chapheadingzzz#1{% + {\chapfonts \vbox{\hyphenpenalty=10000\tolerance=5000 + \parindent=0pt\raggedright + \rm #1\hfill}}% + \bigskip \par\penalty 200\relax + \suppressfirstparagraphindent +} + +% @heading, @subheading, @subsubheading. +\parseargdef\heading{\sectionheading{#1}{sec}{Yomitfromtoc}{} + \suppressfirstparagraphindent} +\parseargdef\subheading{\sectionheading{#1}{subsec}{Yomitfromtoc}{} + \suppressfirstparagraphindent} +\parseargdef\subsubheading{\sectionheading{#1}{subsubsec}{Yomitfromtoc}{} + \suppressfirstparagraphindent} + +% These macros generate a chapter, section, etc. heading only +% (including whitespace, linebreaking, etc. around it), +% given all the information in convenient, parsed form. + +%%% Args are the skip and penalty (usually negative) +\def\dobreak#1#2{\par\ifdim\lastskip<#1\removelastskip\penalty#2\vskip#1\fi} + +%%% Define plain chapter starts, and page on/off switching for it +% Parameter controlling skip before chapter headings (if needed) + +\newskip\chapheadingskip + +\def\chapbreak{\dobreak \chapheadingskip {-4000}} +\def\chappager{\par\vfill\supereject} +% Because \domark is called before \chapoddpage, the filler page will +% get the headings for the next chapter, which is wrong. But we don't +% care -- we just disable all headings on the filler page. +\def\chapoddpage{% + \chappager + \ifodd\pageno \else + \begingroup + \evenheadline={\hfil}\evenfootline={\hfil}% + \oddheadline={\hfil}\oddfootline={\hfil}% + \hbox to 0pt{}% + \chappager + \endgroup + \fi +} + +\def\setchapternewpage #1 {\csname CHAPPAG#1\endcsname} + +\def\CHAPPAGoff{% +\global\let\contentsalignmacro = \chappager +\global\let\pchapsepmacro=\chapbreak +\global\let\pagealignmacro=\chappager} + +\def\CHAPPAGon{% +\global\let\contentsalignmacro = \chappager +\global\let\pchapsepmacro=\chappager +\global\let\pagealignmacro=\chappager +\global\def\HEADINGSon{\HEADINGSsingle}} + +\def\CHAPPAGodd{% +\global\let\contentsalignmacro = \chapoddpage +\global\let\pchapsepmacro=\chapoddpage +\global\let\pagealignmacro=\chapoddpage +\global\def\HEADINGSon{\HEADINGSdouble}} + +\CHAPPAGon + +% Chapter opening. +% +% #1 is the text, #2 is the section type (Ynumbered, Ynothing, +% Yappendix, Yomitfromtoc), #3 the chapter number. +% +% To test against our argument. +\def\Ynothingkeyword{Ynothing} +\def\Yomitfromtockeyword{Yomitfromtoc} +\def\Yappendixkeyword{Yappendix} +% +\def\chapmacro#1#2#3{% + % Insert the first mark before the heading break (see notes for \domark). + \let\prevchapterdefs=\lastchapterdefs + \let\prevsectiondefs=\lastsectiondefs + \gdef\lastsectiondefs{\gdef\thissectionname{}\gdef\thissectionnum{}% + \gdef\thissection{}}% + % + \def\temptype{#2}% + \ifx\temptype\Ynothingkeyword + \gdef\lastchapterdefs{\gdef\thischaptername{#1}\gdef\thischapternum{}% + \gdef\thischapter{\thischaptername}}% + \else\ifx\temptype\Yomitfromtockeyword + \gdef\lastchapterdefs{\gdef\thischaptername{#1}\gdef\thischapternum{}% + \gdef\thischapter{}}% + \else\ifx\temptype\Yappendixkeyword + \toks0={#1}% + \xdef\lastchapterdefs{% + \gdef\noexpand\thischaptername{\the\toks0}% + \gdef\noexpand\thischapternum{\appendixletter}% + \gdef\noexpand\thischapter{\putwordAppendix{} \noexpand\thischapternum: + \noexpand\thischaptername}% + }% + \else + \toks0={#1}% + \xdef\lastchapterdefs{% + \gdef\noexpand\thischaptername{\the\toks0}% + \gdef\noexpand\thischapternum{\the\chapno}% + \gdef\noexpand\thischapter{\putwordChapter{} \noexpand\thischapternum: + \noexpand\thischaptername}% + }% + \fi\fi\fi + % + % Output the mark. Pass it through \safewhatsit, to take care of + % the preceding space. + \safewhatsit\domark + % + % Insert the chapter heading break. + \pchapsepmacro + % + % Now the second mark, after the heading break. No break points + % between here and the heading. + \let\prevchapterdefs=\lastchapterdefs + \let\prevsectiondefs=\lastsectiondefs + \domark + % + {% + \chapfonts \rm + % + % Have to define \lastsection before calling \donoderef, because the + % xref code eventually uses it. On the other hand, it has to be called + % after \pchapsepmacro, or the headline will change too soon. + \gdef\lastsection{#1}% + % + % Only insert the separating space if we have a chapter/appendix + % number, and don't print the unnumbered ``number''. + \ifx\temptype\Ynothingkeyword + \setbox0 = \hbox{}% + \def\toctype{unnchap}% + \else\ifx\temptype\Yomitfromtockeyword + \setbox0 = \hbox{}% contents like unnumbered, but no toc entry + \def\toctype{omit}% + \else\ifx\temptype\Yappendixkeyword + \setbox0 = \hbox{\putwordAppendix{} #3\enspace}% + \def\toctype{app}% + \else + \setbox0 = \hbox{#3\enspace}% + \def\toctype{numchap}% + \fi\fi\fi + % + % Write the toc entry for this chapter. Must come before the + % \donoderef, because we include the current node name in the toc + % entry, and \donoderef resets it to empty. + \writetocentry{\toctype}{#1}{#3}% + % + % For pdftex, we have to write out the node definition (aka, make + % the pdfdest) after any page break, but before the actual text has + % been typeset. If the destination for the pdf outline is after the + % text, then jumping from the outline may wind up with the text not + % being visible, for instance under high magnification. + \donoderef{#2}% + % + % Typeset the actual heading. + \nobreak % Avoid page breaks at the interline glue. + \vbox{\hyphenpenalty=10000 \tolerance=5000 \parindent=0pt \raggedright + \hangindent=\wd0 \centerparametersmaybe + \unhbox0 #1\par}% + }% + \nobreak\bigskip % no page break after a chapter title + \nobreak +} + +% @centerchap -- centered and unnumbered. +\let\centerparametersmaybe = \relax +\def\centerparameters{% + \advance\rightskip by 3\rightskip + \leftskip = \rightskip + \parfillskip = 0pt +} + + +% I don't think this chapter style is supported any more, so I'm not +% updating it with the new noderef stuff. We'll see. --karl, 11aug03. +% +\def\setchapterstyle #1 {\csname CHAPF#1\endcsname} +% +\def\unnchfopen #1{% +\chapoddpage {\chapfonts \vbox{\hyphenpenalty=10000\tolerance=5000 + \parindent=0pt\raggedright + \rm #1\hfill}}\bigskip \par\nobreak +} +\def\chfopen #1#2{\chapoddpage {\chapfonts +\vbox to 3in{\vfil \hbox to\hsize{\hfil #2} \hbox to\hsize{\hfil #1} \vfil}}% +\par\penalty 5000 % +} +\def\centerchfopen #1{% +\chapoddpage {\chapfonts \vbox{\hyphenpenalty=10000\tolerance=5000 + \parindent=0pt + \hfill {\rm #1}\hfill}}\bigskip \par\nobreak +} +\def\CHAPFopen{% + \global\let\chapmacro=\chfopen + \global\let\centerchapmacro=\centerchfopen} + + +% Section titles. These macros combine the section number parts and +% call the generic \sectionheading to do the printing. +% +\newskip\secheadingskip +\def\secheadingbreak{\dobreak \secheadingskip{-1000}} + +% Subsection titles. +\newskip\subsecheadingskip +\def\subsecheadingbreak{\dobreak \subsecheadingskip{-500}} + +% Subsubsection titles. +\def\subsubsecheadingskip{\subsecheadingskip} +\def\subsubsecheadingbreak{\subsecheadingbreak} + + +% Print any size, any type, section title. +% +% #1 is the text, #2 is the section level (sec/subsec/subsubsec), #3 is +% the section type for xrefs (Ynumbered, Ynothing, Yappendix), #4 is the +% section number. +% +\def\seckeyword{sec} +% +\def\sectionheading#1#2#3#4{% + {% + % Switch to the right set of fonts. + \csname #2fonts\endcsname \rm + % + \def\sectionlevel{#2}% + \def\temptype{#3}% + % + % Insert first mark before the heading break (see notes for \domark). + \let\prevsectiondefs=\lastsectiondefs + \ifx\temptype\Ynothingkeyword + \ifx\sectionlevel\seckeyword + \gdef\lastsectiondefs{\gdef\thissectionname{#1}\gdef\thissectionnum{}% + \gdef\thissection{\thissectionname}}% + \fi + \else\ifx\temptype\Yomitfromtockeyword + % Don't redefine \thissection. + \else\ifx\temptype\Yappendixkeyword + \ifx\sectionlevel\seckeyword + \toks0={#1}% + \xdef\lastsectiondefs{% + \gdef\noexpand\thissectionname{\the\toks0}% + \gdef\noexpand\thissectionnum{#4}% + \gdef\noexpand\thissection{\putwordSection{} \noexpand\thissectionnum: + \noexpand\thissectionname}% + }% + \fi + \else + \ifx\sectionlevel\seckeyword + \toks0={#1}% + \xdef\lastsectiondefs{% + \gdef\noexpand\thissectionname{\the\toks0}% + \gdef\noexpand\thissectionnum{#4}% + \gdef\noexpand\thissection{\putwordSection{} \noexpand\thissectionnum: + \noexpand\thissectionname}% + }% + \fi + \fi\fi\fi + % + % Output the mark. Pass it through \safewhatsit, to take care of + % the preceding space. + \safewhatsit\domark + % + % Insert space above the heading. + \csname #2headingbreak\endcsname + % + % Now the second mark, after the heading break. No break points + % between here and the heading. + \let\prevsectiondefs=\lastsectiondefs + \domark + % + % Only insert the space after the number if we have a section number. + \ifx\temptype\Ynothingkeyword + \setbox0 = \hbox{}% + \def\toctype{unn}% + \gdef\lastsection{#1}% + \else\ifx\temptype\Yomitfromtockeyword + % for @headings -- no section number, don't include in toc, + % and don't redefine \lastsection. + \setbox0 = \hbox{}% + \def\toctype{omit}% + \let\sectionlevel=\empty + \else\ifx\temptype\Yappendixkeyword + \setbox0 = \hbox{#4\enspace}% + \def\toctype{app}% + \gdef\lastsection{#1}% + \else + \setbox0 = \hbox{#4\enspace}% + \def\toctype{num}% + \gdef\lastsection{#1}% + \fi\fi\fi + % + % Write the toc entry (before \donoderef). See comments in \chapmacro. + \writetocentry{\toctype\sectionlevel}{#1}{#4}% + % + % Write the node reference (= pdf destination for pdftex). + % Again, see comments in \chapmacro. + \donoderef{#3}% + % + % Interline glue will be inserted when the vbox is completed. + % That glue will be a valid breakpoint for the page, since it'll be + % preceded by a whatsit (usually from the \donoderef, or from the + % \writetocentry if there was no node). We don't want to allow that + % break, since then the whatsits could end up on page n while the + % section is on page n+1, thus toc/etc. are wrong. Debian bug 276000. + \nobreak + % + % Output the actual section heading. + \vbox{\hyphenpenalty=10000 \tolerance=5000 \parindent=0pt \raggedright + \hangindent=\wd0 % zero if no section number + \unhbox0 #1}% + }% + % Add extra space after the heading -- half of whatever came above it. + % Don't allow stretch, though. + \kern .5 \csname #2headingskip\endcsname + % + % Do not let the kern be a potential breakpoint, as it would be if it + % was followed by glue. + \nobreak + % + % We'll almost certainly start a paragraph next, so don't let that + % glue accumulate. (Not a breakpoint because it's preceded by a + % discardable item.) + \vskip-\parskip + % + % This is purely so the last item on the list is a known \penalty > + % 10000. This is so \startdefun can avoid allowing breakpoints after + % section headings. Otherwise, it would insert a valid breakpoint between: + % + % @section sec-whatever + % @deffn def-whatever + \penalty 10001 +} + + +\message{toc,} +% Table of contents. +\newwrite\tocfile + +% Write an entry to the toc file, opening it if necessary. +% Called from @chapter, etc. +% +% Example usage: \writetocentry{sec}{Section Name}{\the\chapno.\the\secno} +% We append the current node name (if any) and page number as additional +% arguments for the \{chap,sec,...}entry macros which will eventually +% read this. The node name is used in the pdf outlines as the +% destination to jump to. +% +% We open the .toc file for writing here instead of at @setfilename (or +% any other fixed time) so that @contents can be anywhere in the document. +% But if #1 is `omit', then we don't do anything. This is used for the +% table of contents chapter openings themselves. +% +\newif\iftocfileopened +\def\omitkeyword{omit}% +% +\def\writetocentry#1#2#3{% + \edef\writetoctype{#1}% + \ifx\writetoctype\omitkeyword \else + \iftocfileopened\else + \immediate\openout\tocfile = \jobname.toc + \global\tocfileopenedtrue + \fi + % + \iflinks + {\atdummies + \edef\temp{% + \write\tocfile{@#1entry{#2}{#3}{\lastnode}{\noexpand\folio}}}% + \temp + }% + \fi + \fi + % + % Tell \shipout to create a pdf destination on each page, if we're + % writing pdf. These are used in the table of contents. We can't + % just write one on every page because the title pages are numbered + % 1 and 2 (the page numbers aren't printed), and so are the first + % two pages of the document. Thus, we'd have two destinations named + % `1', and two named `2'. + \ifpdf \global\pdfmakepagedesttrue \fi +} + + +% These characters do not print properly in the Computer Modern roman +% fonts, so we must take special care. This is more or less redundant +% with the Texinfo input format setup at the end of this file. +% +\def\activecatcodes{% + \catcode`\"=\active + \catcode`\$=\active + \catcode`\<=\active + \catcode`\>=\active + \catcode`\\=\active + \catcode`\^=\active + \catcode`\_=\active + \catcode`\|=\active + \catcode`\~=\active +} + + +% Read the toc file, which is essentially Texinfo input. +\def\readtocfile{% + \setupdatafile + \activecatcodes + \input \tocreadfilename +} + +\newskip\contentsrightmargin \contentsrightmargin=1in +\newcount\savepageno +\newcount\lastnegativepageno \lastnegativepageno = -1 + +% Prepare to read what we've written to \tocfile. +% +\def\startcontents#1{% + % If @setchapternewpage on, and @headings double, the contents should + % start on an odd page, unlike chapters. Thus, we maintain + % \contentsalignmacro in parallel with \pagealignmacro. + % From: Torbjorn Granlund + \contentsalignmacro + \immediate\closeout\tocfile + % + % Don't need to put `Contents' or `Short Contents' in the headline. + % It is abundantly clear what they are. + \chapmacro{#1}{Yomitfromtoc}{}% + % + \savepageno = \pageno + \begingroup % Set up to handle contents files properly. + \raggedbottom % Worry more about breakpoints than the bottom. + \advance\hsize by -\contentsrightmargin % Don't use the full line length. + % + % Roman numerals for page numbers. + \ifnum \pageno>0 \global\pageno = \lastnegativepageno \fi +} + +% redefined for the two-volume lispref. We always output on +% \jobname.toc even if this is redefined. +% +\def\tocreadfilename{\jobname.toc} + +% Normal (long) toc. +% +\def\contents{% + \startcontents{\putwordTOC}% + \openin 1 \tocreadfilename\space + \ifeof 1 \else + \readtocfile + \fi + \vfill \eject + \contentsalignmacro % in case @setchapternewpage odd is in effect + \ifeof 1 \else + \pdfmakeoutlines + \fi + \closein 1 + \endgroup + \lastnegativepageno = \pageno + \global\pageno = \savepageno +} + +% And just the chapters. +\def\summarycontents{% + \startcontents{\putwordShortTOC}% + % + \let\numchapentry = \shortchapentry + \let\appentry = \shortchapentry + \let\unnchapentry = \shortunnchapentry + % We want a true roman here for the page numbers. + \secfonts + \let\rm=\shortcontrm \let\bf=\shortcontbf + \let\sl=\shortcontsl \let\tt=\shortconttt + \rm + \hyphenpenalty = 10000 + \advance\baselineskip by 1pt % Open it up a little. + \def\numsecentry##1##2##3##4{} + \let\appsecentry = \numsecentry + \let\unnsecentry = \numsecentry + \let\numsubsecentry = \numsecentry + \let\appsubsecentry = \numsecentry + \let\unnsubsecentry = \numsecentry + \let\numsubsubsecentry = \numsecentry + \let\appsubsubsecentry = \numsecentry + \let\unnsubsubsecentry = \numsecentry + \openin 1 \tocreadfilename\space + \ifeof 1 \else + \readtocfile + \fi + \closein 1 + \vfill \eject + \contentsalignmacro % in case @setchapternewpage odd is in effect + \endgroup + \lastnegativepageno = \pageno + \global\pageno = \savepageno +} +\let\shortcontents = \summarycontents + +% Typeset the label for a chapter or appendix for the short contents. +% The arg is, e.g., `A' for an appendix, or `3' for a chapter. +% +\def\shortchaplabel#1{% + % This space should be enough, since a single number is .5em, and the + % widest letter (M) is 1em, at least in the Computer Modern fonts. + % But use \hss just in case. + % (This space doesn't include the extra space that gets added after + % the label; that gets put in by \shortchapentry above.) + % + % We'd like to right-justify chapter numbers, but that looks strange + % with appendix letters. And right-justifying numbers and + % left-justifying letters looks strange when there is less than 10 + % chapters. Have to read the whole toc once to know how many chapters + % there are before deciding ... + \hbox to 1em{#1\hss}% +} + +% These macros generate individual entries in the table of contents. +% The first argument is the chapter or section name. +% The last argument is the page number. +% The arguments in between are the chapter number, section number, ... + +% Chapters, in the main contents. +\def\numchapentry#1#2#3#4{\dochapentry{#2\labelspace#1}{#4}} +% +% Chapters, in the short toc. +% See comments in \dochapentry re vbox and related settings. +\def\shortchapentry#1#2#3#4{% + \tocentry{\shortchaplabel{#2}\labelspace #1}{\doshortpageno\bgroup#4\egroup}% +} + +% Appendices, in the main contents. +% Need the word Appendix, and a fixed-size box. +% +\def\appendixbox#1{% + % We use M since it's probably the widest letter. + \setbox0 = \hbox{\putwordAppendix{} M}% + \hbox to \wd0{\putwordAppendix{} #1\hss}} +% +\def\appentry#1#2#3#4{\dochapentry{\appendixbox{#2}\labelspace#1}{#4}} + +% Unnumbered chapters. +\def\unnchapentry#1#2#3#4{\dochapentry{#1}{#4}} +\def\shortunnchapentry#1#2#3#4{\tocentry{#1}{\doshortpageno\bgroup#4\egroup}} + +% Sections. +\def\numsecentry#1#2#3#4{\dosecentry{#2\labelspace#1}{#4}} +\let\appsecentry=\numsecentry +\def\unnsecentry#1#2#3#4{\dosecentry{#1}{#4}} + +% Subsections. +\def\numsubsecentry#1#2#3#4{\dosubsecentry{#2\labelspace#1}{#4}} +\let\appsubsecentry=\numsubsecentry +\def\unnsubsecentry#1#2#3#4{\dosubsecentry{#1}{#4}} + +% And subsubsections. +\def\numsubsubsecentry#1#2#3#4{\dosubsubsecentry{#2\labelspace#1}{#4}} +\let\appsubsubsecentry=\numsubsubsecentry +\def\unnsubsubsecentry#1#2#3#4{\dosubsubsecentry{#1}{#4}} + +% This parameter controls the indentation of the various levels. +% Same as \defaultparindent. +\newdimen\tocindent \tocindent = 15pt + +% Now for the actual typesetting. In all these, #1 is the text and #2 is the +% page number. +% +% If the toc has to be broken over pages, we want it to be at chapters +% if at all possible; hence the \penalty. +\def\dochapentry#1#2{% + \penalty-300 \vskip1\baselineskip plus.33\baselineskip minus.25\baselineskip + \begingroup + \chapentryfonts + \tocentry{#1}{\dopageno\bgroup#2\egroup}% + \endgroup + \nobreak\vskip .25\baselineskip plus.1\baselineskip +} + +\def\dosecentry#1#2{\begingroup + \secentryfonts \leftskip=\tocindent + \tocentry{#1}{\dopageno\bgroup#2\egroup}% +\endgroup} + +\def\dosubsecentry#1#2{\begingroup + \subsecentryfonts \leftskip=2\tocindent + \tocentry{#1}{\dopageno\bgroup#2\egroup}% +\endgroup} + +\def\dosubsubsecentry#1#2{\begingroup + \subsubsecentryfonts \leftskip=3\tocindent + \tocentry{#1}{\dopageno\bgroup#2\egroup}% +\endgroup} + +% We use the same \entry macro as for the index entries. +\let\tocentry = \entry + +% Space between chapter (or whatever) number and the title. +\def\labelspace{\hskip1em \relax} + +\def\dopageno#1{{\rm #1}} +\def\doshortpageno#1{{\rm #1}} + +\def\chapentryfonts{\secfonts \rm} +\def\secentryfonts{\textfonts} +\def\subsecentryfonts{\textfonts} +\def\subsubsecentryfonts{\textfonts} + + +\message{environments,} +% @foo ... @end foo. + +% @point{}, @result{}, @expansion{}, @print{}, @equiv{}. +% +% Since these characters are used in examples, it should be an even number of +% \tt widths. Each \tt character is 1en, so two makes it 1em. +% +\def\point{$\star$} +\def\result{\leavevmode\raise.15ex\hbox to 1em{\hfil$\Rightarrow$\hfil}} +\def\expansion{\leavevmode\raise.1ex\hbox to 1em{\hfil$\mapsto$\hfil}} +\def\print{\leavevmode\lower.1ex\hbox to 1em{\hfil$\dashv$\hfil}} +\def\equiv{\leavevmode\lower.1ex\hbox to 1em{\hfil$\ptexequiv$\hfil}} + +% The @error{} command. +% Adapted from the TeXbook's \boxit. +% +\newbox\errorbox +% +{\tentt \global\dimen0 = 3em}% Width of the box. +\dimen2 = .55pt % Thickness of rules +% The text. (`r' is open on the right, `e' somewhat less so on the left.) +\setbox0 = \hbox{\kern-.75pt \reducedsf error\kern-1.5pt} +% +\setbox\errorbox=\hbox to \dimen0{\hfil + \hsize = \dimen0 \advance\hsize by -5.8pt % Space to left+right. + \advance\hsize by -2\dimen2 % Rules. + \vbox{% + \hrule height\dimen2 + \hbox{\vrule width\dimen2 \kern3pt % Space to left of text. + \vtop{\kern2.4pt \box0 \kern2.4pt}% Space above/below. + \kern3pt\vrule width\dimen2}% Space to right. + \hrule height\dimen2} + \hfil} +% +\def\error{\leavevmode\lower.7ex\copy\errorbox} + +% @tex ... @end tex escapes into raw Tex temporarily. +% One exception: @ is still an escape character, so that @end tex works. +% But \@ or @@ will get a plain tex @ character. + +\envdef\tex{% + \catcode `\\=0 \catcode `\{=1 \catcode `\}=2 + \catcode `\$=3 \catcode `\&=4 \catcode `\#=6 + \catcode `\^=7 \catcode `\_=8 \catcode `\~=\active \let~=\tie + \catcode `\%=14 + \catcode `\+=\other + \catcode `\"=\other + \catcode `\|=\other + \catcode `\<=\other + \catcode `\>=\other + \escapechar=`\\ + % + \let\b=\ptexb + \let\bullet=\ptexbullet + \let\c=\ptexc + \let\,=\ptexcomma + \let\.=\ptexdot + \let\dots=\ptexdots + \let\equiv=\ptexequiv + \let\!=\ptexexclam + \let\i=\ptexi + \let\indent=\ptexindent + \let\noindent=\ptexnoindent + \let\{=\ptexlbrace + \let\+=\tabalign + \let\}=\ptexrbrace + \let\/=\ptexslash + \let\*=\ptexstar + \let\t=\ptext + \let\frenchspacing=\plainfrenchspacing + % + \def\endldots{\mathinner{\ldots\ldots\ldots\ldots}}% + \def\enddots{\relax\ifmmode\endldots\else$\mathsurround=0pt \endldots\,$\fi}% + \def\@{@}% +} +% There is no need to define \Etex. + +% Define @lisp ... @end lisp. +% @lisp environment forms a group so it can rebind things, +% including the definition of @end lisp (which normally is erroneous). + +% Amount to narrow the margins by for @lisp. +\newskip\lispnarrowing \lispnarrowing=0.4in + +% This is the definition that ^^M gets inside @lisp, @example, and other +% such environments. \null is better than a space, since it doesn't +% have any width. +\def\lisppar{\null\endgraf} + +% This space is always present above and below environments. +\newskip\envskipamount \envskipamount = 0pt + +% Make spacing and below environment symmetrical. We use \parskip here +% to help in doing that, since in @example-like environments \parskip +% is reset to zero; thus the \afterenvbreak inserts no space -- but the +% start of the next paragraph will insert \parskip. +% +\def\aboveenvbreak{{% + % =10000 instead of <10000 because of a special case in \itemzzz and + % \sectionheading, q.v. + \ifnum \lastpenalty=10000 \else + \advance\envskipamount by \parskip + \endgraf + \ifdim\lastskip<\envskipamount + \removelastskip + % it's not a good place to break if the last penalty was \nobreak + % or better ... + \ifnum\lastpenalty<10000 \penalty-50 \fi + \vskip\envskipamount + \fi + \fi +}} + +\let\afterenvbreak = \aboveenvbreak + +% \nonarrowing is a flag. If "set", @lisp etc don't narrow margins; it will +% also clear it, so that its embedded environments do the narrowing again. +\let\nonarrowing=\relax + +% @cartouche ... @end cartouche: draw rectangle w/rounded corners around +% environment contents. +\font\circle=lcircle10 +\newdimen\circthick +\newdimen\cartouter\newdimen\cartinner +\newskip\normbskip\newskip\normpskip\newskip\normlskip +\circthick=\fontdimen8\circle +% +\def\ctl{{\circle\char'013\hskip -6pt}}% 6pt from pl file: 1/2charwidth +\def\ctr{{\hskip 6pt\circle\char'010}} +\def\cbl{{\circle\char'012\hskip -6pt}} +\def\cbr{{\hskip 6pt\circle\char'011}} +\def\carttop{\hbox to \cartouter{\hskip\lskip + \ctl\leaders\hrule height\circthick\hfil\ctr + \hskip\rskip}} +\def\cartbot{\hbox to \cartouter{\hskip\lskip + \cbl\leaders\hrule height\circthick\hfil\cbr + \hskip\rskip}} +% +\newskip\lskip\newskip\rskip + +\envdef\cartouche{% + \ifhmode\par\fi % can't be in the midst of a paragraph. + \startsavinginserts + \lskip=\leftskip \rskip=\rightskip + \leftskip=0pt\rightskip=0pt % we want these *outside*. + \cartinner=\hsize \advance\cartinner by-\lskip + \advance\cartinner by-\rskip + \cartouter=\hsize + \advance\cartouter by 18.4pt % allow for 3pt kerns on either + % side, and for 6pt waste from + % each corner char, and rule thickness + \normbskip=\baselineskip \normpskip=\parskip \normlskip=\lineskip + % Flag to tell @lisp, etc., not to narrow margin. + \let\nonarrowing = t% + \vbox\bgroup + \baselineskip=0pt\parskip=0pt\lineskip=0pt + \carttop + \hbox\bgroup + \hskip\lskip + \vrule\kern3pt + \vbox\bgroup + \kern3pt + \hsize=\cartinner + \baselineskip=\normbskip + \lineskip=\normlskip + \parskip=\normpskip + \vskip -\parskip + \comment % For explanation, see the end of \def\group. +} +\def\Ecartouche{% + \ifhmode\par\fi + \kern3pt + \egroup + \kern3pt\vrule + \hskip\rskip + \egroup + \cartbot + \egroup + \checkinserts +} + + +% This macro is called at the beginning of all the @example variants, +% inside a group. +\def\nonfillstart{% + \aboveenvbreak + \hfuzz = 12pt % Don't be fussy + \sepspaces % Make spaces be word-separators rather than space tokens. + \let\par = \lisppar % don't ignore blank lines + \obeylines % each line of input is a line of output + \parskip = 0pt + \parindent = 0pt + \emergencystretch = 0pt % don't try to avoid overfull boxes + \ifx\nonarrowing\relax + \advance \leftskip by \lispnarrowing + \exdentamount=\lispnarrowing + \else + \let\nonarrowing = \relax + \fi + \let\exdent=\nofillexdent +} + +% If you want all examples etc. small: @set dispenvsize small. +% If you want even small examples the full size: @set dispenvsize nosmall. +% This affects the following displayed environments: +% @example, @display, @format, @lisp +% +\def\smallword{small} +\def\nosmallword{nosmall} +\let\SETdispenvsize\relax +\def\setnormaldispenv{% + \ifx\SETdispenvsize\smallword + % end paragraph for sake of leading, in case document has no blank + % line. This is redundant with what happens in \aboveenvbreak, but + % we need to do it before changing the fonts, and it's inconvenient + % to change the fonts afterward. + \ifnum \lastpenalty=10000 \else \endgraf \fi + \smallexamplefonts \rm + \fi +} +\def\setsmalldispenv{% + \ifx\SETdispenvsize\nosmallword + \else + \ifnum \lastpenalty=10000 \else \endgraf \fi + \smallexamplefonts \rm + \fi +} + +% We often define two environments, @foo and @smallfoo. +% Let's do it by one command: +\def\makedispenv #1#2{ + \expandafter\envdef\csname#1\endcsname {\setnormaldispenv #2} + \expandafter\envdef\csname small#1\endcsname {\setsmalldispenv #2} + \expandafter\let\csname E#1\endcsname \afterenvbreak + \expandafter\let\csname Esmall#1\endcsname \afterenvbreak +} + +% Define two synonyms: +\def\maketwodispenvs #1#2#3{ + \makedispenv{#1}{#3} + \makedispenv{#2}{#3} +} + +% @lisp: indented, narrowed, typewriter font; @example: same as @lisp. +% +% @smallexample and @smalllisp: use smaller fonts. +% Originally contributed by Pavel@xerox. +% +\maketwodispenvs {lisp}{example}{% + \nonfillstart + \tt\quoteexpand + \let\kbdfont = \kbdexamplefont % Allow @kbd to do something special. + \gobble % eat return +} +% @display/@smalldisplay: same as @lisp except keep current font. +% +\makedispenv {display}{% + \nonfillstart + \gobble +} + +% @format/@smallformat: same as @display except don't narrow margins. +% +\makedispenv{format}{% + \let\nonarrowing = t% + \nonfillstart + \gobble +} + +% @flushleft: same as @format, but doesn't obey \SETdispenvsize. +\envdef\flushleft{% + \let\nonarrowing = t% + \nonfillstart + \gobble +} +\let\Eflushleft = \afterenvbreak + +% @flushright. +% +\envdef\flushright{% + \let\nonarrowing = t% + \nonfillstart + \advance\leftskip by 0pt plus 1fill + \gobble +} +\let\Eflushright = \afterenvbreak + + +% @quotation does normal linebreaking (hence we can't use \nonfillstart) +% and narrows the margins. We keep \parskip nonzero in general, since +% we're doing normal filling. So, when using \aboveenvbreak and +% \afterenvbreak, temporarily make \parskip 0. +% +\envdef\quotation{% + {\parskip=0pt \aboveenvbreak}% because \aboveenvbreak inserts \parskip + \parindent=0pt + % + % @cartouche defines \nonarrowing to inhibit narrowing at next level down. + \ifx\nonarrowing\relax + \advance\leftskip by \lispnarrowing + \advance\rightskip by \lispnarrowing + \exdentamount = \lispnarrowing + \else + \let\nonarrowing = \relax + \fi + \parsearg\quotationlabel +} + +% We have retained a nonzero parskip for the environment, since we're +% doing normal filling. +% +\def\Equotation{% + \par + \ifx\quotationauthor\undefined\else + % indent a bit. + \leftline{\kern 2\leftskip \sl ---\quotationauthor}% + \fi + {\parskip=0pt \afterenvbreak}% +} + +% If we're given an argument, typeset it in bold with a colon after. +\def\quotationlabel#1{% + \def\temp{#1}% + \ifx\temp\empty \else + {\bf #1: }% + \fi +} + + +% LaTeX-like @verbatim...@end verbatim and @verb{...} +% If we want to allow any as delimiter, +% we need the curly braces so that makeinfo sees the @verb command, eg: +% `@verbx...x' would look like the '@verbx' command. --janneke@gnu.org +% +% [Knuth]: Donald Ervin Knuth, 1996. The TeXbook. +% +% [Knuth] p.344; only we need to do the other characters Texinfo sets +% active too. Otherwise, they get lost as the first character on a +% verbatim line. +\def\dospecials{% + \do\ \do\\\do\{\do\}\do\$\do\&% + \do\#\do\^\do\^^K\do\_\do\^^A\do\%\do\~% + \do\<\do\>\do\|\do\@\do+\do\"% +} +% +% [Knuth] p. 380 +\def\uncatcodespecials{% + \def\do##1{\catcode`##1=\other}\dospecials} +% +% [Knuth] pp. 380,381,391 +% Disable Spanish ligatures ?` and !` of \tt font +\begingroup + \catcode`\`=\active\gdef`{\relax\lq} +\endgroup +% +% Setup for the @verb command. +% +% Eight spaces for a tab +\begingroup + \catcode`\^^I=\active + \gdef\tabeightspaces{\catcode`\^^I=\active\def^^I{\ \ \ \ \ \ \ \ }} +\endgroup +% +\def\setupverb{% + \tt % easiest (and conventionally used) font for verbatim + \def\par{\leavevmode\endgraf}% + \catcode`\`=\active + \tabeightspaces + % Respect line breaks, + % print special symbols as themselves, and + % make each space count + % must do in this order: + \obeylines \uncatcodespecials \sepspaces +} + +% Setup for the @verbatim environment +% +% Real tab expansion +\newdimen\tabw \setbox0=\hbox{\tt\space} \tabw=8\wd0 % tab amount +% +\def\starttabbox{\setbox0=\hbox\bgroup} + +% Allow an option to not replace quotes with a regular directed right +% quote/apostrophe (char 0x27), but instead use the undirected quote +% from cmtt (char 0x0d). The undirected quote is ugly, so don't make it +% the default, but it works for pasting with more pdf viewers (at least +% evince), the lilypond developers report. xpdf does work with the +% regular 0x27. +% +\def\codequoteright{% + \expandafter\ifx\csname SETtxicodequoteundirected\endcsname\relax + \expandafter\ifx\csname SETcodequoteundirected\endcsname\relax + '% + \else \char'15 \fi + \else \char'15 \fi +} +% +% and a similar option for the left quote char vs. a grave accent. +% Modern fonts display ASCII 0x60 as a grave accent, so some people like +% the code environments to do likewise. +% +\def\codequoteleft{% + \expandafter\ifx\csname SETtxicodequotebacktick\endcsname\relax + \expandafter\ifx\csname SETcodequotebacktick\endcsname\relax + `% + \else \char'22 \fi + \else \char'22 \fi +} +% +\begingroup + \catcode`\^^I=\active + \gdef\tabexpand{% + \catcode`\^^I=\active + \def^^I{\leavevmode\egroup + \dimen0=\wd0 % the width so far, or since the previous tab + \divide\dimen0 by\tabw + \multiply\dimen0 by\tabw % compute previous multiple of \tabw + \advance\dimen0 by\tabw % advance to next multiple of \tabw + \wd0=\dimen0 \box0 \starttabbox + }% + } + \catcode`\'=\active + \gdef\rquoteexpand{\catcode\rquoteChar=\active \def'{\codequoteright}}% + % + \catcode`\`=\active + \gdef\lquoteexpand{\catcode\lquoteChar=\active \def`{\codequoteleft}}% + % + \gdef\quoteexpand{\rquoteexpand \lquoteexpand}% +\endgroup + +% start the verbatim environment. +\def\setupverbatim{% + \let\nonarrowing = t% + \nonfillstart + % Easiest (and conventionally used) font for verbatim + \tt + \def\par{\leavevmode\egroup\box0\endgraf}% + \catcode`\`=\active + \tabexpand + \quoteexpand + % Respect line breaks, + % print special symbols as themselves, and + % make each space count + % must do in this order: + \obeylines \uncatcodespecials \sepspaces + \everypar{\starttabbox}% +} + +% Do the @verb magic: verbatim text is quoted by unique +% delimiter characters. Before first delimiter expect a +% right brace, after last delimiter expect closing brace: +% +% \def\doverb'{'#1'}'{#1} +% +% [Knuth] p. 382; only eat outer {} +\begingroup + \catcode`[=1\catcode`]=2\catcode`\{=\other\catcode`\}=\other + \gdef\doverb{#1[\def\next##1#1}[##1\endgroup]\next] +\endgroup +% +\def\verb{\begingroup\setupverb\doverb} +% +% +% Do the @verbatim magic: define the macro \doverbatim so that +% the (first) argument ends when '@end verbatim' is reached, ie: +% +% \def\doverbatim#1@end verbatim{#1} +% +% For Texinfo it's a lot easier than for LaTeX, +% because texinfo's \verbatim doesn't stop at '\end{verbatim}': +% we need not redefine '\', '{' and '}'. +% +% Inspired by LaTeX's verbatim command set [latex.ltx] +% +\begingroup + \catcode`\ =\active + \obeylines % + % ignore everything up to the first ^^M, that's the newline at the end + % of the @verbatim input line itself. Otherwise we get an extra blank + % line in the output. + \xdef\doverbatim#1^^M#2@end verbatim{#2\noexpand\end\gobble verbatim}% + % We really want {...\end verbatim} in the body of the macro, but + % without the active space; thus we have to use \xdef and \gobble. +\endgroup +% +\envdef\verbatim{% + \setupverbatim\doverbatim +} +\let\Everbatim = \afterenvbreak + + +% @verbatiminclude FILE - insert text of file in verbatim environment. +% +\def\verbatiminclude{\parseargusing\filenamecatcodes\doverbatiminclude} +% +\def\doverbatiminclude#1{% + {% + \makevalueexpandable + \setupverbatim + \input #1 + \afterenvbreak + }% +} + +% @copying ... @end copying. +% Save the text away for @insertcopying later. +% +% We save the uninterpreted tokens, rather than creating a box. +% Saving the text in a box would be much easier, but then all the +% typesetting commands (@smallbook, font changes, etc.) have to be done +% beforehand -- and a) we want @copying to be done first in the source +% file; b) letting users define the frontmatter in as flexible order as +% possible is very desirable. +% +\def\copying{\checkenv{}\begingroup\scanargctxt\docopying} +\def\docopying#1@end copying{\endgroup\def\copyingtext{#1}} +% +\def\insertcopying{% + \begingroup + \parindent = 0pt % paragraph indentation looks wrong on title page + \scanexp\copyingtext + \endgroup +} + + +\message{defuns,} +% @defun etc. + +\newskip\defbodyindent \defbodyindent=.4in +\newskip\defargsindent \defargsindent=50pt +\newskip\deflastargmargin \deflastargmargin=18pt +\newcount\defunpenalty + +% Start the processing of @deffn: +\def\startdefun{% + \ifnum\lastpenalty<10000 + \medbreak + \defunpenalty=10003 % Will keep this @deffn together with the + % following @def command, see below. + \else + % If there are two @def commands in a row, we'll have a \nobreak, + % which is there to keep the function description together with its + % header. But if there's nothing but headers, we need to allow a + % break somewhere. Check specifically for penalty 10002, inserted + % by \printdefunline, instead of 10000, since the sectioning + % commands also insert a nobreak penalty, and we don't want to allow + % a break between a section heading and a defun. + % + % As a minor refinement, we avoid "club" headers by signalling + % with penalty of 10003 after the very first @deffn in the + % sequence (see above), and penalty of 10002 after any following + % @def command. + \ifnum\lastpenalty=10002 \penalty2000 \else \defunpenalty=10002 \fi + % + % Similarly, after a section heading, do not allow a break. + % But do insert the glue. + \medskip % preceded by discardable penalty, so not a breakpoint + \fi + % + \parindent=0in + \advance\leftskip by \defbodyindent + \exdentamount=\defbodyindent +} + +\def\dodefunx#1{% + % First, check whether we are in the right environment: + \checkenv#1% + % + % As above, allow line break if we have multiple x headers in a row. + % It's not a great place, though. + \ifnum\lastpenalty=10002 \penalty3000 \else \defunpenalty=10002 \fi + % + % And now, it's time to reuse the body of the original defun: + \expandafter\gobbledefun#1% +} +\def\gobbledefun#1\startdefun{} + +% \printdefunline \deffnheader{text} +% +\def\printdefunline#1#2{% + \begingroup + % call \deffnheader: + #1#2 \endheader + % common ending: + \interlinepenalty = 10000 + \advance\rightskip by 0pt plus 1fil + \endgraf + \nobreak\vskip -\parskip + \penalty\defunpenalty % signal to \startdefun and \dodefunx + % Some of the @defun-type tags do not enable magic parentheses, + % rendering the following check redundant. But we don't optimize. + \checkparencounts + \endgroup +} + +\def\Edefun{\endgraf\medbreak} + +% \makedefun{deffn} creates \deffn, \deffnx and \Edeffn; +% the only thing remainnig is to define \deffnheader. +% +\def\makedefun#1{% + \expandafter\let\csname E#1\endcsname = \Edefun + \edef\temp{\noexpand\domakedefun + \makecsname{#1}\makecsname{#1x}\makecsname{#1header}}% + \temp +} + +% \domakedefun \deffn \deffnx \deffnheader +% +% Define \deffn and \deffnx, without parameters. +% \deffnheader has to be defined explicitly. +% +\def\domakedefun#1#2#3{% + \envdef#1{% + \startdefun + \parseargusing\activeparens{\printdefunline#3}% + }% + \def#2{\dodefunx#1}% + \def#3% +} + +%%% Untyped functions: + +% @deffn category name args +\makedefun{deffn}{\deffngeneral{}} + +% @deffn category class name args +\makedefun{defop}#1 {\defopon{#1\ \putwordon}} + +% \defopon {category on}class name args +\def\defopon#1#2 {\deffngeneral{\putwordon\ \code{#2}}{#1\ \code{#2}} } + +% \deffngeneral {subind}category name args +% +\def\deffngeneral#1#2 #3 #4\endheader{% + % Remember that \dosubind{fn}{foo}{} is equivalent to \doind{fn}{foo}. + \dosubind{fn}{\code{#3}}{#1}% + \defname{#2}{}{#3}\magicamp\defunargs{#4\unskip}% +} + +%%% Typed functions: + +% @deftypefn category type name args +\makedefun{deftypefn}{\deftypefngeneral{}} + +% @deftypeop category class type name args +\makedefun{deftypeop}#1 {\deftypeopon{#1\ \putwordon}} + +% \deftypeopon {category on}class type name args +\def\deftypeopon#1#2 {\deftypefngeneral{\putwordon\ \code{#2}}{#1\ \code{#2}} } + +% \deftypefngeneral {subind}category type name args +% +\def\deftypefngeneral#1#2 #3 #4 #5\endheader{% + \dosubind{fn}{\code{#4}}{#1}% + \defname{#2}{#3}{#4}\defunargs{#5\unskip}% +} + +%%% Typed variables: + +% @deftypevr category type var args +\makedefun{deftypevr}{\deftypecvgeneral{}} + +% @deftypecv category class type var args +\makedefun{deftypecv}#1 {\deftypecvof{#1\ \putwordof}} + +% \deftypecvof {category of}class type var args +\def\deftypecvof#1#2 {\deftypecvgeneral{\putwordof\ \code{#2}}{#1\ \code{#2}} } + +% \deftypecvgeneral {subind}category type var args +% +\def\deftypecvgeneral#1#2 #3 #4 #5\endheader{% + \dosubind{vr}{\code{#4}}{#1}% + \defname{#2}{#3}{#4}\defunargs{#5\unskip}% +} + +%%% Untyped variables: + +% @defvr category var args +\makedefun{defvr}#1 {\deftypevrheader{#1} {} } + +% @defcv category class var args +\makedefun{defcv}#1 {\defcvof{#1\ \putwordof}} + +% \defcvof {category of}class var args +\def\defcvof#1#2 {\deftypecvof{#1}#2 {} } + +%%% Type: +% @deftp category name args +\makedefun{deftp}#1 #2 #3\endheader{% + \doind{tp}{\code{#2}}% + \defname{#1}{}{#2}\defunargs{#3\unskip}% +} + +% Remaining @defun-like shortcuts: +\makedefun{defun}{\deffnheader{\putwordDeffunc} } +\makedefun{defmac}{\deffnheader{\putwordDefmac} } +\makedefun{defspec}{\deffnheader{\putwordDefspec} } +\makedefun{deftypefun}{\deftypefnheader{\putwordDeffunc} } +\makedefun{defvar}{\defvrheader{\putwordDefvar} } +\makedefun{defopt}{\defvrheader{\putwordDefopt} } +\makedefun{deftypevar}{\deftypevrheader{\putwordDefvar} } +\makedefun{defmethod}{\defopon\putwordMethodon} +\makedefun{deftypemethod}{\deftypeopon\putwordMethodon} +\makedefun{defivar}{\defcvof\putwordInstanceVariableof} +\makedefun{deftypeivar}{\deftypecvof\putwordInstanceVariableof} + +% \defname, which formats the name of the @def (not the args). +% #1 is the category, such as "Function". +% #2 is the return type, if any. +% #3 is the function name. +% +% We are followed by (but not passed) the arguments, if any. +% +\def\defname#1#2#3{% + % Get the values of \leftskip and \rightskip as they were outside the @def... + \advance\leftskip by -\defbodyindent + % + % How we'll format the type name. Putting it in brackets helps + % distinguish it from the body text that may end up on the next line + % just below it. + \def\temp{#1}% + \setbox0=\hbox{\kern\deflastargmargin \ifx\temp\empty\else [\rm\temp]\fi} + % + % Figure out line sizes for the paragraph shape. + % The first line needs space for \box0; but if \rightskip is nonzero, + % we need only space for the part of \box0 which exceeds it: + \dimen0=\hsize \advance\dimen0 by -\wd0 \advance\dimen0 by \rightskip + % The continuations: + \dimen2=\hsize \advance\dimen2 by -\defargsindent + % (plain.tex says that \dimen1 should be used only as global.) + \parshape 2 0in \dimen0 \defargsindent \dimen2 + % + % Put the type name to the right margin. + \noindent + \hbox to 0pt{% + \hfil\box0 \kern-\hsize + % \hsize has to be shortened this way: + \kern\leftskip + % Intentionally do not respect \rightskip, since we need the space. + }% + % + % Allow all lines to be underfull without complaint: + \tolerance=10000 \hbadness=10000 + \exdentamount=\defbodyindent + {% + % defun fonts. We use typewriter by default (used to be bold) because: + % . we're printing identifiers, they should be in tt in principle. + % . in languages with many accents, such as Czech or French, it's + % common to leave accents off identifiers. The result looks ok in + % tt, but exceedingly strange in rm. + % . we don't want -- and --- to be treated as ligatures. + % . this still does not fix the ?` and !` ligatures, but so far no + % one has made identifiers using them :). + \df \tt + \def\temp{#2}% return value type + \ifx\temp\empty\else \tclose{\temp} \fi + #3% output function name + }% + {\rm\enskip}% hskip 0.5 em of \tenrm + % + \boldbrax + % arguments will be output next, if any. +} + +% Print arguments in slanted roman (not ttsl), inconsistently with using +% tt for the name. This is because literal text is sometimes needed in +% the argument list (groff manual), and ttsl and tt are not very +% distinguishable. Prevent hyphenation at `-' chars. +% +\def\defunargs#1{% + % use sl by default (not ttsl), + % tt for the names. + \df \sl \hyphenchar\font=0 + % + % On the other hand, if an argument has two dashes (for instance), we + % want a way to get ttsl. Let's try @var for that. + \let\var=\ttslanted + #1% + \sl\hyphenchar\font=45 +} + +% We want ()&[] to print specially on the defun line. +% +\def\activeparens{% + \catcode`\(=\active \catcode`\)=\active + \catcode`\[=\active \catcode`\]=\active + \catcode`\&=\active +} + +% Make control sequences which act like normal parenthesis chars. +\let\lparen = ( \let\rparen = ) + +% Be sure that we always have a definition for `(', etc. For example, +% if the fn name has parens in it, \boldbrax will not be in effect yet, +% so TeX would otherwise complain about undefined control sequence. +{ + \activeparens + \global\let(=\lparen \global\let)=\rparen + \global\let[=\lbrack \global\let]=\rbrack + \global\let& = \& + + \gdef\boldbrax{\let(=\opnr\let)=\clnr\let[=\lbrb\let]=\rbrb} + \gdef\magicamp{\let&=\amprm} +} + +\newcount\parencount + +% If we encounter &foo, then turn on ()-hacking afterwards +\newif\ifampseen +\def\amprm#1 {\ampseentrue{\bf\ }} + +\def\parenfont{% + \ifampseen + % At the first level, print parens in roman, + % otherwise use the default font. + \ifnum \parencount=1 \rm \fi + \else + % The \sf parens (in \boldbrax) actually are a little bolder than + % the contained text. This is especially needed for [ and ] . + \sf + \fi +} +\def\infirstlevel#1{% + \ifampseen + \ifnum\parencount=1 + #1% + \fi + \fi +} +\def\bfafterword#1 {#1 \bf} + +\def\opnr{% + \global\advance\parencount by 1 + {\parenfont(}% + \infirstlevel \bfafterword +} +\def\clnr{% + {\parenfont)}% + \infirstlevel \sl + \global\advance\parencount by -1 +} + +\newcount\brackcount +\def\lbrb{% + \global\advance\brackcount by 1 + {\bf[}% +} +\def\rbrb{% + {\bf]}% + \global\advance\brackcount by -1 +} + +\def\checkparencounts{% + \ifnum\parencount=0 \else \badparencount \fi + \ifnum\brackcount=0 \else \badbrackcount \fi +} +% these should not use \errmessage; the glibc manual, at least, actually +% has such constructs (when documenting function pointers). +\def\badparencount{% + \message{Warning: unbalanced parentheses in @def...}% + \global\parencount=0 +} +\def\badbrackcount{% + \message{Warning: unbalanced square brackets in @def...}% + \global\brackcount=0 +} + + +\message{macros,} +% @macro. + +% To do this right we need a feature of e-TeX, \scantokens, +% which we arrange to emulate with a temporary file in ordinary TeX. +\ifx\eTeXversion\undefined + \newwrite\macscribble + \def\scantokens#1{% + \toks0={#1}% + \immediate\openout\macscribble=\jobname.tmp + \immediate\write\macscribble{\the\toks0}% + \immediate\closeout\macscribble + \input \jobname.tmp + } +\fi + +\def\scanmacro#1{% + \begingroup + \newlinechar`\^^M + \let\xeatspaces\eatspaces + % Undo catcode changes of \startcontents and \doprintindex + % When called from @insertcopying or (short)caption, we need active + % backslash to get it printed correctly. Previously, we had + % \catcode`\\=\other instead. We'll see whether a problem appears + % with macro expansion. --kasal, 19aug04 + \catcode`\@=0 \catcode`\\=\active \escapechar=`\@ + % ... and \example + \spaceisspace + % + % Append \endinput to make sure that TeX does not see the ending newline. + % I've verified that it is necessary both for e-TeX and for ordinary TeX + % --kasal, 29nov03 + \scantokens{#1\endinput}% + \endgroup +} + +\def\scanexp#1{% + \edef\temp{\noexpand\scanmacro{#1}}% + \temp +} + +\newcount\paramno % Count of parameters +\newtoks\macname % Macro name +\newif\ifrecursive % Is it recursive? + +% List of all defined macros in the form +% \definedummyword\macro1\definedummyword\macro2... +% Currently is also contains all @aliases; the list can be split +% if there is a need. +\def\macrolist{} + +% Add the macro to \macrolist +\def\addtomacrolist#1{\expandafter \addtomacrolistxxx \csname#1\endcsname} +\def\addtomacrolistxxx#1{% + \toks0 = \expandafter{\macrolist\definedummyword#1}% + \xdef\macrolist{\the\toks0}% +} + +% Utility routines. +% This does \let #1 = #2, with \csnames; that is, +% \let \csname#1\endcsname = \csname#2\endcsname +% (except of course we have to play expansion games). +% +\def\cslet#1#2{% + \expandafter\let + \csname#1\expandafter\endcsname + \csname#2\endcsname +} + +% Trim leading and trailing spaces off a string. +% Concepts from aro-bend problem 15 (see CTAN). +{\catcode`\@=11 +\gdef\eatspaces #1{\expandafter\trim@\expandafter{#1 }} +\gdef\trim@ #1{\trim@@ @#1 @ #1 @ @@} +\gdef\trim@@ #1@ #2@ #3@@{\trim@@@\empty #2 @} +\def\unbrace#1{#1} +\unbrace{\gdef\trim@@@ #1 } #2@{#1} +} + +% Trim a single trailing ^^M off a string. +{\catcode`\^^M=\other \catcode`\Q=3% +\gdef\eatcr #1{\eatcra #1Q^^MQ}% +\gdef\eatcra#1^^MQ{\eatcrb#1Q}% +\gdef\eatcrb#1Q#2Q{#1}% +} + +% Macro bodies are absorbed as an argument in a context where +% all characters are catcode 10, 11 or 12, except \ which is active +% (as in normal texinfo). It is necessary to change the definition of \. + +% Non-ASCII encodings make 8-bit characters active, so un-activate +% them to avoid their expansion. Must do this non-globally, to +% confine the change to the current group. + +% It's necessary to have hard CRs when the macro is executed. This is +% done by making ^^M (\endlinechar) catcode 12 when reading the macro +% body, and then making it the \newlinechar in \scanmacro. + +\def\scanctxt{% + \catcode`\"=\other + \catcode`\+=\other + \catcode`\<=\other + \catcode`\>=\other + \catcode`\@=\other + \catcode`\^=\other + \catcode`\_=\other + \catcode`\|=\other + \catcode`\~=\other + \ifx\declaredencoding\ascii \else \setnonasciicharscatcodenonglobal\other \fi +} + +\def\scanargctxt{% + \scanctxt + \catcode`\\=\other + \catcode`\^^M=\other +} + +\def\macrobodyctxt{% + \scanctxt + \catcode`\{=\other + \catcode`\}=\other + \catcode`\^^M=\other + \usembodybackslash +} + +\def\macroargctxt{% + \scanctxt + \catcode`\\=\other +} + +% \mbodybackslash is the definition of \ in @macro bodies. +% It maps \foo\ => \csname macarg.foo\endcsname => #N +% where N is the macro parameter number. +% We define \csname macarg.\endcsname to be \realbackslash, so +% \\ in macro replacement text gets you a backslash. + +{\catcode`@=0 @catcode`@\=@active + @gdef@usembodybackslash{@let\=@mbodybackslash} + @gdef@mbodybackslash#1\{@csname macarg.#1@endcsname} +} +\expandafter\def\csname macarg.\endcsname{\realbackslash} + +\def\macro{\recursivefalse\parsearg\macroxxx} +\def\rmacro{\recursivetrue\parsearg\macroxxx} + +\def\macroxxx#1{% + \getargs{#1}% now \macname is the macname and \argl the arglist + \ifx\argl\empty % no arguments + \paramno=0% + \else + \expandafter\parsemargdef \argl;% + \fi + \if1\csname ismacro.\the\macname\endcsname + \message{Warning: redefining \the\macname}% + \else + \expandafter\ifx\csname \the\macname\endcsname \relax + \else \errmessage{Macro name \the\macname\space already defined}\fi + \global\cslet{macsave.\the\macname}{\the\macname}% + \global\expandafter\let\csname ismacro.\the\macname\endcsname=1% + \addtomacrolist{\the\macname}% + \fi + \begingroup \macrobodyctxt + \ifrecursive \expandafter\parsermacbody + \else \expandafter\parsemacbody + \fi} + +\parseargdef\unmacro{% + \if1\csname ismacro.#1\endcsname + \global\cslet{#1}{macsave.#1}% + \global\expandafter\let \csname ismacro.#1\endcsname=0% + % Remove the macro name from \macrolist: + \begingroup + \expandafter\let\csname#1\endcsname \relax + \let\definedummyword\unmacrodo + \xdef\macrolist{\macrolist}% + \endgroup + \else + \errmessage{Macro #1 not defined}% + \fi +} + +% Called by \do from \dounmacro on each macro. The idea is to omit any +% macro definitions that have been changed to \relax. +% +\def\unmacrodo#1{% + \ifx #1\relax + % remove this + \else + \noexpand\definedummyword \noexpand#1% + \fi +} + +% This makes use of the obscure feature that if the last token of a +% is #, then the preceding argument is delimited by +% an opening brace, and that opening brace is not consumed. +\def\getargs#1{\getargsxxx#1{}} +\def\getargsxxx#1#{\getmacname #1 \relax\getmacargs} +\def\getmacname #1 #2\relax{\macname={#1}} +\def\getmacargs#1{\def\argl{#1}} + +% Parse the optional {params} list. Set up \paramno and \paramlist +% so \defmacro knows what to do. Define \macarg.blah for each blah +% in the params list, to be ##N where N is the position in that list. +% That gets used by \mbodybackslash (above). + +% We need to get `macro parameter char #' into several definitions. +% The technique used is stolen from LaTeX: let \hash be something +% unexpandable, insert that wherever you need a #, and then redefine +% it to # just before using the token list produced. +% +% The same technique is used to protect \eatspaces till just before +% the macro is used. + +\def\parsemargdef#1;{\paramno=0\def\paramlist{}% + \let\hash\relax\let\xeatspaces\relax\parsemargdefxxx#1,;,} +\def\parsemargdefxxx#1,{% + \if#1;\let\next=\relax + \else \let\next=\parsemargdefxxx + \advance\paramno by 1% + \expandafter\edef\csname macarg.\eatspaces{#1}\endcsname + {\xeatspaces{\hash\the\paramno}}% + \edef\paramlist{\paramlist\hash\the\paramno,}% + \fi\next} + +% These two commands read recursive and nonrecursive macro bodies. +% (They're different since rec and nonrec macros end differently.) + +\long\def\parsemacbody#1@end macro% +{\xdef\temp{\eatcr{#1}}\endgroup\defmacro}% +\long\def\parsermacbody#1@end rmacro% +{\xdef\temp{\eatcr{#1}}\endgroup\defmacro}% + +% This defines the macro itself. There are six cases: recursive and +% nonrecursive macros of zero, one, and many arguments. +% Much magic with \expandafter here. +% \xdef is used so that macro definitions will survive the file +% they're defined in; @include reads the file inside a group. +\def\defmacro{% + \let\hash=##% convert placeholders to macro parameter chars + \ifrecursive + \ifcase\paramno + % 0 + \expandafter\xdef\csname\the\macname\endcsname{% + \noexpand\scanmacro{\temp}}% + \or % 1 + \expandafter\xdef\csname\the\macname\endcsname{% + \bgroup\noexpand\macroargctxt + \noexpand\braceorline + \expandafter\noexpand\csname\the\macname xxx\endcsname}% + \expandafter\xdef\csname\the\macname xxx\endcsname##1{% + \egroup\noexpand\scanmacro{\temp}}% + \else % many + \expandafter\xdef\csname\the\macname\endcsname{% + \bgroup\noexpand\macroargctxt + \noexpand\csname\the\macname xx\endcsname}% + \expandafter\xdef\csname\the\macname xx\endcsname##1{% + \expandafter\noexpand\csname\the\macname xxx\endcsname ##1,}% + \expandafter\expandafter + \expandafter\xdef + \expandafter\expandafter + \csname\the\macname xxx\endcsname + \paramlist{\egroup\noexpand\scanmacro{\temp}}% + \fi + \else + \ifcase\paramno + % 0 + \expandafter\xdef\csname\the\macname\endcsname{% + \noexpand\norecurse{\the\macname}% + \noexpand\scanmacro{\temp}\egroup}% + \or % 1 + \expandafter\xdef\csname\the\macname\endcsname{% + \bgroup\noexpand\macroargctxt + \noexpand\braceorline + \expandafter\noexpand\csname\the\macname xxx\endcsname}% + \expandafter\xdef\csname\the\macname xxx\endcsname##1{% + \egroup + \noexpand\norecurse{\the\macname}% + \noexpand\scanmacro{\temp}\egroup}% + \else % many + \expandafter\xdef\csname\the\macname\endcsname{% + \bgroup\noexpand\macroargctxt + \expandafter\noexpand\csname\the\macname xx\endcsname}% + \expandafter\xdef\csname\the\macname xx\endcsname##1{% + \expandafter\noexpand\csname\the\macname xxx\endcsname ##1,}% + \expandafter\expandafter + \expandafter\xdef + \expandafter\expandafter + \csname\the\macname xxx\endcsname + \paramlist{% + \egroup + \noexpand\norecurse{\the\macname}% + \noexpand\scanmacro{\temp}\egroup}% + \fi + \fi} + +\def\norecurse#1{\bgroup\cslet{#1}{macsave.#1}} + +% \braceorline decides whether the next nonwhitespace character is a +% {. If so it reads up to the closing }, if not, it reads the whole +% line. Whatever was read is then fed to the next control sequence +% as an argument (by \parsebrace or \parsearg) +\def\braceorline#1{\let\macnamexxx=#1\futurelet\nchar\braceorlinexxx} +\def\braceorlinexxx{% + \ifx\nchar\bgroup\else + \expandafter\parsearg + \fi \macnamexxx} + + +% @alias. +% We need some trickery to remove the optional spaces around the equal +% sign. Just make them active and then expand them all to nothing. +\def\alias{\parseargusing\obeyspaces\aliasxxx} +\def\aliasxxx #1{\aliasyyy#1\relax} +\def\aliasyyy #1=#2\relax{% + {% + \expandafter\let\obeyedspace=\empty + \addtomacrolist{#1}% + \xdef\next{\global\let\makecsname{#1}=\makecsname{#2}}% + }% + \next +} + + +\message{cross references,} + +\newwrite\auxfile +\newif\ifhavexrefs % True if xref values are known. +\newif\ifwarnedxrefs % True if we warned once that they aren't known. + +% @inforef is relatively simple. +\def\inforef #1{\inforefzzz #1,,,,**} +\def\inforefzzz #1,#2,#3,#4**{\putwordSee{} \putwordInfo{} \putwordfile{} \file{\ignorespaces #3{}}, + node \samp{\ignorespaces#1{}}} + +% @node's only job in TeX is to define \lastnode, which is used in +% cross-references. The @node line might or might not have commas, and +% might or might not have spaces before the first comma, like: +% @node foo , bar , ... +% We don't want such trailing spaces in the node name. +% +\parseargdef\node{\checkenv{}\donode #1 ,\finishnodeparse} +% +% also remove a trailing comma, in case of something like this: +% @node Help-Cross, , , Cross-refs +\def\donode#1 ,#2\finishnodeparse{\dodonode #1,\finishnodeparse} +\def\dodonode#1,#2\finishnodeparse{\gdef\lastnode{#1}} + +\let\nwnode=\node +\let\lastnode=\empty + +% Write a cross-reference definition for the current node. #1 is the +% type (Ynumbered, Yappendix, Ynothing). +% +\def\donoderef#1{% + \ifx\lastnode\empty\else + \setref{\lastnode}{#1}% + \global\let\lastnode=\empty + \fi +} + +% @anchor{NAME} -- define xref target at arbitrary point. +% +\newcount\savesfregister +% +\def\savesf{\relax \ifhmode \savesfregister=\spacefactor \fi} +\def\restoresf{\relax \ifhmode \spacefactor=\savesfregister \fi} +\def\anchor#1{\savesf \setref{#1}{Ynothing}\restoresf \ignorespaces} + +% \setref{NAME}{SNT} defines a cross-reference point NAME (a node or an +% anchor), which consists of three parts: +% 1) NAME-title - the current sectioning name taken from \lastsection, +% or the anchor name. +% 2) NAME-snt - section number and type, passed as the SNT arg, or +% empty for anchors. +% 3) NAME-pg - the page number. +% +% This is called from \donoderef, \anchor, and \dofloat. In the case of +% floats, there is an additional part, which is not written here: +% 4) NAME-lof - the text as it should appear in a @listoffloats. +% +\def\setref#1#2{% + \pdfmkdest{#1}% + \iflinks + {% + \atdummies % preserve commands, but don't expand them + \edef\writexrdef##1##2{% + \write\auxfile{@xrdef{#1-% #1 of \setref, expanded by the \edef + ##1}{##2}}% these are parameters of \writexrdef + }% + \toks0 = \expandafter{\lastsection}% + \immediate \writexrdef{title}{\the\toks0 }% + \immediate \writexrdef{snt}{\csname #2\endcsname}% \Ynumbered etc. + \safewhatsit{\writexrdef{pg}{\folio}}% will be written later, during \shipout + }% + \fi +} + +% @xref, @pxref, and @ref generate cross-references. For \xrefX, #1 is +% the node name, #2 the name of the Info cross-reference, #3 the printed +% node name, #4 the name of the Info file, #5 the name of the printed +% manual. All but the node name can be omitted. +% +\def\pxref#1{\putwordsee{} \xrefX[#1,,,,,,,]} +\def\xref#1{\putwordSee{} \xrefX[#1,,,,,,,]} +\def\ref#1{\xrefX[#1,,,,,,,]} +\def\xrefX[#1,#2,#3,#4,#5,#6]{\begingroup + \unsepspaces + \def\printedmanual{\ignorespaces #5}% + \def\printedrefname{\ignorespaces #3}% + \setbox1=\hbox{\printedmanual\unskip}% + \setbox0=\hbox{\printedrefname\unskip}% + \ifdim \wd0 = 0pt + % No printed node name was explicitly given. + \expandafter\ifx\csname SETxref-automatic-section-title\endcsname\relax + % Use the node name inside the square brackets. + \def\printedrefname{\ignorespaces #1}% + \else + % Use the actual chapter/section title appear inside + % the square brackets. Use the real section title if we have it. + \ifdim \wd1 > 0pt + % It is in another manual, so we don't have it. + \def\printedrefname{\ignorespaces #1}% + \else + \ifhavexrefs + % We know the real title if we have the xref values. + \def\printedrefname{\refx{#1-title}{}}% + \else + % Otherwise just copy the Info node name. + \def\printedrefname{\ignorespaces #1}% + \fi% + \fi + \fi + \fi + % + % Make link in pdf output. + \ifpdf + \leavevmode + \getfilename{#4}% + {\indexnofonts + \turnoffactive + % See comments at \activebackslashdouble. + {\activebackslashdouble \xdef\pdfxrefdest{#1}% + \backslashparens\pdfxrefdest}% + % + \ifnum\filenamelength>0 + \startlink attr{/Border [0 0 0]}% + goto file{\the\filename.pdf} name{\pdfxrefdest}% + \else + \startlink attr{/Border [0 0 0]}% + goto name{\pdfmkpgn{\pdfxrefdest}}% + \fi + }% + \setcolor{\linkcolor}% + \fi + % + % Float references are printed completely differently: "Figure 1.2" + % instead of "[somenode], p.3". We distinguish them by the + % LABEL-title being set to a magic string. + {% + % Have to otherify everything special to allow the \csname to + % include an _ in the xref name, etc. + \indexnofonts + \turnoffactive + \expandafter\global\expandafter\let\expandafter\Xthisreftitle + \csname XR#1-title\endcsname + }% + \iffloat\Xthisreftitle + % If the user specified the print name (third arg) to the ref, + % print it instead of our usual "Figure 1.2". + \ifdim\wd0 = 0pt + \refx{#1-snt}{}% + \else + \printedrefname + \fi + % + % if the user also gave the printed manual name (fifth arg), append + % "in MANUALNAME". + \ifdim \wd1 > 0pt + \space \putwordin{} \cite{\printedmanual}% + \fi + \else + % node/anchor (non-float) references. + % + % If we use \unhbox0 and \unhbox1 to print the node names, TeX does not + % insert empty discretionaries after hyphens, which means that it will + % not find a line break at a hyphen in a node names. Since some manuals + % are best written with fairly long node names, containing hyphens, this + % is a loss. Therefore, we give the text of the node name again, so it + % is as if TeX is seeing it for the first time. + \ifdim \wd1 > 0pt + \putwordSection{} ``\printedrefname'' \putwordin{} \cite{\printedmanual}% + \else + % _ (for example) has to be the character _ for the purposes of the + % control sequence corresponding to the node, but it has to expand + % into the usual \leavevmode...\vrule stuff for purposes of + % printing. So we \turnoffactive for the \refx-snt, back on for the + % printing, back off for the \refx-pg. + {\turnoffactive + % Only output a following space if the -snt ref is nonempty; for + % @unnumbered and @anchor, it won't be. + \setbox2 = \hbox{\ignorespaces \refx{#1-snt}{}}% + \ifdim \wd2 > 0pt \refx{#1-snt}\space\fi + }% + % output the `[mynode]' via a macro so it can be overridden. + \xrefprintnodename\printedrefname + % + % But we always want a comma and a space: + ,\space + % + % output the `page 3'. + \turnoffactive \putwordpage\tie\refx{#1-pg}{}% + \fi + \fi + \endlink +\endgroup} + +% This macro is called from \xrefX for the `[nodename]' part of xref +% output. It's a separate macro only so it can be changed more easily, +% since square brackets don't work well in some documents. Particularly +% one that Bob is working on :). +% +\def\xrefprintnodename#1{[#1]} + +% Things referred to by \setref. +% +\def\Ynothing{} +\def\Yomitfromtoc{} +\def\Ynumbered{% + \ifnum\secno=0 + \putwordChapter@tie \the\chapno + \else \ifnum\subsecno=0 + \putwordSection@tie \the\chapno.\the\secno + \else \ifnum\subsubsecno=0 + \putwordSection@tie \the\chapno.\the\secno.\the\subsecno + \else + \putwordSection@tie \the\chapno.\the\secno.\the\subsecno.\the\subsubsecno + \fi\fi\fi +} +\def\Yappendix{% + \ifnum\secno=0 + \putwordAppendix@tie @char\the\appendixno{}% + \else \ifnum\subsecno=0 + \putwordSection@tie @char\the\appendixno.\the\secno + \else \ifnum\subsubsecno=0 + \putwordSection@tie @char\the\appendixno.\the\secno.\the\subsecno + \else + \putwordSection@tie + @char\the\appendixno.\the\secno.\the\subsecno.\the\subsubsecno + \fi\fi\fi +} + +% Define \refx{NAME}{SUFFIX} to reference a cross-reference string named NAME. +% If its value is nonempty, SUFFIX is output afterward. +% +\def\refx#1#2{% + {% + \indexnofonts + \otherbackslash + \expandafter\global\expandafter\let\expandafter\thisrefX + \csname XR#1\endcsname + }% + \ifx\thisrefX\relax + % If not defined, say something at least. + \angleleft un\-de\-fined\angleright + \iflinks + \ifhavexrefs + \message{\linenumber Undefined cross reference `#1'.}% + \else + \ifwarnedxrefs\else + \global\warnedxrefstrue + \message{Cross reference values unknown; you must run TeX again.}% + \fi + \fi + \fi + \else + % It's defined, so just use it. + \thisrefX + \fi + #2% Output the suffix in any case. +} + +% This is the macro invoked by entries in the aux file. Usually it's +% just a \def (we prepend XR to the control sequence name to avoid +% collisions). But if this is a float type, we have more work to do. +% +\def\xrdef#1#2{% + {% The node name might contain 8-bit characters, which in our current + % implementation are changed to commands like @'e. Don't let these + % mess up the control sequence name. + \indexnofonts + \turnoffactive + \xdef\safexrefname{#1}% + }% + % + \expandafter\gdef\csname XR\safexrefname\endcsname{#2}% remember this xref + % + % Was that xref control sequence that we just defined for a float? + \expandafter\iffloat\csname XR\safexrefname\endcsname + % it was a float, and we have the (safe) float type in \iffloattype. + \expandafter\let\expandafter\floatlist + \csname floatlist\iffloattype\endcsname + % + % Is this the first time we've seen this float type? + \expandafter\ifx\floatlist\relax + \toks0 = {\do}% yes, so just \do + \else + % had it before, so preserve previous elements in list. + \toks0 = \expandafter{\floatlist\do}% + \fi + % + % Remember this xref in the control sequence \floatlistFLOATTYPE, + % for later use in \listoffloats. + \expandafter\xdef\csname floatlist\iffloattype\endcsname{\the\toks0 + {\safexrefname}}% + \fi +} + +% Read the last existing aux file, if any. No error if none exists. +% +\def\tryauxfile{% + \openin 1 \jobname.aux + \ifeof 1 \else + \readdatafile{aux}% + \global\havexrefstrue + \fi + \closein 1 +} + +\def\setupdatafile{% + \catcode`\^^@=\other + \catcode`\^^A=\other + \catcode`\^^B=\other + \catcode`\^^C=\other + \catcode`\^^D=\other + \catcode`\^^E=\other + \catcode`\^^F=\other + \catcode`\^^G=\other + \catcode`\^^H=\other + \catcode`\^^K=\other + \catcode`\^^L=\other + \catcode`\^^N=\other + \catcode`\^^P=\other + \catcode`\^^Q=\other + \catcode`\^^R=\other + \catcode`\^^S=\other + \catcode`\^^T=\other + \catcode`\^^U=\other + \catcode`\^^V=\other + \catcode`\^^W=\other + \catcode`\^^X=\other + \catcode`\^^Z=\other + \catcode`\^^[=\other + \catcode`\^^\=\other + \catcode`\^^]=\other + \catcode`\^^^=\other + \catcode`\^^_=\other + % It was suggested to set the catcode of ^ to 7, which would allow ^^e4 etc. + % in xref tags, i.e., node names. But since ^^e4 notation isn't + % supported in the main text, it doesn't seem desirable. Furthermore, + % that is not enough: for node names that actually contain a ^ + % character, we would end up writing a line like this: 'xrdef {'hat + % b-title}{'hat b} and \xrdef does a \csname...\endcsname on the first + % argument, and \hat is not an expandable control sequence. It could + % all be worked out, but why? Either we support ^^ or we don't. + % + % The other change necessary for this was to define \auxhat: + % \def\auxhat{\def^{'hat }}% extra space so ok if followed by letter + % and then to call \auxhat in \setq. + % + \catcode`\^=\other + % + % Special characters. Should be turned off anyway, but... + \catcode`\~=\other + \catcode`\[=\other + \catcode`\]=\other + \catcode`\"=\other + \catcode`\_=\other + \catcode`\|=\other + \catcode`\<=\other + \catcode`\>=\other + \catcode`\$=\other + \catcode`\#=\other + \catcode`\&=\other + \catcode`\%=\other + \catcode`+=\other % avoid \+ for paranoia even though we've turned it off + % + % This is to support \ in node names and titles, since the \ + % characters end up in a \csname. It's easier than + % leaving it active and making its active definition an actual \ + % character. What I don't understand is why it works in the *value* + % of the xrdef. Seems like it should be a catcode12 \, and that + % should not typeset properly. But it works, so I'm moving on for + % now. --karl, 15jan04. + \catcode`\\=\other + % + % Make the characters 128-255 be printing characters. + {% + \count1=128 + \def\loop{% + \catcode\count1=\other + \advance\count1 by 1 + \ifnum \count1<256 \loop \fi + }% + }% + % + % @ is our escape character in .aux files, and we need braces. + \catcode`\{=1 + \catcode`\}=2 + \catcode`\@=0 +} + +\def\readdatafile#1{% +\begingroup + \setupdatafile + \input\jobname.#1 +\endgroup} + + +\message{insertions,} +% including footnotes. + +\newcount \footnoteno + +% The trailing space in the following definition for supereject is +% vital for proper filling; pages come out unaligned when you do a +% pagealignmacro call if that space before the closing brace is +% removed. (Generally, numeric constants should always be followed by a +% space to prevent strange expansion errors.) +\def\supereject{\par\penalty -20000\footnoteno =0 } + +% @footnotestyle is meaningful for info output only. +\let\footnotestyle=\comment + +{\catcode `\@=11 +% +% Auto-number footnotes. Otherwise like plain. +\gdef\footnote{% + \let\indent=\ptexindent + \let\noindent=\ptexnoindent + \global\advance\footnoteno by \@ne + \edef\thisfootno{$^{\the\footnoteno}$}% + % + % In case the footnote comes at the end of a sentence, preserve the + % extra spacing after we do the footnote number. + \let\@sf\empty + \ifhmode\edef\@sf{\spacefactor\the\spacefactor}\ptexslash\fi + % + % Remove inadvertent blank space before typesetting the footnote number. + \unskip + \thisfootno\@sf + \dofootnote +}% + +% Don't bother with the trickery in plain.tex to not require the +% footnote text as a parameter. Our footnotes don't need to be so general. +% +% Oh yes, they do; otherwise, @ifset (and anything else that uses +% \parseargline) fails inside footnotes because the tokens are fixed when +% the footnote is read. --karl, 16nov96. +% +\gdef\dofootnote{% + \insert\footins\bgroup + % We want to typeset this text as a normal paragraph, even if the + % footnote reference occurs in (for example) a display environment. + % So reset some parameters. + \hsize=\pagewidth + \interlinepenalty\interfootnotelinepenalty + \splittopskip\ht\strutbox % top baseline for broken footnotes + \splitmaxdepth\dp\strutbox + \floatingpenalty\@MM + \leftskip\z@skip + \rightskip\z@skip + \spaceskip\z@skip + \xspaceskip\z@skip + \parindent\defaultparindent + % + \smallfonts \rm + % + % Because we use hanging indentation in footnotes, a @noindent appears + % to exdent this text, so make it be a no-op. makeinfo does not use + % hanging indentation so @noindent can still be needed within footnote + % text after an @example or the like (not that this is good style). + \let\noindent = \relax + % + % Hang the footnote text off the number. Use \everypar in case the + % footnote extends for more than one paragraph. + \everypar = {\hang}% + \textindent{\thisfootno}% + % + % Don't crash into the line above the footnote text. Since this + % expands into a box, it must come within the paragraph, lest it + % provide a place where TeX can split the footnote. + \footstrut + \futurelet\next\fo@t +} +}%end \catcode `\@=11 + +% In case a @footnote appears in a vbox, save the footnote text and create +% the real \insert just after the vbox finished. Otherwise, the insertion +% would be lost. +% Similarily, if a @footnote appears inside an alignment, save the footnote +% text to a box and make the \insert when a row of the table is finished. +% And the same can be done for other insert classes. --kasal, 16nov03. + +% Replace the \insert primitive by a cheating macro. +% Deeper inside, just make sure that the saved insertions are not spilled +% out prematurely. +% +\def\startsavinginserts{% + \ifx \insert\ptexinsert + \let\insert\saveinsert + \else + \let\checkinserts\relax + \fi +} + +% This \insert replacement works for both \insert\footins{foo} and +% \insert\footins\bgroup foo\egroup, but it doesn't work for \insert27{foo}. +% +\def\saveinsert#1{% + \edef\next{\noexpand\savetobox \makeSAVEname#1}% + \afterassignment\next + % swallow the left brace + \let\temp = +} +\def\makeSAVEname#1{\makecsname{SAVE\expandafter\gobble\string#1}} +\def\savetobox#1{\global\setbox#1 = \vbox\bgroup \unvbox#1} + +\def\checksaveins#1{\ifvoid#1\else \placesaveins#1\fi} + +\def\placesaveins#1{% + \ptexinsert \csname\expandafter\gobblesave\string#1\endcsname + {\box#1}% +} + +% eat @SAVE -- beware, all of them have catcode \other: +{ + \def\dospecials{\do S\do A\do V\do E} \uncatcodespecials % ;-) + \gdef\gobblesave @SAVE{} +} + +% initialization: +\def\newsaveins #1{% + \edef\next{\noexpand\newsaveinsX \makeSAVEname#1}% + \next +} +\def\newsaveinsX #1{% + \csname newbox\endcsname #1% + \expandafter\def\expandafter\checkinserts\expandafter{\checkinserts + \checksaveins #1}% +} + +% initialize: +\let\checkinserts\empty +\newsaveins\footins +\newsaveins\margin + + +% @image. We use the macros from epsf.tex to support this. +% If epsf.tex is not installed and @image is used, we complain. +% +% Check for and read epsf.tex up front. If we read it only at @image +% time, we might be inside a group, and then its definitions would get +% undone and the next image would fail. +\openin 1 = epsf.tex +\ifeof 1 \else + % Do not bother showing banner with epsf.tex v2.7k (available in + % doc/epsf.tex and on ctan). + \def\epsfannounce{\toks0 = }% + \input epsf.tex +\fi +\closein 1 +% +% We will only complain once about lack of epsf.tex. +\newif\ifwarnednoepsf +\newhelp\noepsfhelp{epsf.tex must be installed for images to + work. It is also included in the Texinfo distribution, or you can get + it from ftp://tug.org/tex/epsf.tex.} +% +\def\image#1{% + \ifx\epsfbox\undefined + \ifwarnednoepsf \else + \errhelp = \noepsfhelp + \errmessage{epsf.tex not found, images will be ignored}% + \global\warnednoepsftrue + \fi + \else + \imagexxx #1,,,,,\finish + \fi +} +% +% Arguments to @image: +% #1 is (mandatory) image filename; we tack on .eps extension. +% #2 is (optional) width, #3 is (optional) height. +% #4 is (ignored optional) html alt text. +% #5 is (ignored optional) extension. +% #6 is just the usual extra ignored arg for parsing this stuff. +\newif\ifimagevmode +\def\imagexxx#1,#2,#3,#4,#5,#6\finish{\begingroup + \catcode`\^^M = 5 % in case we're inside an example + \normalturnoffactive % allow _ et al. in names + % If the image is by itself, center it. + \ifvmode + \imagevmodetrue + \nobreak\bigskip + % Usually we'll have text after the image which will insert + % \parskip glue, so insert it here too to equalize the space + % above and below. + \nobreak\vskip\parskip + \nobreak + \line\bgroup + \fi + % + % Output the image. + \ifpdf + \dopdfimage{#1}{#2}{#3}% + \else + % \epsfbox itself resets \epsf?size at each figure. + \setbox0 = \hbox{\ignorespaces #2}\ifdim\wd0 > 0pt \epsfxsize=#2\relax \fi + \setbox0 = \hbox{\ignorespaces #3}\ifdim\wd0 > 0pt \epsfysize=#3\relax \fi + \epsfbox{#1.eps}% + \fi + % + \ifimagevmode \egroup \bigbreak \fi % space after the image +\endgroup} + + +% @float FLOATTYPE,LABEL,LOC ... @end float for displayed figures, tables, +% etc. We don't actually implement floating yet, we always include the +% float "here". But it seemed the best name for the future. +% +\envparseargdef\float{\eatcommaspace\eatcommaspace\dofloat#1, , ,\finish} + +% There may be a space before second and/or third parameter; delete it. +\def\eatcommaspace#1, {#1,} + +% #1 is the optional FLOATTYPE, the text label for this float, typically +% "Figure", "Table", "Example", etc. Can't contain commas. If omitted, +% this float will not be numbered and cannot be referred to. +% +% #2 is the optional xref label. Also must be present for the float to +% be referable. +% +% #3 is the optional positioning argument; for now, it is ignored. It +% will somehow specify the positions allowed to float to (here, top, bottom). +% +% We keep a separate counter for each FLOATTYPE, which we reset at each +% chapter-level command. +\let\resetallfloatnos=\empty +% +\def\dofloat#1,#2,#3,#4\finish{% + \let\thiscaption=\empty + \let\thisshortcaption=\empty + % + % don't lose footnotes inside @float. + % + % BEWARE: when the floats start float, we have to issue warning whenever an + % insert appears inside a float which could possibly float. --kasal, 26may04 + % + \startsavinginserts + % + % We can't be used inside a paragraph. + \par + % + \vtop\bgroup + \def\floattype{#1}% + \def\floatlabel{#2}% + \def\floatloc{#3}% we do nothing with this yet. + % + \ifx\floattype\empty + \let\safefloattype=\empty + \else + {% + % the floattype might have accents or other special characters, + % but we need to use it in a control sequence name. + \indexnofonts + \turnoffactive + \xdef\safefloattype{\floattype}% + }% + \fi + % + % If label is given but no type, we handle that as the empty type. + \ifx\floatlabel\empty \else + % We want each FLOATTYPE to be numbered separately (Figure 1, + % Table 1, Figure 2, ...). (And if no label, no number.) + % + \expandafter\getfloatno\csname\safefloattype floatno\endcsname + \global\advance\floatno by 1 + % + {% + % This magic value for \lastsection is output by \setref as the + % XREFLABEL-title value. \xrefX uses it to distinguish float + % labels (which have a completely different output format) from + % node and anchor labels. And \xrdef uses it to construct the + % lists of floats. + % + \edef\lastsection{\floatmagic=\safefloattype}% + \setref{\floatlabel}{Yfloat}% + }% + \fi + % + % start with \parskip glue, I guess. + \vskip\parskip + % + % Don't suppress indentation if a float happens to start a section. + \restorefirstparagraphindent +} + +% we have these possibilities: +% @float Foo,lbl & @caption{Cap}: Foo 1.1: Cap +% @float Foo,lbl & no caption: Foo 1.1 +% @float Foo & @caption{Cap}: Foo: Cap +% @float Foo & no caption: Foo +% @float ,lbl & Caption{Cap}: 1.1: Cap +% @float ,lbl & no caption: 1.1 +% @float & @caption{Cap}: Cap +% @float & no caption: +% +\def\Efloat{% + \let\floatident = \empty + % + % In all cases, if we have a float type, it comes first. + \ifx\floattype\empty \else \def\floatident{\floattype}\fi + % + % If we have an xref label, the number comes next. + \ifx\floatlabel\empty \else + \ifx\floattype\empty \else % if also had float type, need tie first. + \appendtomacro\floatident{\tie}% + \fi + % the number. + \appendtomacro\floatident{\chaplevelprefix\the\floatno}% + \fi + % + % Start the printed caption with what we've constructed in + % \floatident, but keep it separate; we need \floatident again. + \let\captionline = \floatident + % + \ifx\thiscaption\empty \else + \ifx\floatident\empty \else + \appendtomacro\captionline{: }% had ident, so need a colon between + \fi + % + % caption text. + \appendtomacro\captionline{\scanexp\thiscaption}% + \fi + % + % If we have anything to print, print it, with space before. + % Eventually this needs to become an \insert. + \ifx\captionline\empty \else + \vskip.5\parskip + \captionline + % + % Space below caption. + \vskip\parskip + \fi + % + % If have an xref label, write the list of floats info. Do this + % after the caption, to avoid chance of it being a breakpoint. + \ifx\floatlabel\empty \else + % Write the text that goes in the lof to the aux file as + % \floatlabel-lof. Besides \floatident, we include the short + % caption if specified, else the full caption if specified, else nothing. + {% + \atdummies + % + % since we read the caption text in the macro world, where ^^M + % is turned into a normal character, we have to scan it back, so + % we don't write the literal three characters "^^M" into the aux file. + \scanexp{% + \xdef\noexpand\gtemp{% + \ifx\thisshortcaption\empty + \thiscaption + \else + \thisshortcaption + \fi + }% + }% + \immediate\write\auxfile{@xrdef{\floatlabel-lof}{\floatident + \ifx\gtemp\empty \else : \gtemp \fi}}% + }% + \fi + \egroup % end of \vtop + % + % place the captured inserts + % + % BEWARE: when the floats start floating, we have to issue warning + % whenever an insert appears inside a float which could possibly + % float. --kasal, 26may04 + % + \checkinserts +} + +% Append the tokens #2 to the definition of macro #1, not expanding either. +% +\def\appendtomacro#1#2{% + \expandafter\def\expandafter#1\expandafter{#1#2}% +} + +% @caption, @shortcaption +% +\def\caption{\docaption\thiscaption} +\def\shortcaption{\docaption\thisshortcaption} +\def\docaption{\checkenv\float \bgroup\scanargctxt\defcaption} +\def\defcaption#1#2{\egroup \def#1{#2}} + +% The parameter is the control sequence identifying the counter we are +% going to use. Create it if it doesn't exist and assign it to \floatno. +\def\getfloatno#1{% + \ifx#1\relax + % Haven't seen this figure type before. + \csname newcount\endcsname #1% + % + % Remember to reset this floatno at the next chap. + \expandafter\gdef\expandafter\resetallfloatnos + \expandafter{\resetallfloatnos #1=0 }% + \fi + \let\floatno#1% +} + +% \setref calls this to get the XREFLABEL-snt value. We want an @xref +% to the FLOATLABEL to expand to "Figure 3.1". We call \setref when we +% first read the @float command. +% +\def\Yfloat{\floattype@tie \chaplevelprefix\the\floatno}% + +% Magic string used for the XREFLABEL-title value, so \xrefX can +% distinguish floats from other xref types. +\def\floatmagic{!!float!!} + +% #1 is the control sequence we are passed; we expand into a conditional +% which is true if #1 represents a float ref. That is, the magic +% \lastsection value which we \setref above. +% +\def\iffloat#1{\expandafter\doiffloat#1==\finish} +% +% #1 is (maybe) the \floatmagic string. If so, #2 will be the +% (safe) float type for this float. We set \iffloattype to #2. +% +\def\doiffloat#1=#2=#3\finish{% + \def\temp{#1}% + \def\iffloattype{#2}% + \ifx\temp\floatmagic +} + +% @listoffloats FLOATTYPE - print a list of floats like a table of contents. +% +\parseargdef\listoffloats{% + \def\floattype{#1}% floattype + {% + % the floattype might have accents or other special characters, + % but we need to use it in a control sequence name. + \indexnofonts + \turnoffactive + \xdef\safefloattype{\floattype}% + }% + % + % \xrdef saves the floats as a \do-list in \floatlistSAFEFLOATTYPE. + \expandafter\ifx\csname floatlist\safefloattype\endcsname \relax + \ifhavexrefs + % if the user said @listoffloats foo but never @float foo. + \message{\linenumber No `\safefloattype' floats to list.}% + \fi + \else + \begingroup + \leftskip=\tocindent % indent these entries like a toc + \let\do=\listoffloatsdo + \csname floatlist\safefloattype\endcsname + \endgroup + \fi +} + +% This is called on each entry in a list of floats. We're passed the +% xref label, in the form LABEL-title, which is how we save it in the +% aux file. We strip off the -title and look up \XRLABEL-lof, which +% has the text we're supposed to typeset here. +% +% Figures without xref labels will not be included in the list (since +% they won't appear in the aux file). +% +\def\listoffloatsdo#1{\listoffloatsdoentry#1\finish} +\def\listoffloatsdoentry#1-title\finish{{% + % Can't fully expand XR#1-lof because it can contain anything. Just + % pass the control sequence. On the other hand, XR#1-pg is just the + % page number, and we want to fully expand that so we can get a link + % in pdf output. + \toksA = \expandafter{\csname XR#1-lof\endcsname}% + % + % use the same \entry macro we use to generate the TOC and index. + \edef\writeentry{\noexpand\entry{\the\toksA}{\csname XR#1-pg\endcsname}}% + \writeentry +}} + + +\message{localization,} + +% @documentlanguage is usually given very early, just after +% @setfilename. If done too late, it may not override everything +% properly. Single argument is the language (de) or locale (de_DE) +% abbreviation. It would be nice if we could set up a hyphenation file. +% +{ + \catcode`\_ = \active + \globaldefs=1 +\parseargdef\documentlanguage{\begingroup + \let_=\normalunderscore % normal _ character for filenames + \tex % read txi-??.tex file in plain TeX. + % Read the file by the name they passed if it exists. + \openin 1 txi-#1.tex + \ifeof 1 + \documentlanguagetrywithoutunderscore{#1_\finish}% + \else + \input txi-#1.tex + \fi + \closein 1 + \endgroup +\endgroup} +} +% +% If they passed de_DE, and txi-de_DE.tex doesn't exist, +% try txi-de.tex. +% +\def\documentlanguagetrywithoutunderscore#1_#2\finish{% + \openin 1 txi-#1.tex + \ifeof 1 + \errhelp = \nolanghelp + \errmessage{Cannot read language file txi-#1.tex}% + \else + \input txi-#1.tex + \fi + \closein 1 +} +% +\newhelp\nolanghelp{The given language definition file cannot be found or +is empty. Maybe you need to install it? In the current directory +should work if nowhere else does.} + +% Set the catcode of characters 128 through 255 to the specified number. +% +\def\setnonasciicharscatcode#1{% + \count255=128 + \loop\ifnum\count255<256 + \global\catcode\count255=#1\relax + \advance\count255 by 1 + \repeat +} + +\def\setnonasciicharscatcodenonglobal#1{% + \count255=128 + \loop\ifnum\count255<256 + \catcode\count255=#1\relax + \advance\count255 by 1 + \repeat +} + +% @documentencoding sets the definition of non-ASCII characters +% according to the specified encoding. +% +\parseargdef\documentencoding{% + % Encoding being declared for the document. + \def\declaredencoding{\csname #1.enc\endcsname}% + % + % Supported encodings: names converted to tokens in order to be able + % to compare them with \ifx. + \def\ascii{\csname US-ASCII.enc\endcsname}% + \def\latnine{\csname ISO-8859-15.enc\endcsname}% + \def\latone{\csname ISO-8859-1.enc\endcsname}% + \def\lattwo{\csname ISO-8859-2.enc\endcsname}% + \def\utfeight{\csname UTF-8.enc\endcsname}% + % + \ifx \declaredencoding \ascii + \asciichardefs + % + \else \ifx \declaredencoding \lattwo + \setnonasciicharscatcode\active + \lattwochardefs + % + \else \ifx \declaredencoding \latone + \setnonasciicharscatcode\active + \latonechardefs + % + \else \ifx \declaredencoding \latnine + \setnonasciicharscatcode\active + \latninechardefs + % + \else \ifx \declaredencoding \utfeight + \setnonasciicharscatcode\active + \utfeightchardefs + % + \else + \message{Unknown document encoding #1, ignoring.}% + % + \fi % utfeight + \fi % latnine + \fi % latone + \fi % lattwo + \fi % ascii +} + +% A message to be logged when using a character that isn't available +% the default font encoding (OT1). +% +\def\missingcharmsg#1{\message{Character missing in OT1 encoding: #1.}} + +% Take account of \c (plain) vs. \, (Texinfo) difference. +\def\cedilla#1{\ifx\c\ptexc\c{#1}\else\,{#1}\fi} + +% First, make active non-ASCII characters in order for them to be +% correctly categorized when TeX reads the replacement text of +% macros containing the character definitions. +\setnonasciicharscatcode\active +% +% Latin1 (ISO-8859-1) character definitions. +\def\latonechardefs{% + \gdef^^a0{~} + \gdef^^a1{\exclamdown} + \gdef^^a2{\missingcharmsg{CENT SIGN}} + \gdef^^a3{{\pounds}} + \gdef^^a4{\missingcharmsg{CURRENCY SIGN}} + \gdef^^a5{\missingcharmsg{YEN SIGN}} + \gdef^^a6{\missingcharmsg{BROKEN BAR}} + \gdef^^a7{\S} + \gdef^^a8{\"{}} + \gdef^^a9{\copyright} + \gdef^^aa{\ordf} + \gdef^^ab{\missingcharmsg{LEFT-POINTING DOUBLE ANGLE QUOTATION MARK}} + \gdef^^ac{$\lnot$} + \gdef^^ad{\-} + \gdef^^ae{\registeredsymbol} + \gdef^^af{\={}} + % + \gdef^^b0{\textdegree} + \gdef^^b1{$\pm$} + \gdef^^b2{$^2$} + \gdef^^b3{$^3$} + \gdef^^b4{\'{}} + \gdef^^b5{$\mu$} + \gdef^^b6{\P} + % + \gdef^^b7{$^.$} + \gdef^^b8{\cedilla\ } + \gdef^^b9{$^1$} + \gdef^^ba{\ordm} + % + \gdef^^bb{\missingcharmsg{RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK}} + \gdef^^bc{$1\over4$} + \gdef^^bd{$1\over2$} + \gdef^^be{$3\over4$} + \gdef^^bf{\questiondown} + % + \gdef^^c0{\`A} + \gdef^^c1{\'A} + \gdef^^c2{\^A} + \gdef^^c3{\~A} + \gdef^^c4{\"A} + \gdef^^c5{\ringaccent A} + \gdef^^c6{\AE} + \gdef^^c7{\cedilla C} + \gdef^^c8{\`E} + \gdef^^c9{\'E} + \gdef^^ca{\^E} + \gdef^^cb{\"E} + \gdef^^cc{\`I} + \gdef^^cd{\'I} + \gdef^^ce{\^I} + \gdef^^cf{\"I} + % + \gdef^^d0{\missingcharmsg{LATIN CAPITAL LETTER ETH}} + \gdef^^d1{\~N} + \gdef^^d2{\`O} + \gdef^^d3{\'O} + \gdef^^d4{\^O} + \gdef^^d5{\~O} + \gdef^^d6{\"O} + \gdef^^d7{$\times$} + \gdef^^d8{\O} + \gdef^^d9{\`U} + \gdef^^da{\'U} + \gdef^^db{\^U} + \gdef^^dc{\"U} + \gdef^^dd{\'Y} + \gdef^^de{\missingcharmsg{LATIN CAPITAL LETTER THORN}} + \gdef^^df{\ss} + % + \gdef^^e0{\`a} + \gdef^^e1{\'a} + \gdef^^e2{\^a} + \gdef^^e3{\~a} + \gdef^^e4{\"a} + \gdef^^e5{\ringaccent a} + \gdef^^e6{\ae} + \gdef^^e7{\cedilla c} + \gdef^^e8{\`e} + \gdef^^e9{\'e} + \gdef^^ea{\^e} + \gdef^^eb{\"e} + \gdef^^ec{\`{\dotless i}} + \gdef^^ed{\'{\dotless i}} + \gdef^^ee{\^{\dotless i}} + \gdef^^ef{\"{\dotless i}} + % + \gdef^^f0{\missingcharmsg{LATIN SMALL LETTER ETH}} + \gdef^^f1{\~n} + \gdef^^f2{\`o} + \gdef^^f3{\'o} + \gdef^^f4{\^o} + \gdef^^f5{\~o} + \gdef^^f6{\"o} + \gdef^^f7{$\div$} + \gdef^^f8{\o} + \gdef^^f9{\`u} + \gdef^^fa{\'u} + \gdef^^fb{\^u} + \gdef^^fc{\"u} + \gdef^^fd{\'y} + \gdef^^fe{\missingcharmsg{LATIN SMALL LETTER THORN}} + \gdef^^ff{\"y} +} + +% Latin9 (ISO-8859-15) encoding character definitions. +\def\latninechardefs{% + % Encoding is almost identical to Latin1. + \latonechardefs + % + \gdef^^a4{\euro} + \gdef^^a6{\v S} + \gdef^^a8{\v s} + \gdef^^b4{\v Z} + \gdef^^b8{\v z} + \gdef^^bc{\OE} + \gdef^^bd{\oe} + \gdef^^be{\"Y} +} + +% Latin2 (ISO-8859-2) character definitions. +\def\lattwochardefs{% + \gdef^^a0{~} + \gdef^^a1{\missingcharmsg{LATIN CAPITAL LETTER A WITH OGONEK}} + \gdef^^a2{\u{}} + \gdef^^a3{\L} + \gdef^^a4{\missingcharmsg{CURRENCY SIGN}} + \gdef^^a5{\v L} + \gdef^^a6{\'S} + \gdef^^a7{\S} + \gdef^^a8{\"{}} + \gdef^^a9{\v S} + \gdef^^aa{\cedilla S} + \gdef^^ab{\v T} + \gdef^^ac{\'Z} + \gdef^^ad{\-} + \gdef^^ae{\v Z} + \gdef^^af{\dotaccent Z} + % + \gdef^^b0{\textdegree} + \gdef^^b1{\missingcharmsg{LATIN SMALL LETTER A WITH OGONEK}} + \gdef^^b2{\missingcharmsg{OGONEK}} + \gdef^^b3{\l} + \gdef^^b4{\'{}} + \gdef^^b5{\v l} + \gdef^^b6{\'s} + \gdef^^b7{\v{}} + \gdef^^b8{\cedilla\ } + \gdef^^b9{\v s} + \gdef^^ba{\cedilla s} + \gdef^^bb{\v t} + \gdef^^bc{\'z} + \gdef^^bd{\H{}} + \gdef^^be{\v z} + \gdef^^bf{\dotaccent z} + % + \gdef^^c0{\'R} + \gdef^^c1{\'A} + \gdef^^c2{\^A} + \gdef^^c3{\u A} + \gdef^^c4{\"A} + \gdef^^c5{\'L} + \gdef^^c6{\'C} + \gdef^^c7{\cedilla C} + \gdef^^c8{\v C} + \gdef^^c9{\'E} + \gdef^^ca{\missingcharmsg{LATIN CAPITAL LETTER E WITH OGONEK}} + \gdef^^cb{\"E} + \gdef^^cc{\v E} + \gdef^^cd{\'I} + \gdef^^ce{\^I} + \gdef^^cf{\v D} + % + \gdef^^d0{\missingcharmsg{LATIN CAPITAL LETTER D WITH STROKE}} + \gdef^^d1{\'N} + \gdef^^d2{\v N} + \gdef^^d3{\'O} + \gdef^^d4{\^O} + \gdef^^d5{\H O} + \gdef^^d6{\"O} + \gdef^^d7{$\times$} + \gdef^^d8{\v R} + \gdef^^d9{\ringaccent U} + \gdef^^da{\'U} + \gdef^^db{\H U} + \gdef^^dc{\"U} + \gdef^^dd{\'Y} + \gdef^^de{\cedilla T} + \gdef^^df{\ss} + % + \gdef^^e0{\'r} + \gdef^^e1{\'a} + \gdef^^e2{\^a} + \gdef^^e3{\u a} + \gdef^^e4{\"a} + \gdef^^e5{\'l} + \gdef^^e6{\'c} + \gdef^^e7{\cedilla c} + \gdef^^e8{\v c} + \gdef^^e9{\'e} + \gdef^^ea{\missingcharmsg{LATIN SMALL LETTER E WITH OGONEK}} + \gdef^^eb{\"e} + \gdef^^ec{\v e} + \gdef^^ed{\'\i} + \gdef^^ee{\^\i} + \gdef^^ef{\v d} + % + \gdef^^f0{\missingcharmsg{LATIN SMALL LETTER D WITH STROKE}} + \gdef^^f1{\'n} + \gdef^^f2{\v n} + \gdef^^f3{\'o} + \gdef^^f4{\^o} + \gdef^^f5{\H o} + \gdef^^f6{\"o} + \gdef^^f7{$\div$} + \gdef^^f8{\v r} + \gdef^^f9{\ringaccent u} + \gdef^^fa{\'u} + \gdef^^fb{\H u} + \gdef^^fc{\"u} + \gdef^^fd{\'y} + \gdef^^fe{\cedilla t} + \gdef^^ff{\dotaccent{}} +} + +% UTF-8 character definitions. +% +% This code to support UTF-8 is based on LaTeX's utf8.def, with some +% changes for Texinfo conventions. It is included here under the GPL by +% permission from Frank Mittelbach and the LaTeX team. +% +\newcount\countUTFx +\newcount\countUTFy +\newcount\countUTFz + +\gdef\UTFviiiTwoOctets#1#2{\expandafter + \UTFviiiDefined\csname u8:#1\string #2\endcsname} +% +\gdef\UTFviiiThreeOctets#1#2#3{\expandafter + \UTFviiiDefined\csname u8:#1\string #2\string #3\endcsname} +% +\gdef\UTFviiiFourOctets#1#2#3#4{\expandafter + \UTFviiiDefined\csname u8:#1\string #2\string #3\string #4\endcsname} + +\gdef\UTFviiiDefined#1{% + \ifx #1\relax + \message{\linenumber Unicode char \string #1 not defined for Texinfo}% + \else + \expandafter #1% + \fi +} + +\begingroup + \catcode`\~13 + \catcode`\"12 + + \def\UTFviiiLoop{% + \global\catcode\countUTFx\active + \uccode`\~\countUTFx + \uppercase\expandafter{\UTFviiiTmp}% + \advance\countUTFx by 1 + \ifnum\countUTFx < \countUTFy + \expandafter\UTFviiiLoop + \fi} + + \countUTFx = "C2 + \countUTFy = "E0 + \def\UTFviiiTmp{% + \xdef~{\noexpand\UTFviiiTwoOctets\string~}} + \UTFviiiLoop + + \countUTFx = "E0 + \countUTFy = "F0 + \def\UTFviiiTmp{% + \xdef~{\noexpand\UTFviiiThreeOctets\string~}} + \UTFviiiLoop + + \countUTFx = "F0 + \countUTFy = "F4 + \def\UTFviiiTmp{% + \xdef~{\noexpand\UTFviiiFourOctets\string~}} + \UTFviiiLoop +\endgroup + +\begingroup + \catcode`\"=12 + \catcode`\<=12 + \catcode`\.=12 + \catcode`\,=12 + \catcode`\;=12 + \catcode`\!=12 + \catcode`\~=13 + + \gdef\DeclareUnicodeCharacter#1#2{% + \countUTFz = "#1\relax + \wlog{\space\space defining Unicode char U+#1 (decimal \the\countUTFz)}% + \begingroup + \parseXMLCharref + \def\UTFviiiTwoOctets##1##2{% + \csname u8:##1\string ##2\endcsname}% + \def\UTFviiiThreeOctets##1##2##3{% + \csname u8:##1\string ##2\string ##3\endcsname}% + \def\UTFviiiFourOctets##1##2##3##4{% + \csname u8:##1\string ##2\string ##3\string ##4\endcsname}% + \expandafter\expandafter\expandafter\expandafter + \expandafter\expandafter\expandafter + \gdef\UTFviiiTmp{#2}% + \endgroup} + + \gdef\parseXMLCharref{% + \ifnum\countUTFz < "A0\relax + \errhelp = \EMsimple + \errmessage{Cannot define Unicode char value < 00A0}% + \else\ifnum\countUTFz < "800\relax + \parseUTFviiiA,% + \parseUTFviiiB C\UTFviiiTwoOctets.,% + \else\ifnum\countUTFz < "10000\relax + \parseUTFviiiA;% + \parseUTFviiiA,% + \parseUTFviiiB E\UTFviiiThreeOctets.{,;}% + \else + \parseUTFviiiA;% + \parseUTFviiiA,% + \parseUTFviiiA!% + \parseUTFviiiB F\UTFviiiFourOctets.{!,;}% + \fi\fi\fi + } + + \gdef\parseUTFviiiA#1{% + \countUTFx = \countUTFz + \divide\countUTFz by 64 + \countUTFy = \countUTFz + \multiply\countUTFz by 64 + \advance\countUTFx by -\countUTFz + \advance\countUTFx by 128 + \uccode `#1\countUTFx + \countUTFz = \countUTFy} + + \gdef\parseUTFviiiB#1#2#3#4{% + \advance\countUTFz by "#10\relax + \uccode `#3\countUTFz + \uppercase{\gdef\UTFviiiTmp{#2#3#4}}} +\endgroup + +\def\utfeightchardefs{% + \DeclareUnicodeCharacter{00A0}{\tie} + \DeclareUnicodeCharacter{00A1}{\exclamdown} + \DeclareUnicodeCharacter{00A3}{\pounds} + \DeclareUnicodeCharacter{00A8}{\"{ }} + \DeclareUnicodeCharacter{00A9}{\copyright} + \DeclareUnicodeCharacter{00AA}{\ordf} + \DeclareUnicodeCharacter{00AB}{\guillemetleft} + \DeclareUnicodeCharacter{00AD}{\-} + \DeclareUnicodeCharacter{00AE}{\registeredsymbol} + \DeclareUnicodeCharacter{00AF}{\={ }} + + \DeclareUnicodeCharacter{00B0}{\ringaccent{ }} + \DeclareUnicodeCharacter{00B4}{\'{ }} + \DeclareUnicodeCharacter{00B8}{\cedilla{ }} + \DeclareUnicodeCharacter{00BA}{\ordm} + \DeclareUnicodeCharacter{00BB}{\guillemetright} + \DeclareUnicodeCharacter{00BF}{\questiondown} + + \DeclareUnicodeCharacter{00C0}{\`A} + \DeclareUnicodeCharacter{00C1}{\'A} + \DeclareUnicodeCharacter{00C2}{\^A} + \DeclareUnicodeCharacter{00C3}{\~A} + \DeclareUnicodeCharacter{00C4}{\"A} + \DeclareUnicodeCharacter{00C5}{\AA} + \DeclareUnicodeCharacter{00C6}{\AE} + \DeclareUnicodeCharacter{00C7}{\cedilla{C}} + \DeclareUnicodeCharacter{00C8}{\`E} + \DeclareUnicodeCharacter{00C9}{\'E} + \DeclareUnicodeCharacter{00CA}{\^E} + \DeclareUnicodeCharacter{00CB}{\"E} + \DeclareUnicodeCharacter{00CC}{\`I} + \DeclareUnicodeCharacter{00CD}{\'I} + \DeclareUnicodeCharacter{00CE}{\^I} + \DeclareUnicodeCharacter{00CF}{\"I} + + \DeclareUnicodeCharacter{00D1}{\~N} + \DeclareUnicodeCharacter{00D2}{\`O} + \DeclareUnicodeCharacter{00D3}{\'O} + \DeclareUnicodeCharacter{00D4}{\^O} + \DeclareUnicodeCharacter{00D5}{\~O} + \DeclareUnicodeCharacter{00D6}{\"O} + \DeclareUnicodeCharacter{00D8}{\O} + \DeclareUnicodeCharacter{00D9}{\`U} + \DeclareUnicodeCharacter{00DA}{\'U} + \DeclareUnicodeCharacter{00DB}{\^U} + \DeclareUnicodeCharacter{00DC}{\"U} + \DeclareUnicodeCharacter{00DD}{\'Y} + \DeclareUnicodeCharacter{00DF}{\ss} + + \DeclareUnicodeCharacter{00E0}{\`a} + \DeclareUnicodeCharacter{00E1}{\'a} + \DeclareUnicodeCharacter{00E2}{\^a} + \DeclareUnicodeCharacter{00E3}{\~a} + \DeclareUnicodeCharacter{00E4}{\"a} + \DeclareUnicodeCharacter{00E5}{\aa} + \DeclareUnicodeCharacter{00E6}{\ae} + \DeclareUnicodeCharacter{00E7}{\cedilla{c}} + \DeclareUnicodeCharacter{00E8}{\`e} + \DeclareUnicodeCharacter{00E9}{\'e} + \DeclareUnicodeCharacter{00EA}{\^e} + \DeclareUnicodeCharacter{00EB}{\"e} + \DeclareUnicodeCharacter{00EC}{\`{\dotless{i}}} + \DeclareUnicodeCharacter{00ED}{\'{\dotless{i}}} + \DeclareUnicodeCharacter{00EE}{\^{\dotless{i}}} + \DeclareUnicodeCharacter{00EF}{\"{\dotless{i}}} + + \DeclareUnicodeCharacter{00F1}{\~n} + \DeclareUnicodeCharacter{00F2}{\`o} + \DeclareUnicodeCharacter{00F3}{\'o} + \DeclareUnicodeCharacter{00F4}{\^o} + \DeclareUnicodeCharacter{00F5}{\~o} + \DeclareUnicodeCharacter{00F6}{\"o} + \DeclareUnicodeCharacter{00F8}{\o} + \DeclareUnicodeCharacter{00F9}{\`u} + \DeclareUnicodeCharacter{00FA}{\'u} + \DeclareUnicodeCharacter{00FB}{\^u} + \DeclareUnicodeCharacter{00FC}{\"u} + \DeclareUnicodeCharacter{00FD}{\'y} + \DeclareUnicodeCharacter{00FF}{\"y} + + \DeclareUnicodeCharacter{0100}{\=A} + \DeclareUnicodeCharacter{0101}{\=a} + \DeclareUnicodeCharacter{0102}{\u{A}} + \DeclareUnicodeCharacter{0103}{\u{a}} + \DeclareUnicodeCharacter{0106}{\'C} + \DeclareUnicodeCharacter{0107}{\'c} + \DeclareUnicodeCharacter{0108}{\^C} + \DeclareUnicodeCharacter{0109}{\^c} + \DeclareUnicodeCharacter{010A}{\dotaccent{C}} + \DeclareUnicodeCharacter{010B}{\dotaccent{c}} + \DeclareUnicodeCharacter{010C}{\v{C}} + \DeclareUnicodeCharacter{010D}{\v{c}} + \DeclareUnicodeCharacter{010E}{\v{D}} + + \DeclareUnicodeCharacter{0112}{\=E} + \DeclareUnicodeCharacter{0113}{\=e} + \DeclareUnicodeCharacter{0114}{\u{E}} + \DeclareUnicodeCharacter{0115}{\u{e}} + \DeclareUnicodeCharacter{0116}{\dotaccent{E}} + \DeclareUnicodeCharacter{0117}{\dotaccent{e}} + \DeclareUnicodeCharacter{011A}{\v{E}} + \DeclareUnicodeCharacter{011B}{\v{e}} + \DeclareUnicodeCharacter{011C}{\^G} + \DeclareUnicodeCharacter{011D}{\^g} + \DeclareUnicodeCharacter{011E}{\u{G}} + \DeclareUnicodeCharacter{011F}{\u{g}} + + \DeclareUnicodeCharacter{0120}{\dotaccent{G}} + \DeclareUnicodeCharacter{0121}{\dotaccent{g}} + \DeclareUnicodeCharacter{0124}{\^H} + \DeclareUnicodeCharacter{0125}{\^h} + \DeclareUnicodeCharacter{0128}{\~I} + \DeclareUnicodeCharacter{0129}{\~{\dotless{i}}} + \DeclareUnicodeCharacter{012A}{\=I} + \DeclareUnicodeCharacter{012B}{\={\dotless{i}}} + \DeclareUnicodeCharacter{012C}{\u{I}} + \DeclareUnicodeCharacter{012D}{\u{\dotless{i}}} + + \DeclareUnicodeCharacter{0130}{\dotaccent{I}} + \DeclareUnicodeCharacter{0131}{\dotless{i}} + \DeclareUnicodeCharacter{0132}{IJ} + \DeclareUnicodeCharacter{0133}{ij} + \DeclareUnicodeCharacter{0134}{\^J} + \DeclareUnicodeCharacter{0135}{\^{\dotless{j}}} + \DeclareUnicodeCharacter{0139}{\'L} + \DeclareUnicodeCharacter{013A}{\'l} + + \DeclareUnicodeCharacter{0141}{\L} + \DeclareUnicodeCharacter{0142}{\l} + \DeclareUnicodeCharacter{0143}{\'N} + \DeclareUnicodeCharacter{0144}{\'n} + \DeclareUnicodeCharacter{0147}{\v{N}} + \DeclareUnicodeCharacter{0148}{\v{n}} + \DeclareUnicodeCharacter{014C}{\=O} + \DeclareUnicodeCharacter{014D}{\=o} + \DeclareUnicodeCharacter{014E}{\u{O}} + \DeclareUnicodeCharacter{014F}{\u{o}} + + \DeclareUnicodeCharacter{0150}{\H{O}} + \DeclareUnicodeCharacter{0151}{\H{o}} + \DeclareUnicodeCharacter{0152}{\OE} + \DeclareUnicodeCharacter{0153}{\oe} + \DeclareUnicodeCharacter{0154}{\'R} + \DeclareUnicodeCharacter{0155}{\'r} + \DeclareUnicodeCharacter{0158}{\v{R}} + \DeclareUnicodeCharacter{0159}{\v{r}} + \DeclareUnicodeCharacter{015A}{\'S} + \DeclareUnicodeCharacter{015B}{\'s} + \DeclareUnicodeCharacter{015C}{\^S} + \DeclareUnicodeCharacter{015D}{\^s} + \DeclareUnicodeCharacter{015E}{\cedilla{S}} + \DeclareUnicodeCharacter{015F}{\cedilla{s}} + + \DeclareUnicodeCharacter{0160}{\v{S}} + \DeclareUnicodeCharacter{0161}{\v{s}} + \DeclareUnicodeCharacter{0162}{\cedilla{t}} + \DeclareUnicodeCharacter{0163}{\cedilla{T}} + \DeclareUnicodeCharacter{0164}{\v{T}} + + \DeclareUnicodeCharacter{0168}{\~U} + \DeclareUnicodeCharacter{0169}{\~u} + \DeclareUnicodeCharacter{016A}{\=U} + \DeclareUnicodeCharacter{016B}{\=u} + \DeclareUnicodeCharacter{016C}{\u{U}} + \DeclareUnicodeCharacter{016D}{\u{u}} + \DeclareUnicodeCharacter{016E}{\ringaccent{U}} + \DeclareUnicodeCharacter{016F}{\ringaccent{u}} + + \DeclareUnicodeCharacter{0170}{\H{U}} + \DeclareUnicodeCharacter{0171}{\H{u}} + \DeclareUnicodeCharacter{0174}{\^W} + \DeclareUnicodeCharacter{0175}{\^w} + \DeclareUnicodeCharacter{0176}{\^Y} + \DeclareUnicodeCharacter{0177}{\^y} + \DeclareUnicodeCharacter{0178}{\"Y} + \DeclareUnicodeCharacter{0179}{\'Z} + \DeclareUnicodeCharacter{017A}{\'z} + \DeclareUnicodeCharacter{017B}{\dotaccent{Z}} + \DeclareUnicodeCharacter{017C}{\dotaccent{z}} + \DeclareUnicodeCharacter{017D}{\v{Z}} + \DeclareUnicodeCharacter{017E}{\v{z}} + + \DeclareUnicodeCharacter{01C4}{D\v{Z}} + \DeclareUnicodeCharacter{01C5}{D\v{z}} + \DeclareUnicodeCharacter{01C6}{d\v{z}} + \DeclareUnicodeCharacter{01C7}{LJ} + \DeclareUnicodeCharacter{01C8}{Lj} + \DeclareUnicodeCharacter{01C9}{lj} + \DeclareUnicodeCharacter{01CA}{NJ} + \DeclareUnicodeCharacter{01CB}{Nj} + \DeclareUnicodeCharacter{01CC}{nj} + \DeclareUnicodeCharacter{01CD}{\v{A}} + \DeclareUnicodeCharacter{01CE}{\v{a}} + \DeclareUnicodeCharacter{01CF}{\v{I}} + + \DeclareUnicodeCharacter{01D0}{\v{\dotless{i}}} + \DeclareUnicodeCharacter{01D1}{\v{O}} + \DeclareUnicodeCharacter{01D2}{\v{o}} + \DeclareUnicodeCharacter{01D3}{\v{U}} + \DeclareUnicodeCharacter{01D4}{\v{u}} + + \DeclareUnicodeCharacter{01E2}{\={\AE}} + \DeclareUnicodeCharacter{01E3}{\={\ae}} + \DeclareUnicodeCharacter{01E6}{\v{G}} + \DeclareUnicodeCharacter{01E7}{\v{g}} + \DeclareUnicodeCharacter{01E8}{\v{K}} + \DeclareUnicodeCharacter{01E9}{\v{k}} + + \DeclareUnicodeCharacter{01F0}{\v{\dotless{j}}} + \DeclareUnicodeCharacter{01F1}{DZ} + \DeclareUnicodeCharacter{01F2}{Dz} + \DeclareUnicodeCharacter{01F3}{dz} + \DeclareUnicodeCharacter{01F4}{\'G} + \DeclareUnicodeCharacter{01F5}{\'g} + \DeclareUnicodeCharacter{01F8}{\`N} + \DeclareUnicodeCharacter{01F9}{\`n} + \DeclareUnicodeCharacter{01FC}{\'{\AE}} + \DeclareUnicodeCharacter{01FD}{\'{\ae}} + \DeclareUnicodeCharacter{01FE}{\'{\O}} + \DeclareUnicodeCharacter{01FF}{\'{\o}} + + \DeclareUnicodeCharacter{021E}{\v{H}} + \DeclareUnicodeCharacter{021F}{\v{h}} + + \DeclareUnicodeCharacter{0226}{\dotaccent{A}} + \DeclareUnicodeCharacter{0227}{\dotaccent{a}} + \DeclareUnicodeCharacter{0228}{\cedilla{E}} + \DeclareUnicodeCharacter{0229}{\cedilla{e}} + \DeclareUnicodeCharacter{022E}{\dotaccent{O}} + \DeclareUnicodeCharacter{022F}{\dotaccent{o}} + + \DeclareUnicodeCharacter{0232}{\=Y} + \DeclareUnicodeCharacter{0233}{\=y} + \DeclareUnicodeCharacter{0237}{\dotless{j}} + + \DeclareUnicodeCharacter{1E02}{\dotaccent{B}} + \DeclareUnicodeCharacter{1E03}{\dotaccent{b}} + \DeclareUnicodeCharacter{1E04}{\udotaccent{B}} + \DeclareUnicodeCharacter{1E05}{\udotaccent{b}} + \DeclareUnicodeCharacter{1E06}{\ubaraccent{B}} + \DeclareUnicodeCharacter{1E07}{\ubaraccent{b}} + \DeclareUnicodeCharacter{1E0A}{\dotaccent{D}} + \DeclareUnicodeCharacter{1E0B}{\dotaccent{d}} + \DeclareUnicodeCharacter{1E0C}{\udotaccent{D}} + \DeclareUnicodeCharacter{1E0D}{\udotaccent{d}} + \DeclareUnicodeCharacter{1E0E}{\ubaraccent{D}} + \DeclareUnicodeCharacter{1E0F}{\ubaraccent{d}} + + \DeclareUnicodeCharacter{1E1E}{\dotaccent{F}} + \DeclareUnicodeCharacter{1E1F}{\dotaccent{f}} + + \DeclareUnicodeCharacter{1E20}{\=G} + \DeclareUnicodeCharacter{1E21}{\=g} + \DeclareUnicodeCharacter{1E22}{\dotaccent{H}} + \DeclareUnicodeCharacter{1E23}{\dotaccent{h}} + \DeclareUnicodeCharacter{1E24}{\udotaccent{H}} + \DeclareUnicodeCharacter{1E25}{\udotaccent{h}} + \DeclareUnicodeCharacter{1E26}{\"H} + \DeclareUnicodeCharacter{1E27}{\"h} + + \DeclareUnicodeCharacter{1E30}{\'K} + \DeclareUnicodeCharacter{1E31}{\'k} + \DeclareUnicodeCharacter{1E32}{\udotaccent{K}} + \DeclareUnicodeCharacter{1E33}{\udotaccent{k}} + \DeclareUnicodeCharacter{1E34}{\ubaraccent{K}} + \DeclareUnicodeCharacter{1E35}{\ubaraccent{k}} + \DeclareUnicodeCharacter{1E36}{\udotaccent{L}} + \DeclareUnicodeCharacter{1E37}{\udotaccent{l}} + \DeclareUnicodeCharacter{1E3A}{\ubaraccent{L}} + \DeclareUnicodeCharacter{1E3B}{\ubaraccent{l}} + \DeclareUnicodeCharacter{1E3E}{\'M} + \DeclareUnicodeCharacter{1E3F}{\'m} + + \DeclareUnicodeCharacter{1E40}{\dotaccent{M}} + \DeclareUnicodeCharacter{1E41}{\dotaccent{m}} + \DeclareUnicodeCharacter{1E42}{\udotaccent{M}} + \DeclareUnicodeCharacter{1E43}{\udotaccent{m}} + \DeclareUnicodeCharacter{1E44}{\dotaccent{N}} + \DeclareUnicodeCharacter{1E45}{\dotaccent{n}} + \DeclareUnicodeCharacter{1E46}{\udotaccent{N}} + \DeclareUnicodeCharacter{1E47}{\udotaccent{n}} + \DeclareUnicodeCharacter{1E48}{\ubaraccent{N}} + \DeclareUnicodeCharacter{1E49}{\ubaraccent{n}} + + \DeclareUnicodeCharacter{1E54}{\'P} + \DeclareUnicodeCharacter{1E55}{\'p} + \DeclareUnicodeCharacter{1E56}{\dotaccent{P}} + \DeclareUnicodeCharacter{1E57}{\dotaccent{p}} + \DeclareUnicodeCharacter{1E58}{\dotaccent{R}} + \DeclareUnicodeCharacter{1E59}{\dotaccent{r}} + \DeclareUnicodeCharacter{1E5A}{\udotaccent{R}} + \DeclareUnicodeCharacter{1E5B}{\udotaccent{r}} + \DeclareUnicodeCharacter{1E5E}{\ubaraccent{R}} + \DeclareUnicodeCharacter{1E5F}{\ubaraccent{r}} + + \DeclareUnicodeCharacter{1E60}{\dotaccent{S}} + \DeclareUnicodeCharacter{1E61}{\dotaccent{s}} + \DeclareUnicodeCharacter{1E62}{\udotaccent{S}} + \DeclareUnicodeCharacter{1E63}{\udotaccent{s}} + \DeclareUnicodeCharacter{1E6A}{\dotaccent{T}} + \DeclareUnicodeCharacter{1E6B}{\dotaccent{t}} + \DeclareUnicodeCharacter{1E6C}{\udotaccent{T}} + \DeclareUnicodeCharacter{1E6D}{\udotaccent{t}} + \DeclareUnicodeCharacter{1E6E}{\ubaraccent{T}} + \DeclareUnicodeCharacter{1E6F}{\ubaraccent{t}} + + \DeclareUnicodeCharacter{1E7C}{\~V} + \DeclareUnicodeCharacter{1E7D}{\~v} + \DeclareUnicodeCharacter{1E7E}{\udotaccent{V}} + \DeclareUnicodeCharacter{1E7F}{\udotaccent{v}} + + \DeclareUnicodeCharacter{1E80}{\`W} + \DeclareUnicodeCharacter{1E81}{\`w} + \DeclareUnicodeCharacter{1E82}{\'W} + \DeclareUnicodeCharacter{1E83}{\'w} + \DeclareUnicodeCharacter{1E84}{\"W} + \DeclareUnicodeCharacter{1E85}{\"w} + \DeclareUnicodeCharacter{1E86}{\dotaccent{W}} + \DeclareUnicodeCharacter{1E87}{\dotaccent{w}} + \DeclareUnicodeCharacter{1E88}{\udotaccent{W}} + \DeclareUnicodeCharacter{1E89}{\udotaccent{w}} + \DeclareUnicodeCharacter{1E8A}{\dotaccent{X}} + \DeclareUnicodeCharacter{1E8B}{\dotaccent{x}} + \DeclareUnicodeCharacter{1E8C}{\"X} + \DeclareUnicodeCharacter{1E8D}{\"x} + \DeclareUnicodeCharacter{1E8E}{\dotaccent{Y}} + \DeclareUnicodeCharacter{1E8F}{\dotaccent{y}} + + \DeclareUnicodeCharacter{1E90}{\^Z} + \DeclareUnicodeCharacter{1E91}{\^z} + \DeclareUnicodeCharacter{1E92}{\udotaccent{Z}} + \DeclareUnicodeCharacter{1E93}{\udotaccent{z}} + \DeclareUnicodeCharacter{1E94}{\ubaraccent{Z}} + \DeclareUnicodeCharacter{1E95}{\ubaraccent{z}} + \DeclareUnicodeCharacter{1E96}{\ubaraccent{h}} + \DeclareUnicodeCharacter{1E97}{\"t} + \DeclareUnicodeCharacter{1E98}{\ringaccent{w}} + \DeclareUnicodeCharacter{1E99}{\ringaccent{y}} + + \DeclareUnicodeCharacter{1EA0}{\udotaccent{A}} + \DeclareUnicodeCharacter{1EA1}{\udotaccent{a}} + + \DeclareUnicodeCharacter{1EB8}{\udotaccent{E}} + \DeclareUnicodeCharacter{1EB9}{\udotaccent{e}} + \DeclareUnicodeCharacter{1EBC}{\~E} + \DeclareUnicodeCharacter{1EBD}{\~e} + + \DeclareUnicodeCharacter{1ECA}{\udotaccent{I}} + \DeclareUnicodeCharacter{1ECB}{\udotaccent{i}} + \DeclareUnicodeCharacter{1ECC}{\udotaccent{O}} + \DeclareUnicodeCharacter{1ECD}{\udotaccent{o}} + + \DeclareUnicodeCharacter{1EE4}{\udotaccent{U}} + \DeclareUnicodeCharacter{1EE5}{\udotaccent{u}} + + \DeclareUnicodeCharacter{1EF2}{\`Y} + \DeclareUnicodeCharacter{1EF3}{\`y} + \DeclareUnicodeCharacter{1EF4}{\udotaccent{Y}} + + \DeclareUnicodeCharacter{1EF8}{\~Y} + \DeclareUnicodeCharacter{1EF9}{\~y} + + \DeclareUnicodeCharacter{2013}{--} + \DeclareUnicodeCharacter{2014}{---} + \DeclareUnicodeCharacter{2018}{\quoteleft} + \DeclareUnicodeCharacter{2019}{\quoteright} + \DeclareUnicodeCharacter{201A}{\quotesinglbase} + \DeclareUnicodeCharacter{201C}{\quotedblleft} + \DeclareUnicodeCharacter{201D}{\quotedblright} + \DeclareUnicodeCharacter{201E}{\quotedblbase} + \DeclareUnicodeCharacter{2022}{\bullet} + \DeclareUnicodeCharacter{2026}{\dots} + \DeclareUnicodeCharacter{2039}{\guilsinglleft} + \DeclareUnicodeCharacter{203A}{\guilsinglright} + \DeclareUnicodeCharacter{20AC}{\euro} + + \DeclareUnicodeCharacter{2192}{\expansion} + \DeclareUnicodeCharacter{21D2}{\result} + + \DeclareUnicodeCharacter{2212}{\minus} + \DeclareUnicodeCharacter{2217}{\point} + \DeclareUnicodeCharacter{2261}{\equiv} +}% end of \utfeightchardefs + + +% US-ASCII character definitions. +\def\asciichardefs{% nothing need be done + \relax +} + +% Make non-ASCII characters printable again for compatibility with +% existing Texinfo documents that may use them, even without declaring a +% document encoding. +% +\setnonasciicharscatcode \other + + +\message{formatting,} + +\newdimen\defaultparindent \defaultparindent = 15pt + +\chapheadingskip = 15pt plus 4pt minus 2pt +\secheadingskip = 12pt plus 3pt minus 2pt +\subsecheadingskip = 9pt plus 2pt minus 2pt + +% Prevent underfull vbox error messages. +\vbadness = 10000 + +% Don't be so finicky about underfull hboxes, either. +\hbadness = 2000 + +% Following George Bush, get rid of widows and orphans. +\widowpenalty=10000 +\clubpenalty=10000 + +% Use TeX 3.0's \emergencystretch to help line breaking, but if we're +% using an old version of TeX, don't do anything. We want the amount of +% stretch added to depend on the line length, hence the dependence on +% \hsize. We call this whenever the paper size is set. +% +\def\setemergencystretch{% + \ifx\emergencystretch\thisisundefined + % Allow us to assign to \emergencystretch anyway. + \def\emergencystretch{\dimen0}% + \else + \emergencystretch = .15\hsize + \fi +} + +% Parameters in order: 1) textheight; 2) textwidth; +% 3) voffset; 4) hoffset; 5) binding offset; 6) topskip; +% 7) physical page height; 8) physical page width. +% +% We also call \setleading{\textleading}, so the caller should define +% \textleading. The caller should also set \parskip. +% +\def\internalpagesizes#1#2#3#4#5#6#7#8{% + \voffset = #3\relax + \topskip = #6\relax + \splittopskip = \topskip + % + \vsize = #1\relax + \advance\vsize by \topskip + \outervsize = \vsize + \advance\outervsize by 2\topandbottommargin + \pageheight = \vsize + % + \hsize = #2\relax + \outerhsize = \hsize + \advance\outerhsize by 0.5in + \pagewidth = \hsize + % + \normaloffset = #4\relax + \bindingoffset = #5\relax + % + \ifpdf + \pdfpageheight #7\relax + \pdfpagewidth #8\relax + % if we don't reset these, they will remain at "1 true in" of + % whatever layout pdftex was dumped with. + \pdfhorigin = 1 true in + \pdfvorigin = 1 true in + \fi + % + \setleading{\textleading} + % + \parindent = \defaultparindent + \setemergencystretch +} + +% @letterpaper (the default). +\def\letterpaper{{\globaldefs = 1 + \parskip = 3pt plus 2pt minus 1pt + \textleading = 13.2pt + % + % If page is nothing but text, make it come out even. + \internalpagesizes{607.2pt}{6in}% that's 46 lines + {\voffset}{.25in}% + {\bindingoffset}{36pt}% + {11in}{8.5in}% +}} + +% Use @smallbook to reset parameters for 7x9.25 trim size. +\def\smallbook{{\globaldefs = 1 + \parskip = 2pt plus 1pt + \textleading = 12pt + % + \internalpagesizes{7.5in}{5in}% + {-.2in}{0in}% + {\bindingoffset}{16pt}% + {9.25in}{7in}% + % + \lispnarrowing = 0.3in + \tolerance = 700 + \hfuzz = 1pt + \contentsrightmargin = 0pt + \defbodyindent = .5cm +}} + +% Use @smallerbook to reset parameters for 6x9 trim size. +% (Just testing, parameters still in flux.) +\def\smallerbook{{\globaldefs = 1 + \parskip = 1.5pt plus 1pt + \textleading = 12pt + % + \internalpagesizes{7.4in}{4.8in}% + {-.2in}{-.4in}% + {0pt}{14pt}% + {9in}{6in}% + % + \lispnarrowing = 0.25in + \tolerance = 700 + \hfuzz = 1pt + \contentsrightmargin = 0pt + \defbodyindent = .4cm +}} + +% Use @afourpaper to print on European A4 paper. +\def\afourpaper{{\globaldefs = 1 + \parskip = 3pt plus 2pt minus 1pt + \textleading = 13.2pt + % + % Double-side printing via postscript on Laserjet 4050 + % prints double-sided nicely when \bindingoffset=10mm and \hoffset=-6mm. + % To change the settings for a different printer or situation, adjust + % \normaloffset until the front-side and back-side texts align. Then + % do the same for \bindingoffset. You can set these for testing in + % your texinfo source file like this: + % @tex + % \global\normaloffset = -6mm + % \global\bindingoffset = 10mm + % @end tex + \internalpagesizes{673.2pt}{160mm}% that's 51 lines + {\voffset}{\hoffset}% + {\bindingoffset}{44pt}% + {297mm}{210mm}% + % + \tolerance = 700 + \hfuzz = 1pt + \contentsrightmargin = 0pt + \defbodyindent = 5mm +}} + +% Use @afivepaper to print on European A5 paper. +% From romildo@urano.iceb.ufop.br, 2 July 2000. +% He also recommends making @example and @lisp be small. +\def\afivepaper{{\globaldefs = 1 + \parskip = 2pt plus 1pt minus 0.1pt + \textleading = 12.5pt + % + \internalpagesizes{160mm}{120mm}% + {\voffset}{\hoffset}% + {\bindingoffset}{8pt}% + {210mm}{148mm}% + % + \lispnarrowing = 0.2in + \tolerance = 800 + \hfuzz = 1.2pt + \contentsrightmargin = 0pt + \defbodyindent = 2mm + \tableindent = 12mm +}} + +% A specific text layout, 24x15cm overall, intended for A4 paper. +\def\afourlatex{{\globaldefs = 1 + \afourpaper + \internalpagesizes{237mm}{150mm}% + {\voffset}{4.6mm}% + {\bindingoffset}{7mm}% + {297mm}{210mm}% + % + % Must explicitly reset to 0 because we call \afourpaper. + \globaldefs = 0 +}} + +% Use @afourwide to print on A4 paper in landscape format. +\def\afourwide{{\globaldefs = 1 + \afourpaper + \internalpagesizes{241mm}{165mm}% + {\voffset}{-2.95mm}% + {\bindingoffset}{7mm}% + {297mm}{210mm}% + \globaldefs = 0 +}} + +% @pagesizes TEXTHEIGHT[,TEXTWIDTH] +% Perhaps we should allow setting the margins, \topskip, \parskip, +% and/or leading, also. Or perhaps we should compute them somehow. +% +\parseargdef\pagesizes{\pagesizesyyy #1,,\finish} +\def\pagesizesyyy#1,#2,#3\finish{{% + \setbox0 = \hbox{\ignorespaces #2}\ifdim\wd0 > 0pt \hsize=#2\relax \fi + \globaldefs = 1 + % + \parskip = 3pt plus 2pt minus 1pt + \setleading{\textleading}% + % + \dimen0 = #1\relax + \advance\dimen0 by \voffset + % + \dimen2 = \hsize + \advance\dimen2 by \normaloffset + % + \internalpagesizes{#1}{\hsize}% + {\voffset}{\normaloffset}% + {\bindingoffset}{44pt}% + {\dimen0}{\dimen2}% +}} + +% Set default to letter. +% +\letterpaper + + +\message{and turning on texinfo input format.} + +% Define macros to output various characters with catcode for normal text. +\catcode`\"=\other +\catcode`\~=\other +\catcode`\^=\other +\catcode`\_=\other +\catcode`\|=\other +\catcode`\<=\other +\catcode`\>=\other +\catcode`\+=\other +\catcode`\$=\other +\def\normaldoublequote{"} +\def\normaltilde{~} +\def\normalcaret{^} +\def\normalunderscore{_} +\def\normalverticalbar{|} +\def\normalless{<} +\def\normalgreater{>} +\def\normalplus{+} +\def\normaldollar{$}%$ font-lock fix + +% This macro is used to make a character print one way in \tt +% (where it can probably be output as-is), and another way in other fonts, +% where something hairier probably needs to be done. +% +% #1 is what to print if we are indeed using \tt; #2 is what to print +% otherwise. Since all the Computer Modern typewriter fonts have zero +% interword stretch (and shrink), and it is reasonable to expect all +% typewriter fonts to have this, we can check that font parameter. +% +\def\ifusingtt#1#2{\ifdim \fontdimen3\font=0pt #1\else #2\fi} + +% Same as above, but check for italic font. Actually this also catches +% non-italic slanted fonts since it is impossible to distinguish them from +% italic fonts. But since this is only used by $ and it uses \sl anyway +% this is not a problem. +\def\ifusingit#1#2{\ifdim \fontdimen1\font>0pt #1\else #2\fi} + +% Turn off all special characters except @ +% (and those which the user can use as if they were ordinary). +% Most of these we simply print from the \tt font, but for some, we can +% use math or other variants that look better in normal text. + +\catcode`\"=\active +\def\activedoublequote{{\tt\char34}} +\let"=\activedoublequote +\catcode`\~=\active +\def~{{\tt\char126}} +\chardef\hat=`\^ +\catcode`\^=\active +\def^{{\tt \hat}} + +\catcode`\_=\active +\def_{\ifusingtt\normalunderscore\_} +\let\realunder=_ +% Subroutine for the previous macro. +\def\_{\leavevmode \kern.07em \vbox{\hrule width.3em height.1ex}\kern .07em } + +\catcode`\|=\active +\def|{{\tt\char124}} +\chardef \less=`\< +\catcode`\<=\active +\def<{{\tt \less}} +\chardef \gtr=`\> +\catcode`\>=\active +\def>{{\tt \gtr}} +\catcode`\+=\active +\def+{{\tt \char 43}} +\catcode`\$=\active +\def${\ifusingit{{\sl\$}}\normaldollar}%$ font-lock fix + +% If a .fmt file is being used, characters that might appear in a file +% name cannot be active until we have parsed the command line. +% So turn them off again, and have \everyjob (or @setfilename) turn them on. +% \otherifyactive is called near the end of this file. +\def\otherifyactive{\catcode`+=\other \catcode`\_=\other} + +% Used sometimes to turn off (effectively) the active characters even after +% parsing them. +\def\turnoffactive{% + \normalturnoffactive + \otherbackslash +} + +\catcode`\@=0 + +% \backslashcurfont outputs one backslash character in current font, +% as in \char`\\. +\global\chardef\backslashcurfont=`\\ +\global\let\rawbackslashxx=\backslashcurfont % let existing .??s files work + +% \realbackslash is an actual character `\' with catcode other, and +% \doublebackslash is two of them (for the pdf outlines). +{\catcode`\\=\other @gdef@realbackslash{\} @gdef@doublebackslash{\\}} + +% In texinfo, backslash is an active character; it prints the backslash +% in fixed width font. +\catcode`\\=\active +@def@normalbackslash{{@tt@backslashcurfont}} +% On startup, @fixbackslash assigns: +% @let \ = @normalbackslash + +% \rawbackslash defines an active \ to do \backslashcurfont. +% \otherbackslash defines an active \ to be a literal `\' character with +% catcode other. +@gdef@rawbackslash{@let\=@backslashcurfont} +@gdef@otherbackslash{@let\=@realbackslash} + +% Same as @turnoffactive except outputs \ as {\tt\char`\\} instead of +% the literal character `\'. +% +@def@normalturnoffactive{% + @let\=@normalbackslash + @let"=@normaldoublequote + @let~=@normaltilde + @let^=@normalcaret + @let_=@normalunderscore + @let|=@normalverticalbar + @let<=@normalless + @let>=@normalgreater + @let+=@normalplus + @let$=@normaldollar %$ font-lock fix + @unsepspaces +} + +% Make _ and + \other characters, temporarily. +% This is canceled by @fixbackslash. +@otherifyactive + +% If a .fmt file is being used, we don't want the `\input texinfo' to show up. +% That is what \eatinput is for; after that, the `\' should revert to printing +% a backslash. +% +@gdef@eatinput input texinfo{@fixbackslash} +@global@let\ = @eatinput + +% On the other hand, perhaps the file did not have a `\input texinfo'. Then +% the first `\' in the file would cause an error. This macro tries to fix +% that, assuming it is called before the first `\' could plausibly occur. +% Also turn back on active characters that might appear in the input +% file name, in case not using a pre-dumped format. +% +@gdef@fixbackslash{% + @ifx\@eatinput @let\ = @normalbackslash @fi + @catcode`+=@active + @catcode`@_=@active +} + +% Say @foo, not \foo, in error messages. +@escapechar = `@@ + +% These look ok in all fonts, so just make them not special. +@catcode`@& = @other +@catcode`@# = @other +@catcode`@% = @other + + +@c Local variables: +@c eval: (add-hook 'write-file-hooks 'time-stamp) +@c page-delimiter: "^\\\\message" +@c time-stamp-start: "def\\\\texinfoversion{" +@c time-stamp-format: "%:y-%02m-%02d.%02H" +@c time-stamp-end: "}" +@c End: + +@c vim:sw=2: + +@ignore + arch-tag: e1b36e32-c96e-4135-a41a-0b2efa2ea115 +@end ignore diff --git a/clan/autoconf/ylwrap b/clan/autoconf/ylwrap new file mode 100755 index 0000000..7278b6a --- /dev/null +++ b/clan/autoconf/ylwrap @@ -0,0 +1,223 @@ +#! /bin/sh +# ylwrap - wrapper for lex/yacc invocations. + +scriptversion=2007-11-22.22 + +# Copyright (C) 1996, 1997, 1998, 1999, 2001, 2002, 2003, 2004, 2005, +# 2007 Free Software Foundation, Inc. +# +# Written by Tom Tromey . +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA +# 02110-1301, USA. + +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + +# This file is maintained in Automake, please report +# bugs to or send patches to +# . + +case "$1" in + '') + echo "$0: No files given. Try \`$0 --help' for more information." 1>&2 + exit 1 + ;; + --basedir) + basedir=$2 + shift 2 + ;; + -h|--h*) + cat <<\EOF +Usage: ylwrap [--help|--version] INPUT [OUTPUT DESIRED]... -- PROGRAM [ARGS]... + +Wrapper for lex/yacc invocations, renaming files as desired. + + INPUT is the input file + OUTPUT is one file PROG generates + DESIRED is the file we actually want instead of OUTPUT + PROGRAM is program to run + ARGS are passed to PROG + +Any number of OUTPUT,DESIRED pairs may be used. + +Report bugs to . +EOF + exit $? + ;; + -v|--v*) + echo "ylwrap $scriptversion" + exit $? + ;; +esac + + +# The input. +input="$1" +shift +case "$input" in + [\\/]* | ?:[\\/]*) + # Absolute path; do nothing. + ;; + *) + # Relative path. Make it absolute. + input="`pwd`/$input" + ;; +esac + +pairlist= +while test "$#" -ne 0; do + if test "$1" = "--"; then + shift + break + fi + pairlist="$pairlist $1" + shift +done + +# The program to run. +prog="$1" +shift +# Make any relative path in $prog absolute. +case "$prog" in + [\\/]* | ?:[\\/]*) ;; + *[\\/]*) prog="`pwd`/$prog" ;; +esac + +# FIXME: add hostname here for parallel makes that run commands on +# other machines. But that might take us over the 14-char limit. +dirname=ylwrap$$ +trap "cd '`pwd`'; rm -rf $dirname > /dev/null 2>&1" 1 2 3 15 +mkdir $dirname || exit 1 + +cd $dirname + +case $# in + 0) "$prog" "$input" ;; + *) "$prog" "$@" "$input" ;; +esac +ret=$? + +if test $ret -eq 0; then + set X $pairlist + shift + first=yes + # Since DOS filename conventions don't allow two dots, + # the DOS version of Bison writes out y_tab.c instead of y.tab.c + # and y_tab.h instead of y.tab.h. Test to see if this is the case. + y_tab_nodot="no" + if test -f y_tab.c || test -f y_tab.h; then + y_tab_nodot="yes" + fi + + # The directory holding the input. + input_dir=`echo "$input" | sed -e 's,\([\\/]\)[^\\/]*$,\1,'` + # Quote $INPUT_DIR so we can use it in a regexp. + # FIXME: really we should care about more than `.' and `\'. + input_rx=`echo "$input_dir" | sed 's,\\\\,\\\\\\\\,g;s,\\.,\\\\.,g'` + + while test "$#" -ne 0; do + from="$1" + # Handle y_tab.c and y_tab.h output by DOS + if test $y_tab_nodot = "yes"; then + if test $from = "y.tab.c"; then + from="y_tab.c" + else + if test $from = "y.tab.h"; then + from="y_tab.h" + fi + fi + fi + if test -f "$from"; then + # If $2 is an absolute path name, then just use that, + # otherwise prepend `../'. + case "$2" in + [\\/]* | ?:[\\/]*) target="$2";; + *) target="../$2";; + esac + + # We do not want to overwrite a header file if it hasn't + # changed. This avoid useless recompilations. However the + # parser itself (the first file) should always be updated, + # because it is the destination of the .y.c rule in the + # Makefile. Divert the output of all other files to a temporary + # file so we can compare them to existing versions. + if test $first = no; then + realtarget="$target" + target="tmp-`echo $target | sed s/.*[\\/]//g`" + fi + # Edit out `#line' or `#' directives. + # + # We don't want the resulting debug information to point at + # an absolute srcdir; it is better for it to just mention the + # .y file with no path. + # + # We want to use the real output file name, not yy.lex.c for + # instance. + # + # We want the include guards to be adjusted too. + FROM=`echo "$from" | sed \ + -e 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/'\ + -e 's/[^ABCDEFGHIJKLMNOPQRSTUVWXYZ]/_/g'` + TARGET=`echo "$2" | sed \ + -e 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/'\ + -e 's/[^ABCDEFGHIJKLMNOPQRSTUVWXYZ]/_/g'` + + sed -e "/^#/!b" -e "s,$input_rx,," -e "s,$from,$2," \ + -e "s,$FROM,$TARGET," "$from" >"$target" || ret=$? + + # Check whether header files must be updated. + if test $first = no; then + if test -f "$realtarget" && cmp -s "$realtarget" "$target"; then + echo "$2" is unchanged + rm -f "$target" + else + echo updating "$2" + mv -f "$target" "$realtarget" + fi + fi + else + # A missing file is only an error for the first file. This + # is a blatant hack to let us support using "yacc -d". If -d + # is not specified, we don't want an error when the header + # file is "missing". + if test $first = yes; then + ret=1 + fi + fi + shift + shift + first=no + done +else + ret=$? +fi + +# Remove the directory. +cd .. +rm -rf $dirname + +exit $ret + +# Local Variables: +# mode: shell-script +# sh-indentation: 2 +# eval: (add-hook 'write-file-hooks 'time-stamp) +# time-stamp-start: "scriptversion=" +# time-stamp-format: "%:y-%02m-%02d.%02H" +# time-stamp-end: "$" +# End: diff --git a/clan/configure.in b/clan/configure.in new file mode 100644 index 0000000..e6a7e23 --- /dev/null +++ b/clan/configure.in @@ -0,0 +1,175 @@ +dnl +dnl /**------- <| --------------------------------------------------------** +dnl ** A Clan ** +dnl **--- /.\ -----------------------------------------------------** +dnl ** <| [""M# configure.in ** +dnl **- A | # -----------------------------------------------------** +dnl ** /.\ [""M# First version: 30/04/2008 ** +dnl **- [""M# | # U"U#U -----------------------------------------------** +dnl | # | # \ .:/ +dnl | # | #___| # +dnl ****** | "--' .-" *************************************************** +dnl * |"-"-"-"-"-#-#-## Clan : the Chunky Loop Analyser (experimental) * +dnl **** | # ## ###### ************************************************** +dnl * \ .::::'/ * +dnl * \ ::::'/ Copyright (C) 2008 Cedric Bastoul * +dnl * :8a| # # ## * +dnl * ::88a ### This is free software; you can redistribute it * +dnl * ::::888a 8a ##::. and/or modify it under the terms of the GNU * +dnl * ::::::::888a88a[]::: Lesser General Public License as published by * +dnl *::8:::::::::SUNDOGa8a::. the Free Software Foundation, either version 3 * +dnl *::::::::8::::888:Y8888:: of the License, or (at your * +dnl *::::':::88::::888::Y88a::::::::::::... option) any later version. * +dnl *::'::.. . ..... .. ... . * +dnl * This software is distributed in the hope that it will be useful, but * +dnl * WITHOUT ANY WARRANTY; without even the implied warranty of * +dnl * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * +dnl * General Public License for more details. * +dnl * * +dnl * You should have received a copy of the GNU Lesser General Public * +dnl * License along with software; if not, write to the Free Software * +dnl * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 * +dnl * USA * +dnl * * +dnl * Clan, the Chunky Loop Analyser * +dnl * Written by Cedric Bastoul, Cedric.Bastoul@inria.fr * +dnl * * +dnl ***************************************************************************/ +dnl +dnl Input file for autoconf to build a configuration shellscript. + + +AC_PREREQ(2.13) +dnl Fill here the @bug email adress. +AC_INIT([clan], [0.6.0], [cedric.bastoul@inria.fr,pouchet@cse.ohio-state.edu]) +dnl A common file, which serve as a test. +AC_CONFIG_SRCDIR([include/clan/symbol.h]) +dnl Put as most as possible configuration files to an auxialiry +dnl directory. +AC_CONFIG_AUX_DIR([autoconf]) +dnl Initialize automake. Here, a special tar version that enables +dnl (very) long filenames. +AM_INIT_AUTOMAKE([1.9 tar-ustar no-define foreign dist-bzip2]) + +dnl default version +BITS="64" +CLAN_INT_T=CLAN_INT_T_IS_LONGLONG + + +dnl /************************************************************************** +dnl * Checking * +dnl **************************************************************************/ + + +dnl Checks for programs. +AC_PROG_CC +AC_PROG_LN_S +AC_PROG_MAKE_SET +AC_CHECK_PROG(CD, cd) +AC_PROG_LIBTOOL +AC_PROG_LEX +AC_PROG_YACC +AC_CHECK_PROGS(DOXYGEN,doxygen,doxygen) + +dnl Checks for typedefs, structures, and compiler characteristics. +AC_C_CONST +AC_TYPE_SIZE_T + +dnl Checks for header files. +AC_HEADER_STDC +AC_CHECK_HEADERS([errno.h stddef.h stdlib.h string.h strings.h unistd.h]) + +dnl Checks for library functions. +AC_CHECK_FUNCS(strtol) + + +dnl /************************************************************************** +dnl * Option setting * +dnl **************************************************************************/ + +AC_ARG_ENABLE(internal-scoplib, + AC_HELP_STRING([--enable-internal-scoplib], + [Use shipped ScopLib]), + [ if test "x$enableval" = xno; then + shipped_scoplib=no; + else + shipped_scoplib=yes; + fi + ], [ shipped_scoplib=uncertain ]) + + +dnl Offer --with-scoplib. +AC_ARG_WITH(scoplib, + AC_HELP_STRING([--with-scoplib=DIR], + [DIR Location of SCOPLIB package]), + [if test "x$shipped_scoplib" != xyes; then + with_scoplib=$withval; + CPPFLAGS="${CPPFLAGS} -I$withval/include"; + LDFLAGS="${LDFLAGS} -L$withval/lib"; + shipped_scoplib=no; + fi; + ], + [if test "x$shipped_scoplib" = xno; then + with_scoplib=yes; + else + with_scoplib=check; + fi; + ]) +dnl Check for scoplib existence. +AS_IF([test "x$with_scoplib" != xno ], + [AC_CHECK_LIB([scoplib], [scoplib_scop_read], + [LIBS="-lscoplib $LIBS"; + AC_DEFINE([HAVE_LIBSCOPLIB], [1], [Define if you have libscoplib]) + ], + [if test "x$with_scoplib" != xcheck; then + AC_MSG_FAILURE([Test for SCOPLIB failed. Use --with-scoplib to specify libscoplib path.]); + fi; + ]) +]) + +AS_IF([test "x$shipped_scoplib" != xno ], + [abs_top_srcdir=`cd $srcdir; pwd`; + abs_top_builddir=`pwd`; + if ! test -f $abs_top_srcdir/scoplib/scoplib-0.2.0 ; then + cd $abs_top_srcdir/scoplib && tar xzf scoplib-0.2.0.tar.gz ; cd -; + fi; + AC_CONFIG_SUBDIRS([scoplib/scoplib-0.2.0]) + BUILD_SCOPLIB="scoplib/scoplib-0.2.0"; + CPPFLAGS="${CPPFLAGS} -I$abs_top_srcdir/scoplib/scoplib-0.2.0/include -I$abs_top_builddir/scoplib/scoplib-0.2.0/include"; + LDFLAGS="${LDFLAGS} -L$abs_top_builddir/scoplib/scoplib-0.2.0/source"; + LIBS="-lscoplib $LIBS"; + ], + [BUILD_SCOPLIB=""]) + + +dnl /************************************************************************** +dnl * Substitutions * +dnl **************************************************************************/ + + +dnl Substitutions to do. +AC_SUBST(ac_aux_dir) +AC_SUBST(abs_top_srcdir) +AC_SUBST(BUILD_SCOPLIB) + +dnl Configure Makefiles. +AC_CONFIG_FILES([ + Makefile + doc/Makefile + doc/Doxyfile + include/Makefile + include/clan/clan.h + source/Makefile + tests/Makefile + ], + [test -z "$CONFIG_HEADERS" || echo timestamp > source/stamp-h.in]) + +AC_OUTPUT + + +echo " /*-----------------------------------------------*" +echo " * Clan configuration is OK *" +echo " *-----------------------------------------------*/" +echo "It appears that your system is OK to start Clan compilation. You need" +echo "now to type \"make\". Lastly type \"make install\" to install Clan on" +echo "your system (log as root if necessary)." diff --git a/clan/doc/Doxyfile.in b/clan/doc/Doxyfile.in new file mode 100644 index 0000000..9825544 --- /dev/null +++ b/clan/doc/Doxyfile.in @@ -0,0 +1,1295 @@ +# Doxyfile 1.5.3 + +# This file describes the settings to be used by the documentation system +# doxygen (www.doxygen.org) for a project +# +# All text after a hash (#) is considered a comment and will be ignored +# The format is: +# TAG = value [value, ...] +# For lists items can also be appended using: +# TAG += value [value, ...] +# Values that contain spaces should be placed between quotes (" ") + +#--------------------------------------------------------------------------- +# Project related configuration options +#--------------------------------------------------------------------------- + +# This tag specifies the encoding used for all characters in the config file that +# follow. The default is UTF-8 which is also the encoding used for all text before +# the first occurrence of this tag. Doxygen uses libiconv (or the iconv built into +# libc) for the transcoding. See http://www.gnu.org/software/libiconv for the list of +# possible encodings. + +DOXYFILE_ENCODING = UTF-8 + +# The PROJECT_NAME tag is a single word (or a sequence of words surrounded +# by quotes) that should identify the project. + +PROJECT_NAME = Clan + +# The PROJECT_NUMBER tag can be used to enter a project or revision number. +# This could be handy for archiving the generated documentation or +# if some version control system is used. + +PROJECT_NUMBER = @VERSION@ + +# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) +# base path where the generated documentation will be put. +# If a relative path is entered, it will be relative to the location +# where doxygen was started. If left blank the current directory will be used. + +OUTPUT_DIRECTORY = htmldoc + +# If the CREATE_SUBDIRS tag is set to YES, then doxygen will create +# 4096 sub-directories (in 2 levels) under the output directory of each output +# format and will distribute the generated files over these directories. +# Enabling this option can be useful when feeding doxygen a huge amount of +# source files, where putting all generated files in the same directory would +# otherwise cause performance problems for the file system. + +CREATE_SUBDIRS = NO + +# The OUTPUT_LANGUAGE tag is used to specify the language in which all +# documentation generated by doxygen is written. Doxygen will use this +# information to generate all constant output in the proper language. +# The default language is English, other supported languages are: +# Afrikaans, Arabic, Brazilian, Catalan, Chinese, Chinese-Traditional, +# Croatian, Czech, Danish, Dutch, Finnish, French, German, Greek, Hungarian, +# Italian, Japanese, Japanese-en (Japanese with English messages), Korean, +# Korean-en, Lithuanian, Norwegian, Polish, Portuguese, Romanian, Russian, +# Serbian, Slovak, Slovene, Spanish, Swedish, and Ukrainian. + +OUTPUT_LANGUAGE = English + +# If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will +# include brief member descriptions after the members that are listed in +# the file and class documentation (similar to JavaDoc). +# Set to NO to disable this. + +BRIEF_MEMBER_DESC = YES + +# If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend +# the brief description of a member or function before the detailed description. +# Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the +# brief descriptions will be completely suppressed. + +REPEAT_BRIEF = YES + +# This tag implements a quasi-intelligent brief description abbreviator +# that is used to form the text in various listings. Each string +# in this list, if found as the leading text of the brief description, will be +# stripped from the text and the result after processing the whole list, is +# used as the annotated text. Otherwise, the brief description is used as-is. +# If left blank, the following values are used ("$name" is automatically +# replaced with the name of the entity): "The $name class" "The $name widget" +# "The $name file" "is" "provides" "specifies" "contains" +# "represents" "a" "an" "the" + +ABBREVIATE_BRIEF = + +# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then +# Doxygen will generate a detailed section even if there is only a brief +# description. + +ALWAYS_DETAILED_SEC = YES + +# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all +# inherited members of a class in the documentation of that class as if those +# members were ordinary class members. Constructors, destructors and assignment +# operators of the base classes will not be shown. + +INLINE_INHERITED_MEMB = YES + +# If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full +# path before files name in the file list and in the header files. If set +# to NO the shortest path that makes the file name unique will be used. + +FULL_PATH_NAMES = NO + +# If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag +# can be used to strip a user-defined part of the path. Stripping is +# only done if one of the specified strings matches the left-hand part of +# the path. The tag can be used to show relative paths in the file list. +# If left blank the directory from which doxygen is run is used as the +# path to strip. + +STRIP_FROM_PATH = + +# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of +# the path mentioned in the documentation of a class, which tells +# the reader which header file to include in order to use a class. +# If left blank only the name of the header file containing the class +# definition is used. Otherwise one should specify the include paths that +# are normally passed to the compiler using the -I flag. + +STRIP_FROM_INC_PATH = + +# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter +# (but less readable) file names. This can be useful is your file systems +# doesn't support long names like on DOS, Mac, or CD-ROM. + +SHORT_NAMES = YES + +# If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen +# will interpret the first line (until the first dot) of a JavaDoc-style +# comment as the brief description. If set to NO, the JavaDoc +# comments will behave just like regular Qt-style comments +# (thus requiring an explicit @brief command for a brief description.) + +JAVADOC_AUTOBRIEF = NO + +# If the QT_AUTOBRIEF tag is set to YES then Doxygen will +# interpret the first line (until the first dot) of a Qt-style +# comment as the brief description. If set to NO, the comments +# will behave just like regular Qt-style comments (thus requiring +# an explicit \brief command for a brief description.) + +QT_AUTOBRIEF = NO + +# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make Doxygen +# treat a multi-line C++ special comment block (i.e. a block of //! or /// +# comments) as a brief description. This used to be the default behaviour. +# The new default is to treat a multi-line C++ comment block as a detailed +# description. Set this tag to YES if you prefer the old behaviour instead. + +MULTILINE_CPP_IS_BRIEF = NO + +# If the DETAILS_AT_TOP tag is set to YES then Doxygen +# will output the detailed description near the top, like JavaDoc. +# If set to NO, the detailed description appears after the member +# documentation. + +DETAILS_AT_TOP = NO + +# If the INHERIT_DOCS tag is set to YES (the default) then an undocumented +# member inherits the documentation from any documented member that it +# re-implements. + +INHERIT_DOCS = YES + +# If the SEPARATE_MEMBER_PAGES tag is set to YES, then doxygen will produce +# a new page for each member. If set to NO, the documentation of a member will +# be part of the file/class/namespace that contains it. + +SEPARATE_MEMBER_PAGES = NO + +# The TAB_SIZE tag can be used to set the number of spaces in a tab. +# Doxygen uses this value to replace tabs by spaces in code fragments. + +TAB_SIZE = 8 + +# This tag can be used to specify a number of aliases that acts +# as commands in the documentation. An alias has the form "name=value". +# For example adding "sideeffect=\par Side Effects:\n" will allow you to +# put the command \sideeffect (or @sideeffect) in the documentation, which +# will result in a user-defined paragraph with heading "Side Effects:". +# You can put \n's in the value part of an alias to insert newlines. + +ALIASES = + +# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C +# sources only. Doxygen will then generate output that is more tailored for C. +# For instance, some of the names that are used will be different. The list +# of all members will be omitted, etc. + +OPTIMIZE_OUTPUT_FOR_C = NO + +# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java +# sources only. Doxygen will then generate output that is more tailored for Java. +# For instance, namespaces will be presented as packages, qualified scopes +# will look different, etc. + +OPTIMIZE_OUTPUT_JAVA = NO + +# If you use STL classes (i.e. std::string, std::vector, etc.) but do not want to +# include (a tag file for) the STL sources as input, then you should +# set this tag to YES in order to let doxygen match functions declarations and +# definitions whose arguments contain STL classes (e.g. func(std::string); v.s. +# func(std::string) {}). This also make the inheritance and collaboration +# diagrams that involve STL classes more complete and accurate. + +BUILTIN_STL_SUPPORT = NO + +# If you use Microsoft's C++/CLI language, you should set this option to YES to +# enable parsing support. + +CPP_CLI_SUPPORT = NO + +# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC +# tag is set to YES, then doxygen will reuse the documentation of the first +# member in the group (if any) for the other members of the group. By default +# all members of a group must be documented explicitly. + +DISTRIBUTE_GROUP_DOC = NO + +# Set the SUBGROUPING tag to YES (the default) to allow class member groups of +# the same type (for instance a group of public functions) to be put as a +# subgroup of that type (e.g. under the Public Functions section). Set it to +# NO to prevent subgrouping. Alternatively, this can be done per class using +# the \nosubgrouping command. + +SUBGROUPING = YES + +#--------------------------------------------------------------------------- +# Build related configuration options +#--------------------------------------------------------------------------- + +# If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in +# documentation are documented, even if no documentation was available. +# Private class members and static file members will be hidden unless +# the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES + +EXTRACT_ALL = YES + +# If the EXTRACT_PRIVATE tag is set to YES all private members of a class +# will be included in the documentation. + +EXTRACT_PRIVATE = YES + +# If the EXTRACT_STATIC tag is set to YES all static members of a file +# will be included in the documentation. + +EXTRACT_STATIC = YES + +# If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs) +# defined locally in source files will be included in the documentation. +# If set to NO only classes defined in header files are included. + +EXTRACT_LOCAL_CLASSES = YES + +# This flag is only useful for Objective-C code. When set to YES local +# methods, which are defined in the implementation section but not in +# the interface are included in the documentation. +# If set to NO (the default) only methods in the interface are included. + +EXTRACT_LOCAL_METHODS = NO + +# If this flag is set to YES, the members of anonymous namespaces will be extracted +# and appear in the documentation as a namespace called 'anonymous_namespace{file}', +# where file will be replaced with the base name of the file that contains the anonymous +# namespace. By default anonymous namespace are hidden. + +EXTRACT_ANON_NSPACES = NO + +# If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all +# undocumented members of documented classes, files or namespaces. +# If set to NO (the default) these members will be included in the +# various overviews, but no documentation section is generated. +# This option has no effect if EXTRACT_ALL is enabled. + +HIDE_UNDOC_MEMBERS = NO + +# If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all +# undocumented classes that are normally visible in the class hierarchy. +# If set to NO (the default) these classes will be included in the various +# overviews. This option has no effect if EXTRACT_ALL is enabled. + +HIDE_UNDOC_CLASSES = NO + +# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, Doxygen will hide all +# friend (class|struct|union) declarations. +# If set to NO (the default) these declarations will be included in the +# documentation. + +HIDE_FRIEND_COMPOUNDS = NO + +# If the HIDE_IN_BODY_DOCS tag is set to YES, Doxygen will hide any +# documentation blocks found inside the body of a function. +# If set to NO (the default) these blocks will be appended to the +# function's detailed documentation block. + +HIDE_IN_BODY_DOCS = NO + +# The INTERNAL_DOCS tag determines if documentation +# that is typed after a \internal command is included. If the tag is set +# to NO (the default) then the documentation will be excluded. +# Set it to YES to include the internal documentation. + +INTERNAL_DOCS = NO + +# If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate +# file names in lower-case letters. If set to YES upper-case letters are also +# allowed. This is useful if you have classes or files whose names only differ +# in case and if your file system supports case sensitive file names. Windows +# and Mac users are advised to set this option to NO. + +CASE_SENSE_NAMES = YES + +# If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen +# will show members with their full class and namespace scopes in the +# documentation. If set to YES the scope will be hidden. + +HIDE_SCOPE_NAMES = NO + +# If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen +# will put a list of the files that are included by a file in the documentation +# of that file. + +SHOW_INCLUDE_FILES = YES + +# If the INLINE_INFO tag is set to YES (the default) then a tag [inline] +# is inserted in the documentation for inline members. + +INLINE_INFO = YES + +# If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen +# will sort the (detailed) documentation of file and class members +# alphabetically by member name. If set to NO the members will appear in +# declaration order. + +SORT_MEMBER_DOCS = YES + +# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the +# brief documentation of file, namespace and class members alphabetically +# by member name. If set to NO (the default) the members will appear in +# declaration order. + +SORT_BRIEF_DOCS = NO + +# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be +# sorted by fully-qualified names, including namespaces. If set to +# NO (the default), the class list will be sorted only by class name, +# not including the namespace part. +# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES. +# Note: This option applies only to the class list, not to the +# alphabetical list. + +SORT_BY_SCOPE_NAME = NO + +# The GENERATE_TODOLIST tag can be used to enable (YES) or +# disable (NO) the todo list. This list is created by putting \todo +# commands in the documentation. + +GENERATE_TODOLIST = YES + +# The GENERATE_TESTLIST tag can be used to enable (YES) or +# disable (NO) the test list. This list is created by putting \test +# commands in the documentation. + +GENERATE_TESTLIST = YES + +# The GENERATE_BUGLIST tag can be used to enable (YES) or +# disable (NO) the bug list. This list is created by putting \bug +# commands in the documentation. + +GENERATE_BUGLIST = YES + +# The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or +# disable (NO) the deprecated list. This list is created by putting +# \deprecated commands in the documentation. + +GENERATE_DEPRECATEDLIST= YES + +# The ENABLED_SECTIONS tag can be used to enable conditional +# documentation sections, marked by \if sectionname ... \endif. + +ENABLED_SECTIONS = + +# The MAX_INITIALIZER_LINES tag determines the maximum number of lines +# the initial value of a variable or define consists of for it to appear in +# the documentation. If the initializer consists of more lines than specified +# here it will be hidden. Use a value of 0 to hide initializers completely. +# The appearance of the initializer of individual variables and defines in the +# documentation can be controlled using \showinitializer or \hideinitializer +# command in the documentation regardless of this setting. + +MAX_INITIALIZER_LINES = 30 + +# Set the SHOW_USED_FILES tag to NO to disable the list of files generated +# at the bottom of the documentation of classes and structs. If set to YES the +# list will mention the files that were used to generate the documentation. + +SHOW_USED_FILES = YES + +# If the sources in your project are distributed over multiple directories +# then setting the SHOW_DIRECTORIES tag to YES will show the directory hierarchy +# in the documentation. The default is NO. + +SHOW_DIRECTORIES = NO + +# The FILE_VERSION_FILTER tag can be used to specify a program or script that +# doxygen should invoke to get the current version for each file (typically from the +# version control system). Doxygen will invoke the program by executing (via +# popen()) the command , where is the value of +# the FILE_VERSION_FILTER tag, and is the name of an input file +# provided by doxygen. Whatever the program writes to standard output +# is used as the file version. See the manual for examples. + +FILE_VERSION_FILTER = + +#--------------------------------------------------------------------------- +# configuration options related to warning and progress messages +#--------------------------------------------------------------------------- + +# The QUIET tag can be used to turn on/off the messages that are generated +# by doxygen. Possible values are YES and NO. If left blank NO is used. + +QUIET = YES + +# The WARNINGS tag can be used to turn on/off the warning messages that are +# generated by doxygen. Possible values are YES and NO. If left blank +# NO is used. + +WARNINGS = YES + +# If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings +# for undocumented members. If EXTRACT_ALL is set to YES then this flag will +# automatically be disabled. + +WARN_IF_UNDOCUMENTED = YES + +# If WARN_IF_DOC_ERROR is set to YES, doxygen will generate warnings for +# potential errors in the documentation, such as not documenting some +# parameters in a documented function, or documenting parameters that +# don't exist or using markup commands wrongly. + +WARN_IF_DOC_ERROR = YES + +# This WARN_NO_PARAMDOC option can be abled to get warnings for +# functions that are documented, but have no documentation for their parameters +# or return value. If set to NO (the default) doxygen will only warn about +# wrong or incomplete parameter documentation, but not about the absence of +# documentation. + +WARN_NO_PARAMDOC = NO + +# The WARN_FORMAT tag determines the format of the warning messages that +# doxygen can produce. The string should contain the $file, $line, and $text +# tags, which will be replaced by the file and line number from which the +# warning originated and the warning text. Optionally the format may contain +# $version, which will be replaced by the version of the file (if it could +# be obtained via FILE_VERSION_FILTER) + +WARN_FORMAT = "$file:$line: $text " + +# The WARN_LOGFILE tag can be used to specify a file to which warning +# and error messages should be written. If left blank the output is written +# to stderr. + +WARN_LOGFILE = + +#--------------------------------------------------------------------------- +# configuration options related to the input files +#--------------------------------------------------------------------------- + +# The INPUT tag can be used to specify the files and/or directories that contain +# documented source files. You may enter file names like "myfile.cpp" or +# directories like "/usr/src/myproject". Separate the files or directories +# with spaces. + +INPUT = @top_srcdir@/source \ + @top_srcdir@/include/clan + +# This tag can be used to specify the character encoding of the source files that +# doxygen parses. Internally doxygen uses the UTF-8 encoding, which is also the default +# input encoding. Doxygen uses libiconv (or the iconv built into libc) for the transcoding. +# See http://www.gnu.org/software/libiconv for the list of possible encodings. + +INPUT_ENCODING = UTF-8 + +# If the value of the INPUT tag contains directories, you can use the +# FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp +# and *.h) to filter out the source-files in the directories. If left +# blank the following patterns are tested: +# *.c *.cc *.cxx *.cpp *.c++ *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh *.hxx +# *.hpp *.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm *.py + +FILE_PATTERNS = + +# The RECURSIVE tag can be used to turn specify whether or not subdirectories +# should be searched for input files as well. Possible values are YES and NO. +# If left blank NO is used. + +RECURSIVE = NO + +# The EXCLUDE tag can be used to specify files and/or directories that should +# excluded from the INPUT source files. This way you can easily exclude a +# subdirectory from a directory tree whose root is specified with the INPUT tag. + +EXCLUDE = + +# The EXCLUDE_SYMLINKS tag can be used select whether or not files or +# directories that are symbolic links (a Unix filesystem feature) are excluded +# from the input. + +EXCLUDE_SYMLINKS = NO + +# If the value of the INPUT tag contains directories, you can use the +# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude +# certain files from those directories. Note that the wildcards are matched +# against the file with absolute path, so to exclude all test directories +# for example use the pattern */test/* + +EXCLUDE_PATTERNS = + +# The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names +# (namespaces, classes, functions, etc.) that should be excluded from the output. +# The symbol name can be a fully qualified name, a word, or if the wildcard * is used, +# a substring. Examples: ANamespace, AClass, AClass::ANamespace, ANamespace::*Test + +EXCLUDE_SYMBOLS = + +# The EXAMPLE_PATH tag can be used to specify one or more files or +# directories that contain example code fragments that are included (see +# the \include command). + +EXAMPLE_PATH = + +# If the value of the EXAMPLE_PATH tag contains directories, you can use the +# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp +# and *.h) to filter out the source-files in the directories. If left +# blank all files are included. + +EXAMPLE_PATTERNS = + +# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be +# searched for input files to be used with the \include or \dontinclude +# commands irrespective of the value of the RECURSIVE tag. +# Possible values are YES and NO. If left blank NO is used. + +EXAMPLE_RECURSIVE = NO + +# The IMAGE_PATH tag can be used to specify one or more files or +# directories that contain image that are included in the documentation (see +# the \image command). + +IMAGE_PATH = + +# The INPUT_FILTER tag can be used to specify a program that doxygen should +# invoke to filter for each input file. Doxygen will invoke the filter program +# by executing (via popen()) the command , where +# is the value of the INPUT_FILTER tag, and is the name of an +# input file. Doxygen will then use the output that the filter program writes +# to standard output. If FILTER_PATTERNS is specified, this tag will be +# ignored. + +INPUT_FILTER = + +# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern +# basis. Doxygen will compare the file name with each pattern and apply the +# filter if there is a match. The filters are a list of the form: +# pattern=filter (like *.cpp=my_cpp_filter). See INPUT_FILTER for further +# info on how filters are used. If FILTER_PATTERNS is empty, INPUT_FILTER +# is applied to all files. + +FILTER_PATTERNS = + +# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using +# INPUT_FILTER) will be used to filter the input files when producing source +# files to browse (i.e. when SOURCE_BROWSER is set to YES). + +FILTER_SOURCE_FILES = NO + +#--------------------------------------------------------------------------- +# configuration options related to source browsing +#--------------------------------------------------------------------------- + +# If the SOURCE_BROWSER tag is set to YES then a list of source files will +# be generated. Documented entities will be cross-referenced with these sources. +# Note: To get rid of all source code in the generated output, make sure also +# VERBATIM_HEADERS is set to NO. If you have enabled CALL_GRAPH or CALLER_GRAPH +# then you must also enable this option. If you don't then doxygen will produce +# a warning and turn it on anyway + +SOURCE_BROWSER = NO + +# Setting the INLINE_SOURCES tag to YES will include the body +# of functions and classes directly in the documentation. + +INLINE_SOURCES = NO + +# Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct +# doxygen to hide any special comment blocks from generated source code +# fragments. Normal C and C++ comments will always remain visible. + +STRIP_CODE_COMMENTS = YES + +# If the REFERENCED_BY_RELATION tag is set to YES (the default) +# then for each documented function all documented +# functions referencing it will be listed. + +REFERENCED_BY_RELATION = YES + +# If the REFERENCES_RELATION tag is set to YES (the default) +# then for each documented function all documented entities +# called/used by that function will be listed. + +REFERENCES_RELATION = YES + +# If the REFERENCES_LINK_SOURCE tag is set to YES (the default) +# and SOURCE_BROWSER tag is set to YES, then the hyperlinks from +# functions in REFERENCES_RELATION and REFERENCED_BY_RELATION lists will +# link to the source code. Otherwise they will link to the documentstion. + +REFERENCES_LINK_SOURCE = YES + +# If the USE_HTAGS tag is set to YES then the references to source code +# will point to the HTML generated by the htags(1) tool instead of doxygen +# built-in source browser. The htags tool is part of GNU's global source +# tagging system (see http://www.gnu.org/software/global/global.html). You +# will need version 4.8.6 or higher. + +USE_HTAGS = NO + +# If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen +# will generate a verbatim copy of the header file for each class for +# which an include is specified. Set to NO to disable this. + +VERBATIM_HEADERS = YES + +#--------------------------------------------------------------------------- +# configuration options related to the alphabetical class index +#--------------------------------------------------------------------------- + +# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index +# of all compounds will be generated. Enable this if the project +# contains a lot of classes, structs, unions or interfaces. + +ALPHABETICAL_INDEX = NO + +# If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then +# the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns +# in which this list will be split (can be a number in the range [1..20]) + +COLS_IN_ALPHA_INDEX = 5 + +# In case all classes in a project start with a common prefix, all +# classes will be put under the same header in the alphabetical index. +# The IGNORE_PREFIX tag can be used to specify one or more prefixes that +# should be ignored while generating the index headers. + +IGNORE_PREFIX = + +#--------------------------------------------------------------------------- +# configuration options related to the HTML output +#--------------------------------------------------------------------------- + +# If the GENERATE_HTML tag is set to YES (the default) Doxygen will +# generate HTML output. + +GENERATE_HTML = YES + +# The HTML_OUTPUT tag is used to specify where the HTML docs will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `html' will be used as the default path. + +HTML_OUTPUT = html + +# The HTML_FILE_EXTENSION tag can be used to specify the file extension for +# each generated HTML page (for example: .htm,.php,.asp). If it is left blank +# doxygen will generate files with .html extension. + +HTML_FILE_EXTENSION = .html + +# The HTML_HEADER tag can be used to specify a personal HTML header for +# each generated HTML page. If it is left blank doxygen will generate a +# standard header. + +HTML_HEADER = + +# The HTML_FOOTER tag can be used to specify a personal HTML footer for +# each generated HTML page. If it is left blank doxygen will generate a +# standard footer. + +HTML_FOOTER = + +# The HTML_STYLESHEET tag can be used to specify a user-defined cascading +# style sheet that is used by each HTML page. It can be used to +# fine-tune the look of the HTML output. If the tag is left blank doxygen +# will generate a default style sheet. Note that doxygen will try to copy +# the style sheet file to the HTML output directory, so don't put your own +# stylesheet in the HTML output directory as well, or it will be erased! + +HTML_STYLESHEET = + +# If the HTML_ALIGN_MEMBERS tag is set to YES, the members of classes, +# files or namespaces will be aligned in HTML using tables. If set to +# NO a bullet list will be used. + +HTML_ALIGN_MEMBERS = YES + +# If the GENERATE_HTMLHELP tag is set to YES, additional index files +# will be generated that can be used as input for tools like the +# Microsoft HTML help workshop to generate a compressed HTML help file (.chm) +# of the generated HTML documentation. + +GENERATE_HTMLHELP = NO + +# If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML +# documentation will contain sections that can be hidden and shown after the +# page has loaded. For this to work a browser that supports +# JavaScript and DHTML is required (for instance Mozilla 1.0+, Firefox +# Netscape 6.0+, Internet explorer 5.0+, Konqueror, or Safari). + +HTML_DYNAMIC_SECTIONS = NO + +# If the GENERATE_HTMLHELP tag is set to YES, the CHM_FILE tag can +# be used to specify the file name of the resulting .chm file. You +# can add a path in front of the file if the result should not be +# written to the html output directory. + +CHM_FILE = + +# If the GENERATE_HTMLHELP tag is set to YES, the HHC_LOCATION tag can +# be used to specify the location (absolute path including file name) of +# the HTML help compiler (hhc.exe). If non-empty doxygen will try to run +# the HTML help compiler on the generated index.hhp. + +HHC_LOCATION = + +# If the GENERATE_HTMLHELP tag is set to YES, the GENERATE_CHI flag +# controls if a separate .chi index file is generated (YES) or that +# it should be included in the master .chm file (NO). + +GENERATE_CHI = NO + +# If the GENERATE_HTMLHELP tag is set to YES, the BINARY_TOC flag +# controls whether a binary table of contents is generated (YES) or a +# normal table of contents (NO) in the .chm file. + +BINARY_TOC = NO + +# The TOC_EXPAND flag can be set to YES to add extra items for group members +# to the contents of the HTML help documentation and to the tree view. + +TOC_EXPAND = NO + +# The DISABLE_INDEX tag can be used to turn on/off the condensed index at +# top of each HTML page. The value NO (the default) enables the index and +# the value YES disables it. + +DISABLE_INDEX = NO + +# This tag can be used to set the number of enum values (range [1..20]) +# that doxygen will group on one line in the generated HTML documentation. + +ENUM_VALUES_PER_LINE = 4 + +# If the GENERATE_TREEVIEW tag is set to YES, a side panel will be +# generated containing a tree-like index structure (just like the one that +# is generated for HTML Help). For this to work a browser that supports +# JavaScript, DHTML, CSS and frames is required (for instance Mozilla 1.0+, +# Netscape 6.0+, Internet explorer 5.0+, or Konqueror). Windows users are +# probably better off using the HTML help feature. + +GENERATE_TREEVIEW = NO + +# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be +# used to set the initial width (in pixels) of the frame in which the tree +# is shown. + +TREEVIEW_WIDTH = 250 + +#--------------------------------------------------------------------------- +# configuration options related to the LaTeX output +#--------------------------------------------------------------------------- + +# If the GENERATE_LATEX tag is set to YES (the default) Doxygen will +# generate Latex output. + +GENERATE_LATEX = YES + +# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `latex' will be used as the default path. + +LATEX_OUTPUT = latex + +# The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be +# invoked. If left blank `latex' will be used as the default command name. + +LATEX_CMD_NAME = latex + +# The MAKEINDEX_CMD_NAME tag can be used to specify the command name to +# generate index for LaTeX. If left blank `makeindex' will be used as the +# default command name. + +MAKEINDEX_CMD_NAME = makeindex + +# If the COMPACT_LATEX tag is set to YES Doxygen generates more compact +# LaTeX documents. This may be useful for small projects and may help to +# save some trees in general. + +COMPACT_LATEX = NO + +# The PAPER_TYPE tag can be used to set the paper type that is used +# by the printer. Possible values are: a4, a4wide, letter, legal and +# executive. If left blank a4wide will be used. + +PAPER_TYPE = a4wide + +# The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX +# packages that should be included in the LaTeX output. + +EXTRA_PACKAGES = + +# The LATEX_HEADER tag can be used to specify a personal LaTeX header for +# the generated latex document. The header should contain everything until +# the first chapter. If it is left blank doxygen will generate a +# standard header. Notice: only use this tag if you know what you are doing! + +LATEX_HEADER = + +# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated +# is prepared for conversion to pdf (using ps2pdf). The pdf file will +# contain links (just like the HTML output) instead of page references +# This makes the output suitable for online browsing using a pdf viewer. + +PDF_HYPERLINKS = NO + +# If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of +# plain latex in the generated Makefile. Set this option to YES to get a +# higher quality PDF documentation. + +USE_PDFLATEX = NO + +# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode. +# command to the generated LaTeX files. This will instruct LaTeX to keep +# running if errors occur, instead of asking the user for help. +# This option is also used when generating formulas in HTML. + +LATEX_BATCHMODE = NO + +# If LATEX_HIDE_INDICES is set to YES then doxygen will not +# include the index chapters (such as File Index, Compound Index, etc.) +# in the output. + +LATEX_HIDE_INDICES = NO + +#--------------------------------------------------------------------------- +# configuration options related to the RTF output +#--------------------------------------------------------------------------- + +# If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output +# The RTF output is optimized for Word 97 and may not look very pretty with +# other RTF readers or editors. + +GENERATE_RTF = NO + +# The RTF_OUTPUT tag is used to specify where the RTF docs will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `rtf' will be used as the default path. + +RTF_OUTPUT = rtf + +# If the COMPACT_RTF tag is set to YES Doxygen generates more compact +# RTF documents. This may be useful for small projects and may help to +# save some trees in general. + +COMPACT_RTF = NO + +# If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated +# will contain hyperlink fields. The RTF file will +# contain links (just like the HTML output) instead of page references. +# This makes the output suitable for online browsing using WORD or other +# programs which support those fields. +# Note: wordpad (write) and others do not support links. + +RTF_HYPERLINKS = NO + +# Load stylesheet definitions from file. Syntax is similar to doxygen's +# config file, i.e. a series of assignments. You only have to provide +# replacements, missing definitions are set to their default value. + +RTF_STYLESHEET_FILE = + +# Set optional variables used in the generation of an rtf document. +# Syntax is similar to doxygen's config file. + +RTF_EXTENSIONS_FILE = + +#--------------------------------------------------------------------------- +# configuration options related to the man page output +#--------------------------------------------------------------------------- + +# If the GENERATE_MAN tag is set to YES (the default) Doxygen will +# generate man pages + +GENERATE_MAN = YES + +# The MAN_OUTPUT tag is used to specify where the man pages will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `man' will be used as the default path. + +MAN_OUTPUT = man + +# The MAN_EXTENSION tag determines the extension that is added to +# the generated man pages (default is the subroutine's section .3) + +MAN_EXTENSION = .3 + +# If the MAN_LINKS tag is set to YES and Doxygen generates man output, +# then it will generate one additional man file for each entity +# documented in the real man page(s). These additional files +# only source the real man page, but without them the man command +# would be unable to find the correct page. The default is NO. + +MAN_LINKS = NO + +#--------------------------------------------------------------------------- +# configuration options related to the XML output +#--------------------------------------------------------------------------- + +# If the GENERATE_XML tag is set to YES Doxygen will +# generate an XML file that captures the structure of +# the code including all documentation. + +GENERATE_XML = NO + +# The XML_OUTPUT tag is used to specify where the XML pages will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `xml' will be used as the default path. + +XML_OUTPUT = xml + +# The XML_SCHEMA tag can be used to specify an XML schema, +# which can be used by a validating XML parser to check the +# syntax of the XML files. + +XML_SCHEMA = + +# The XML_DTD tag can be used to specify an XML DTD, +# which can be used by a validating XML parser to check the +# syntax of the XML files. + +XML_DTD = + +# If the XML_PROGRAMLISTING tag is set to YES Doxygen will +# dump the program listings (including syntax highlighting +# and cross-referencing information) to the XML output. Note that +# enabling this will significantly increase the size of the XML output. + +XML_PROGRAMLISTING = YES + +#--------------------------------------------------------------------------- +# configuration options for the AutoGen Definitions output +#--------------------------------------------------------------------------- + +# If the GENERATE_AUTOGEN_DEF tag is set to YES Doxygen will +# generate an AutoGen Definitions (see autogen.sf.net) file +# that captures the structure of the code including all +# documentation. Note that this feature is still experimental +# and incomplete at the moment. + +GENERATE_AUTOGEN_DEF = NO + +#--------------------------------------------------------------------------- +# configuration options related to the Perl module output +#--------------------------------------------------------------------------- + +# If the GENERATE_PERLMOD tag is set to YES Doxygen will +# generate a Perl module file that captures the structure of +# the code including all documentation. Note that this +# feature is still experimental and incomplete at the +# moment. + +GENERATE_PERLMOD = NO + +# If the PERLMOD_LATEX tag is set to YES Doxygen will generate +# the necessary Makefile rules, Perl scripts and LaTeX code to be able +# to generate PDF and DVI output from the Perl module output. + +PERLMOD_LATEX = NO + +# If the PERLMOD_PRETTY tag is set to YES the Perl module output will be +# nicely formatted so it can be parsed by a human reader. This is useful +# if you want to understand what is going on. On the other hand, if this +# tag is set to NO the size of the Perl module output will be much smaller +# and Perl will parse it just the same. + +PERLMOD_PRETTY = YES + +# The names of the make variables in the generated doxyrules.make file +# are prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. +# This is useful so different doxyrules.make files included by the same +# Makefile don't overwrite each other's variables. + +PERLMOD_MAKEVAR_PREFIX = + +#--------------------------------------------------------------------------- +# Configuration options related to the preprocessor +#--------------------------------------------------------------------------- + +# If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will +# evaluate all C-preprocessor directives found in the sources and include +# files. + +ENABLE_PREPROCESSING = YES + +# If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro +# names in the source code. If set to NO (the default) only conditional +# compilation will be performed. Macro expansion can be done in a controlled +# way by setting EXPAND_ONLY_PREDEF to YES. + +MACRO_EXPANSION = NO + +# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES +# then the macro expansion is limited to the macros specified with the +# PREDEFINED and EXPAND_AS_DEFINED tags. + +EXPAND_ONLY_PREDEF = NO + +# If the SEARCH_INCLUDES tag is set to YES (the default) the includes files +# in the INCLUDE_PATH (see below) will be search if a #include is found. + +SEARCH_INCLUDES = YES + +# The INCLUDE_PATH tag can be used to specify one or more directories that +# contain include files that are not input files but should be processed by +# the preprocessor. + +INCLUDE_PATH = + +# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard +# patterns (like *.h and *.hpp) to filter out the header-files in the +# directories. If left blank, the patterns specified with FILE_PATTERNS will +# be used. + +INCLUDE_FILE_PATTERNS = + +# The PREDEFINED tag can be used to specify one or more macro names that +# are defined before the preprocessor is started (similar to the -D option of +# gcc). The argument of the tag is a list of macros of the form: name +# or name=definition (no spaces). If the definition and the = are +# omitted =1 is assumed. To prevent a macro definition from being +# undefined via #undef or recursively expanded use the := operator +# instead of the = operator. + +PREDEFINED = + +# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then +# this tag can be used to specify a list of macro names that should be expanded. +# The macro definition that is found in the sources will be used. +# Use the PREDEFINED tag if you want to use a different macro definition. + +EXPAND_AS_DEFINED = + +# If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then +# doxygen's preprocessor will remove all function-like macros that are alone +# on a line, have an all uppercase name, and do not end with a semicolon. Such +# function macros are typically used for boiler-plate code, and will confuse +# the parser if not removed. + +SKIP_FUNCTION_MACROS = YES + +#--------------------------------------------------------------------------- +# Configuration::additions related to external references +#--------------------------------------------------------------------------- + +# The TAGFILES option can be used to specify one or more tagfiles. +# Optionally an initial location of the external documentation +# can be added for each tagfile. The format of a tag file without +# this location is as follows: +# TAGFILES = file1 file2 ... +# Adding location for the tag files is done as follows: +# TAGFILES = file1=loc1 "file2 = loc2" ... +# where "loc1" and "loc2" can be relative or absolute paths or +# URLs. If a location is present for each tag, the installdox tool +# does not have to be run to correct the links. +# Note that each tag file must have a unique name +# (where the name does NOT include the path) +# If a tag file is not located in the directory in which doxygen +# is run, you must also specify the path to the tagfile here. + +TAGFILES = + +# When a file name is specified after GENERATE_TAGFILE, doxygen will create +# a tag file that is based on the input files it reads. + +GENERATE_TAGFILE = + +# If the ALLEXTERNALS tag is set to YES all external classes will be listed +# in the class index. If set to NO only the inherited external classes +# will be listed. + +ALLEXTERNALS = NO + +# If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed +# in the modules index. If set to NO, only the current project's groups will +# be listed. + +EXTERNAL_GROUPS = YES + +# The PERL_PATH should be the absolute path and name of the perl script +# interpreter (i.e. the result of `which perl'). + +PERL_PATH = /usr/bin/perl + +#--------------------------------------------------------------------------- +# Configuration options related to the dot tool +#--------------------------------------------------------------------------- + +# If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will +# generate a inheritance diagram (in HTML, RTF and LaTeX) for classes with base +# or super classes. Setting the tag to NO turns the diagrams off. Note that +# this option is superseded by the HAVE_DOT option below. This is only a +# fallback. It is recommended to install and use dot, since it yields more +# powerful graphs. + +CLASS_DIAGRAMS = YES + +# You can define message sequence charts within doxygen comments using the \msc +# command. Doxygen will then run the mscgen tool (see http://www.mcternan.me.uk/mscgen/) to +# produce the chart and insert it in the documentation. The MSCGEN_PATH tag allows you to +# specify the directory where the mscgen tool resides. If left empty the tool is assumed to +# be found in the default search path. + +MSCGEN_PATH = + +# If set to YES, the inheritance and collaboration graphs will hide +# inheritance and usage relations if the target is undocumented +# or is not a class. + +HIDE_UNDOC_RELATIONS = YES + +# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is +# available from the path. This tool is part of Graphviz, a graph visualization +# toolkit from AT&T and Lucent Bell Labs. The other options in this section +# have no effect if this option is set to NO (the default) + +HAVE_DOT = YES + +# If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen +# will generate a graph for each documented class showing the direct and +# indirect inheritance relations. Setting this tag to YES will force the +# the CLASS_DIAGRAMS tag to NO. + +CLASS_GRAPH = YES + +# If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen +# will generate a graph for each documented class showing the direct and +# indirect implementation dependencies (inheritance, containment, and +# class references variables) of the class with other documented classes. + +COLLABORATION_GRAPH = YES + +# If the GROUP_GRAPHS and HAVE_DOT tags are set to YES then doxygen +# will generate a graph for groups, showing the direct groups dependencies + +GROUP_GRAPHS = YES + +# If the UML_LOOK tag is set to YES doxygen will generate inheritance and +# collaboration diagrams in a style similar to the OMG's Unified Modeling +# Language. + +UML_LOOK = NO + +# If set to YES, the inheritance and collaboration graphs will show the +# relations between templates and their instances. + +TEMPLATE_RELATIONS = NO + +# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT +# tags are set to YES then doxygen will generate a graph for each documented +# file showing the direct and indirect include dependencies of the file with +# other documented files. + +INCLUDE_GRAPH = YES + +# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and +# HAVE_DOT tags are set to YES then doxygen will generate a graph for each +# documented header file showing the documented files that directly or +# indirectly include this file. + +INCLUDED_BY_GRAPH = YES + +# If the CALL_GRAPH, SOURCE_BROWSER and HAVE_DOT tags are set to YES then doxygen will +# generate a call dependency graph for every global function or class method. +# Note that enabling this option will significantly increase the time of a run. +# So in most cases it will be better to enable call graphs for selected +# functions only using the \callgraph command. + +CALL_GRAPH = NO + +# If the CALLER_GRAPH, SOURCE_BROWSER and HAVE_DOT tags are set to YES then doxygen will +# generate a caller dependency graph for every global function or class method. +# Note that enabling this option will significantly increase the time of a run. +# So in most cases it will be better to enable caller graphs for selected +# functions only using the \callergraph command. + +CALLER_GRAPH = NO + +# If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen +# will graphical hierarchy of all classes instead of a textual one. + +GRAPHICAL_HIERARCHY = YES + +# If the DIRECTORY_GRAPH, SHOW_DIRECTORIES and HAVE_DOT tags are set to YES +# then doxygen will show the dependencies a directory has on other directories +# in a graphical way. The dependency relations are determined by the #include +# relations between the files in the directories. + +DIRECTORY_GRAPH = YES + +# The DOT_IMAGE_FORMAT tag can be used to set the image format of the images +# generated by dot. Possible values are png, jpg, or gif +# If left blank png will be used. + +DOT_IMAGE_FORMAT = png + +# The tag DOT_PATH can be used to specify the path where the dot tool can be +# found. If left blank, it is assumed the dot tool can be found in the path. + +DOT_PATH = /usr/bin/ + +# The DOTFILE_DIRS tag can be used to specify one or more directories that +# contain dot files that are included in the documentation (see the +# \dotfile command). + +DOTFILE_DIRS = + +# The MAX_DOT_GRAPH_MAX_NODES tag can be used to set the maximum number of +# nodes that will be shown in the graph. If the number of nodes in a graph +# becomes larger than this value, doxygen will truncate the graph, which is +# visualized by representing a node as a red box. Note that doxygen if the number +# of direct children of the root node in a graph is already larger than +# MAX_DOT_GRAPH_NOTES then the graph will not be shown at all. Also note +# that the size of a graph can be further restricted by MAX_DOT_GRAPH_DEPTH. + +DOT_GRAPH_MAX_NODES = 50 + +# The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the +# graphs generated by dot. A depth value of 3 means that only nodes reachable +# from the root by following a path via at most 3 edges will be shown. Nodes +# that lay further from the root node will be omitted. Note that setting this +# option to 1 or 2 may greatly reduce the computation time needed for large +# code bases. Also note that the size of a graph can be further restricted by +# DOT_GRAPH_MAX_NODES. Using a depth of 0 means no depth restriction. + +MAX_DOT_GRAPH_DEPTH = 0 + +# Set the DOT_TRANSPARENT tag to YES to generate images with a transparent +# background. This is disabled by default, which results in a white background. +# Warning: Depending on the platform used, enabling this option may lead to +# badly anti-aliased labels on the edges of a graph (i.e. they become hard to +# read). + +DOT_TRANSPARENT = NO + +# Set the DOT_MULTI_TARGETS tag to YES allow dot to generate multiple output +# files in one run (i.e. multiple -o and -T options on the command line). This +# makes dot run faster, but since only newer versions of dot (>1.8.10) +# support this, this feature is disabled by default. + +DOT_MULTI_TARGETS = NO + +# If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will +# generate a legend page explaining the meaning of the various boxes and +# arrows in the dot generated graphs. + +GENERATE_LEGEND = YES + +# If the DOT_CLEANUP tag is set to YES (the default) Doxygen will +# remove the intermediate dot files that are used to generate +# the various graphs. + +DOT_CLEANUP = YES + +#--------------------------------------------------------------------------- +# Configuration::additions related to the search engine +#--------------------------------------------------------------------------- + +# The SEARCHENGINE tag specifies whether or not a search engine should be +# used. If set to NO the values of all tags below this one will be ignored. + +SEARCHENGINE = NO diff --git a/clan/doc/Makefile.am b/clan/doc/Makefile.am new file mode 100644 index 0000000..96a36c9 --- /dev/null +++ b/clan/doc/Makefile.am @@ -0,0 +1,92 @@ +# +# /**------- <| --------------------------------------------------------** +# ** A Clan ** +# **--- /.\ -----------------------------------------------------** +# ** <| [""M# makefile.am ** +# **- A | # -----------------------------------------------------** +# ** /.\ [""M# First version: 30/04/2008 ** +# **- [""M# | # U"U#U -----------------------------------------------** +# | # | # \ .:/ +# | # | #___| # +# ****** | "--' .-" ***************************************************** +# * |"-"-"-"-"-#-#-## Clan : the Chunky Loop Analyser (experimental) * +# **** | # ## ###### **************************************************** +# * \ .::::'/ * +# * \ ::::'/ Copyright (C) 2008 Cedric Bastoul * +# * :8a| # # ## * +# * ::88a ### This is free software; you can redistribute it * +# * ::::888a 8a ##::. and/or modify it under the terms of the GNU * +# * ::::::::888a88a[]::: Lesser General Public License as published by * +# *::8:::::::::SUNDOGa8a::. the Free Software Foundation, either version 3 of * +# *::::::::8::::888:Y8888:: the License, or (at your option) * +# *::::':::88::::888::Y88a::::::::::::... any later version. * +# *::'::.. . ..... .. ... . * +# * This software is distributed in the hope that it will be useful, but * +# * WITHOUT ANY WARRANTY; without even the implied warranty of * +# * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General * +# * Public License for more details. * +# * * +# * You should have received a copy of the GNU Lesser General Public * +# * License along with software; if not, write to the Free Software * +# * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * +# * * +# * Clan, the Chunky Loop Analyser * +# * Written by Cedric Bastoul, Cedric.Bastoul@inria.fr * +# * * +# *****************************************************************************/ +# +# Makefile.am (or makefile if generated) of Clan, the Chunky Loop Analyser. +# Makefile.am is not a makefile, you must run the 'autogen.sh' THEN the +# configure shellscript to generate the Makefile thanks to this file. + + + +############################################################################# +SUBDIRS = + +############################################################################# + +MAINTAINERCLEANFILES = Makefile.in + +EXTRA_DIST = \ + htmldoc.tar.gz \ + clan.pdf \ + S4.cloog \ + ascii-art.txt \ + images/basic.eps \ + images/basic.fig \ + images/basic.jpg \ + images/basic.pdf \ + images/basic.txt \ + images/basic1.eps \ + images/basic1.fig \ + images/basic1.jpg \ + images/basic1.pdf \ + images/basic1.txt \ + images/basic2.eps \ + images/basic2.fig \ + images/basic2.jpg \ + images/basic2.pdf \ + images/basic2.txt \ + images/tree.eps \ + images/tree.fig \ + images/tree.jpg \ + images/tree.pdf \ + images/tree.txt + + +info_TEXINFOS = clan.texi + +DOCDIR = htmldoc +DOXYFILE = Doxyfile +DOXYGEN = @DOXYGEN@ + +# The following requires a fixed version of the Emacs 19.30 etags. +ETAGS_ARGS = --lang=none \ + --regex='/^@node[ \t]+\([^,]+\)/\1/' $(srcdir)/doc/clan.texi +TAGS_DEPENDENCIES = clan.texi $(DOXYFILE).in + +htmldoc.tar.gz: + mkdir -p $(top_srcdir)/doc/htmldoc + $(DOXYGEN) $(DOXYFILE) + tar czf htmldoc.tar.gz htmldoc diff --git a/clan/doc/S4.cloog b/clan/doc/S4.cloog new file mode 100644 index 0000000..1524381 --- /dev/null +++ b/clan/doc/S4.cloog @@ -0,0 +1,44 @@ +# language: C +c + +# no parameters +0 2 +0 + +1 # One statement + +1 +# D = {i, j | 2<=i<=4 2<=j<=4} +4 4 +# i j 1 +1 1 0 -2 +1 -1 0 4 +1 0 1 -2 +1 0 -1 4 +0 0 0 +0 + +1 # Scattering function + +# T = (j+2,3i+j) +2 6 +# t1 t2 i j 1 +0 1 0 0 -1 0 +0 0 1 -1 0 0 + +1 +t1 t2 + +############################# + + +# T = (j,i) +2 6 +# t1 t2 i j 1 +0 1 0 0 -1 0 +0 0 1 -1 0 0 + +2 6 +# t1 t2 i j 1 +0 1 0 0 -1 -2 +0 0 1 -3 -1 0 diff --git a/clan/doc/ascii-art.txt b/clan/doc/ascii-art.txt new file mode 100644 index 0000000..dd56019 --- /dev/null +++ b/clan/doc/ascii-art.txt @@ -0,0 +1,25 @@ + <| + A + /.\ + <| [""M# + A | # + /.\ [""M# + [""M# | # U"U#U + | # | # \ .:/ + | # | #___| # + | "--' .-" + |"-"-"-"-"-#-#-## + | # ## ###### + \ .::::'/ + \ ::::'/ + :8a| # # ## + ::88a ### + ::::888a 8a ##::. + ::::::888a88a[]:::: + :::::::::SUNDOGa8a::::. .. + :::::8::::888:Y8888:::::::::... +::':::88::::888::Y88a______________________________________________________ +:: ::::88a::::88a:Y88a __---__-- __ +' .: ::Y88a:::::8a:Y88a __----_-- -------_-__ + :' ::::8P::::::::::88aa. _ _- -- --_ --- __ --- __-- +.:: :::::::::::::::::::Y88as88a...s88aa. diff --git a/clan/doc/clan.info b/clan/doc/clan.info new file mode 100644 index 0000000..89d2aa5 --- /dev/null +++ b/clan/doc/clan.info @@ -0,0 +1,2130 @@ +This is clan.info, produced by makeinfo version 4.11 from clan.texi. + +This manual is for Clan version 1.0.0, a software which extracts the +polyhedral representation of some parts of high level programs written +in C, C++, C# or Java. + + It would be quite kind to refer the following paper in any +publication that results from the use of the Clan software or its +library (the reason to cite it is, amongst many other interesting +things, it defines what is a _SCoP_, or _static control part_): + + @InProceedings{Bas03, + author = {C\'edric Bastoul and Albert Cohen and Sylvain Girbal and + Saurabh Sharma and Olivier Temam}, + title = {Putting Polyhedral Loop Transformations to Work}, + booktitle = {LCPC'16 International Workshop on Languages and + Compilers for Parallel Computers, LNCS 2958}, + pages = {209--225}, + month = {october}, + year = 2003, + address = {College Station, Texas} + } + + Copyright (C) 2008 Ce'dric Bastoul. + + Permission is granted to copy, distribute and/or modify this +document under the terms of the GNU Free Documentation License, Version +1.2 published by the Free Software Foundation. To receive a copy of the +GNU Free Documentation License, write to the Free Software Foundation, +Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. + + +File: clan.info, Node: Top, Next: Introduction, Up: (dir) + +CLooG +***** + +This manual is for Clan version 1.0.0, a software which extracts the +polyhedral representation of some parts of high level programs written +in C, C++, C# or Java. + + It would be quite kind to refer the following paper in any +publication that results from the use of the Clan software or its +library (the reason to cite it is, amongst many other interesting +things, it defines what is a _SCoP_, or _static control part_): + + @InProceedings{Bas03, + author = {C\'edric Bastoul and Albert Cohen and Sylvain Girbal and + Saurabh Sharma and Olivier Temam}, + title = {Putting Polyhedral Loop Transformations to Work}, + booktitle = {LCPC'16 International Workshop on Languages and + Compilers for Parallel Computers, LNCS 2958}, + pages = {209--225}, + month = {october}, + year = 2003, + address = {College Station, Texas} + } + + Copyright (C) 2008 Ce'dric Bastoul. + + Permission is granted to copy, distribute and/or modify this +document under the terms of the GNU Free Documentation License, Version +1.2 published by the Free Software Foundation. To receive a copy of the +GNU Free Documentation License, write to the Free Software Foundation, +Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. + +* Menu: + +* Introduction:: +* Polyhedral Representation:: +* Clan Software:: +* Clan Library:: +* Installing:: +* Documentation:: +* References:: + + +File: clan.info, Node: Introduction, Next: Polyhedral Representation, Prev: Top, Up: Top + +1 Introduction +************** + +Clan is a free software and library that translates some particular +parts of high level programs written in C, C++, C# or Java into a +polyhedral representation. This representation may be manipulated by +other tools to, e.g., achieve complex program restructurations (for +optimization, parallelization or any other kind of manipulation). It +has been created to avoid tedious and error-prone input file writing +for polyhedral tools (such as CLooG, LeTSeE, Candl etc.). Using Clan, +the user has to deal with source codes based on C grammar only (as C, +C++, C# or Java). + + Clan stands for _Chunky Loop ANalyzer_: it is a part of the Chunky +project, a research tool for data locality improvement (*note Bas03a::). +It is designed to be the front-end of any source-to-source automatic +optimizers and/or parallelizers. + + Clan is a very basic tool since it is only a translator from a given +program representation to another representation. Nevertheless the +current version is still under evaluation, and there is no guarantee +that the upward compatibility will be respected. A lot of reports are +necessary to freeze the library API and the input/output file shapes. +The current output file format has been designed after discussions +between several compilation researchers from various institutions. Thus +you are very welcome and encouraged to send reports on bugs, wishes, +critics, comments, suggestions or (please !) successful experiences to +cedric.bastoul@inria.fr. + + +File: clan.info, Node: Polyhedral Representation, Next: Clan Software, Prev: Introduction, Up: Top + +2 Polyhedral Representation of Programs +*************************************** + +If you are reading the Clan's user manual, you probably don't need any +explanation about the Polyhedral Model. It's unlikely someone will read +this manual by chance. However some vicious advisor may ask their poor +engineers/interns/students to work for the very first time on this +exciting topic. Most papers on Polyhedral Compilation are hard to read. +Despite my efforts, mine are no exception according to some +reviewers... Hence I give there a new try to provide a comprehensive +explanation of the polyhedral model without the size and style limits +of a classical research paper. + + Be aware that to be able to understand the Polyhedral Model, there +are few prerequisites. You should not read the following while you +still ignore what is: + * a `for' loop construction in C programs, + + * an _affine expression_, + + * a _vector_, + + * a _matrix_, + + * a _matrix-vector multiply_. + +* Menu: + +* Motivation:: +* Thinking in Polyhedra:: + + +File: clan.info, Node: Motivation, Next: Thinking in Polyhedra, Up: Polyhedral Representation + +2.1 Motivation: Program Transformations +======================================= + +A direct translation of high level programs written, e.g., in C to +assembly then object code is likely to produce (very) inefficient +applications. Architectures are quite complex, including several +levels of cache memory, many cores, deep pipelines, various number of +functionnal units, of registers etc. The list of such "architectural +features" is growing with each new generation of processors. To +achieve the best performance, the object program must do a smart use of +these features. Programmers use high level languages for productivity +and portability: typically they do not have to take care of the target +architecture but to ensure they do write programs that produce the +right output. Hence, the problem of mapping the program to the target +architecture in the most efficient way is left to the compiler. + + The compiler may see a high level program as a specification _of an +output_. The program is a list of operations to be executed to produce +the output. As long as the output is guaranteed to be as the programmer +specified in his code, the compiler is free to modify the program. For +instance, let us imagine we are working on an architecture with only +three registers and we consider the following statements written by a +programmer: + + x = a + b; + y = c + d; + z = a * b; + + It is easy to see that we can reorder the three statements in any +way without modifying the semantics (no statement reads or writes a +variable that another statement writes). Because of the lack of +registers, the solutions such that the first and the third statements +are one after the other are better because `a' and `b' will be put in +the processor registers by one statement and can be reused directly by +the other one without reading to memory (this is called a _data locality +improving_ transformation). Hence a better statement order is, e.g.: + + x = a + b; + z = a * b; // a and b are still in processor registers + y = c + d; + + We could also notice that it is possible to run the three statements +in parallel and explicit this in the way the compiler and/or the +architecture is able to understand. Here we use OpenMP to describe +parallelism. It is supported in GCC since 4.2 version (this is called a +_parallelizing_ transformation): + + #pragma omp parallel sections + { + #pragma omp section + { + x = a + b; + } + #pragma omp section + { + y = c + d; + } + #pragma omp section + { + z = a * b; + } + } + + However, the right way to optimize this program is probably a mix of +these two techniques, especially if the target architecture have some +limitations to run too many operations in parallel: + + #pragma omp parallel sections + { + #pragma omp section + { + x = a + b; + z = a * b; + } + #pragma omp section + { + y = c + d; + } + } + + Such transformations are quite trivial. The reason is the statements +are executed only once. The real sport begins when we have to deal with +loops as we will see momentarily. However, Clan users have to be +conscious that we _need_ to transform programs to achieve the best +performance and that the best transformation that have to be discovered +(with often many, many efforts) and performed may be quite complex. +Hence the need of powerful model and tools (Who said Polyhedral Model +and CLooG ? Right !). + + +File: clan.info, Node: Thinking in Polyhedra, Prev: Motivation, Up: Polyhedral Representation + +2.2 Thinking in Polyhedra +========================= + +Since the very first compilers, the internal representation of programs +is the _Abstract Syntax Tree_, or AST. In such representation, each +statement appears only once even if it is executed many times (e.g., +when it is enclosed inside a loop). + +*This is a limitation for program analysis.* For instance if a +statement _depends_ on another statement (i.e., they access the same +memory location and at least one of these accesses is a write), we will +consider both statements as unique entities while the dependence +relation may involve only few statement executions. + +*This is a limitation for program transformations.* Loop +transformations operate on statement executions. For instance, because +they consider all statement executions at the same time, present day +production compilers are not able to achieve loop fusion (that tries to +merge the loop bodies of two loops) if the loop bounds of the two loops +do not match. + +*This is a limitation for program manipulation flexibility.* Trees are +very rigid data structures that are not easy to manipulate. Program +transformation may require very complex transformations that will imply +deep modifications of the control flow. Hence, for complex program +restructuration, the need for a more precise, more flexible +representation. + + The Polyhedral Model is a convenient alternative representation which +combines analysis power, expressiveness and high flexibility. The +drawback is it breaks the classical structure of programs that every +programmer is familiar with. It requires some (real) efforts to be +smoothly manipulated, but it definitely worth it. It is based on three +main concepts, _iteration domain_, _scattering function_ and _access +function_ that are described in depth in the following sections. + + A program part that can be represented using the Polyhedral Model is +called a *Static Control Part* or *SCoP* for short. + +* Menu: + +* Iteration Domain:: +* Scattering Function:: +* Access Function:: + + +File: clan.info, Node: Iteration Domain, Next: Scattering Function, Up: Thinking in Polyhedra + +2.2.1 Iteration Domain +---------------------- + +The key aspect of the Polyhedral Model is to consider _statement +instances_. A statement instance is _one_ execution of a statement. A +statement outside a loop has only one instance while those inside loops +may have many. Let us consider the following code with two statements +`S1' and `S2': + + pi = 3.14; // S1 + for (i = 0; i < 5; i++) + A[i] = pi; // S2 + + The list of statement instances is the following (we just have to +fully unroll the loop): + + pi = 3.14; + A[0] = x; + A[1] = x; + A[2] = x; + A[3] = x; + A[4] = x; + + Each instance of a statement which is enclosed inside a loop may be +referred thanks to its outer loop counters (or _iterators_). In the +Polyhedral Model we consider statements as functions of the outer loop +counters that may produce statement instances: instead of simply +"`S2'", we use preferably the notation `S2(i)'. For instance we +denote the statement instance `A[3] = x;' of the previous example as +`S2(3)'. This means _instance of statement `S2' for_ `i = 3'. If a +statement `S3' is enclosed inside two loops of iterators `i' (outermost +loop) and `j' (innermost loop), we would denote it `S3(i,j)', and so on +with more enclosing loops. + + The ordered list of iterators (ordered from the outermost iterator +to the innermost iterator) is called the *iteration vector*. For +instance the iteration vector for `S3' is `(i,j)', for `S2' it is +`(i)', and for `S1' it is empty since it has no enclosing loop: `()'. A +more precise reading at the notation `S2(3)' would show that it denotes +the instance of statement `S2' for the iteration vector `(2)'. + + Obviously, dealing with statement instances does not mean we have to +unroll all loops. First because there would be probably too many +instances to deal with, and second because we probably just don't know +how many instances there are. For instance in the following loop it is +not possible to know (at compile time) how many times the statement +`S3' will be executed: + + for (i = 2; i <= N; i++) + for (j = 2; j <= N; j++) + A[i] = pi; // S3 + +Such a loop is said to be _parametric_: it depends on (at least) a +value called a _parameter_ which is not modified during the execution +of the whole loop, but is unknown at compile time. Here the only +parameter is `N'. + + A compact way to represent all the instances of a given statement is +to consider the set of all possible values of its iteration vector. +This set is called the *iteration domain*. It can be conveniently +described thanks to all the constraints on the various iterator the +statement depends on. For instance, let us consider the statement `S3' +of the previous program. The iteration domain is the set of iteration +vectors `(i,j)'. Because of the parameter, we are not able to achieve a +precise list of all possible values, it would look like this: + + (2,2) (2,3) (2,4) ... (2,N) + (3,2) (3,3) (3,4) ... (3,N) + ... ... ... ... ... + (N,2) (N,3) (N,4) ... (N,N) + +A better way is to say it is the set of iteration vectors `(i,j)' such +that `i' is an integer greater or equal than 2 and lower or equal than +`N', and `j' is an integer greater or equal than 2 and lower or equal +than `N'. This may be written in the following mathematical form: + + D_S3 = {(i,j) in Z^2 | 2 <= i <= N && 2 <= j <= N } + +It is easy to see that this iteration domain is a part of the +2-dimensional space + Z^2. +We often use in our research papers a graphical representation that +gives a better view of this subspace: + +[image src="images/basic1.jpg" text=" j^ i>=2 i<=N + | | | + | | | +N-+-********--j<=N + | ******** + | ******** + | ******** +2-+-********--j>=2 + | | | +0-+-+------+--->i + | | | + 0 2 N +"] + +Here the iteration domain is specified thanks to a set of constraints. +When those constraints are affine and depend only on the outer loop +counters and some parameters, the set of constraints defines a +_polyhedron_ (more precisely this is a _Z-polyhedron_, but we use +_polyhedron_ for short). Hence the Polyhedral Model. + + To facilitate the manipulation of the affine constraints, we use a +matrix representation. To write it, we use the _homogeneous_ iteration +vector: it is simply the iteration vector with some additional +dimensions to represent the parameters and the constant. For instance +for the statement `S3', the iteration vector in homogeneous coordinates +is `(i,j,N,1)' (we will now call it _iteration vector_ directly for +short). Then we write all the constraints as affine inequalities of +the form `p(i) >= 0'. For instance for the statement `S3' the set of +constraints is: + + i - 2 >= 0 + -i + N >= 0 + j - 2 >= 0 + -j + N >= 0 + +Lastly, we translate the constraint system to the form *domain matrix*` +* '_iteration vector_` >= 0' (please someone show me how to do this in +TeX -not LaTeX- for the texinfo manual !): + [ 1 0 0 -2 ] [ i ] [ 0 ] + [ -1 0 1 0 ] [ j ] [ 0 ] + [ 0 1 0 -2 ] * [ N ] >= [ 0 ] + [ 0 -1 1 0 ] [ 1 ] [ 0 ] + +The domain matrix (along with the iteration vector which is most of the +time an implicit information) will be used in all our tools to provide +the informations on the iteration domain of a given statement. + + +File: clan.info, Node: Scattering Function, Next: Access Function, Prev: Iteration Domain, Up: Thinking in Polyhedra + +2.2.2 Scattering Function +------------------------- + +There is no ordering information inside the iteration domain: it only +describes the set of statement instances but *not* the order in which +they have to be executed relatively to each other. In the past the +lexicographic order of the iteration domain was considered, this is no +more true (especially when using CLooG). If we don't give any ordering +information, this means that the statement instances may be executed in +any order (this is useful, e.g., to specify parallelism), but some +statement instances may depend on some others and it may be critical to +enforce a given order (or non-order). Hence we need another information. + + We call _scattering_ any kind of ordering information in the +Polyhedral Model. There exists many kind of ordering indeed, as +_allocation_, _scheduling_, _chunking_ etc. Nevertheless they are all +expressed in the same way, using _logical stamps_ that can have various +semantics. + + In the case of *scheduling*, the logical stamps are logical dates +that express at which date a statement instance have to be executed. +For instance, let us consider the following three statements: + + x = a + b; // S1 + y = c + d; // S2 + z = a * b; // S3 + +The scheduling of a statement `S' is typically denoted by T_S. Let us +consider the following logical dates for each statement: + + T_S1 = 1 + T_S2 = 2 + T_S3 = 3 + +It means that statement `S3' have to be executed at logical date `1', +statement `S1' have to be executed at logical date `2' and statement +`S2' have to be executed at logical date `3'. The target code have to +respect this scheduling (the order of the logical dates), hence it +would look like the following where the variable `t' denotes the time: + + t = 1; + z = a * b; // S3 + t = 2; + x = a + b; // S1 + t = 3; + y = c + d; // S2 + +When some statements share the same logical date, this means that, once +the program reaches this logical date, the two statements can be +executed in any order, or better, in parallel. For instance let us +consider the following scheduling: + + T_S1 = 1 + T_S2 = 2 + T_S3 = 1 + +Statements `S1' and `S3' have the same logical date, hence the target +code would be: + + t = 1; + #pragma omp parallel sections + { + #pragma omp section + { + x = a + b; // S1 + } + #pragma omp section + { + z = a * b; // S3 + } + } + t = 2; + y = c + d; // S2 + + Logical dates may be multidimensional, as clocks: the first dimension +corresponds to days (most significant), next one is hours (less +significant), the third to minutes and so on. For instance we can +consider the following multidimensional schedules for our example: + + T_S1 = (1,1) + T_S2 = (2,1) + T_S3 = (1,2) + +It is not very hard to decypher the meaning of such scheduling. +Because of the first dimension, statements `S1' and `S3' will be +executed before statement `S2' (`S1' and `S3' are executed at day 1, +while `S2' is executed at day 2). The second dimension is not really +useful there for `S2' because it is the only statement executed at day +2. Nevertheless it allows to order `S1' and `S3' relatively to each +other since `S1' is executed at hour 1 of day 1 while `S3' is executed +at hour 2 of day 1. The corresponding target code is the following, +with some additional time variables for a better view of the ordering +(`t1' corresponds to the first time dimension, `t2' to the second one): + + t1 = 1; + t2 = 1; + x = a + b; // S1 + t2 = 2; + z = a * b; // S3 + t1 = 2; + t2 = 1; + y = c + d; // S2 + + In the case of *allocation* (in the litterature we can find some +papers that call it _placement_), the logical stamps are a processor +number that expresses on which processor a statement instance has to be +executed. Typically, allocations are written in the same way as +scheduling (hence the general term of _scattering_), here we denote it +P_S for a statement `S'. For instance, let us consider the following +allocation: + + P_S1 = 1 + P_S2 = 2 + P_S3 = 1 + +The corresponding target code have to take into account that both +statements `S1' and `S3' have to be executed on the same processor +(they have the same logical number 1) and that statement `S2' have to +be executed on another processor (logical number 2). A possible target +code is the following: + + #pragma omp parallel sections + { + #pragma omp section + { + // Logical processor 1 + x = a + b; // S1 + z = a * b; // S3 + } + #pragma omp section + { + // Logical processor 2 + y = c + d; // S2 + } + } + +We can note that no order have been specified for the statements `S1' +and `S3' that are executed on the same processor. Hence any order is +satisfying. For sake of flexibility, it is usual to build a scattering +whose various dimensions do not have the same semantics. A typical +construction is _space/time mapping_ where the first `n' dimensions are +devoted to allocation, then the last `m' dimensions are devoted to +scheduling. Typically, space/time mapping is written in the same way as +scheduling (hence again the general term of _scattering_), here we +denote it for a statement `S' as M_S. For instance, let us consider +the following space/time mapping for our example where one dimension is +devoted for mapping and one dimension is devoted to scheduling: + + M_S1 = (1,2) + M_S2 = (2,1) + M_S3 = (1,1) + +Here we have the same first dimension as the previous example, thus the +allocation of the statements to processors is the same. The second +dimension precises on a given processor at which logical date a +statement instance has to be executed. Here, the statement `S1' is +executed at day 2 on processor 1 while the statement `S3' is executed +at day 1 onto the same processor. It follows this space/time mapping +corresponds to the following target code (we added an additional +variable to represent the local logical clocks): + + #pragma omp parallel sections + { + #pragma omp section + { + // Logical processor 1 + t = 1; + z = a * b; // S3 + t = 2; + x = a + b; // S1 + } + #pragma omp section + { + // Logical processor 2 + t = 1; + y = c + d; // S2 + } + } + + For the same reason as discussed for iteration domains (*note +Iteration Domain::), it is not possible to define a scattering for each +statement instance, especially if the statement belongs to a (possibly +parametric) loop. The iteration vector fully defines an instance of a +given statement. Thus, a practical way to provide a scattering for each +instance of a given statement is to use a _function_ that depends on +the iteration vector. In this way the function may give for each +iteration vector a different scattering. We call these functions +*scattering functions*. Scattering functions are _affine_ functions of +the outer loop counter and the global parameters. For instance, let us +consider the following source code: + + for (i = 2; i <= 4; i++) + for (j = 2; j <= 4; j++) + P[i+j] += A[i] + B[j]; // S4 + +The iteration domain of the statement `S4' is: + + D_S4= {(i,j) in Z^2 | 2 <= i <= 4 && 2 <= j <= 4 }. + +If you are still not comfortable with the mathematical notation, it +corresponds to the following graphical representation: + +[image src="images/basic2.jpg" text=" j^ i>=2 + | | i<=4 + | | | +4-+-***--j<=4 + | *** +2-+-***--j>=2 + | | | +0-+-+-+--->i + | | | + 0 2 4 +"] + +The list of the statement instances of `S4' (the integral points of its +iteration domain) corresponds to the following iteration vectors: + + iteration vector + (2,2) + (2,3) + (2,4) + (3,2) + (3,3) + (3,4) + (4,2) + (4,3) + (4,4) + +Let us suppose we want to schedule the instances of the statement `S4' +(the integral points of its iteration domain) using the following +scheduling function: + + T_S4(i,j) = (j+2,3*i+j) + +We only have to apply the function to each iteration vector to find the +logical date of each instance: + + iteration vector logical date + (2,2) --> (4,8) + (2,3) --> (5,9) + (2,4) --> (6,10) + (3,2) --> (4,11) + (3,3) --> (5,12) + (3,4) --> (6,13) + (4,2) --> (4,14) + (4,3) --> (5,15) + (4,4) --> (6,16) + + Polyhedral Model users do not have to take care about the generation +of a target code that respects the scattering: the CLooG tool is there +to solve the problem quite easily (`http://www.cloog.org'). For the +previous example, the target code would be the following (`t1' and `t2' +corresponds to the two dimensions of the logical date): + + for (t1 = 4; t1 <= 6; t1++) { + for (t2 = t1+4; t2 <= t1+10; t2++) { + if ((-t1+t2+2)%3 == 0) { + i = (-t1+t2+2)/3 ; + j = t1-2 ; + P[i+j] += A[i] + B[j]; // S4 + } + } + } + + Obviously with such a twisted scheduling, it is hard to see the +"meaning" of the transformation. To name any kind of program +transformation as a magic spell ("tile", "fuse", "skew"...) is an old +bad habit that should be changed in the Polyhedral Model: a scheduling +may be an arbitrary complex sequence of basic-old-good transformations. +Nevertheless it is most of the time quite easy to translate well known +transformations to schedules. For instance, let us consider this new +scheduling function: + + T_S4(i,j) = (j,i) + +Using CLooG, we can generate the target code: + + for (t1 = 2; t1 <= 4; t1++) { + for (t2 = 2; t2 <= 4; t2++) { + i = t2; + j = t1; + P[i+j] += A[i] + B[j]; // S4 + } + } + +It is easy to see (and analyze) that it corresponds to a classical +_loop interchange_ transformation. + + A very useful example of multi-dimensional scattering functions is +the *scheduling of the original program*. The method to compute it is +quite simple (*note Fea92::). The idea is to build an abstract syntax +tree of the program and to read the scheduling for each statement. For +instance, let us consider the following implementation of a Cholesky +factorization: + + /* A Cholesky factorization kernel. */ + for (i=1;i<=N;i++) { + for (j=1;j<=i-1;j++) { + a[i][i] -= a[i][j] ; /* S1 */ + } + a[i][i] = sqrt(a[i][i]) ; /* S2 */ + for (j=i+1;j<=N;j++) { + for (k=1;k<=i-1;k++) { + a[j][i] -= a[j][k]*a[i][k] ; /* S3 */ + } + a[j][i] /= a[i][i] ; /* S4 */ + } + } + } + +The corresponding abstract syntax tree is given in the following +figure. It directly gives the scattering functions (schedules) for all +the statements of the program. + +[image src="images/tree.jpg" text=" * + | + |0 + | + V + i + | + +-----+-----+ + | | | + |0 |1 |2 + | | | + V V V + j S2 j + | | + |0 +--+--+ + | | | + V |0 |1 + S1 | | + V V + k S4 + | + |0 + | + V + S3 +"] + + T_S1(i,j) = (0,i,0,j,0) + T_S2(i) = (0,i,1) + T_S3(i,j,k) = (0,i,2,j,0,k,0) + T_S4(i,j) = (0,i,2,j,1) + +These schedules depend on the iterators and give for each instance of +each statement a unique execution date. Using such scattering functions +allows CLooG to re-generate the input code. + +To easily manipulate the scattering function of any statement `S', we +translate it to the matrix form: T_S(_iteration vector_) ` = +'*scattering matrix*` * '_iteration vector_. For instance let us +consider again our previous example T_S4(i,j) = (j+2,3*i+j). We write +it in the following way (again please someone show me how to do this in +TeX -not LaTeX- for the texinfo manual !): + [ i ] [ 0 1 2 ] [ i ] + T_S4([ j ]) = [ 3 1 0 ] * [ j ] + [ 1 ] [ 1 ] + +The scattering matrix (along with the iteration vector which is most of +the time an implicit information) will be used in all our tools to +provide the informations on the scattering of a given statement. + + +File: clan.info, Node: Access Function, Prev: Scattering Function, Up: Thinking in Polyhedra + +2.2.3 Access Function +--------------------- + +Before applying any transformation, it is essential to deeply analyze +both the original program and the transformation to ensure the +transformation does not imply any modification of the original program +semantics. In the Polyhedral Model, we can reach a *total analysis +power*: we are able to achieve an exact analysis when all the memory +accesses are made through arrays (note that variables are a particular +case of arrays since they are simply arrays with only one memory +location) with affine subscripts that depend on outer loop counters and +global parameters (note that _subscripts_ are sometimes called _index_ +or _accesses_ in the litterature). + + For instance let us consider the array access `A[2*i+j][j][i+N]'. It +has three dimensions, each subscript dimension is an affine form of +some outer loop iterarors (`i' and `j') and global parameters (`N') +hence it corresponds to an acceptable array access in the Polyhedral +Model. + + Each array access can target a different memory cell depending on the +statement instance, i.e., depending on the iteration vector. Thus we +use access functions (or subscript functions or index functions as you +prefer) depending on the iteration vector to describe an array access. +In our example, the access function would be written F_A(i,j) = +(2*i+j,j,i+N). + +To easily manipulate the access function of any array `A', we translate +it to the matrix form: F_A(_iteration vector_) ` = '*access matrix*` * +'_iteration vector_. For instance let us consider again our previous +example: we write it in the following way (again please someone show me +how to do this in TeX -not LaTeX- for the texinfo manual !): + [ i ] [ 2 1 0 0 ] [ i ] + F_A([ j ]) = [ 0 1 0 0 ] * [ j ] + [ N ] [ 1 0 1 0 ] [ N ] + [ 1 ] [ 1 ] + +The access matrix (along with the iteration vector which is most of the +time an implicit information) will be used in all our tools to provide +the informations on the access of a given statement. + + +File: clan.info, Node: Clan Software, Next: Clan Library, Prev: Polyhedral Representation, Up: Top + +3 Using the Clan Software +************************* + +* Menu: + +* A First Example:: +* Writing The Input File:: +* Reading The Output File:: +* Calling Clan:: +* Clan Options:: + + +File: clan.info, Node: A First Example, Next: Writing The Input File, Up: Clan Software + +3.1 A First Example +=================== + +Clan takes as input a source code file than can be written in either C +or C++ or C# or Java (or any other imperative language that is close +enough to C). It is very simple as it only translates a part of a +program that can be represented using the Polyhedral model (*note +Polyhedral Representation::) in a matrix form. Clan does not find +itself the program parts that could be represented using the Polyhedral +Model. More complex tools like WRAP-IT for the ORC compiler +(`http://www.lri.fr/~girbal/site_wrapit')or the GRAPHITE branch of GCC +(`http://gcc.gnu.org/wiki/Graphite') are devoted to such a complex, +highly technical problem. Using Clan, the user has to specify thanks to +pragmas where begins the SCoP he is interested by, and where it ends. + + For instance, let us consider the following source code in C of a +matrix-matrix multiply program that reads two matrices, achieves the +multiply then prints the result. Let us also consider that the user is +only interested in the matrix-matrix multiply kernel: + + /* matmul.c 128*128 matrix multiply */ + #include + #define N 128 + + int main() { + int i,j,k; + float a[N][N], b[N][N], c[N][N]; + + /* We read matrix a then matrix b */ + for (i = 0; i < N; i++) + for (j = 0; j < N; j++) + scanf(" %f",&a[i][j]); + for (i = 0; i < N; i++) + for (j = 0; j < N; j++) + scanf(" %f",&b[i][j]); + + /* c = a * b */ + #pragma scop + for (i = 0; i < N; i++) + for (j = 0; j < N; j++) { + c[i][j] = 0.0; + for (k = 0; k < N; k++) + c[i][j] = c[i][j] + a[i][k]*b[k][j]; + } + #pragma endscop + + /* We print matrix c */ + for (i = 0; i < N; i++) { + for (j = 0; j < N; j++) + printf("%6.2f ",c[i][j]); + printf("\n"); + } + + return 0; + } + + The tags to ask Clan to consider a given part of the code are +provided thanks to the pragmas `#pragma scop' and `#pragma endscop'. +It can have different forms depending on the input language. This is +explained in a further section (*note Writing The Input File::). + + This source code file may be called `matmul.c' (this example is +provided in the Clan distribution as `test/matmul.c') and we can ask +Clan to process it and to generate the polyhedral representation by a +simple call to Clan with this file as input: `clan matmul.c'. By +default, Clan will print the polyhedral representation in the standard +output: + + # [File generated by Clan 1.0.0 64 bits] + + SCoP + + # =============================================== Global + # Language + C + + # Context + 0 3 + + # Parameter names are provided + 1 + # Parameter names + N + + # Number of statements + 2 + + # =============================================== Statement 1 + # ---------------------------------------------- 1.1 Domain + # Iteration domain + 1 + 4 5 + 1 1 0 0 0 ## i >= 0 + 1 -1 0 1 -1 ## -i+N-1 >= 0 + 1 0 1 0 0 ## j >= 0 + 1 0 -1 1 -1 ## -j+N-1 >= 0 + + # ---------------------------------------------- 1.2 Scattering + # Scattering function is provided + 1 + # Scattering function + 5 5 + 0 0 0 0 0 ## 0 + 0 1 0 0 0 ## i + 0 0 0 0 0 ## 0 + 0 0 1 0 0 ## j + 0 0 0 0 0 ## 0 + + # ---------------------------------------------- 1.3 Access + # Access informations are provided + 1 + # Read access informations + 0 5 + # Write access informations + 2 5 + 1 1 0 0 0 ## c[i][j] + 0 0 1 0 0 ## + + # ---------------------------------------------- 1.4 Body + # Statement body is provided + 1 + # Original iterator names + i j + # Statement body + c[i][j]=0.0; + + + # =============================================== Statement 2 + # ---------------------------------------------- 2.1 Domain + # Iteration domain + 1 + 6 6 + 1 1 0 0 0 0 ## i >= 0 + 1 -1 0 0 1 -1 ## -i+N-1 >= 0 + 1 0 1 0 0 0 ## j >= 0 + 1 0 -1 0 1 -1 ## -j+N-1 >= 0 + 1 0 0 1 0 0 ## k >= 0 + 1 0 0 -1 1 -1 ## -k+N-1 >= 0 + + # ---------------------------------------------- 2.2 Scattering + # Scattering function is provided + 1 + # Scattering function + 7 6 + 0 0 0 0 0 0 ## 0 + 0 1 0 0 0 0 ## i + 0 0 0 0 0 0 ## 0 + 0 0 1 0 0 0 ## j + 0 0 0 0 0 1 ## 1 + 0 0 0 1 0 0 ## k + 0 0 0 0 0 0 ## 0 + + # ---------------------------------------------- 2.3 Access + # Access informations are provided + 1 + # Read access informations + 6 6 + 1 1 0 0 0 0 ## c[i][j] + 0 0 1 0 0 0 ## + 2 1 0 0 0 0 ## a[i][k] + 0 0 0 1 0 0 ## + 3 0 0 1 0 0 ## b[k][j] + 0 0 1 0 0 0 ## + # Write access informations + 2 6 + 1 1 0 0 0 0 ## c[i][j] + 0 0 1 0 0 0 ## + + # ---------------------------------------------- 2.4 Body + # Statement body is provided + 1 + # Original iterator names + i j k + # Statement body + c[i][j]=c[i][j]+a[i][k]*b[k][j]; + + + # =============================================== Options + + We will not describe here precisely the structure and the components +of this output, this is described in depth in a further section (*note +Reading The Output File::). This file format, called `.scop' has been +designed to be the input file format of most of the polyhedral tools. +If you read the description of the polyhedral representation of +programs, you should already feel familiar with this file format (*note +Polyhedral Representation::). + + +File: clan.info, Node: Writing The Input File, Next: Reading The Output File, Prev: A First Example, Up: Clan Software + +3.2 Writing The Input File +========================== + +The input file of Clan is a source code file written in any language +based on C for the `for' loop, the `if' and for the array accesses. C, +C++, Java and C# are good examples that should work pretty well with +Clan. + + The input file may contain a static control part (i.e., a part of the +program that can be represented using the Polyhedral Model as described +in the corresponding chapter, *note Polyhedral Representation::) +delimitated *by the user* thanks to pragmas. Clan trusts the user: it +will not check hardly whether the program part is actually a SCoP or +not. It will only try to translate the program part to a polyhedral +representation and will fail with _syntax error_ if it reads something +wrong. + + In C, C++ and C#, the pragma to tag the beginning of the SCoP is: + #pragma scop +and the pragma to tag the end of the SCoP is: + #pragma endscop + + In Java, the pragma to tag the beginning of the SCoP is: + /*@ scop */ +and the pragma to tag the end of the SCoP is: + /*@ end scop */ + + +File: clan.info, Node: Reading The Output File, Next: Calling Clan, Prev: Writing The Input File, Up: Clan Software + +3.3 Reading The Output File +=========================== + +The output text file of Clan provides an explicit polyhedral +representation of a static control part. The output file format is +called _.scop_ format. It has been designed by various researchers in +polyhedral compilation from various institutions. It builds on previous +popular polyhedral file formats like _.cloog_ to provide a unique, +extensible file format to every polyhedral compilation tools (including +future versions of CLooG). This file is composed of two main parts. The +first part is devoted to the polyhedral representation of a SCoP. It +contains what is strictly necessary to enter a complete +source-to-source framework in the polyhedral model and to output a +semantically equivalent code for the SCoP, from analysis to code +generation. The second part of the file contains options, i.e. +extensions to provide additional informations to some tools. + + The following grammar describes the structure of the first part of +the .scop file format where terminals are preceeded by "_". Each +relevant part will be explained in more details momentarily. Its looks +long but it has been artificially extended to be easily understood and +it can be easily simplified: + + File ::= SCoP + SCoP ::= "SCoP" Context Statements + Context ::= Language Domain Parameters + Statements ::= Nb_statements Statement_list + String_list ::= _String String_list | (void) + Statement_list ::= Statement Statement_list | (void) + Domain_list ::= Domain Domain_list | (void) + Statement ::= Iteration_domain Scattering Access Body + Iteration_domain ::= Domain_union + Domain_union ::= Nb_domains Domain_list + Scattering ::= "0" | "1" Scattering_function + Access ::= "0" | "1" Read_function Write_function + Parameters ::= "0" | "1" Parameter_list + Body ::= "0" | "1" Iterator_list Body_text + Language ::= "C" | "C++" | "C#" | "Java" | "Toy" + Parameter_list ::= String_list + Iterator_list ::= String_list + Domain ::= _Matrix + Scattering_function ::= _Matrix + Read_function ::= _Matrix + Write_function ::= _Matrix + Nb_statements ::= _Integer + Nb_domains ::= _Integer + Body_text ::= _String + + * `Context' represents the informations that are shared by + all the statements. It consists on the language used (which + can be `C', `C++', `C#' or `Java'), the global constraints + on parameters and optionally the parameter names. The set + of constraints on parameters is essential since it provides + the number of parameters. The `Domain' encoding includes + the number of unknown (here the number of parameters) + (*note Domain Representation::). Even if there are no constraints, + this number has to be correct. After the + constraints, it is possible to provide the list of parameter + names (the textual names in the original program). A `0' means + we don't provide the list of parameter names, and a `1' means + the list of parameter names is provided afterward. The original + parameter names are necessary for the code generator + to be able to generate a code that can replace directly the + SCoP in the original program by copy/paste. In the case of + a `0', parameter names will probably be generated by the + code generator (this is the case when using CLooG) or will + be extracted from another input source. + + * `Statements' represents the informations on the statements. + `Nb_statements' is the number of statements in the program, + i.e. the number of `Statement' items in the `Statement_list'. + `Statement' represents the informations on a given statement. + To each statement is associated four informations, the first + one is mandatory while the three others are optional. The + statement iteration domain `Iteration_domain' is the + required information, then one can provide optionally a + scattering function, the access functions and the statement + body, in this order. Each optional information is preceeded + by a boolean that precises whether the optional information is + provided or not. The iteration domain (*note Iteration + Domain::) is represented using a matrix (*note Domain + Representation::). Next, the scattering function (*note + Scattering Function::) is represented using a matrix as well + (*note Scattering Representation::). The access functions + (*note Access Function::) are represented using two matrices, one + for read accesses and another one for write accesses + (*note Access Representation::). The statement body is made of two + parts: first, the list of surrounding loop counters in the + original program and second, the text string of the + statement. This representation allows to apply the + substitution of the original iterators with new iterators + in the target program. + + The main terminal parts (domains, scattering and access functions) +are detailed in the next subsections. Lastly, we will describe the +option part (*note Option Part::). + +* Menu: + +* Domain Representation:: +* Scattering Representation:: +* Access Representation:: +* Option Part:: + + +File: clan.info, Node: Domain Representation, Next: Scattering Representation, Up: Reading The Output File + +3.3.1 Domain Representation +--------------------------- + +As shown by the grammar, the input file describes the various +informations thanks to strings, integers and domains. Each domain is +defined by a set of constraints in the PolyLib format (*note Wil93::). +They have the following syntax: + 1. Some optional comment lines beginning with `#'. + + 2. The row and column numbers, possibly followed by comments. + + 3. The constraint rows. Each row corresponds to a constraint the + domain have to satisfy. Each row must be on a single line and is + possibly followed by comments. The constraint is an equality + p(x) = 0 if the first element is 0, an inequality p(x) \geq + 0 if the first element is 1. The next elements are the + unknown coefficients, followed by the parameter + coefficients. The last element is the constant factor. + For instance, assuming that `i', `j' and `k' are the loop +iterators and `m' and `n' are the parameters, the domain defined by the +following constraints : + + -i + m >= 0 + -j + n >= 0 + i + j - k >= 0 + +can be written in the input file as follows : + + # This is a domain + 3 7 # 3 lines and 7 columns + # eq/in i j k m n 1 + 1 -1 0 0 1 0 0 # -i + m >= 0 + 1 0 -1 0 0 1 0 # -j + n >= 0 + 1 1 1 -1 0 0 0 # i + j - k >= 0 + + Each iteration domain `Iteration_domain' of a given statement is a +_union_ of polyhedra `Domain_union'. A union is defined by its number +of elements `Nb_domains' and the elements themselves `Domain_list'. +For instance, let us consider the following pseudo-code: + + for (i = 1; i <= n; i++) { + if ((i >= m) || (i <= 2*m)) + S1; + } + +The iteration domain of `S1' can be divided into two polyhedra and +written in the .scop file as follows: + + 2 # Number of polyhedra in the union + # First domain + 3 5 # 3 lines and 5 columns + # eq/in i m n 1 + 1 1 0 0 -1 # i >= 1 + 1 -1 0 1 0 # i <= n + 1 1 -1 0 0 # i >= m + # Second domain + 3 5 # 3 lines and 5 columns + # eq/in i m n 1 + 1 1 0 0 -1 # i >= 1 + 1 -1 0 1 0 # i <= n + 1 -1 2 0 0 # i <= 2*m + + +File: clan.info, Node: Scattering Representation, Next: Access Representation, Prev: Domain Representation, Up: Reading The Output File + +3.3.2 Scattering Representation +------------------------------- + +Scattering functions are depicted in the input file thanks a +representation very close to the domain one. The difference is each row +do not describe a constraint but a scattering function dimension (*note +Scattering Function::). By convention, the first element of each row +(the one that defines whether the constraint is an equality or an +inequality for domains) _must be set to 0_. The next elements are the +unknown coefficients, followed by the parameter coefficients. The last +element is the constant factor. For instance, assuming that `i', `j' +and `k' are the loop iterators and `m' and `n' are the parameters, the +scattering function + T_{S}(i,j,k) = (j+2,3*i+j,k+n+1) + may be written in a .scop file in the following way: + + # A scattering function + 3 7 # 3 dimensions and 7 columns + # 0 i j k m n 1 + 0 0 1 0 0 0 2 # j+2 + 0 3 1 0 0 0 0 # 3*i+j + 0 0 0 1 0 1 1 # k+n+1 + + Note that this representation is different from the .cloog format: +the useless and error-prone identity matrix part disappeared. + + The scattering function extracted by Clan is the scheduling of the +original program as described in a previous section (*note Scattering +Function::). It allows a code generator (like CLooG) to reconstruct +directly the original program or a dependence analyzer (like Candl) to +achieve its data dependence calculation. + + +File: clan.info, Node: Access Representation, Next: Option Part, Prev: Scattering Representation, Up: Reading The Output File + +3.3.3 Access Representation +--------------------------- + +Access functions are depicted in the input file thanks a representation +very close to the domain one. The difference is each row do not +describe a constraint but a access function dimension (*note Access +Function::). Moreover, the matrix representation do not describes only +one access function but a set of access functions. Each array accessed +in the SCoP has a unique strictly positive identification number. The +first element of each row (the one that defines whether the constraint +is an equality or an inequality for domains) corresponds to the array +identifier iff the row corresponds to the first dimension of the access +function. If the first element is 0, this means the row corresponds to +the next dimension of the access function, with respect to the previous +row. The next elements are the unknown coefficients, followed by the +parameter coefficients. The last element is the constant factor. For +instance, assuming that `i', `j' and `k' are the loop iterators and `m' +and `n' are the parameters, the set of array accesses +`A[2*i+j][j][i+n]', `B[i+j]' and `A[k][j][1]' (the identifier of `A' is +1 and the identifier of `B' is 2) may be written in a .scop file in the +following way: + + # A set of access functions + 7 7 # 7 rows and 7 columns + # id i j k m n 1 + 1 2 1 0 0 0 0 # A[2*i+j][j][i+n] + 0 0 1 0 0 0 0 # + 0 1 0 0 0 1 0 # + 2 1 1 0 0 0 0 # B[i+j] + 1 0 0 1 0 0 0 # A[k][j][1] + 0 0 1 0 0 0 0 # + 0 0 0 0 0 0 1 # + + +File: clan.info, Node: Option Part, Prev: Access Representation, Up: Reading The Output File + +3.3.4 Option Part +----------------- + +The end of the .scop file is made of a succession of options delimited +using XML-like tags. Each tool will take care of known options and will +ignore the others. There is no specification for the option body as it +is tool-dependent. Nevertheless, authors are invited to put the name of +the tool inside the option name to avoid conflicts. A reserved option +name is `Comments' that allows to put some comments in the second part +of the .scop file. For instance, this could be a possible second part +of a .scop file: + + + Just a comment example. + <\Comments> + + + This is supposed to provide CLooG some interesting + additional informations. + <\CLooG foobar> + + A second reserved name is `arrays', Clan can optionally print a +table of the arrays referenced in the access functions. For instance, +for a program referencing first the array `FOO', then the array `BAR': + + + # Number of referenced arrays + 2 + # First reference + 1 FOO + # Second reference + 2 BAR + + + +File: clan.info, Node: Calling Clan, Next: Clan Options, Prev: Reading The Output File, Up: Clan Software + +3.4 Calling Clan +================ + +Clan is called by the following command: + clan [ options | file ] + The default behavior of Clan is to read the input source code from a +file and to print the generated .scop file on the standard output. +Clan's behavior and the output file are under the user control thanks +to some options which will be detailed momentarily (*note Clan +Options::). `file' is the input file. `stdin' is a special value: when +used, input is standard input. For instance, we can call Clan to +process the input file `basic.c' with default options by typing: `clan +basic.c' or `more basic.c | clan stdin' (usual `more basic.c | clan -' +works too). + + +File: clan.info, Node: Clan Options, Prev: Calling Clan, Up: Clan Software + +3.5 Clan Options +================ + +* Menu: + +* Output:: +* Arrays Tag:: +* Help:: +* Version :: + + +File: clan.info, Node: Output, Next: Arrays Tag, Up: Clan Options + +3.5.1 Output `-o ' +-------------------------- + +`-o ': this option sets the output file. `stdout' is a +special value: when used, output is standard output. Default +value is `stdout'. + + +File: clan.info, Node: Arrays Tag, Next: Help, Prev: Output, Up: Clan Options + +3.5.2 Arrays Tag `-arraystag' +----------------------------- + +`-arraystag': this option dumps the table of referenced arrays at the +end of the .scop file, between the `' and `NbColumns - nb_iterators - 2') To represent the statement body, +we use `iterators', an array of `nb_iterators' strings for the +surrounding loop counters names in the original program, and `body', +the statement body string in the original program. + + +File: clan.info, Node: clan_scop_t, Next: clan_options_t, Prev: clan_statement_t, Up: Clan Data Structures + +4.1.4 clan_scop_t +----------------- + + struct clan_scop + { + clan_matrix_p context; /* Constraints on the SCoP parameters */ + int nb_parameters; /* Number of parameters for the SCoP */ + char ** parameters; /* Array of parameter names */ + int nb_arrays; /* Number of arrays accessed in the SCoP */ + char ** arrays; /* Array of array names */ + clan_statement_p statement; /* Statement list of the SCoP */ + char * optiontags; /* The content (as a 0 terminated + string) of the optional tags. */ + void * usr; /* A user-defined field, + not touched by clan. */ + }; + typedef struct clan_scop clan_scop_t; + typedef struct clan_scop * clan_scop_p; + +`clan_scop_t' stores the useful informations of a static control part +of a program to process it within a polyhedral framework. It contains +the informations about the context (what is common to all statements in +the SCoP) and the list of statements `statement'. The context is made +of the constraints on the global parameters `context'. The +representation of the context using the `clan_matrix_t' data structure +is described with the output file format (this is a domain, *note +Reading The Output File::). The list of parameter names is provided as +an array of `nb_parameters' strings called `parameters' +(`nb_parameters' is somewhat redundant as it is supposed to be equal to +`context->NbColumns - 2'). The list of array names is provided as an +array of `nb_arrays' strings called `arrays'. Each accessed array in +the SCoP has a unique identifier (a strictly positive number, *note +Access Representation::), `arrays' provides the correspondance between +an identifier and the real name of the accessed array. If an array has +the identifier `id', then its real name is `arrays[id - 1]'. The +`optiontags' field contains the remainder of the SCoP description file, +as a `char*' string. Optional tags specified in the `Options' section +are stored there. Finally, the `usr' field is a pointer for library +users convenience. This field is not touched by Clan. + + As an example, let us consider again the matrix-matrix multiply +program (*note A First Example::). The next figure gives a possible +representation in memory for this SCoP thanks to the Clan data +structures (it has been actually printed by the `clan_scop_print' +function, it is also possible to ask Clan to output the internal +representation using the command line option `-structure'): + + +-- clan_scop_t + | | + | +-- clan_matrix_t + | | 0 3 + | | + | +-- Original parameters strings: N + | | + | +-- Accessed array strings: c a b + | | + | +-- clan_statement_t (S1) + | | | + | | +-- clan_matrix_list_t + | | | | + | | | +-- clan_matrix_t + | | | | 4 5 + | | | | [ 1 1 0 0 0 ] + | | | | [ 1 -1 0 1 -1 ] + | | | | [ 1 0 1 0 0 ] + | | | | [ 1 0 -1 1 -1 ] + | | | | + | | | + | | +-- clan_matrix_t + | | | 5 5 + | | | [ 0 0 0 0 0 ] + | | | [ 0 1 0 0 0 ] + | | | [ 0 0 0 0 0 ] + | | | [ 0 0 1 0 0 ] + | | | [ 0 0 0 0 0 ] + | | | + | | +-- NULL matrix + | | | + | | +-- clan_matrix_t + | | | 2 5 + | | | [ 1 1 0 0 0 ] + | | | [ 0 0 1 0 0 ] + | | | + | | +-- Original iterator strings: i j + | | | + | | +-- Original body: c[i][j]=0.0; + | | | + | | V + | | clan_statement_t (S2) + | | | + | | +-- clan_matrix_list_t + | | | | + | | | +-- clan_matrix_t + | | | | 6 6 + | | | | [ 1 1 0 0 0 0 ] + | | | | [ 1 -1 0 0 1 -1 ] + | | | | [ 1 0 1 0 0 0 ] + | | | | [ 1 0 -1 0 1 -1 ] + | | | | [ 1 0 0 1 0 0 ] + | | | | [ 1 0 0 -1 1 -1 ] + | | | | + | | | + | | +-- clan_matrix_t + | | | 7 6 + | | | [ 0 0 0 0 0 0 ] + | | | [ 0 1 0 0 0 0 ] + | | | [ 0 0 0 0 0 0 ] + | | | [ 0 0 1 0 0 0 ] + | | | [ 0 0 0 0 0 1 ] + | | | [ 0 0 0 1 0 0 ] + | | | [ 0 0 0 0 0 0 ] + | | | + | | +-- clan_matrix_t + | | | 6 6 + | | | [ 1 1 0 0 0 0 ] + | | | [ 0 0 1 0 0 0 ] + | | | [ 2 1 0 0 0 0 ] + | | | [ 0 0 0 1 0 0 ] + | | | [ 3 0 0 1 0 0 ] + | | | [ 0 0 1 0 0 0 ] + | | | + | | +-- clan_matrix_t + | | | 2 6 + | | | [ 1 1 0 0 0 0 ] + | | | [ 0 0 1 0 0 0 ] + | | | + | | +-- Original iterator strings: i j k + | | | + | | +-- Original body: c[i][j]=c[i][j]+a[i][k]*b[k][j]; + | | | + | | + | + + +File: clan.info, Node: clan_options_t, Prev: clan_scop_t, Up: Clan Data Structures + +4.1.5 clan_options_t +-------------------- + + struct clan_options + { + char * name ; /* Name of the input file. */ + }; + typedef struct clan_options clan_options_t; + typedef struct clan_options * clan_options_p; + +The `clan_options_t' structure contains all the possible options to +rule Clan's behaviour (*note Calling Clan::). For the moment there are +mainly internal options, but it's going to change in the future. + + +File: clan.info, Node: Clan Functions, Next: Example of Library Utilization, Prev: Clan Data Structures, Up: Clan Library + +4.2 Clan Functions Description +============================== + +* Menu: + +* clan_scop_extract:: +* clan_scop_print_dot_scop:: +* clan_scop_read:: +* clan_scop_tag_content:: +* Allocation and Initialization Functions:: +* Memory Deallocation Functions:: +* Printing Functions:: + + +File: clan.info, Node: clan_scop_extract, Next: clan_scop_print_dot_scop, Up: Clan Functions + +4.2.1 clan_scop_extract +----------------------- + + clan_scop_p clan_scop_extract(FILE * input, clan_options_p options); + +The `clan_scop_extract' function extracts the polyhedral representation +of a SCoP in the file provided thanks to the `input' pointer (the file, +possibly `stdin', has to be open for reading), according to some options +provided thanks to the pointer `options' to a `clan_options_t' data +structure (*note clan_options_t::). It returns a pointer to the +extracted SCoP, translated into a `clan_scop_t' data structure (*note +clan_scop_t::). + + +File: clan.info, Node: clan_scop_print_dot_scop, Next: clan_scop_read, Prev: clan_scop_extract, Up: Clan Functions + +4.2.2 clan_scop_print_dot_scop +------------------------------ + + void clan_scop_print_dot_scop + ( + FILE * output, + clan_scop_p scop, + clan_options_p options + ); + +The function `clan_scop_print_dot_scop' is a pretty printer for +`clan_scop_t' structures. It dumps the `scop' informations in .scop +format (*note Reading The Output File::) in the file provided thanks to +the pointer `output' (the file, possibly `stdout', has to be open for +writing), according to some options provided thanks to the pointer +`options' to a `clan_options_t' data structure (*note clan_options_t::). + + +File: clan.info, Node: clan_scop_read, Next: clan_scop_tag_content, Prev: clan_scop_print_dot_scop, Up: Clan Functions + +4.2.3 clan_scop_read +-------------------- + + clan_scop_p clan_scop_read + ( + FILE * input, + clan_options_p options + ); + +The function `clan_scop_read' reads a .scop file from the standard +input, and returns a pointer on a freshly allocated `clan_scop_t' +structure containing the SCoP information. + + +File: clan.info, Node: clan_scop_tag_content, Next: Allocation and Initialization Functions, Prev: clan_scop_read, Up: Clan Functions + +4.2.4 clan_scop_tag_content +--------------------------- + + char* clan_scop_tag_content + ( + clan_scop_p scop, + char* from, + char* to + ); + +The function `clan_scop_tag_content' reads the list of optional tags +for the `clan_scop_t' (stored in the `optiontags' string), and returns +a freshly allocated string of all characters between the two given +strings `from' and `to'. If one or the other given strings are not +found, or if there was no optional part specified in the .scop, `NULL' +is returned. + + +File: clan.info, Node: Allocation and Initialization Functions, Next: Memory Deallocation Functions, Prev: clan_scop_tag_content, Up: Clan Functions + +4.2.5 Allocation and Initialization Functions +--------------------------------------------- + + clan_structure_p clan_structure_malloc(); +Each Clan data structure has an allocation and initialization function +as shown above, where `structure' have to be replaced by the name of +the convenient structure (without `clan' prefix and `_t' suffix) for +instance `clan_scop_p clan_scop_malloc();'. These functions return +pointers to an allocated structure with fields set to convenient default +values. *Using those functions is mandatory* to support internal +management fields and to avoid upward compatibility problems if new +fields appear. An exception is `clan_matrix_malloc' since the +`clan_matrix_t' needs two parameters: the number of rows and columns of +the matrix we want to allocate: + clan_matrix_p clan_matrix_malloc(unsigned nbrows, unsigned nbcolumns); + + +File: clan.info, Node: Memory Deallocation Functions, Next: Printing Functions, Prev: Allocation and Initialization Functions, Up: Clan Functions + +4.2.6 Memory Deallocation Functions +----------------------------------- + + void clan_structure_free(clan_structure_p); +Each Clan data structure has a deallocation function as shown above, +where `structure' have to be replaced by the name of the convenient +structure (without `clan' prefix and `_t' suffix) for instance `void +clan_scop_free(clan_scop_p);'. These functions free the allocated +memory for the structure provided as input. They free memory +recursively, i.e. they also free the allocated memory for the internal +structures. *Using those functions is mandatory* to avoid memory leaks +on internal management fields and to avoid upward compatibility +problems if new fields appear. + + +File: clan.info, Node: Printing Functions, Prev: Memory Deallocation Functions, Up: Clan Functions + +4.2.7 Printing Functions +------------------------ + + void clan_structure_print(FILE *, clan_structure_p) ; +Each Clan data structure has a printing function as shown above, where +`structure' have to be replaced by the name of the convenient structure +(without `clan' prefix and `_t' suffix) for instance `void +clan_scop_print(FILE *, clan_scop_p);'. These functions print the +pointed structure (and its fields recursively) to the file provided as +input (the file, possibly `stdout', has to be open for writing). + + +File: clan.info, Node: Example of Library Utilization, Prev: Clan Functions, Up: Clan Library + +4.3 Example of Library Utilization +================================== + +Here is a basic example showing how it is possible to use the Clan +library, assuming that a standard installation has been done. The +following C program reads a source code input file on the standard +input, then prints the solution on the standard output. Options are +preselected to the default values of the Clan software. + /* example.c */ + # include + # include + + int main() + { + clan_scop_p scop; + clan_options_p options; + + /* Default option setting. */ + options = clan_options_malloc() ; + + /* Extraction of the SCoP. */ + scop = clan_scop_extract(stdin, options); + + /* Output of the .scop file. */ + clan_scop_print_dot_scop(stdout, scop, options); + + /* Save the planet. */ + clan_options_free(options); + clan_scop_free(scop); + + return 0; + } + +The compilation command could be: + gcc example.c -lclan -o example + A calling command with the input file test.c could be: + more test.c | ./example + + +File: clan.info, Node: Installing, Next: Documentation, Prev: Clan Library, Up: Top + +5 Installing Clan +***************** + +* Menu: + +* License:: +* Requirements:: +* Basic Installation:: +* Optional Features:: +* Uninstallation:: + + +File: clan.info, Node: License, Next: Requirements, Up: Installing + +5.1 License +=========== + +First of all, it would be very kind to refer the following paper in any +publication that result from the use of the Clan software or its +library, *note Bas03:: (a bibtex entry is provided behind the title +page of this manual, along with copyright notice). + + This program is free software; you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as +published by the Free Software Foundation, either version 3 of the +License, or (at your option) any later version. This program is +distributed in the hope that it will be useful, but WITHOUT ANY +WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. `http://www.gnu.org/copyleft/lgpl.html' + + +File: clan.info, Node: Requirements, Next: Basic Installation, Prev: License, Up: Installing + +5.2 Requirements +================ + +Clan is a stand-alone tool and library. For a basic use, it does not +need any additional tool or library. Anyway, to be able to work in +conjunction with other tools that manipulate multiple precision +numbers, the GNU GMP library can be used as an option. + +* Menu: + +* GMP Library:: + + +File: clan.info, Node: GMP Library, Up: Requirements + +5.2.1 GMP Library (optional) +---------------------------- + +To be able to deal with insanely large coefficient, the user will need +to install the GNU Multiple Precision Library (GMP for short) version +4.2.2 or above. It can be freely downloaded from +`http://www.swox.com/gmp'. The user can compile it by typing the +following commands on the GMP root directory: + + * `./configure' + + * `make' + + * And as root: `make install' + + The GMP default installation is `/usr/local'. This directory may not +be inside your library path. To fix the problem, the user should set + export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib + if your shell is, e.g., bash or + setenv LD_LIBRARY_PATH $LD_LIBRARY_PATH:/usr/local/lib + if your shell is, e.g., tcsh. Add the line to your .bashrc or +.tcshrc (or whatever convenient file) to make this change permanent. +Another solution is to ask GMP to install in the standard path by using +the prefix option of the configure script: `./configure --prefix=/usr'. + + Clan has to be built using the GMP library by specifying the +convenient configure script options to buid the GMP version (*note +Optional Features::). + + +File: clan.info, Node: Basic Installation, Next: Optional Features, Prev: Requirements, Up: Installing + +5.3 Clan Basic Installation +=========================== + +Once downloaded and unpacked (e.g. using the `tar -zxvf +clan-1.0.0.tar.gz' command), you can compile Clan by typing the +following commands on the Clan's root directory: + + * `./configure' + + * `make' + + * And as root: `make install' + + The program binaries and object files can be removed from the source +code directory by typing `make clean'. To also remove the files that +the `configure' script created (so you can compile the package for a +different kind of computer) type `make distclean'. + + +File: clan.info, Node: Optional Features, Next: Uninstallation, Prev: Basic Installation, Up: Installing + +5.4 Optional Features +===================== + +The `configure' shell script attempts to guess correct values for +various system-dependent variables and user options used during +compilation. It uses those values to create the `Makefile'. Various +user options are provided by the Clan's configure script. They are +summarized in the following list and may be printed by typing +`./configure --help' in the Clan top-level directory. + + * By default, the installation directory is `/usr/local': `make + install' will install the package's files in `/usr/local/bin', + `/usr/local/lib' and `/usr/local/include'. The user can specify + an installation prefix other than `/usr/local' by giving + `configure' the option `--prefix=PATH'. + + * By default, Clan is built in 64bits version. If the user give to + `configure' the option `--enable-int-version', the 32bits version + of Clan will be compiled. In the same way, the option + `--enable-mp-version' have to be used to build the multiple + precision version. + + * By default, `configure' will look for the GMP library (necessary + to build the multiple precision version) in standard locations. If + necessary, the user can specify the GMP path by giving `configure' + the option `--with-gmp=PATH'. + + +File: clan.info, Node: Uninstallation, Prev: Optional Features, Up: Installing + +5.5 Uninstallation +================== + +The user can easily remove the Clan software and library from his system +by typing (as root if necessary) from the Clan top-level directory +`make uninstall'. + + +File: clan.info, Node: Documentation, Next: References, Prev: Installing, Up: Top + +6 Documentation +*************** + +The Clan distribution provides several documentation sources. First, the +source code itself is as documented as possible. The code comments use a +Doxygen-compatible presentation (something similar to what JavaDoc does +for JAVA). The user may install Doxygen (see +`http://www.stack.nl/~dimitri/doxygen') to automatically generate a +technical documentation by typing `make doc' or `doxygen +./autoconf/Doxyfile' at the Clan top-level directory after running the +configure script (*note Installing::). Doxygen will generate +documentation sources (in HTML, LaTeX and man) in the `doc/source' +directory of the Clan distribution. + + The Texinfo sources of the present document are also provided in the +`doc' directory. You can build it in either DVI format (by typing +`texi2dvi cloog.texi') or PDF format (by typing `texi2pdf cloog.texi') +or HTML format (by typing `makeinfo --html cloog.texi', using +`--no-split' option to generate a single HTML file) or info format (by +typing `makeinfo cloog.texi'). + + +File: clan.info, Node: References, Prev: Documentation, Up: Top + +7 References +************ + + * [Bas03a] C. Bastoul, P. Feautrier. Improving data locality by + chunking. CC'12 International Conference on Compiler Construction, + LNCS 2622, pages 320-335, Warsaw, april 2003. + + * [Bas03] C. Bastoul and A. Cohen and S. Girbal and S. Sharma and O. + Temam. Putting Polyhedral Loop Transformations to Work, LCPC'16 + International Workshop on Languages and Compilers for Parallel + Computers, LNCS 2958, pages 209-225, College Station, Texas, + october 2003. + + * [Fea92] P. Feautrier Some efficient solutions to the affine + scheduling problem, part II: multidimensional time. International + Journal of Parallel Programming, 21(6):389-420, December 1992. + + * [Gri04] M. Griebl. Automatic parallelization of loop programs for + distributed memory architectures. Habilitation Thesis. Faculta"t + fu"r Mathematik und Informatik, Universita"t Passau, 2004. + _http://www.infosun.fmi.uni-passau.de/cl/loopo/_ + + * [Wil93] Doran K. Wilde. A library for doing polyhedral operations. + Technical Report 785, IRISA, Rennes, France, 1993. + + + + +Tag Table: +Node: Top1376 +Node: Introduction2899 +Node: Polyhedral Representation4495 +Node: Motivation5623 +Node: Thinking in Polyhedra9240 +Node: Iteration Domain11355 +Node: Scattering Function16814 +Node: Access Function29301 +Node: Clan Software31462 +Node: A First Example31740 +Node: Writing The Input File38016 +Node: Reading The Output File39210 +Node: Domain Representation44932 +Node: Scattering Representation47336 +Node: Access Representation48963 +Node: Option Part50724 +Node: Calling Clan51928 +Node: Clan Options52717 +Node: Output52891 +Node: Arrays Tag53168 +Node: Help53452 +Node: Version53659 +Node: Clan Library53892 +Node: Clan Data Structures54836 +Node: clan_matrix_t55350 +Node: clan_matrix_list_t56929 +Node: clan_statement_t57726 +Node: clan_scop_t59777 +Node: clan_options_t66231 +Node: Clan Functions66763 +Node: clan_scop_extract67162 +Node: clan_scop_print_dot_scop67821 +Node: clan_scop_read68549 +Node: clan_scop_tag_content68994 +Node: Allocation and Initialization Functions69660 +Node: Memory Deallocation Functions70681 +Node: Printing Functions71528 +Node: Example of Library Utilization72148 +Node: Installing73342 +Node: License73573 +Node: Requirements74455 +Node: GMP Library74872 +Node: Basic Installation76088 +Node: Optional Features76754 +Node: Uninstallation78148 +Node: Documentation78431 +Node: References79551 +Ref: Bas03a79653 +Ref: Bas0379844 +Ref: Fea9280139 +Ref: Gri0480345 +Ref: Wil9380605 + +End Tag Table diff --git a/clan/doc/clan.pdf b/clan/doc/clan.pdf new file mode 100644 index 0000000000000000000000000000000000000000..fb0ea29117be96f4b12c1bdba5c37b057b9b3773 GIT binary patch literal 270279 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

!blY=d5cFdz8H0`NY58N8 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 VCx7xMfAS}P@+W`td&F)h{|5s!X0`wT literal 0 HcwPel00001 diff --git a/clan/doc/images/tree.pdf b/clan/doc/images/tree.pdf new file mode 100644 index 0000000000000000000000000000000000000000..7569edebb461590b8208c320a8e109fd4a44c25c GIT binary patch literal 4558 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 literal 0 HcwPel00001 diff --git a/clan/doc/images/tree.txt b/clan/doc/images/tree.txt new file mode 100644 index 0000000..7bcfef2 --- /dev/null +++ b/clan/doc/images/tree.txt @@ -0,0 +1,25 @@ + * + | + |0 + | + V + i + | + +-----+-----+ + | | | + |0 |1 |2 + | | | + V V V + j S2 j + | | + |0 +--+--+ + | | | + V |0 |1 + S1 | | + V V + k S4 + | + |0 + | + V + S3 diff --git a/clan/include/Makefile.am b/clan/include/Makefile.am new file mode 100644 index 0000000..231d937 --- /dev/null +++ b/clan/include/Makefile.am @@ -0,0 +1,59 @@ +# +# /**------- <| --------------------------------------------------------** +# ** A Clan ** +# **--- /.\ -----------------------------------------------------** +# ** <| [""M# makefile.am ** +# **- A | # -----------------------------------------------------** +# ** /.\ [""M# First version: 30/04/2008 ** +# **- [""M# | # U"U#U -----------------------------------------------** +# | # | # \ .:/ +# | # | #___| # +# ****** | "--' .-" ***************************************************** +# * |"-"-"-"-"-#-#-## Clan : the Chunky Loop Analyser (experimental) * +# **** | # ## ###### **************************************************** +# * \ .::::'/ * +# * \ ::::'/ Copyright (C) 2008 Cedric Bastoul * +# * :8a| # # ## * +# * ::88a ### This is free software; you can redistribute it * +# * ::::888a 8a ##::. and/or modify it under the terms of the GNU * +# * ::::::::888a88a[]::: Lesser General Public License as published by * +# *::8:::::::::SUNDOGa8a::. the Free Software Foundation, either version 3 of * +# *::::::::8::::888:Y8888:: the License, or (at your option) * +# *::::':::88::::888::Y88a::::::::::::... any later version. * +# *::'::.. . ..... .. ... . * +# * This software is distributed in the hope that it will be useful, but * +# * WITHOUT ANY WARRANTY; without even the implied warranty of * +# * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General * +# * Public License for more details. * +# * * +# * You should have received a copy of the GNU Lesser General Public * +# * License along with software; if not, write to the Free Software * +# * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * +# * * +# * Clan, the Chunky Loop Analyser * +# * Written by Cedric Bastoul, Cedric.Bastoul@inria.fr * +# * * +# *****************************************************************************/ +# +# Makefile.am (or makefile if generated) of Clan, the Chunky Loop Analyser. +# Makefile.am is not a makefile, you must run the 'autogen.sh' THEN the +# configure shellscript to generate the Makefile thanks to this file. + + +############################################################################# +SUBDIRS = + +############################################################################# +MAINTAINERCLEANFILES = Makefile.in + +############################################################################# + +pkginclude_HEADERS = \ + clan/clan.h \ + clan/options.h \ + clan/statement.h \ + clan/vector.h \ + clan/matrix.h \ + clan/macros.h \ + clan/scop.h \ + clan/symbol.h diff --git a/clan/include/clan/clan.h b/clan/include/clan/clan.h new file mode 100644 index 0000000..ef51eeb --- /dev/null +++ b/clan/include/clan/clan.h @@ -0,0 +1,58 @@ + + /*+------- <| --------------------------------------------------------** + ** A Clan ** + **--- /.\ -----------------------------------------------------** + ** <| [""M# clan.h ** + **- A | # -----------------------------------------------------** + ** /.\ [""M# First version: 30/04/2008 ** + **- [""M# | # U"U#U -----------------------------------------------** + | # | # \ .:/ + | # | #___| # + ****** | "--' .-" ****************************************************** + * |"-"-"-"-"-#-#-## Clan : the Chunky Loop Analyzer (experimental) * + **** | # ## ###### ***************************************************** + * \ .::::'/ * + * \ ::::'/ Copyright (C) 2008 Cedric Bastoul * + * :8a| # # ## * + * ::88a ### This is free software; you can redistribute it * + * ::::888a 8a ##::. and/or modify it under the terms of the GNU Lesser * + * ::::::::888a88a[]::: General Public License as published by the Free * + *::8:::::::::SUNDOGa8a::. Software Foundation, either version 3 of the * + *::::::::8::::888:Y8888:: License, or (at your option) any later version. * + *::::':::88::::888::Y88a::::::::::::... * + *::'::.. . ..... .. ... . * + * This software is distributed in the hope that it will be useful, but * + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * + * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License * + * for more details. * + * * + * You should have received a copy of the GNU Lesser General Public License * + * along with software; if not, write to the Free Software Foundation, Inc., * + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * + * * + * Clan, the Chunky Loop Analyzer * + * Written by Cedric Bastoul, Cedric.Bastoul@inria.fr * + * * + ******************************************************************************/ + + +/*+**************************************************************************** + * THIS FILE HAS BEEN AUTOMATICALLY GENERATED FROM clan.h.in BY configure * + ******************************************************************************/ + + +#ifndef CLAN_H +# define CLAN_H + +# define CLAN_RELEASE "0.6.0" +# define CLAN_VERSION "@BITS@" + +# include +# include +# include +# include +# include +# include +# include + +#endif /* define CLAN_H */ diff --git a/clan/include/clan/clan.h.in b/clan/include/clan/clan.h.in new file mode 100644 index 0000000..4fe4a56 --- /dev/null +++ b/clan/include/clan/clan.h.in @@ -0,0 +1,58 @@ + + /*+------- <| --------------------------------------------------------** + ** A Clan ** + **--- /.\ -----------------------------------------------------** + ** <| [""M# clan.h ** + **- A | # -----------------------------------------------------** + ** /.\ [""M# First version: 30/04/2008 ** + **- [""M# | # U"U#U -----------------------------------------------** + | # | # \ .:/ + | # | #___| # + ****** | "--' .-" ****************************************************** + * |"-"-"-"-"-#-#-## Clan : the Chunky Loop Analyzer (experimental) * + **** | # ## ###### ***************************************************** + * \ .::::'/ * + * \ ::::'/ Copyright (C) 2008 Cedric Bastoul * + * :8a| # # ## * + * ::88a ### This is free software; you can redistribute it * + * ::::888a 8a ##::. and/or modify it under the terms of the GNU Lesser * + * ::::::::888a88a[]::: General Public License as published by the Free * + *::8:::::::::SUNDOGa8a::. Software Foundation, either version 3 of the * + *::::::::8::::888:Y8888:: License, or (at your option) any later version. * + *::::':::88::::888::Y88a::::::::::::... * + *::'::.. . ..... .. ... . * + * This software is distributed in the hope that it will be useful, but * + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * + * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License * + * for more details. * + * * + * You should have received a copy of the GNU Lesser General Public License * + * along with software; if not, write to the Free Software Foundation, Inc., * + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * + * * + * Clan, the Chunky Loop Analyzer * + * Written by Cedric Bastoul, Cedric.Bastoul@inria.fr * + * * + ******************************************************************************/ + + +/*+**************************************************************************** + * THIS FILE HAS BEEN AUTOMATICALLY GENERATED FROM clan.h.in BY configure * + ******************************************************************************/ + + +#ifndef CLAN_H +# define CLAN_H + +# define CLAN_RELEASE "@PACKAGE_VERSION@" +# define CLAN_VERSION "@BITS@" + +# include +# include +# include +# include +# include +# include +# include + +#endif /* define CLAN_H */ diff --git a/clan/include/clan/macros.h b/clan/include/clan/macros.h new file mode 100644 index 0000000..a606045 --- /dev/null +++ b/clan/include/clan/macros.h @@ -0,0 +1,49 @@ + + /*+------- <| --------------------------------------------------------** + ** A Clan ** + **--- /.\ -----------------------------------------------------** + ** <| [""M# macros.h ** + **- A | # -----------------------------------------------------** + ** /.\ [""M# First version: 30/04/2008 ** + **- [""M# | # U"U#U -----------------------------------------------** + | # | # \ .:/ + | # | #___| # + ****** | "--' .-" ****************************************************** + * |"-"-"-"-"-#-#-## Clan : the Chunky Loop Analyzer (experimental) * + **** | # ## ###### ***************************************************** + * \ .::::'/ * + * \ ::::'/ Copyright (C) 2008 Cedric Bastoul * + * :8a| # # ## * + * ::88a ### This is free software; you can redistribute it * + * ::::888a 8a ##::. and/or modify it under the terms of the GNU Lesser * + * ::::::::888a88a[]::: General Public License as published by the Free * + *::8:::::::::SUNDOGa8a::. Software Foundation, either version 3 of the * + *::::::::8::::888:Y8888:: License, or (at your option) any later version. * + *::::':::88::::888::Y88a::::::::::::... * + *::'::.. . ..... .. ... . * + * This software is distributed in the hope that it will be useful, but * + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * + * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License * + * for more details. * + * * + * You should have received a copy of the GNU Lesser General Public License * + * along with software; if not, write to the Free Software Foundation, Inc., * + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * + * * + * Clan, the Chunky Loop Analyzer * + * Written by Cedric Bastoul, Cedric.Bastoul@inria.fr * + * * + ******************************************************************************/ + +#ifndef CLAN_MACROS_H +# define CLAN_MACROS_H + +# define CLAN_DEBUG 0 +# define CLAN_TRUE 1 +# define CLAN_FALSE 0 +# define CLAN_MAX_LOCAL_VARIABLES 100 + +# include +# include + +#endif /* define CLAN_MACROS_H */ diff --git a/clan/include/clan/matrix.h b/clan/include/clan/matrix.h new file mode 100644 index 0000000..ce1dae3 --- /dev/null +++ b/clan/include/clan/matrix.h @@ -0,0 +1,64 @@ + + /*+------- <| --------------------------------------------------------** + ** A Clan ** + **--- /.\ -----------------------------------------------------** + ** <| [""M# matrix.h ** + **- A | # -----------------------------------------------------** + ** /.\ [""M# First version: 30/04/2008 ** + **- [""M# | # U"U#U -----------------------------------------------** + | # | # \ .:/ + | # | #___| # + ****** | "--' .-" ****************************************************** + * |"-"-"-"-"-#-#-## Clan : the Chunky Loop Analyzer (experimental) * + **** | # ## ###### ***************************************************** + * \ .::::'/ * + * \ ::::'/ Copyright (C) 2008 Cedric Bastoul * + * :8a| # # ## * + * ::88a ### This is free software; you can redistribute it * + * ::::888a 8a ##::. and/or modify it under the terms of the GNU Lesser * + * ::::::::888a88a[]::: General Public License as published by the Free * + *::8:::::::::SUNDOGa8a::. Software Foundation, either version 3 of the * + *::::::::8::::888:Y8888:: License, or (at your option) any later version. * + *::::':::88::::888::Y88a::::::::::::... * + *::'::.. . ..... .. ... . * + * This software is distributed in the hope that it will be useful, but * + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * + * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License * + * for more details. * + * * + * You should have received a copy of the GNU Lesser General Public License * + * along with software; if not, write to the Free Software Foundation, Inc., * + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * + * * + * Clan, the Chunky Loop Analyzer * + * Written by Cedric Bastoul, Cedric.Bastoul@inria.fr * + * * + ******************************************************************************/ + + +#ifndef CLAN_MATRIX_H +# define CLAN_MATRIX_H + +# include +# include +# include +# include +# include + + +# if defined(__cplusplus) +extern "C" + { +# endif + +/*+**************************************************************************** + * Processing functions * + ******************************************************************************/ +void clan_matrix_tag_array(scoplib_matrix_p, int); +scoplib_matrix_p clan_matrix_scheduling(int *, int); +void clan_matrix_compact(scoplib_matrix_p, int, int); + +# if defined(__cplusplus) + } +# endif +#endif /* define CLAN_MATRIX_H */ diff --git a/clan/include/clan/options.h b/clan/include/clan/options.h new file mode 100644 index 0000000..82828c5 --- /dev/null +++ b/clan/include/clan/options.h @@ -0,0 +1,99 @@ + + /*+------- <| --------------------------------------------------------** + ** A Clan ** + **--- /.\ -----------------------------------------------------** + ** <| [""M# options.h ** + **- A | # -----------------------------------------------------** + ** /.\ [""M# First version: 24/05/2008 ** + **- [""M# | # U"U#U -----------------------------------------------** + | # | # \ .:/ + | # | #___| # + ****** | "--' .-" ****************************************************** + * |"-"-"-"-"-#-#-## Clan : the Chunky Loop Analyzer (experimental) * + **** | # ## ###### ***************************************************** + * \ .::::'/ * + * \ ::::'/ Copyright (C) 2008 Cedric Bastoul * + * :8a| # # ## * + * ::88a ### This is free software; you can redistribute it * + * ::::888a 8a ##::. and/or modify it under the terms of the GNU Lesser * + * ::::::::888a88a[]::: General Public License as published by the Free * + *::8:::::::::SUNDOGa8a::. Software Foundation, either version 3 of the * + *::::::::8::::888:Y8888:: License, or (at your option) any later version. * + *::::':::88::::888::Y88a::::::::::::... * + *::'::.. . ..... .. ... . * + * This software is distributed in the hope that it will be useful, but * + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * + * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License * + * for more details. * + * * + * You should have received a copy of the GNU Lesser General Public License * + * along with software; if not, write to the Free Software Foundation, Inc., * + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * + * * + * Clan, the Chunky Loop Analyzer * + * Written by Cedric Bastoul, Cedric.Bastoul@inria.fr * + * * + ******************************************************************************/ + + +#ifndef CLAN_OPTIONS_H +# define CLAN_OPTIONS_H + +# include +# include +# include + + +# if defined(__cplusplus) +extern "C" + { +# endif + + +/** + * The clan_options_t structure stores the software/library options for all + * functions. They are not too many for now, but they will come someday... + */ +struct clan_options +{ + char * name ; /**< Name of the input file. */ + int castle; /**< 1 to put the Clan castle in output, 0 otherwise. */ + int structure; /**< 1 to print the clan_scop structure, 0 otherwise. */ + int inputscop; /**< 1 to read a .scop on the input, 0 to read a + source file (default). */ + int arraystag; /**< 1 to dump the table of array names between the + tags, 0 otherwise (default). */ + int bounded_context; /**< 1 to force global parameters >= -1 (default 0) */ +}; +typedef struct clan_options clan_options_t; +typedef struct clan_options * clan_options_p; + + +/*+**************************************************************************** + * Structure display function * + ******************************************************************************/ +void clan_options_print(FILE *, clan_options_p); + + +/*+**************************************************************************** + * Memory allocation/deallocation function * + ******************************************************************************/ +clan_options_p clan_options_malloc(); +void clan_options_free(clan_options_p); + + +/*+**************************************************************************** + * Reading function * + ******************************************************************************/ +clan_options_p clan_options_read(int, char **, FILE **, FILE **); + + +/*+**************************************************************************** + * Processing functions * + ******************************************************************************/ + + +# if defined(__cplusplus) + } +# endif +#endif /* define CLAN_OPTIONS_H */ diff --git a/clan/include/clan/scop.h b/clan/include/clan/scop.h new file mode 100644 index 0000000..3c7b58d --- /dev/null +++ b/clan/include/clan/scop.h @@ -0,0 +1,64 @@ + + /*+------- <| --------------------------------------------------------** + ** A Clan ** + **--- /.\ -----------------------------------------------------** + ** <| [""M# scop.h ** + **- A | # -----------------------------------------------------** + ** /.\ [""M# First version: 30/04/2008 ** + **- [""M# | # U"U#U -----------------------------------------------** + | # | # \ .:/ + | # | #___| # + ****** | "--' .-" ****************************************************** + * |"-"-"-"-"-#-#-## Clan : the Chunky Loop Analyzer (experimental) * + **** | # ## ###### ***************************************************** + * \ .::::'/ * + * \ ::::'/ Copyright (C) 2008 Cedric Bastoul * + * :8a| # # ## * + * ::88a ### This is free software; you can redistribute it * + * ::::888a 8a ##::. and/or modify it under the terms of the GNU Lesser * + * ::::::::888a88a[]::: General Public License as published by the Free * + *::8:::::::::SUNDOGa8a::. Software Foundation, either version 3 of the * + *::::::::8::::888:Y8888:: License, or (at your option) any later version. * + *::::':::88::::888::Y88a::::::::::::... * + *::'::.. . ..... .. ... . * + * This software is distributed in the hope that it will be useful, but * + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * + * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License * + * for more details. * + * * + * You should have received a copy of the GNU Lesser General Public License * + * along with software; if not, write to the Free Software Foundation, Inc., * + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * + * * + * Clan, the Chunky Loop Analyzer * + * Written by Cedric Bastoul, Cedric.Bastoul@inria.fr * + * * + ******************************************************************************/ + + +#ifndef CLAN_SCOP_H +# define CLAN_SCOP_H + +# include + +# include +# include + +# if defined(__cplusplus) +extern "C" + { +# endif + + +/*+**************************************************************************** + * Processing functions * + ******************************************************************************/ +scoplib_scop_p clan_scop_extract(FILE *, clan_options_p); +void clan_scop_compact(scoplib_scop_p); +void clan_scop_fill_options(scoplib_scop_p, int*, int*); + + +# if defined(__cplusplus) + } +# endif +#endif /* define CLAN_SCOP_H */ diff --git a/clan/include/clan/statement.h b/clan/include/clan/statement.h new file mode 100644 index 0000000..1fbe076 --- /dev/null +++ b/clan/include/clan/statement.h @@ -0,0 +1,62 @@ + + /*+------- <| --------------------------------------------------------** + ** A Clan ** + **--- /.\ -----------------------------------------------------** + ** <| [""M# statement.h ** + **- A | # -----------------------------------------------------** + ** /.\ [""M# First version: 30/04/2008 ** + **- [""M# | # U"U#U -----------------------------------------------** + | # | # \ .:/ + | # | #___| # + ****** | "--' .-" ****************************************************** + * |"-"-"-"-"-#-#-## Clan : the Chunky Loop Analyzer (experimental) * + **** | # ## ###### ***************************************************** + * \ .::::'/ * + * \ ::::'/ Copyright (C) 2008 Cedric Bastoul * + * :8a| # # ## * + * ::88a ### This is free software; you can redistribute it * + * ::::888a 8a ##::. and/or modify it under the terms of the GNU Lesser * + * ::::::::888a88a[]::: General Public License as published by the Free * + *::8:::::::::SUNDOGa8a::. Software Foundation, either version 3 of the * + *::::::::8::::888:Y8888:: License, or (at your option) any later version. * + *::::':::88::::888::Y88a::::::::::::... * + *::'::.. . ..... .. ... . * + * This software is distributed in the hope that it will be useful, but * + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * + * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License * + * for more details. * + * * + * You should have received a copy of the GNU Lesser General Public License * + * along with software; if not, write to the Free Software Foundation, Inc., * + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * + * * + * Clan, the Chunky Loop Analyzer * + * Written by Cedric Bastoul, Cedric.Bastoul@inria.fr * + * * + ******************************************************************************/ + + +#ifndef CLAN_STATEMENT_H +# define CLAN_STATEMENT_H + +# include +# include +# include +# include + +# if defined(__cplusplus) +extern "C" + { +# endif + + +/*+**************************************************************************** + * Processing functions * + ******************************************************************************/ +void clan_statement_compact(scoplib_statement_p, int); + + +# if defined(__cplusplus) + } +# endif +#endif /* define CLAN_STATEMENT_H */ diff --git a/clan/include/clan/symbol.h b/clan/include/clan/symbol.h new file mode 100644 index 0000000..71b5bf4 --- /dev/null +++ b/clan/include/clan/symbol.h @@ -0,0 +1,95 @@ + + /*+------- <| --------------------------------------------------------** + ** A Clan ** + **--- /.\ -----------------------------------------------------** + ** <| [""M# symbol.h ** + **- A | # -----------------------------------------------------** + ** /.\ [""M# First version: 01/05/2008 ** + **- [""M# | # U"U#U -----------------------------------------------** + | # | # \ .:/ + | # | #___| # + ****** | "--' .-" ****************************************************** + * |"-"-"-"-"-#-#-## Clan : the Chunky Loop Analyzer (experimental) * + **** | # ## ###### ***************************************************** + * \ .::::'/ * + * \ ::::'/ Copyright (C) 2008 Cedric Bastoul * + * :8a| # # ## * + * ::88a ### This is free software; you can redistribute it * + * ::::888a 8a ##::. and/or modify it under the terms of the GNU Lesser * + * ::::::::888a88a[]::: General Public License as published by the Free * + *::8:::::::::SUNDOGa8a::. Software Foundation, either version 3 of the * + *::::::::8::::888:Y8888:: License, or (at your option) any later version. * + *::::':::88::::888::Y88a::::::::::::... * + *::'::.. . ..... .. ... . * + * This software is distributed in the hope that it will be useful, but * + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * + * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License * + * for more details. * + * * + * You should have received a copy of the GNU Lesser General Public License * + * along with software; if not, write to the Free Software Foundation, Inc., * + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * + * * + * Clan, the Chunky Loop Analyzer * + * Written by Cedric Bastoul, Cedric.Bastoul@inria.fr * + * * + ******************************************************************************/ + + +#ifndef CLAN_SYMBOL_H +# define CLAN_SYMBOL_H + +# include +# include +# include + +# if defined(__cplusplus) +extern "C" + { +# endif + + +/** + * The clan_symbol_t structure is a node of the symbol table of the parser. + */ +struct clan_symbol +{ + char * identifier; /**< Symbol identifier */ + int type; /**< Symbol type (variable, iterator...) */ + int rank; /**< Depth for iterators, number for others */ + struct clan_symbol * next; /**< Next symbol in the symbol table */ +}; +typedef struct clan_symbol clan_symbol_t; +typedef struct clan_symbol * clan_symbol_p; + + +/*+**************************************************************************** + * Structure display function * + ******************************************************************************/ +void clan_symbol_print_structure(FILE *, clan_symbol_p, int); +void clan_symbol_print(FILE *, clan_symbol_p); + + +/*+**************************************************************************** + * Memory allocation/deallocation function * + ******************************************************************************/ +clan_symbol_p clan_symbol_malloc(); +void clan_symbol_free(clan_symbol_p); + + +/*+**************************************************************************** + * Processing functions * + ******************************************************************************/ +clan_symbol_p clan_symbol_lookup(clan_symbol_p, char *); +clan_symbol_p clan_symbol_add(clan_symbol_p *, char *, int, int); +void clan_symbol_remove(clan_symbol_p*, clan_symbol_p); +int clan_symbol_get_rank(clan_symbol_p, char *); +int clan_symbol_get_type(clan_symbol_p, char *); +char ** clan_symbol_iterators(clan_symbol_p *, int); +char ** clan_symbol_id_array(clan_symbol_p, int, int *); + + +# if defined(__cplusplus) + } +# endif +#endif /* define CLAN_SYMBOL_H */ diff --git a/clan/include/clan/vector.h b/clan/include/clan/vector.h new file mode 100644 index 0000000..e026da2 --- /dev/null +++ b/clan/include/clan/vector.h @@ -0,0 +1,68 @@ + + /*+------- <| --------------------------------------------------------** + ** A Clan ** + **--- /.\ -----------------------------------------------------** + ** <| [""M# vector.h ** + **- A | # -----------------------------------------------------** + ** /.\ [""M# First version: 01/05/2008 ** + **- [""M# | # U"U#U -----------------------------------------------** + | # | # \ .:/ + | # | #___| # + ****** | "--' .-" ****************************************************** + * |"-"-"-"-"-#-#-## Clan : the Chunky Loop Analyzer (experimental) * + **** | # ## ###### ***************************************************** + * \ .::::'/ * + * \ ::::'/ Copyright (C) 2008 Cedric Bastoul * + * :8a| # # ## * + * ::88a ### This is free software; you can redistribute it * + * ::::888a 8a ##::. and/or modify it under the terms of the GNU Lesser * + * ::::::::888a88a[]::: General Public License as published by the Free * + *::8:::::::::SUNDOGa8a::. Software Foundation, either version 3 of the * + *::::::::8::::888:Y8888:: License, or (at your option) any later version. * + *::::':::88::::888::Y88a::::::::::::... * + *::'::.. . ..... .. ... . * + * This software is distributed in the hope that it will be useful, but * + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * + * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License * + * for more details. * + * * + * You should have received a copy of the GNU Lesser General Public License * + * along with software; if not, write to the Free Software Foundation, Inc., * + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * + * * + * Clan, the Chunky Loop Analyzer * + * Written by Cedric Bastoul, Cedric.Bastoul@inria.fr * + * * + ******************************************************************************/ + + +#ifndef CLAN_VECTOR_H +# define CLAN_VECTOR_H + +# include +# include +# include +# include + + +# define CLAN_MAX_DEPTH 50 /* Max loop depth (max iterator number) */ +# define CLAN_MAX_PARAMETERS 50 /* Max parameter number */ +# define CLAN_MAX_CONSTRAINTS 50 /* Max contraint number for a domain */ + + +# if defined(__cplusplus) +extern "C" + { +# endif + + +/*+**************************************************************************** + * Processing functions * + ******************************************************************************/ +scoplib_vector_p clan_vector_term(clan_symbol_p, int, char *); + + +# if defined(__cplusplus) + } +# endif +#endif /* define CLAN_VECTOR_H */ diff --git a/clan/scoplib/scoplib-0.2.0.tar.gz b/clan/scoplib/scoplib-0.2.0.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..ad8a787dcb6545e56523d6b2a5f778ae22db6bf9 GIT binary patch literal 942376 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

&T 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Μiv2<;=HP0)_6{fzIV9E8n`rz^#iAu3^^Vo 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 yWuPD4Xl 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


TI<4E8N5?9C zJ#OK#jU7^$^~ZG|-Z_;1d4nd`uDK%?lZHPr!y4PSq_}?OQ;$9;>AL#f>LBm_F`Q8I z;39r2PvI{~Kh7U`;=XCgx`m-)`ITn6E-76>n~psCc63$R4%eIcPYc3}kNrp}*@9nw zdj9_AZe>|y-i{s+T6xBS0uLQxO^0z$RpH~=juC6rG zcxx0Il#0!(=G9vf(>({ro3LuN^vBnVn0adkwk`Q|!_aBTheh*BO|G{TbmcXaYjHnW z-ebnbp@Og6yzI{xLB%DuCMEGrn2tVt%hbD&j^7V%#7zaoSMtT~*zk0B-YTJ^UY~<_ zj+8CB|JM83QSPL&dmgt9-h~Y*Jf1o`&k9sBAIEv^+aVp>s;GHxEVW1b@l&3ii?%ON zmkaS}_Bd}lr7HY5*Y8}-`Khwnn1dGEUWq2r`$^A?8+KXh56*W?i{ ztdl1DW~1D%2Kiju9WMFRnziC3gmLY_9&Tg&#nMPglb*{j^D2kSj;6oJ=MEC&KGac| zN4~%&?$%#)xXvy`+3=QM{fCO%<6Q&Vy4y}fYre(TCO%1tUQlN!Y4fX6{99L%#VRwq z#qZ}_|9b2y`S<{LAIG9#qd`F0HZI!WtCP0l_BEdbs&Z?v`RA@X`{f3z?W;0~O&&D^ z)#rw+U5G6gQ_uBP%XRzbp6*oXe%|9ii7av7+WK-u-u;ydx_68BJTH~*KG72MmjA=# z{>3BW)lY3@1m3sR$rj(AAH=PGL4`D4eEaOVtklsb+hiu6Hl8fnqp!CYzbRVbp~!=1 zOKNUNnt90cv@baijQ3e*S$A#>n4q@hPvv{wG(PhztZ358EYxI_V@2Y<0_QhSh(LUivd$Q+i=axA0Hi z)B=;D`MsGnbHsbTs)S9I+!J(fxoOw(G`LN!spQwsya|Of!lN8lJYP@sO-u!e;IN!q z3py*$$!_!I8Of47xVvn=2A3v>p`DGwfy}S!Ln%Mi`*HKWjB{{U+_s+D$o)IVe8>2Z zFqS-ckAKO|vyM5h=A~-XpEPxe*sHbnsLHFHhtb>;OBVR}TM^xO!02`;Eo9{eusFUgg|meL?Q&`=h6YPQKEZTkP#NKY;7@fy+DQ9{R{h!I^9NRBB7ccA~w^gl_m+e{_r4^mj9zL%Y`!sxBfduf6^yM8(g*fM9 z9s^%yCeCGZ*b(7+rjryi&pXuH-}}d>&tEII%{lnFOVwWE$K!)(AC}4FI9auLKKT8->jzGrPg{Dvj`n@)XOVl7&)!J6ss3&Lhk9&X*+;pA zol734JMVnX^<<;OD%XXNth@J@&-c>)kxsF0vC-5$Iet4TXvr1lCI^+GE?a*~mFO*s zJi^>OyC3UvEz�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�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 b@mu^Bzr}CyTl^Nk-0!~t8&lvJ0FWsF1Wuls literal 0 HcwPel00001 diff --git a/clan/source/Makefile.am b/clan/source/Makefile.am new file mode 100644 index 0000000..63af6ec --- /dev/null +++ b/clan/source/Makefile.am @@ -0,0 +1,82 @@ +# +# /**------- <| --------------------------------------------------------** +# ** A Clan ** +# **--- /.\ -----------------------------------------------------** +# ** <| [""M# makefile.am ** +# **- A | # -----------------------------------------------------** +# ** /.\ [""M# First version: 30/04/2008 ** +# **- [""M# | # U"U#U -----------------------------------------------** +# | # | # \ .:/ +# | # | #___| # +# ****** | "--' .-" ***************************************************** +# * |"-"-"-"-"-#-#-## Clan : the Chunky Loop Analyser (experimental) * +# **** | # ## ###### **************************************************** +# * \ .::::'/ * +# * \ ::::'/ Copyright (C) 2008 Cedric Bastoul * +# * :8a| # # ## * +# * ::88a ### This is free software; you can redistribute it * +# * ::::888a 8a ##::. and/or modify it under the terms of the GNU * +# * ::::::::888a88a[]::: Lesser General Public License as published by * +# *::8:::::::::SUNDOGa8a::. the Free Software Foundation, either version 3 of * +# *::::::::8::::888:Y8888:: the License, or (at your option) * +# *::::':::88::::888::Y88a::::::::::::... any later version. * +# *::'::.. . ..... .. ... . * +# * This software is distributed in the hope that it will be useful, but * +# * WITHOUT ANY WARRANTY; without even the implied warranty of * +# * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General * +# * Public License for more details. * +# * * +# * You should have received a copy of the GNU Lesser General Public * +# * License along with software; if not, write to the Free Software * +# * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * +# * * +# * Clan, the Chunky Loop Analyser * +# * Written by Cedric Bastoul, Cedric.Bastoul@inria.fr * +# * * +# *****************************************************************************/ +# +# Makefile.am (or makefile if generated) of Clan, the Chunky Loop Analyser. +# Makefile.am is not a makefile, you must run the 'autogen.sh' THEN the +# configure shellscript to generate the Makefile thanks to this file. + + + +############################################################################# +SUBDIRS = + +############################################################################# +MAINTAINERCLEANFILES = Makefile.in + +INCLUDES = -I$(top_builddir) -I$(top_srcdir) \ + -I$(top_builddir)/include \ + -I$(top_srcdir)/include + +############################################################################# + +lib_LTLIBRARIES = libclan.la + + +libclan_la_SOURCES = \ + parser.y \ + scanner.l \ + options.c \ + symbol.c \ + scop.c \ + statement.c \ + matrix.c \ + vector.c + +AM_CFLAGS = -Wall -fomit-frame-pointer -g + + +bin_PROGRAMS = clan + +LDADD = libclan.la + +clan_SOURCES = clan.c + +YFLAGS = -y -d + +#EXTRA_DIST = \ +# parser.h +# diff --git a/clan/source/clan.c b/clan/source/clan.c new file mode 100644 index 0000000..3a732d0 --- /dev/null +++ b/clan/source/clan.c @@ -0,0 +1,80 @@ + + /*+------- <| --------------------------------------------------------** + ** A Clan ** + **--- /.\ -----------------------------------------------------** + ** <| [""M# clan.c ** + **- A | # -----------------------------------------------------** + ** /.\ [""M# First version: 30/04/2008 ** + **- [""M# | # U"U#U -----------------------------------------------** + | # | # \ .:/ + | # | #___| # + ****** | "--' .-" ****************************************************** + * |"-"-"-"-"-#-#-## Clan : the Chunky Loop Analyzer (experimental) * + **** | # ## ###### ***************************************************** + * \ .::::'/ * + * \ ::::'/ Copyright (C) 2008 Cedric Bastoul * + * :8a| # # ## * + * ::88a ### This is free software; you can redistribute it * + * ::::888a 8a ##::. and/or modify it under the terms of the GNU Lesser * + * ::::::::888a88a[]::: General Public License as published by the Free * + *::8:::::::::SUNDOGa8a::. Software Foundation, either version 3 of the * + *::::::::8::::888:Y8888:: License, or (at your option) any later version. * + *::::':::88::::888::Y88a::::::::::::... * + *::'::.. . ..... .. ... . * + * This software is distributed in the hope that it will be useful, but * + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * + * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License * + * for more details. * + * * + * You should have received a copy of the GNU Lesser General Public License * + * along with software; if not, write to the Free Software Foundation, Inc., * + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * + * * + * Clan, the Chunky Loop Analyzer * + * Written by Cedric Bastoul, Cedric.Bastoul@inria.fr * + * * + ******************************************************************************/ + +#include +#include + +#include +#include + + +int main(int argc, char * argv[]) +{ + scoplib_scop_p scop; + clan_options_p options; + FILE * input; + FILE * output; + + /* Options and input/output file setting. */ + options = clan_options_read(argc,argv,&input,&output); + + /* Extraction of the polyhedral representation of the SCoP from the input. */ + if (options->inputscop) + /* Input is a .scop file. */ + scop = scoplib_scop_read(input); + else + /* Input is a source code. */ + scop = clan_scop_extract(input,options); + + /* Printing of the internal data structure of the SCoP if asked. */ + if (options->structure) + scoplib_scop_print(stdout,scop); + + /* Generation of the .scop output file. */ + int sopt = 0; + if (options->castle) + sopt |= SCOPLIB_SCOP_PRINT_CASTLE; + if (options->arraystag) + sopt |= SCOPLIB_SCOP_PRINT_ARRAYSTAG; + scoplib_scop_print_dot_scop_options(output,scop,sopt); + + /* Save the planet. */ + clan_options_free(options); + scoplib_scop_free(scop); + + return 0; +} diff --git a/clan/source/matrix.c b/clan/source/matrix.c new file mode 100644 index 0000000..3683e8a --- /dev/null +++ b/clan/source/matrix.c @@ -0,0 +1,166 @@ + + /*+------- <| --------------------------------------------------------** + ** A Clan ** + **--- /.\ -----------------------------------------------------** + ** <| [""M# matrix.c ** + **- A | # -----------------------------------------------------** + ** /.\ [""M# First version: 30/04/2008 ** + **- [""M# | # U"U#U -----------------------------------------------** + | # | # \ .:/ + | # | #___| # + ****** | "--' .-" ****************************************************** + * |"-"-"-"-"-#-#-## Clan : the Chunky Loop Analyzer (experimental) * + **** | # ## ###### ***************************************************** + * \ .::::'/ * + * \ ::::'/ Copyright (C) 2008 Cedric Bastoul * + * :8a| # # ## * + * ::88a ### This is free software; you can redistribute it * + * ::::888a 8a ##::. and/or modify it under the terms of the GNU Lesser * + * ::::::::888a88a[]::: General Public License as published by the Free * + *::8:::::::::SUNDOGa8a::. Software Foundation, either version 3 of the * + *::::::::8::::888:Y8888:: License, or (at your option) any later version. * + *::::':::88::::888::Y88a::::::::::::... * + *::'::.. . ..... .. ... . * + * This software is distributed in the hope that it will be useful, but * + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * + * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License * + * for more details. * + * * + * You should have received a copy of the GNU Lesser General Public License * + * along with software; if not, write to the Free Software Foundation, Inc., * + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * + * * + * Clan, the Chunky Loop Analyzer * + * Written by Cedric Bastoul, Cedric.Bastoul@inria.fr * + * * + ******************************************************************************/ + + +# include +# include +# include +# include +# include + + +/*+**************************************************************************** + * Processing functions * + ******************************************************************************/ + + +/** + * clan_matrix_tag_array function: + * this function tags a matrix to explicit it is describing the array index of + * a given array. This means using SCoP representation that the very first + * element of the very first row will be the array number instead of zero. + * It updates directly the matrix provided as parameter. + * \param matrix The matrix to tag. + * \param array The array number. + ** + * - 02/05/2008: first version. + */ +void +clan_matrix_tag_array(scoplib_matrix_p matrix, int array) +{ + if ((matrix == NULL) || (matrix->NbRows == 0)) + { + fprintf(stderr,"[Clan] Error: matrix cannot be array-tagged\n"); + exit(1); + } + + SCOPVAL_set_si(matrix->p[0][0],array); +} + + +/** + * clan_matrix_scheduling function: + * this function builds the scheduling matrix for the clan_statement_t + * structures thanks to the parser current state of parser_scheduling (rank) + * and parser_depth (depth). The "rank" vector gives the "position" of the + * statement for every loop depth (see Feautrier's demonstration of existence + * of a schedule for any SCoP or CLooG's manual for original scattering + * function to understand if necessary). This function just "expands" this + * vector to a (2*n+1)-dimensional schedule for a statement at depth n and + * returns it. + * \param rank The position of the statement at every loop depth. + * \param depth The depth of the statement. + ** + * - 01/05/2008: First version. + */ +scoplib_matrix_p +clan_matrix_scheduling(int * rank, int depth) +{ + int i, j, nb_rows, nb_columns; + scoplib_matrix_p scheduling; + + nb_rows = 2 * depth + 1; + nb_columns = CLAN_MAX_DEPTH + CLAN_MAX_PARAMETERS + 2; + scheduling = scoplib_matrix_malloc(nb_rows,nb_columns); + + j = 0; + for (i = 0; i < depth; i++) + { + SCOPVAL_set_si(scheduling->p[j][nb_columns-1],rank[i]); + SCOPVAL_set_si(scheduling->p[j+1][i+1],1); + j += 2; + } + SCOPVAL_set_si(scheduling->p[nb_rows-1][nb_columns-1],rank[depth]); + + return scheduling; +} + + +/** + * clan_matrix_compact function: + * This function compacts a matrix such that it uses the right number + * of columns (during construction we used CLAN_MAX_DEPTH and + * CLAN_MAX_PARAMETERS to define matrix and vector sizes). It modifies + * directly the matrix provided as parameter. + * \param matrix The matrix to compact. + * \param nb_iterators The true number of iterators for this matrix. + * \param nb_parameters The true number of parameters in the SCoP. + ** + * - 02/05/2008: first version. + * - 24/05/2008: nice bug fixed (p_Init_size was not copied, segfaulting later). + */ +void +clan_matrix_compact(scoplib_matrix_p matrix, int nb_iterators, + int nb_parameters) +{ + int i, j, nb_columns; + scoplib_matrix_p compacted; + + if (matrix == NULL) + return; + + nb_columns = nb_iterators + nb_parameters + 2; + compacted = scoplib_matrix_malloc(matrix->NbRows,nb_columns); + + for (i = 0; i < matrix->NbRows; i++) + { + /* We copy the equality/inequality tag and the iterator coefficients */ + for (j = 0; j <= nb_iterators; j++) + SCOPVAL_assign(compacted->p[i][j],matrix->p[i][j]); + + /* Then we copy the parameter coefficients */ + for (j = 0; j < nb_parameters; j++) + SCOPVAL_assign(compacted->p[i][j + nb_iterators + 1], + matrix->p[i][j + CLAN_MAX_DEPTH + 1]); + + /* Lastly the scalar coefficient */ + SCOPVAL_assign(compacted->p[i][nb_columns - 1], + matrix->p[i][matrix->NbColumns - 1]); + } + + scoplib_matrix_free_inside(matrix); + + /* Replace the inside of matrix */ + matrix->NbRows = compacted->NbRows; + matrix->NbColumns = compacted->NbColumns; + matrix->p = compacted->p; + matrix->p_Init = compacted->p_Init; + matrix->p_Init_size = compacted->p_Init_size; + + /* Free the compacted "container" */ + free(compacted); +} diff --git a/clan/source/options.c b/clan/source/options.c new file mode 100644 index 0000000..7e1ace4 --- /dev/null +++ b/clan/source/options.c @@ -0,0 +1,362 @@ + + /*+------- <| --------------------------------------------------------** + ** A Clan ** + **--- /.\ -----------------------------------------------------** + ** <| [""M# options.c ** + **- A | # -----------------------------------------------------** + ** /.\ [""M# First version: 24/05/2008 ** + **- [""M# | # U"U#U -----------------------------------------------** + | # | # \ .:/ + | # | #___| # + ****** | "--' .-" ****************************************************** + * |"-"-"-"-"-#-#-## Clan : the Chunky Loop Analyzer (experimental) * + **** | # ## ###### ***************************************************** + * \ .::::'/ * + * \ ::::'/ Copyright (C) 2008 Cedric Bastoul * + * :8a| # # ## * + * ::88a ### This is free software; you can redistribute it * + * ::::888a 8a ##::. and/or modify it under the terms of the GNU Lesser * + * ::::::::888a88a[]::: General Public License as published by the Free * + *::8:::::::::SUNDOGa8a::. Software Foundation, either version 3 of the * + *::::::::8::::888:Y8888:: License, or (at your option) any later version. * + *::::':::88::::888::Y88a::::::::::::... * + *::'::.. . ..... .. ... . * + * This software is distributed in the hope that it will be useful, but * + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * + * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License * + * for more details. * + * * + * You should have received a copy of the GNU Lesser General Public License * + * along with software; if not, write to the Free Software Foundation, Inc., * + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * + * * + * Clan, the Chunky Loop Analyzer * + * Written by Cedric Bastoul, Cedric.Bastoul@inria.fr * + * * + ******************************************************************************/ + + +# include +# include +# include +# include +# include + + +/*+**************************************************************************** + * Structure display function * + ******************************************************************************/ + + +/** + * clan_option_print function: + * This function prints the content of a clan_options_t structure (program) into + * a file (foo, possibly stdout). + * \param foo File where informations are printed. + * \param options Option structure whose information have to be printed. + ** + * - 24/05/2008: first version (from CLooG 0.14.1). + */ +void +clan_options_print(FILE * foo, clan_options_p options) +{ + fprintf(foo,"Options:\n"); + + if (options->name != NULL) + fprintf(foo,"name = %s,\n",options->name); + else + fprintf(foo,"name = NULL,\n"); + + fprintf(foo,"castle = %3d,\n",options->castle); + fprintf(foo,"structure = %3d.\n",options->structure); + fprintf(foo,"inputscop = %3d.\n",options->inputscop); + fprintf(foo,"bounded_context = %3d.\n",options->bounded_context); +} + + +/*+**************************************************************************** + * Memory deallocation function * + ******************************************************************************/ + + +/** + * clan_options_free function: + * This function frees the allocated memory for a clan_options_t structure. + * \param options Option structure to be freed. + ** + * - 24/05/2008: first version (from CLooG 0.14.1). + */ +void +clan_options_free(clan_options_p options) +{ + free(options); +} + + +/*+**************************************************************************** + * Processing functions * + ******************************************************************************/ + + +/** + * clan_options_help function: + * This function displays the quick help when the user set the option -help + * while calling clan. Prints are cut to respect the 509 characters + * limitation of the ISO C 89 compilers. + ** + * - 24/05/2008: first version (from CLooG 0.14.1). + */ +void +clan_options_help() +{ + printf( + "Usage: clan [ options | file ] ...\n"); + printf( + "\nGeneral options:\n" + " -o Name of the output file; 'stdout' is a special\n" + " value: when used, output is standard output\n" + " (default setting: stdout).\n" + " -inputscop Read a .scop as the input.\n" + " -arraystag Dump the arrays table in the tag.\n" + " -boundedctxt Bound all global parameters to be >= -1.\n" + " -v, --version Display the release information (and more).\n" + " -h, --help Display this information.\n\n"); + printf( + "The special value 'stdin' for 'file' or the special option '-' makes clan\n" + "to read data on standard input.\n\n" + "For bug reporting or any suggestions, please send an email to the author\n" + "Cedric Bastoul .\n"); +} + + +/** + * clan_options_version function: + * This function displays some version informations when the user set the + * option -version while calling clan. Prints are cut to respect the 509 + * characters limitation of the ISO C 89 compilers. + ** + * - 24/05/2008: first version (from CLooG 0.14.1). + */ +void +clan_options_version() +{ + printf("clan %s %s bits The Chunky Loop Analyzer\n", + CLAN_RELEASE,CLAN_VERSION); + printf( + "-----\n" + "This is a polyhedral representation extractor for imperative programs using " + "a C\ngrammar for control flow and array accesses (this includes C, C++," + " Java, C#\nand probably few toy languages too). This program is distributed " + "under the\nterms of the GNU Lesser General Public License, see details of " + "the licence at\nhttp://www.gnu.org/copyleft/lgpl.html\n" + "-----\n"); + printf( + "It would be fair to refer the following paper in any publication " + "resulting from\nthe use of this software or its library (it defines SCoPs):\n" + "@InProceedings{Bas03,\n" + "author = {Cedric Bastoul and Albert Cohen and Sylvain Girbal and\n" + " Saurabh Sharma and Olivier Temam},\n" + "title = {Putting Polyhedral Loop Transformations to Work},\n" + "booktitle = {LCPC'16 International Workshop on Languages and\n" + " Compilers for Parallel Computers, LNCS 2958},\n" + "pages = {209--225},\n" + "month = {october},\n" + "year = 2003,\n" + "address = {College Station, Texas}\n" + "}\n" + "-----\n"); + printf( + "For any information, please send an email to the author\n" + "Cedric Bastoul .\n"); +} + + +/** + * clan_options_set function: + * This function sets the value of an option thanks to the user's calling line. + * \param option The value to set, + * \param argv Number of elements in the user's calling line, + * \param argc Elements of the user's calling line, + * \param number Number of the element corresponding to the considered option, + * this function adds 1 to number to pass away the option value. + ** + * - 24/05/2008: first version (from CLooG 0.14.1). + */ +void +clan_options_set(int * option, int argv, char ** argc, int * number) +{ + char ** endptr; + + if (*number+1 >= argv) + { fprintf(stderr, "[clan]ERROR: an option lacks of argument.\n"); + exit(1); + } + + endptr = NULL; + *option = strtol(argc[*number+1],endptr,10); + if (endptr != NULL) + { fprintf(stderr, "[clan]ERROR: %s value for %s option is not valid.\n", + argc[*number+1],argc[*number]); + exit(1); + } + *number = *number + 1; +} + + +/** + * clan_options_malloc function: + * This functions allocate the memory space for a clan_options_t structure and + * fill its fields with the defaults values. It returns a pointer to the + * allocated clan_options_t structure. + ** + * - 24/05/2008: first version (from CLooG 0.14.1). + */ +clan_options_p +clan_options_malloc(void) +{ + clan_options_p options; + + /* Memory allocation for the clan_options_t structure. */ + options = (clan_options_p)malloc(sizeof(clan_options_t)); + if (options == NULL) + { fprintf(stderr, "[clan]ERROR: memory overflow.\n"); + exit(1); + } + + /* We set the various fields with default values. */ + options->name = NULL; /* Name of the input file is not set. */ + options->castle = 1; /* Do print the Clan McCloog castle in output. */ + options->structure = 0; /* Don't print internal structure.*/ + options->inputscop = 0; /* Default input is a source file, not a .scop.*/ + options->arraystag = 0; /* Don't dump the array list in the + tag. */ + options->bounded_context = 0;/* Don't bound the global parameters. */ + return options; +} + + +/** + * clan_options_read function: + * This functions reads all the options and the input/output files thanks + * the the user's calling line elements (in argc). It fills a clan_options_t + * structure and the FILE structure corresponding to input and output files. + * \param argv Number of strings in command line. + * \param argc Array of command line strings. + * \param input Input file (modified by the function). + * \param output Output file (modified by the function). + ** + * - 24/05/2008: first version (from CLooG 0.14.1). + */ +clan_options_p +clan_options_read(int argv, char ** argc, FILE ** input, FILE ** output) +{ + int i, infos=0, input_is_set=0; + clan_options_p options; + + /* clan_options_t structure allocation and initialization. */ + options = clan_options_malloc(); + + /* The default output is the standard output. */ + *output = stdout; + + for (i=1; i < argv; i++) + { + if (argc[i][0] == '-') + { + if (argc[i][1] == '\0') + { + /* "-" alone is a special option to set input to standard input. */ + input_is_set = 1; + *input = stdin; + } + else + if (strcmp(argc[i],"-castle") == 0) + clan_options_set(&(options)->castle,argv,argc,&i); + else + if (strcmp(argc[i],"-structure") == 0) + options->structure = 1; + else + if (strcmp(argc[i],"-inputscop") == 0) + options->inputscop = 1; + else + if (strcmp(argc[i],"-arraystag") == 0) + options->arraystag = 1; + else + if (strcmp(argc[i],"-boundedctxt") == 0) + options->bounded_context = 1; + else + if ((strcmp(argc[i],"--help") == 0) || (strcmp(argc[i],"-h") == 0)) + { + clan_options_help(); + infos = 1; + } + else + if ((strcmp(argc[i],"--version") == 0) || (strcmp(argc[i],"-v") == 0)) + { + clan_options_version(); + infos = 1; + } + else + if (strcmp(argc[i],"-o") == 0) + { + if (i+1 >= argv) + { + fprintf(stderr, "[clan]ERROR: no output name for -o option.\n"); + exit(1); + } + + /* stdout is a special value to set output to standard output. */ + if (strcmp(argc[i+1],"stdout") == 0) + *output = stdout; + else + { + *output = fopen(argc[i+1],"w"); + if (*output == NULL) + { + fprintf(stderr, "[clan]ERROR: can't create output file %s.\n", + argc[i+1]); + exit(1); + } + } + i++; + } + else + fprintf(stderr, "[clan]WARNING: unknown %s option.\n",argc[i]); + } + else + { + if (!input_is_set) + { + input_is_set = 1; + options->name = argc[i]; + /* stdin is a special value to set input to standard input. */ + if (strcmp(argc[i],"stdin") == 0) + *input = stdin; + else + { + *input = fopen(argc[i],"r"); + if (*input == NULL) + { + fprintf(stderr, "[clan]ERROR: %s file does not exist.\n",argc[i]); + exit(1); + } + } + } + else + { + fprintf(stderr, "[clan]ERROR: multiple input files.\n"); + exit(1); + } + } + } + + if (!input_is_set) + { + if (!infos) + fprintf(stderr, "[clan]ERROR: no input file (-h for help).\n"); + clan_options_free(options); + exit(1); + } + + return options; +} diff --git a/clan/source/parser.c b/clan/source/parser.c new file mode 100644 index 0000000..ef8955d --- /dev/null +++ b/clan/source/parser.c @@ -0,0 +1,2945 @@ +/* A Bison parser, made by GNU Bison 2.3. */ + +/* Skeleton implementation for Bison's Yacc-like parsers in C + + Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002, 2003, 2004, 2005, 2006 + Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. */ + +/* As a special exception, you may create a larger work that contains + part or all of the Bison parser skeleton and distribute that work + under terms of your choice, so long as that work isn't itself a + parser generator using the skeleton or a modified version thereof + as a parser skeleton. Alternatively, if you modify or redistribute + the parser skeleton itself, you may (at your option) remove this + special exception, which will cause the skeleton and the resulting + Bison output files to be licensed under the GNU General Public + License without this special exception. + + This special exception was added by the Free Software Foundation in + version 2.2 of Bison. */ + +/* C LALR(1) parser skeleton written by Richard Stallman, by + simplifying the original so-called "semantic" parser. */ + +/* All symbols defined below should begin with yy or YY, to avoid + infringing on user name space. This should be done even for local + variables, as they might otherwise be expanded by user macros. + There are some unavoidable exceptions within include files to + define necessary library symbols; they are noted "INFRINGES ON + USER NAME SPACE" below. */ + +/* Identify Bison output. */ +#define YYBISON 1 + +/* Bison version. */ +#define YYBISON_VERSION "2.3" + +/* Skeleton name. */ +#define YYSKELETON_NAME "yacc.c" + +/* Pure parsers. */ +#define YYPURE 0 + +/* Using locations. */ +#define YYLSP_NEEDED 0 + + + +/* Tokens. */ +#ifndef YYTOKENTYPE +# define YYTOKENTYPE + /* Put the tokens into the symbol table, so that GDB and other debuggers + know about them. */ + enum yytokentype { + IGNORE = 258, + IF = 259, + ELSE = 260, + FOR = 261, + PRAGMALOCALVARS = 262, + PRAGMALIVEOUT = 263, + MIN = 264, + MAX = 265, + CEILD = 266, + FLOORD = 267, + REAL = 268, + ID = 269, + INTEGER = 270, + syRPARENTHESIS = 271, + syLPARENTHESIS = 272, + syRBRACKET = 273, + syLBRACKET = 274, + syRBRACE = 275, + syLBRACE = 276, + sySEMICOLON = 277, + syCOMMA = 278, + syPOINT = 279, + syARROW = 280, + opEQUAL = 281, + opLEQ = 282, + opGEQ = 283, + opLOWER = 284, + opGREATER = 285, + opPLUS = 286, + opMINUS = 287, + opINCREMENTATION = 288, + opDECREMENTATION = 289, + opNOT = 290, + opMULTIPLY = 291, + opDIVIDE = 292, + opMOD = 293, + opAND = 294, + opOR = 295, + opCOMP = 296, + opASSIGNMENT = 297, + opPLUSEQUAL = 298, + opMINUSEQUAL = 299, + opMULTIPLYEQUAL = 300, + opDIVIDEEQUAL = 301, + opMODEQUAL = 302, + opANDEQUAL = 303, + opOREQUAL = 304, + opCOMPEQUAL = 305, + opLAND = 306, + opLOR = 307, + opQMARK = 308, + opCOLON = 309, + MAXPRIORITY = 310 + }; +#endif +/* Tokens. */ +#define IGNORE 258 +#define IF 259 +#define ELSE 260 +#define FOR 261 +#define PRAGMALOCALVARS 262 +#define PRAGMALIVEOUT 263 +#define MIN 264 +#define MAX 265 +#define CEILD 266 +#define FLOORD 267 +#define REAL 268 +#define ID 269 +#define INTEGER 270 +#define syRPARENTHESIS 271 +#define syLPARENTHESIS 272 +#define syRBRACKET 273 +#define syLBRACKET 274 +#define syRBRACE 275 +#define syLBRACE 276 +#define sySEMICOLON 277 +#define syCOMMA 278 +#define syPOINT 279 +#define syARROW 280 +#define opEQUAL 281 +#define opLEQ 282 +#define opGEQ 283 +#define opLOWER 284 +#define opGREATER 285 +#define opPLUS 286 +#define opMINUS 287 +#define opINCREMENTATION 288 +#define opDECREMENTATION 289 +#define opNOT 290 +#define opMULTIPLY 291 +#define opDIVIDE 292 +#define opMOD 293 +#define opAND 294 +#define opOR 295 +#define opCOMP 296 +#define opASSIGNMENT 297 +#define opPLUSEQUAL 298 +#define opMINUSEQUAL 299 +#define opMULTIPLYEQUAL 300 +#define opDIVIDEEQUAL 301 +#define opMODEQUAL 302 +#define opANDEQUAL 303 +#define opOREQUAL 304 +#define opCOMPEQUAL 305 +#define opLAND 306 +#define opLOR 307 +#define opQMARK 308 +#define opCOLON 309 +#define MAXPRIORITY 310 + + + + +/* Copy the first part of user declarations. */ +#line 39 "parser.y" + + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + + int yylex(void); + void yyerror(char *); + int clan_parse_error = 0; /**< Set to 1 during parsing if + encountered an error */ + void clan_parser_log(char *); + scoplib_scop_p clan_parse(FILE *, clan_options_p); + + extern FILE * yyin; /**< File to be read by Lex */ + extern char scanner_latest_text[]; /**< Latest text read by Lex */ + + /* This is the "parser state", a collection of variables that vary + * during the parsing and thanks to we can extract all SCoP informations. + */ + scoplib_scop_p parser_scop; /**< SCoP in construction */ + scoplib_statement_p parser_statement; /**< Statement in construction */ + clan_symbol_p parser_symbol; /**< Top of the symbol table */ + int parser_recording; /**< Boolean: do we record or not? */ + char * parser_record; /**< What we record + (statement body) */ + int parser_depth = 0; /**< Current loop depth */ + int * parser_scheduling; /**< Current statement scheduling */ + clan_symbol_p * parser_iterators; /**< Current iterator list */ + scoplib_matrix_p parser_domain; /**< Current iteration domain */ + int parser_nb_cons = 0; /**< Current number of constraints */ + int * parser_consperdim; /**< Constraint nb for each + dimension */ + int* parser_variables_localvars;/**< List of variables + in #pragma + local-vars */ + int* parser_variables_liveout;/**< List of variables + in #pragma + live-out */ + /* Ugly global variable to keep/read Clan options during parsing. */ + clan_options_p parser_options = NULL; + + + + +/* Enabling traces. */ +#ifndef YYDEBUG +# define YYDEBUG 0 +#endif + +/* Enabling verbose error messages. */ +#ifdef YYERROR_VERBOSE +# undef YYERROR_VERBOSE +# define YYERROR_VERBOSE 1 +#else +# define YYERROR_VERBOSE 0 +#endif + +/* Enabling the token table. */ +#ifndef YYTOKEN_TABLE +# define YYTOKEN_TABLE 0 +#endif + +#if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED +typedef union YYSTYPE +#line 90 "parser.y" +{ int value; /**< An integer value for integers */ + char * symbol; /**< A string for identifiers */ + scoplib_vector_p affex; /**< An affine expression */ + scoplib_matrix_p setex; /**< A set of affine expressions */ + scoplib_matrix_p rw[2]; /**< Read and write array accesses */ + } +/* Line 187 of yacc.c. */ +#line 264 "parser.c" + YYSTYPE; +# define yystype YYSTYPE /* obsolescent; will be withdrawn */ +# define YYSTYPE_IS_DECLARED 1 +# define YYSTYPE_IS_TRIVIAL 1 +#endif + + + +/* Copy the second part of user declarations. */ + + +/* Line 216 of yacc.c. */ +#line 277 "parser.c" + +#ifdef short +# undef short +#endif + +#ifdef YYTYPE_UINT8 +typedef YYTYPE_UINT8 yytype_uint8; +#else +typedef unsigned char yytype_uint8; +#endif + +#ifdef YYTYPE_INT8 +typedef YYTYPE_INT8 yytype_int8; +#elif (defined __STDC__ || defined __C99__FUNC__ \ + || defined __cplusplus || defined _MSC_VER) +typedef signed char yytype_int8; +#else +typedef short int yytype_int8; +#endif + +#ifdef YYTYPE_UINT16 +typedef YYTYPE_UINT16 yytype_uint16; +#else +typedef unsigned short int yytype_uint16; +#endif + +#ifdef YYTYPE_INT16 +typedef YYTYPE_INT16 yytype_int16; +#else +typedef short int yytype_int16; +#endif + +#ifndef YYSIZE_T +# ifdef __SIZE_TYPE__ +# define YYSIZE_T __SIZE_TYPE__ +# elif defined size_t +# define YYSIZE_T size_t +# elif ! defined YYSIZE_T && (defined __STDC__ || defined __C99__FUNC__ \ + || defined __cplusplus || defined _MSC_VER) +# include /* INFRINGES ON USER NAME SPACE */ +# define YYSIZE_T size_t +# else +# define YYSIZE_T unsigned int +# endif +#endif + +#define YYSIZE_MAXIMUM ((YYSIZE_T) -1) + +#ifndef YY_ +# if YYENABLE_NLS +# if ENABLE_NLS +# include /* INFRINGES ON USER NAME SPACE */ +# define YY_(msgid) dgettext ("bison-runtime", msgid) +# endif +# endif +# ifndef YY_ +# define YY_(msgid) msgid +# endif +#endif + +/* Suppress unused-variable warnings by "using" E. */ +#if ! defined lint || defined __GNUC__ +# define YYUSE(e) ((void) (e)) +#else +# define YYUSE(e) /* empty */ +#endif + +/* Identity function, used to suppress warnings about constant conditions. */ +#ifndef lint +# define YYID(n) (n) +#else +#if (defined __STDC__ || defined __C99__FUNC__ \ + || defined __cplusplus || defined _MSC_VER) +static int +YYID (int i) +#else +static int +YYID (i) + int i; +#endif +{ + return i; +} +#endif + +#if ! defined yyoverflow || YYERROR_VERBOSE + +/* The parser invokes alloca or malloc; define the necessary symbols. */ + +# ifdef YYSTACK_USE_ALLOCA +# if YYSTACK_USE_ALLOCA +# ifdef __GNUC__ +# define YYSTACK_ALLOC __builtin_alloca +# elif defined __BUILTIN_VA_ARG_INCR +# include /* INFRINGES ON USER NAME SPACE */ +# elif defined _AIX +# define YYSTACK_ALLOC __alloca +# elif defined _MSC_VER +# include /* INFRINGES ON USER NAME SPACE */ +# define alloca _alloca +# else +# define YYSTACK_ALLOC alloca +# if ! defined _ALLOCA_H && ! defined _STDLIB_H && (defined __STDC__ || defined __C99__FUNC__ \ + || defined __cplusplus || defined _MSC_VER) +# include /* INFRINGES ON USER NAME SPACE */ +# ifndef _STDLIB_H +# define _STDLIB_H 1 +# endif +# endif +# endif +# endif +# endif + +# ifdef YYSTACK_ALLOC + /* Pacify GCC's `empty if-body' warning. */ +# define YYSTACK_FREE(Ptr) do { /* empty */; } while (YYID (0)) +# ifndef YYSTACK_ALLOC_MAXIMUM + /* The OS might guarantee only one guard page at the bottom of the stack, + and a page size can be as small as 4096 bytes. So we cannot safely + invoke alloca (N) if N exceeds 4096. Use a slightly smaller number + to allow for a few compiler-allocated temporary stack slots. */ +# define YYSTACK_ALLOC_MAXIMUM 4032 /* reasonable circa 2006 */ +# endif +# else +# define YYSTACK_ALLOC YYMALLOC +# define YYSTACK_FREE YYFREE +# ifndef YYSTACK_ALLOC_MAXIMUM +# define YYSTACK_ALLOC_MAXIMUM YYSIZE_MAXIMUM +# endif +# if (defined __cplusplus && ! defined _STDLIB_H \ + && ! ((defined YYMALLOC || defined malloc) \ + && (defined YYFREE || defined free))) +# include /* INFRINGES ON USER NAME SPACE */ +# ifndef _STDLIB_H +# define _STDLIB_H 1 +# endif +# endif +# ifndef YYMALLOC +# define YYMALLOC malloc +# if ! defined malloc && ! defined _STDLIB_H && (defined __STDC__ || defined __C99__FUNC__ \ + || defined __cplusplus || defined _MSC_VER) +void *malloc (YYSIZE_T); /* INFRINGES ON USER NAME SPACE */ +# endif +# endif +# ifndef YYFREE +# define YYFREE free +# if ! defined free && ! defined _STDLIB_H && (defined __STDC__ || defined __C99__FUNC__ \ + || defined __cplusplus || defined _MSC_VER) +void free (void *); /* INFRINGES ON USER NAME SPACE */ +# endif +# endif +# endif +#endif /* ! defined yyoverflow || YYERROR_VERBOSE */ + + +#if (! defined yyoverflow \ + && (! defined __cplusplus \ + || (defined YYSTYPE_IS_TRIVIAL && YYSTYPE_IS_TRIVIAL))) + +/* A type that is properly aligned for any stack member. */ +union yyalloc +{ + yytype_int16 yyss; + YYSTYPE yyvs; + }; + +/* The size of the maximum gap between one aligned stack and the next. */ +# define YYSTACK_GAP_MAXIMUM (sizeof (union yyalloc) - 1) + +/* The size of an array large to enough to hold all stacks, each with + N elements. */ +# define YYSTACK_BYTES(N) \ + ((N) * (sizeof (yytype_int16) + sizeof (YYSTYPE)) \ + + YYSTACK_GAP_MAXIMUM) + +/* Copy COUNT objects from FROM to TO. The source and destination do + not overlap. */ +# ifndef YYCOPY +# if defined __GNUC__ && 1 < __GNUC__ +# define YYCOPY(To, From, Count) \ + __builtin_memcpy (To, From, (Count) * sizeof (*(From))) +# else +# define YYCOPY(To, From, Count) \ + do \ + { \ + YYSIZE_T yyi; \ + for (yyi = 0; yyi < (Count); yyi++) \ + (To)[yyi] = (From)[yyi]; \ + } \ + while (YYID (0)) +# endif +# endif + +/* Relocate STACK from its old location to the new one. The + local variables YYSIZE and YYSTACKSIZE give the old and new number of + elements in the stack, and YYPTR gives the new location of the + stack. Advance YYPTR to a properly aligned location for the next + stack. */ +# define YYSTACK_RELOCATE(Stack) \ + do \ + { \ + YYSIZE_T yynewbytes; \ + YYCOPY (&yyptr->Stack, Stack, yysize); \ + Stack = &yyptr->Stack; \ + yynewbytes = yystacksize * sizeof (*Stack) + YYSTACK_GAP_MAXIMUM; \ + yyptr += yynewbytes / sizeof (*yyptr); \ + } \ + while (YYID (0)) + +#endif + +/* YYFINAL -- State number of the termination state. */ +#define YYFINAL 32 +/* YYLAST -- Last index in YYTABLE. */ +#define YYLAST 543 + +/* YYNTOKENS -- Number of terminals. */ +#define YYNTOKENS 56 +/* YYNNTS -- Number of nonterminals. */ +#define YYNNTS 29 +/* YYNRULES -- Number of rules. */ +#define YYNRULES 116 +/* YYNRULES -- Number of states. */ +#define YYNSTATES 220 + +/* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX. */ +#define YYUNDEFTOK 2 +#define YYMAXUTOK 310 + +#define YYTRANSLATE(YYX) \ + ((unsigned int) (YYX) <= YYMAXUTOK ? yytranslate[YYX] : YYUNDEFTOK) + +/* YYTRANSLATE[YYLEX] -- Bison symbol number corresponding to YYLEX. */ +static const yytype_uint8 yytranslate[] = +{ + 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 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 +}; + +#if YYDEBUG +/* YYPRHS[YYN] -- Index of the first RHS symbol of rule number YYN in + YYRHS. */ +static const yytype_uint16 yyprhs[] = +{ + 0, 0, 3, 5, 6, 8, 11, 13, 16, 20, + 22, 26, 27, 28, 29, 30, 46, 47, 54, 55, + 58, 61, 64, 67, 70, 76, 80, 82, 89, 91, + 98, 100, 104, 108, 112, 119, 126, 128, 130, 133, + 137, 141, 145, 149, 154, 159, 162, 166, 170, 174, + 178, 182, 186, 190, 192, 194, 196, 198, 200, 202, + 204, 206, 208, 210, 215, 220, 224, 228, 231, 235, + 237, 239, 241, 243, 245, 247, 249, 251, 253, 255, + 257, 259, 261, 263, 266, 268, 272, 275, 279, 285, + 287, 290, 295, 298, 301, 303, 307, 311, 315, 319, + 323, 325, 329, 333, 335, 336, 340, 345, 347, 351, + 354, 356, 358, 360, 362, 364, 366 +}; + +/* YYRHS -- A `-1'-separated list of the rules' RHS. */ +static const yytype_int8 yyrhs[] = +{ + 57, 0, -1, 58, -1, -1, 60, -1, 58, 60, + -1, 3, -1, 58, 3, -1, 20, 58, 21, -1, + 60, -1, 20, 58, 21, -1, -1, -1, -1, -1, + 6, 16, 82, 61, 42, 69, 62, 22, 72, 63, + 22, 67, 17, 64, 59, -1, -1, 4, 16, 72, + 17, 65, 59, -1, -1, 66, 75, -1, 7, 80, + -1, 8, 80, -1, 82, 33, -1, 33, 82, -1, + 82, 42, 82, 31, 15, -1, 82, 43, 15, -1, + 70, -1, 9, 16, 68, 23, 68, 17, -1, 70, + -1, 10, 16, 69, 23, 69, 17, -1, 71, -1, + 70, 31, 70, -1, 70, 32, 70, -1, 16, 70, + 17, -1, 11, 16, 70, 23, 71, 17, -1, 12, + 16, 70, 23, 71, 17, -1, 15, -1, 82, -1, + 32, 15, -1, 15, 36, 82, -1, 82, 36, 15, + -1, 15, 36, 15, -1, 15, 37, 15, -1, 32, + 15, 36, 82, -1, 32, 82, 36, 15, -1, 32, + 82, -1, 70, 29, 68, -1, 70, 30, 69, -1, + 70, 27, 68, -1, 70, 28, 69, -1, 70, 26, + 70, -1, 16, 72, 17, -1, 72, 51, 72, -1, + 43, -1, 44, -1, 45, -1, 46, -1, 47, -1, + 48, -1, 49, -1, 50, -1, 33, -1, 34, -1, + 78, 42, 77, 22, -1, 78, 73, 77, 22, -1, + 78, 74, 22, -1, 74, 78, 22, -1, 78, 22, + -1, 20, 75, 21, -1, 31, -1, 32, -1, 36, + -1, 37, -1, 38, -1, 28, -1, 30, -1, 27, + -1, 29, -1, 26, -1, 39, -1, 40, -1, 41, + -1, 84, -1, 32, 84, -1, 78, -1, 77, 76, + 77, -1, 35, 77, -1, 16, 77, 17, -1, 77, + 53, 77, 54, 77, -1, 82, -1, 82, 81, -1, + 82, 16, 80, 17, -1, 32, 78, -1, 31, 78, + -1, 84, -1, 79, 32, 79, -1, 79, 31, 79, + -1, 79, 36, 79, -1, 79, 37, 79, -1, 16, + 79, 17, -1, 78, -1, 80, 23, 78, -1, 80, + 23, 79, -1, 79, -1, -1, 18, 70, 19, -1, + 81, 18, 70, 19, -1, 14, -1, 16, 14, 17, + -1, 39, 14, -1, 83, -1, 9, -1, 10, -1, + 11, -1, 12, -1, 15, -1, 13, -1 +}; + +/* YYRLINE[YYN] -- source line where rule number YYN was defined. */ +static const yytype_uint16 yyrline[] = +{ + 0, 140, 140, 169, 177, 178, 179, 180, 181, 192, + 196, 213, 235, 255, 263, 210, 280, 279, 298, 298, + 366, 390, 419, 423, 427, 437, 455, 460, 474, 479, + 493, 497, 503, 509, 513, 518, 535, 542, 551, 558, + 567, 576, 583, 590, 599, 608, 628, 663, 700, 733, + 768, 785, 792, 806, 807, 808, 809, 810, 811, 812, + 813, 822, 823, 836, 849, 863, 876, 889, 897, 910, + 911, 912, 913, 914, 915, 916, 917, 918, 919, 920, + 921, 922, 933, 940, 947, 955, 964, 971, 978, 1000, + 1026, 1039, 1047, 1054, 1065, 1066, 1067, 1068, 1069, 1070, + 1082, 1089, 1096, 1103, 1111, 1126, 1134, 1155, 1162, 1169, + 1176, 1182, 1182, 1182, 1182, 1185, 1186 +}; +#endif + +#if YYDEBUG || YYERROR_VERBOSE || YYTOKEN_TABLE +/* YYTNAME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM. + First, the terminals, then, starting at YYNTOKENS, nonterminals. */ +static const char *const yytname[] = +{ + "$end", "error", "$undefined", "IGNORE", "IF", "ELSE", "FOR", + "PRAGMALOCALVARS", "PRAGMALIVEOUT", "MIN", "MAX", "CEILD", "FLOORD", + "REAL", "ID", "INTEGER", "syRPARENTHESIS", "syLPARENTHESIS", + "syRBRACKET", "syLBRACKET", "syRBRACE", "syLBRACE", "sySEMICOLON", + "syCOMMA", "syPOINT", "syARROW", "opEQUAL", "opLEQ", "opGEQ", "opLOWER", + "opGREATER", "opPLUS", "opMINUS", "opINCREMENTATION", "opDECREMENTATION", + "opNOT", "opMULTIPLY", "opDIVIDE", "opMOD", "opAND", "opOR", "opCOMP", + "opASSIGNMENT", "opPLUSEQUAL", "opMINUSEQUAL", "opMULTIPLYEQUAL", + "opDIVIDEEQUAL", "opMODEQUAL", "opANDEQUAL", "opOREQUAL", "opCOMPEQUAL", + "opLAND", "opLOR", "opQMARK", "opCOLON", "MAXPRIORITY", "$accept", + "program", "instruction_list", "bloc", "instruction", "@1", "@2", "@3", + "@4", "@5", "@6", "incrementation", "min_affine_expression", + "max_affine_expression", "affine_expression", "term", "condition", + "reduction_operator", "unary_operator", "assignment", "binary_operator", + "expression", "variable", "arithmetic_expression", "variable_list", + "array_index", "id", "math_func_list", "NUMBER", 0 +}; +#endif + +# ifdef YYPRINT +/* YYTOKNUM[YYLEX-NUM] -- Internal token number corresponding to + token YYLEX-NUM. */ +static const yytype_uint16 yytoknum[] = +{ + 0, 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 +}; +# endif + +/* YYR1[YYN] -- Symbol number of symbol that rule YYN derives. */ +static const yytype_uint8 yyr1[] = +{ + 0, 56, 57, 57, 58, 58, 58, 58, 58, 59, + 59, 61, 62, 63, 64, 60, 65, 60, 66, 60, + 60, 60, 67, 67, 67, 67, 68, 68, 69, 69, + 70, 70, 70, 70, 70, 70, 71, 71, 71, 71, + 71, 71, 71, 71, 71, 71, 72, 72, 72, 72, + 72, 72, 72, 73, 73, 73, 73, 73, 73, 73, + 73, 74, 74, 75, 75, 75, 75, 75, 75, 76, + 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, + 76, 76, 77, 77, 77, 77, 77, 77, 77, 78, + 78, 78, 78, 78, 79, 79, 79, 79, 79, 79, + 80, 80, 80, 80, 80, 81, 81, 82, 82, 82, + 82, 83, 83, 83, 83, 84, 84 +}; + +/* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN. */ +static const yytype_uint8 yyr2[] = +{ + 0, 2, 1, 0, 1, 2, 1, 2, 3, 1, + 3, 0, 0, 0, 0, 15, 0, 6, 0, 2, + 2, 2, 2, 2, 5, 3, 1, 6, 1, 6, + 1, 3, 3, 3, 6, 6, 1, 1, 2, 3, + 3, 3, 3, 4, 4, 2, 3, 3, 3, 3, + 3, 3, 3, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 4, 4, 3, 3, 2, 3, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 2, 1, 3, 2, 3, 5, 1, + 2, 4, 2, 2, 1, 3, 3, 3, 3, 3, + 1, 3, 3, 1, 0, 3, 4, 1, 3, 2, + 1, 1, 1, 1, 1, 1, 1 +}; + +/* YYDEFACT[STATE-NAME] -- Default rule to reduce with in state + STATE-NUM when YYTABLE doesn't specify something else to do. Zero + means the default is an error. */ +static const yytype_uint8 yydefact[] = +{ + 18, 6, 0, 0, 104, 104, 18, 0, 18, 4, + 0, 0, 0, 111, 112, 113, 114, 116, 107, 115, + 0, 0, 0, 0, 100, 103, 20, 89, 110, 94, + 21, 18, 1, 7, 5, 0, 0, 61, 62, 0, + 19, 0, 113, 114, 36, 0, 0, 0, 30, 0, + 37, 11, 0, 0, 0, 93, 92, 109, 0, 0, + 0, 0, 0, 104, 0, 90, 8, 0, 0, 67, + 0, 53, 54, 55, 56, 57, 58, 59, 60, 0, + 0, 0, 0, 0, 0, 107, 0, 0, 38, 45, + 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, + 0, 108, 99, 96, 95, 97, 98, 101, 102, 0, + 0, 0, 0, 68, 66, 0, 0, 0, 0, 84, + 82, 0, 65, 0, 0, 41, 39, 42, 33, 51, + 0, 0, 50, 111, 48, 26, 112, 49, 28, 46, + 47, 31, 32, 18, 52, 40, 0, 91, 0, 105, + 0, 0, 83, 86, 63, 78, 76, 74, 77, 75, + 69, 70, 71, 72, 73, 79, 80, 81, 0, 0, + 64, 0, 0, 43, 44, 0, 0, 18, 17, 9, + 12, 106, 87, 0, 85, 0, 0, 0, 0, 18, + 0, 0, 34, 35, 0, 0, 10, 0, 88, 0, + 0, 13, 27, 29, 0, 0, 0, 0, 0, 23, + 14, 22, 0, 0, 18, 0, 25, 15, 0, 24 +}; + +/* YYDEFGOTO[NTERM-NUM]. */ +static const yytype_int16 yydefgoto[] = +{ + -1, 7, 8, 178, 9, 100, 190, 204, 214, 143, + 10, 207, 134, 137, 138, 48, 49, 79, 39, 40, + 169, 118, 119, 25, 26, 65, 50, 28, 29 +}; + +/* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing + STATE-NUM. */ +#define YYPACT_NINF -80 +static const yytype_int16 yypact[] = +{ + 136, -80, 3, 11, 290, 290, 375, 13, 280, -80, + 238, 329, 464, -80, -80, -80, -80, -80, -80, -80, + 147, 353, 353, 16, -80, 167, 55, 31, -80, -80, + 55, 101, -80, -80, -80, 69, 238, -80, -80, 353, + -80, 471, 72, 77, 1, 361, 137, 455, -80, -7, + 49, -80, 79, 41, -8, -80, -80, -80, 41, 41, + 41, 41, 290, 290, 387, 82, -80, 85, 98, -80, + 250, -80, -80, -80, -80, -80, -80, -80, -80, 250, + 105, 387, 387, 440, 109, 79, 505, -3, 99, 114, + 387, 395, 406, 395, 406, 387, 387, -80, 329, 126, + 115, -80, -80, 34, 34, -80, -80, -80, 167, 57, + 421, 21, 387, -80, -80, 281, 321, 250, 184, -80, + -80, 204, -80, 87, 102, -80, -80, -80, -80, -80, + 464, 159, 67, 170, -80, 67, 174, -80, 67, -80, + -80, -80, -80, 185, -80, -80, 406, -80, 14, -80, + 45, 141, -80, -80, -80, -80, -80, -80, -80, -80, + -80, -80, -80, -80, -80, -80, -80, -80, 250, 250, + -80, 432, 432, -80, -80, 395, 406, 375, -80, -80, + -80, -80, -80, 470, -80, 166, 178, 173, 177, 522, + 175, 250, -80, -80, 395, 406, -80, 329, -80, 190, + 200, 168, -80, -80, 196, 456, 464, 210, -21, -80, + -80, -80, 464, 213, 185, 198, -80, -80, 223, -80 +}; + +/* YYPGOTO[NTERM-NUM]. */ +static const yytype_int16 yypgoto[] = +{ + -80, -80, -2, 25, -5, -80, -80, -80, -80, -80, + -80, -80, -73, -79, -9, -17, -38, -80, 205, 215, + -80, -74, 29, 70, 6, -80, -4, -80, -54 +}; + +/* YYTABLE[YYPACT[STATE-NUM]]. What to do in state STATE-NUM. If + positive, shift that token. If negative, reduce the rule which + number is the opposite. If zero, do what YYDEFACT says. + If YYTABLE_NINF, syntax error. */ +#define YYTABLE_NINF -4 +static const yytype_int16 yytable[] = +{ + 27, 27, 47, 34, 31, 121, 27, 87, 51, 102, + 97, 30, 211, 32, 129, 140, 120, 27, 27, 11, + 139, 212, 213, 58, 59, 120, 34, 12, 60, 61, + 57, 128, 27, 24, 24, 27, 86, 83, 84, 41, + 149, 151, 89, 153, 98, 95, 96, 63, 98, 64, + 55, 56, 95, 96, 17, 111, 19, 53, 27, 27, + 144, 120, 152, 120, 181, 41, 27, 180, 68, 109, + 60, 61, 123, 124, 147, 27, 95, 96, 62, 126, + 62, 132, 135, 52, 135, 99, 141, 142, 81, 47, + 54, 107, 24, 82, 183, 184, 101, 188, 95, 96, + 112, 148, 187, 150, 33, 2, 113, 3, 4, 5, + 171, 27, 27, 27, 120, 120, 200, 198, 95, 96, + 114, 199, 66, 54, 127, 172, 173, 122, 103, 104, + 105, 106, 108, 95, 96, 130, -3, 120, 179, 1, + 2, 145, 3, 4, 5, 56, 13, 14, 15, 16, + 131, 18, 88, 35, 185, 186, 6, 146, 182, 201, + 17, 52, 19, 53, 27, 27, 135, 155, 156, 157, + 158, 159, 160, 161, 174, 189, 23, 162, 163, 164, + 165, 166, 167, 192, 34, 135, 175, 27, 47, 2, + 176, 3, 4, 5, 168, 193, 194, 197, 58, 59, + 195, 208, 209, 60, 61, 177, 154, 202, 215, 179, + 155, 156, 157, 158, 159, 160, 161, 203, 205, 98, + 162, 163, 164, 165, 166, 167, 170, 210, 216, 218, + 155, 156, 157, 158, 159, 160, 161, 168, 219, 217, + 162, 163, 164, 165, 166, 167, 80, 13, 14, 15, + 16, 67, 18, 0, 35, 0, 0, 168, 36, 13, + 14, 15, 16, 17, 18, 19, 115, 0, 0, 21, + 22, 37, 38, 0, 0, 0, 0, 23, 0, 0, + -2, 21, 116, 33, 2, 117, 3, 4, 5, 23, + 13, 14, 15, 16, 17, 85, 19, 115, 0, 13, + 14, 15, 16, 17, 18, 19, 20, 0, 0, 0, + 0, 0, 21, 116, 0, 0, 117, 0, 0, 0, + 23, 21, 22, 0, 0, 0, 0, 0, 0, 23, + 13, 14, 15, 16, 17, 18, 19, 35, 13, 14, + 42, 43, 0, 18, 44, 45, 0, 0, 0, 0, + 0, 0, 21, 22, 0, 0, 0, 0, 0, 0, + 23, 46, 13, 14, 15, 16, 0, 18, 23, 35, + 13, 14, 42, 43, 0, 85, 44, 45, 1, 2, + 0, 3, 4, 5, 21, 22, 0, 0, 0, 0, + 0, 0, 23, 46, 0, 6, 13, 14, 42, 43, + 23, 18, 44, 110, 133, 14, 42, 43, 0, 18, + 44, 110, 0, 0, 0, 13, 136, 42, 43, 46, + 18, 44, 110, 0, 0, 0, 23, 46, 0, 0, + 13, 14, 42, 43, 23, 85, 44, 110, 46, 0, + 0, 13, 14, 15, 16, 23, 18, 44, 35, 13, + 14, 15, 16, 46, 18, 125, 35, 0, 0, 0, + 23, 0, 0, 0, 46, 13, 14, 15, 16, 0, + 18, 23, 35, 13, 14, 15, 16, 0, 18, 23, + 35, 90, 91, 92, 93, 94, 95, 96, 0, 206, + 0, 0, 0, 69, 0, 23, 155, 156, 157, 158, + 159, 160, 161, 23, 37, 38, 162, 163, 164, 165, + 166, 167, 0, 70, 71, 72, 73, 74, 75, 76, + 77, 78, 128, 168, 191, 33, 2, 0, 3, 4, + 5, 90, 91, 92, 93, 94, 95, 96, 0, 0, + 0, 0, 0, 196 +}; + +static const yytype_int16 yycheck[] = +{ + 4, 5, 11, 8, 6, 79, 10, 45, 12, 17, + 17, 5, 33, 0, 17, 94, 70, 21, 22, 16, + 93, 42, 43, 31, 32, 79, 31, 16, 36, 37, + 14, 17, 36, 4, 5, 39, 45, 36, 37, 10, + 19, 115, 46, 117, 51, 31, 32, 16, 51, 18, + 21, 22, 31, 32, 13, 64, 15, 16, 62, 63, + 98, 115, 116, 117, 19, 36, 70, 146, 39, 63, + 36, 37, 81, 82, 17, 79, 31, 32, 23, 83, + 23, 90, 91, 14, 93, 36, 95, 96, 16, 98, + 20, 62, 63, 16, 168, 169, 17, 176, 31, 32, + 18, 110, 175, 112, 3, 4, 21, 6, 7, 8, + 23, 115, 116, 117, 168, 169, 195, 191, 31, 32, + 22, 194, 21, 53, 15, 23, 130, 22, 58, 59, + 60, 61, 62, 31, 32, 36, 0, 191, 143, 3, + 4, 15, 6, 7, 8, 116, 9, 10, 11, 12, + 36, 14, 15, 16, 171, 172, 20, 42, 17, 197, + 13, 14, 15, 16, 168, 169, 175, 26, 27, 28, + 29, 30, 31, 32, 15, 177, 39, 36, 37, 38, + 39, 40, 41, 17, 189, 194, 16, 191, 197, 4, + 16, 6, 7, 8, 53, 17, 23, 22, 31, 32, + 23, 205, 206, 36, 37, 20, 22, 17, 212, 214, + 26, 27, 28, 29, 30, 31, 32, 17, 22, 51, + 36, 37, 38, 39, 40, 41, 22, 17, 15, 31, + 26, 27, 28, 29, 30, 31, 32, 53, 15, 214, + 36, 37, 38, 39, 40, 41, 41, 9, 10, 11, + 12, 36, 14, -1, 16, -1, -1, 53, 20, 9, + 10, 11, 12, 13, 14, 15, 16, -1, -1, 31, + 32, 33, 34, -1, -1, -1, -1, 39, -1, -1, + 0, 31, 32, 3, 4, 35, 6, 7, 8, 39, + 9, 10, 11, 12, 13, 14, 15, 16, -1, 9, + 10, 11, 12, 13, 14, 15, 16, -1, -1, -1, + -1, -1, 31, 32, -1, -1, 35, -1, -1, -1, + 39, 31, 32, -1, -1, -1, -1, -1, -1, 39, + 9, 10, 11, 12, 13, 14, 15, 16, 9, 10, + 11, 12, -1, 14, 15, 16, -1, -1, -1, -1, + -1, -1, 31, 32, -1, -1, -1, -1, -1, -1, + 39, 32, 9, 10, 11, 12, -1, 14, 39, 16, + 9, 10, 11, 12, -1, 14, 15, 16, 3, 4, + -1, 6, 7, 8, 31, 32, -1, -1, -1, -1, + -1, -1, 39, 32, -1, 20, 9, 10, 11, 12, + 39, 14, 15, 16, 9, 10, 11, 12, -1, 14, + 15, 16, -1, -1, -1, 9, 10, 11, 12, 32, + 14, 15, 16, -1, -1, -1, 39, 32, -1, -1, + 9, 10, 11, 12, 39, 14, 15, 16, 32, -1, + -1, 9, 10, 11, 12, 39, 14, 15, 16, 9, + 10, 11, 12, 32, 14, 15, 16, -1, -1, -1, + 39, -1, -1, -1, 32, 9, 10, 11, 12, -1, + 14, 39, 16, 9, 10, 11, 12, -1, 14, 39, + 16, 26, 27, 28, 29, 30, 31, 32, -1, 33, + -1, -1, -1, 22, -1, 39, 26, 27, 28, 29, + 30, 31, 32, 39, 33, 34, 36, 37, 38, 39, + 40, 41, -1, 42, 43, 44, 45, 46, 47, 48, + 49, 50, 17, 53, 54, 3, 4, -1, 6, 7, + 8, 26, 27, 28, 29, 30, 31, 32, -1, -1, + -1, -1, -1, 21 +}; + +/* YYSTOS[STATE-NUM] -- The (internal number of the) accessing + symbol of state STATE-NUM. */ +static const yytype_uint8 yystos[] = +{ + 0, 3, 4, 6, 7, 8, 20, 57, 58, 60, + 66, 16, 16, 9, 10, 11, 12, 13, 14, 15, + 16, 31, 32, 39, 78, 79, 80, 82, 83, 84, + 80, 58, 0, 3, 60, 16, 20, 33, 34, 74, + 75, 78, 11, 12, 15, 16, 32, 70, 71, 72, + 82, 82, 14, 16, 79, 78, 78, 14, 31, 32, + 36, 37, 23, 16, 18, 81, 21, 75, 78, 22, + 42, 43, 44, 45, 46, 47, 48, 49, 50, 73, + 74, 16, 16, 36, 37, 14, 70, 72, 15, 82, + 26, 27, 28, 29, 30, 31, 32, 17, 51, 36, + 61, 17, 17, 79, 79, 79, 79, 78, 79, 80, + 16, 70, 18, 21, 22, 16, 32, 35, 77, 78, + 84, 77, 22, 70, 70, 15, 82, 15, 17, 17, + 36, 36, 70, 9, 68, 70, 10, 69, 70, 68, + 69, 70, 70, 65, 72, 15, 42, 17, 70, 19, + 70, 77, 84, 77, 22, 26, 27, 28, 29, 30, + 31, 32, 36, 37, 38, 39, 40, 41, 53, 76, + 22, 23, 23, 82, 15, 16, 16, 20, 59, 60, + 69, 19, 17, 77, 77, 71, 71, 68, 69, 58, + 62, 54, 17, 17, 23, 23, 21, 22, 77, 68, + 69, 72, 17, 17, 63, 22, 33, 67, 82, 82, + 17, 33, 42, 43, 64, 82, 15, 59, 31, 15 +}; + +#define yyerrok (yyerrstatus = 0) +#define yyclearin (yychar = YYEMPTY) +#define YYEMPTY (-2) +#define YYEOF 0 + +#define YYACCEPT goto yyacceptlab +#define YYABORT goto yyabortlab +#define YYERROR goto yyerrorlab + + +/* Like YYERROR except do call yyerror. This remains here temporarily + to ease the transition to the new meaning of YYERROR, for GCC. + Once GCC version 2 has supplanted version 1, this can go. */ + +#define YYFAIL goto yyerrlab + +#define YYRECOVERING() (!!yyerrstatus) + +#define YYBACKUP(Token, Value) \ +do \ + if (yychar == YYEMPTY && yylen == 1) \ + { \ + yychar = (Token); \ + yylval = (Value); \ + yytoken = YYTRANSLATE (yychar); \ + YYPOPSTACK (1); \ + goto yybackup; \ + } \ + else \ + { \ + yyerror (YY_("syntax error: cannot back up")); \ + YYERROR; \ + } \ +while (YYID (0)) + + +#define YYTERROR 1 +#define YYERRCODE 256 + + +/* YYLLOC_DEFAULT -- Set CURRENT to span from RHS[1] to RHS[N]. + If N is 0, then set CURRENT to the empty location which ends + the previous symbol: RHS[0] (always defined). */ + +#define YYRHSLOC(Rhs, K) ((Rhs)[K]) +#ifndef YYLLOC_DEFAULT +# define YYLLOC_DEFAULT(Current, Rhs, N) \ + do \ + if (YYID (N)) \ + { \ + (Current).first_line = YYRHSLOC (Rhs, 1).first_line; \ + (Current).first_column = YYRHSLOC (Rhs, 1).first_column; \ + (Current).last_line = YYRHSLOC (Rhs, N).last_line; \ + (Current).last_column = YYRHSLOC (Rhs, N).last_column; \ + } \ + else \ + { \ + (Current).first_line = (Current).last_line = \ + YYRHSLOC (Rhs, 0).last_line; \ + (Current).first_column = (Current).last_column = \ + YYRHSLOC (Rhs, 0).last_column; \ + } \ + while (YYID (0)) +#endif + + +/* YY_LOCATION_PRINT -- Print the location on the stream. + This macro was not mandated originally: define only if we know + we won't break user code: when these are the locations we know. */ + +#ifndef YY_LOCATION_PRINT +# if YYLTYPE_IS_TRIVIAL +# define YY_LOCATION_PRINT(File, Loc) \ + fprintf (File, "%d.%d-%d.%d", \ + (Loc).first_line, (Loc).first_column, \ + (Loc).last_line, (Loc).last_column) +# else +# define YY_LOCATION_PRINT(File, Loc) ((void) 0) +# endif +#endif + + +/* YYLEX -- calling `yylex' with the right arguments. */ + +#ifdef YYLEX_PARAM +# define YYLEX yylex (YYLEX_PARAM) +#else +# define YYLEX yylex () +#endif + +/* Enable debugging if requested. */ +#if YYDEBUG + +# ifndef YYFPRINTF +# include /* INFRINGES ON USER NAME SPACE */ +# define YYFPRINTF fprintf +# endif + +# define YYDPRINTF(Args) \ +do { \ + if (yydebug) \ + YYFPRINTF Args; \ +} while (YYID (0)) + +# define YY_SYMBOL_PRINT(Title, Type, Value, Location) \ +do { \ + if (yydebug) \ + { \ + YYFPRINTF (stderr, "%s ", Title); \ + yy_symbol_print (stderr, \ + Type, Value); \ + YYFPRINTF (stderr, "\n"); \ + } \ +} while (YYID (0)) + + +/*--------------------------------. +| Print this symbol on YYOUTPUT. | +`--------------------------------*/ + +/*ARGSUSED*/ +#if (defined __STDC__ || defined __C99__FUNC__ \ + || defined __cplusplus || defined _MSC_VER) +static void +yy_symbol_value_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvaluep) +#else +static void +yy_symbol_value_print (yyoutput, yytype, yyvaluep) + FILE *yyoutput; + int yytype; + YYSTYPE const * const yyvaluep; +#endif +{ + if (!yyvaluep) + return; +# ifdef YYPRINT + if (yytype < YYNTOKENS) + YYPRINT (yyoutput, yytoknum[yytype], *yyvaluep); +# else + YYUSE (yyoutput); +# endif + switch (yytype) + { + default: + break; + } +} + + +/*--------------------------------. +| Print this symbol on YYOUTPUT. | +`--------------------------------*/ + +#if (defined __STDC__ || defined __C99__FUNC__ \ + || defined __cplusplus || defined _MSC_VER) +static void +yy_symbol_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvaluep) +#else +static void +yy_symbol_print (yyoutput, yytype, yyvaluep) + FILE *yyoutput; + int yytype; + YYSTYPE const * const yyvaluep; +#endif +{ + if (yytype < YYNTOKENS) + YYFPRINTF (yyoutput, "token %s (", yytname[yytype]); + else + YYFPRINTF (yyoutput, "nterm %s (", yytname[yytype]); + + yy_symbol_value_print (yyoutput, yytype, yyvaluep); + YYFPRINTF (yyoutput, ")"); +} + +/*------------------------------------------------------------------. +| yy_stack_print -- Print the state stack from its BOTTOM up to its | +| TOP (included). | +`------------------------------------------------------------------*/ + +#if (defined __STDC__ || defined __C99__FUNC__ \ + || defined __cplusplus || defined _MSC_VER) +static void +yy_stack_print (yytype_int16 *bottom, yytype_int16 *top) +#else +static void +yy_stack_print (bottom, top) + yytype_int16 *bottom; + yytype_int16 *top; +#endif +{ + YYFPRINTF (stderr, "Stack now"); + for (; bottom <= top; ++bottom) + YYFPRINTF (stderr, " %d", *bottom); + YYFPRINTF (stderr, "\n"); +} + +# define YY_STACK_PRINT(Bottom, Top) \ +do { \ + if (yydebug) \ + yy_stack_print ((Bottom), (Top)); \ +} while (YYID (0)) + + +/*------------------------------------------------. +| Report that the YYRULE is going to be reduced. | +`------------------------------------------------*/ + +#if (defined __STDC__ || defined __C99__FUNC__ \ + || defined __cplusplus || defined _MSC_VER) +static void +yy_reduce_print (YYSTYPE *yyvsp, int yyrule) +#else +static void +yy_reduce_print (yyvsp, yyrule) + YYSTYPE *yyvsp; + int yyrule; +#endif +{ + int yynrhs = yyr2[yyrule]; + int yyi; + unsigned long int yylno = yyrline[yyrule]; + YYFPRINTF (stderr, "Reducing stack by rule %d (line %lu):\n", + yyrule - 1, yylno); + /* The symbols being reduced. */ + for (yyi = 0; yyi < yynrhs; yyi++) + { + fprintf (stderr, " $%d = ", yyi + 1); + yy_symbol_print (stderr, yyrhs[yyprhs[yyrule] + yyi], + &(yyvsp[(yyi + 1) - (yynrhs)]) + ); + fprintf (stderr, "\n"); + } +} + +# define YY_REDUCE_PRINT(Rule) \ +do { \ + if (yydebug) \ + yy_reduce_print (yyvsp, Rule); \ +} while (YYID (0)) + +/* Nonzero means print parse trace. It is left uninitialized so that + multiple parsers can coexist. */ +int yydebug; +#else /* !YYDEBUG */ +# define YYDPRINTF(Args) +# define YY_SYMBOL_PRINT(Title, Type, Value, Location) +# define YY_STACK_PRINT(Bottom, Top) +# define YY_REDUCE_PRINT(Rule) +#endif /* !YYDEBUG */ + + +/* YYINITDEPTH -- initial size of the parser's stacks. */ +#ifndef YYINITDEPTH +# define YYINITDEPTH 200 +#endif + +/* YYMAXDEPTH -- maximum size the stacks can grow to (effective only + if the built-in stack extension method is used). + + Do not make this value too large; the results are undefined if + YYSTACK_ALLOC_MAXIMUM < YYSTACK_BYTES (YYMAXDEPTH) + evaluated with infinite-precision integer arithmetic. */ + +#ifndef YYMAXDEPTH +# define YYMAXDEPTH 10000 +#endif + + + +#if YYERROR_VERBOSE + +# ifndef yystrlen +# if defined __GLIBC__ && defined _STRING_H +# define yystrlen strlen +# else +/* Return the length of YYSTR. */ +#if (defined __STDC__ || defined __C99__FUNC__ \ + || defined __cplusplus || defined _MSC_VER) +static YYSIZE_T +yystrlen (const char *yystr) +#else +static YYSIZE_T +yystrlen (yystr) + const char *yystr; +#endif +{ + YYSIZE_T yylen; + for (yylen = 0; yystr[yylen]; yylen++) + continue; + return yylen; +} +# endif +# endif + +# ifndef yystpcpy +# if defined __GLIBC__ && defined _STRING_H && defined _GNU_SOURCE +# define yystpcpy stpcpy +# else +/* Copy YYSRC to YYDEST, returning the address of the terminating '\0' in + YYDEST. */ +#if (defined __STDC__ || defined __C99__FUNC__ \ + || defined __cplusplus || defined _MSC_VER) +static char * +yystpcpy (char *yydest, const char *yysrc) +#else +static char * +yystpcpy (yydest, yysrc) + char *yydest; + const char *yysrc; +#endif +{ + char *yyd = yydest; + const char *yys = yysrc; + + while ((*yyd++ = *yys++) != '\0') + continue; + + return yyd - 1; +} +# endif +# endif + +# ifndef yytnamerr +/* Copy to YYRES the contents of YYSTR after stripping away unnecessary + quotes and backslashes, so that it's suitable for yyerror. The + heuristic is that double-quoting is unnecessary unless the string + contains an apostrophe, a comma, or backslash (other than + backslash-backslash). YYSTR is taken from yytname. If YYRES is + null, do not copy; instead, return the length of what the result + would have been. */ +static YYSIZE_T +yytnamerr (char *yyres, const char *yystr) +{ + if (*yystr == '"') + { + YYSIZE_T yyn = 0; + char const *yyp = yystr; + + for (;;) + switch (*++yyp) + { + case '\'': + case ',': + goto do_not_strip_quotes; + + case '\\': + if (*++yyp != '\\') + goto do_not_strip_quotes; + /* Fall through. */ + default: + if (yyres) + yyres[yyn] = *yyp; + yyn++; + break; + + case '"': + if (yyres) + yyres[yyn] = '\0'; + return yyn; + } + do_not_strip_quotes: ; + } + + if (! yyres) + return yystrlen (yystr); + + return yystpcpy (yyres, yystr) - yyres; +} +# endif + +/* Copy into YYRESULT an error message about the unexpected token + YYCHAR while in state YYSTATE. Return the number of bytes copied, + including the terminating null byte. If YYRESULT is null, do not + copy anything; just return the number of bytes that would be + copied. As a special case, return 0 if an ordinary "syntax error" + message will do. Return YYSIZE_MAXIMUM if overflow occurs during + size calculation. */ +static YYSIZE_T +yysyntax_error (char *yyresult, int yystate, int yychar) +{ + int yyn = yypact[yystate]; + + if (! (YYPACT_NINF < yyn && yyn <= YYLAST)) + return 0; + else + { + int yytype = YYTRANSLATE (yychar); + YYSIZE_T yysize0 = yytnamerr (0, yytname[yytype]); + YYSIZE_T yysize = yysize0; + YYSIZE_T yysize1; + int yysize_overflow = 0; + enum { YYERROR_VERBOSE_ARGS_MAXIMUM = 5 }; + char const *yyarg[YYERROR_VERBOSE_ARGS_MAXIMUM]; + int yyx; + +# if 0 + /* This is so xgettext sees the translatable formats that are + constructed on the fly. */ + YY_("syntax error, unexpected %s"); + YY_("syntax error, unexpected %s, expecting %s"); + YY_("syntax error, unexpected %s, expecting %s or %s"); + YY_("syntax error, unexpected %s, expecting %s or %s or %s"); + YY_("syntax error, unexpected %s, expecting %s or %s or %s or %s"); +# endif + char *yyfmt; + char const *yyf; + static char const yyunexpected[] = "syntax error, unexpected %s"; + static char const yyexpecting[] = ", expecting %s"; + static char const yyor[] = " or %s"; + char yyformat[sizeof yyunexpected + + sizeof yyexpecting - 1 + + ((YYERROR_VERBOSE_ARGS_MAXIMUM - 2) + * (sizeof yyor - 1))]; + char const *yyprefix = yyexpecting; + + /* Start YYX at -YYN if negative to avoid negative indexes in + YYCHECK. */ + int yyxbegin = yyn < 0 ? -yyn : 0; + + /* Stay within bounds of both yycheck and yytname. */ + int yychecklim = YYLAST - yyn + 1; + int yyxend = yychecklim < YYNTOKENS ? yychecklim : YYNTOKENS; + int yycount = 1; + + yyarg[0] = yytname[yytype]; + yyfmt = yystpcpy (yyformat, yyunexpected); + + for (yyx = yyxbegin; yyx < yyxend; ++yyx) + if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR) + { + if (yycount == YYERROR_VERBOSE_ARGS_MAXIMUM) + { + yycount = 1; + yysize = yysize0; + yyformat[sizeof yyunexpected - 1] = '\0'; + break; + } + yyarg[yycount++] = yytname[yyx]; + yysize1 = yysize + yytnamerr (0, yytname[yyx]); + yysize_overflow |= (yysize1 < yysize); + yysize = yysize1; + yyfmt = yystpcpy (yyfmt, yyprefix); + yyprefix = yyor; + } + + yyf = YY_(yyformat); + yysize1 = yysize + yystrlen (yyf); + yysize_overflow |= (yysize1 < yysize); + yysize = yysize1; + + if (yysize_overflow) + return YYSIZE_MAXIMUM; + + if (yyresult) + { + /* Avoid sprintf, as that infringes on the user's name space. + Don't have undefined behavior even if the translation + produced a string with the wrong number of "%s"s. */ + char *yyp = yyresult; + int yyi = 0; + while ((*yyp = *yyf) != '\0') + { + if (*yyp == '%' && yyf[1] == 's' && yyi < yycount) + { + yyp += yytnamerr (yyp, yyarg[yyi++]); + yyf += 2; + } + else + { + yyp++; + yyf++; + } + } + } + return yysize; + } +} +#endif /* YYERROR_VERBOSE */ + + +/*-----------------------------------------------. +| Release the memory associated to this symbol. | +`-----------------------------------------------*/ + +/*ARGSUSED*/ +#if (defined __STDC__ || defined __C99__FUNC__ \ + || defined __cplusplus || defined _MSC_VER) +static void +yydestruct (const char *yymsg, int yytype, YYSTYPE *yyvaluep) +#else +static void +yydestruct (yymsg, yytype, yyvaluep) + const char *yymsg; + int yytype; + YYSTYPE *yyvaluep; +#endif +{ + YYUSE (yyvaluep); + + if (!yymsg) + yymsg = "Deleting"; + YY_SYMBOL_PRINT (yymsg, yytype, yyvaluep, yylocationp); + + switch (yytype) + { + + default: + break; + } +} + + +/* Prevent warnings from -Wmissing-prototypes. */ + +#ifdef YYPARSE_PARAM +#if defined __STDC__ || defined __cplusplus +int yyparse (void *YYPARSE_PARAM); +#else +int yyparse (); +#endif +#else /* ! YYPARSE_PARAM */ +#if defined __STDC__ || defined __cplusplus +int yyparse (void); +#else +int yyparse (); +#endif +#endif /* ! YYPARSE_PARAM */ + + + +/* The look-ahead symbol. */ +int yychar; + +/* The semantic value of the look-ahead symbol. */ +YYSTYPE yylval; + +/* Number of syntax errors so far. */ +int yynerrs; + + + +/*----------. +| yyparse. | +`----------*/ + +#ifdef YYPARSE_PARAM +#if (defined __STDC__ || defined __C99__FUNC__ \ + || defined __cplusplus || defined _MSC_VER) +int +yyparse (void *YYPARSE_PARAM) +#else +int +yyparse (YYPARSE_PARAM) + void *YYPARSE_PARAM; +#endif +#else /* ! YYPARSE_PARAM */ +#if (defined __STDC__ || defined __C99__FUNC__ \ + || defined __cplusplus || defined _MSC_VER) +int +yyparse (void) +#else +int +yyparse () + +#endif +#endif +{ + + int yystate; + int yyn; + int yyresult; + /* Number of tokens to shift before error messages enabled. */ + int yyerrstatus; + /* Look-ahead token as an internal (translated) token number. */ + int yytoken = 0; +#if YYERROR_VERBOSE + /* Buffer for error messages, and its allocated size. */ + char yymsgbuf[128]; + char *yymsg = yymsgbuf; + YYSIZE_T yymsg_alloc = sizeof yymsgbuf; +#endif + + /* Three stacks and their tools: + `yyss': related to states, + `yyvs': related to semantic values, + `yyls': related to locations. + + Refer to the stacks thru separate pointers, to allow yyoverflow + to reallocate them elsewhere. */ + + /* The state stack. */ + yytype_int16 yyssa[YYINITDEPTH]; + yytype_int16 *yyss = yyssa; + yytype_int16 *yyssp; + + /* The semantic value stack. */ + YYSTYPE yyvsa[YYINITDEPTH]; + YYSTYPE *yyvs = yyvsa; + YYSTYPE *yyvsp; + + + +#define YYPOPSTACK(N) (yyvsp -= (N), yyssp -= (N)) + + YYSIZE_T yystacksize = YYINITDEPTH; + + /* The variables used to return semantic value and location from the + action routines. */ + YYSTYPE yyval; + + + /* The number of symbols on the RHS of the reduced rule. + Keep to zero when no symbol should be popped. */ + int yylen = 0; + + YYDPRINTF ((stderr, "Starting parse\n")); + + yystate = 0; + yyerrstatus = 0; + yynerrs = 0; + yychar = YYEMPTY; /* Cause a token to be read. */ + + /* Initialize stack pointers. + Waste one element of value and location stack + so that they stay on the same level as the state stack. + The wasted elements are never initialized. */ + + yyssp = yyss; + yyvsp = yyvs; + + goto yysetstate; + +/*------------------------------------------------------------. +| yynewstate -- Push a new state, which is found in yystate. | +`------------------------------------------------------------*/ + yynewstate: + /* In all cases, when you get here, the value and location stacks + have just been pushed. So pushing a state here evens the stacks. */ + yyssp++; + + yysetstate: + *yyssp = yystate; + + if (yyss + yystacksize - 1 <= yyssp) + { + /* Get the current used size of the three stacks, in elements. */ + YYSIZE_T yysize = yyssp - yyss + 1; + +#ifdef yyoverflow + { + /* Give user a chance to reallocate the stack. Use copies of + these so that the &'s don't force the real ones into + memory. */ + YYSTYPE *yyvs1 = yyvs; + yytype_int16 *yyss1 = yyss; + + + /* Each stack pointer address is followed by the size of the + data in use in that stack, in bytes. This used to be a + conditional around just the two extra args, but that might + be undefined if yyoverflow is a macro. */ + yyoverflow (YY_("memory exhausted"), + &yyss1, yysize * sizeof (*yyssp), + &yyvs1, yysize * sizeof (*yyvsp), + + &yystacksize); + + yyss = yyss1; + yyvs = yyvs1; + } +#else /* no yyoverflow */ +# ifndef YYSTACK_RELOCATE + goto yyexhaustedlab; +# else + /* Extend the stack our own way. */ + if (YYMAXDEPTH <= yystacksize) + goto yyexhaustedlab; + yystacksize *= 2; + if (YYMAXDEPTH < yystacksize) + yystacksize = YYMAXDEPTH; + + { + yytype_int16 *yyss1 = yyss; + union yyalloc *yyptr = + (union yyalloc *) YYSTACK_ALLOC (YYSTACK_BYTES (yystacksize)); + if (! yyptr) + goto yyexhaustedlab; + YYSTACK_RELOCATE (yyss); + YYSTACK_RELOCATE (yyvs); + +# undef YYSTACK_RELOCATE + if (yyss1 != yyssa) + YYSTACK_FREE (yyss1); + } +# endif +#endif /* no yyoverflow */ + + yyssp = yyss + yysize - 1; + yyvsp = yyvs + yysize - 1; + + + YYDPRINTF ((stderr, "Stack size increased to %lu\n", + (unsigned long int) yystacksize)); + + if (yyss + yystacksize - 1 <= yyssp) + YYABORT; + } + + YYDPRINTF ((stderr, "Entering state %d\n", yystate)); + + goto yybackup; + +/*-----------. +| yybackup. | +`-----------*/ +yybackup: + + /* Do appropriate processing given the current state. Read a + look-ahead token if we need one and don't already have one. */ + + /* First try to decide what to do without reference to look-ahead token. */ + yyn = yypact[yystate]; + if (yyn == YYPACT_NINF) + goto yydefault; + + /* Not known => get a look-ahead token if don't already have one. */ + + /* YYCHAR is either YYEMPTY or YYEOF or a valid look-ahead symbol. */ + if (yychar == YYEMPTY) + { + YYDPRINTF ((stderr, "Reading a token: ")); + yychar = YYLEX; + } + + if (yychar <= YYEOF) + { + yychar = yytoken = YYEOF; + YYDPRINTF ((stderr, "Now at end of input.\n")); + } + else + { + yytoken = YYTRANSLATE (yychar); + YY_SYMBOL_PRINT ("Next token is", yytoken, &yylval, &yylloc); + } + + /* If the proper action on seeing token YYTOKEN is to reduce or to + detect an error, take that action. */ + yyn += yytoken; + if (yyn < 0 || YYLAST < yyn || yycheck[yyn] != yytoken) + goto yydefault; + yyn = yytable[yyn]; + if (yyn <= 0) + { + if (yyn == 0 || yyn == YYTABLE_NINF) + goto yyerrlab; + yyn = -yyn; + goto yyreduce; + } + + if (yyn == YYFINAL) + YYACCEPT; + + /* Count tokens shifted since error; after three, turn off error + status. */ + if (yyerrstatus) + yyerrstatus--; + + /* Shift the look-ahead token. */ + YY_SYMBOL_PRINT ("Shifting", yytoken, &yylval, &yylloc); + + /* Discard the shifted token unless it is eof. */ + if (yychar != YYEOF) + yychar = YYEMPTY; + + yystate = yyn; + *++yyvsp = yylval; + + goto yynewstate; + + +/*-----------------------------------------------------------. +| yydefault -- do the default action for the current state. | +`-----------------------------------------------------------*/ +yydefault: + yyn = yydefact[yystate]; + if (yyn == 0) + goto yyerrlab; + goto yyreduce; + + +/*-----------------------------. +| yyreduce -- Do a reduction. | +`-----------------------------*/ +yyreduce: + /* yyn is the number of a rule to reduce with. */ + yylen = yyr2[yyn]; + + /* If YYLEN is nonzero, implement the default value of the action: + `$$ = $1'. + + Otherwise, the following line sets YYVAL to garbage. + This behavior is undocumented and Bison + users should not rely upon it. Assigning to YYVAL + unconditionally makes the parser a bit smaller, and it avoids a + GCC warning that YYVAL may be used uninitialized. */ + yyval = yyvsp[1-yylen]; + + + YY_REDUCE_PRINT (yyn); + switch (yyn) + { + case 2: +#line 141 "parser.y" + { + /* The full program was parsed. Allocate and fill the final + .scop structures. */ + int nb_parameters, nb_arrays; + + parser_scop->parameters = clan_symbol_id_array(parser_symbol, + SCOPLIB_TYPE_PARAMETER, + &nb_parameters); + parser_scop->nb_parameters = nb_parameters; + parser_scop->arrays = clan_symbol_id_array(parser_symbol, + SCOPLIB_TYPE_ARRAY, + &nb_arrays); + parser_scop->nb_arrays = nb_arrays; + if (parser_options->bounded_context) + { + parser_scop->context = scoplib_matrix_malloc(nb_parameters, + nb_parameters+2); + int i; + for (i = 0; i < nb_parameters; ++i) + { + SCOPVAL_set_si(parser_scop->context->p[i][0], 1); + SCOPVAL_set_si(parser_scop->context->p[i][i+1], 1); + SCOPVAL_set_si(parser_scop->context->p[i][nb_parameters +1], 1); + } + } + else + parser_scop->context = scoplib_matrix_malloc(0,nb_parameters+2); + } + break; + + case 11: +#line 213 "parser.y" + { + clan_symbol_p symbol; + symbol = clan_symbol_add(&parser_symbol,(yyvsp[(3) - (3)].symbol), + SCOPLIB_TYPE_ITERATOR,parser_depth+1); + /* Ensure that the returned symbol was either a new one, + either from the same type. */ + if (symbol->type != SCOPLIB_TYPE_ITERATOR) + { + yyerror("[Clan] Error: the input file is not a SCoP\n" + "\t> A loop iterator was previously used as a parameter" + "\n"); + return 0; + } + /* Update the rank, in case a symbol with the same name was + already existing. */ + if (symbol->rank != parser_depth + 1) + symbol->rank = parser_depth + 1; + parser_iterators[parser_depth] = symbol; + /* Memorize the current iterator as a negative constraint prefix */ + } + break; + + case 12: +#line 235 "parser.y" + { + scoplib_vector_p parser_i_term = clan_vector_term(parser_symbol,1,(yyvsp[(3) - (6)].symbol)); + scoplib_vector_tag_inequality(parser_i_term); + int i, j; + for (i = 0; i < (yyvsp[(6) - (6)].setex)->NbRows; ++i) + { + for (j = 1; j < (yyvsp[(6) - (6)].setex)->NbColumns; ++j) + SCOPVAL_oppose((yyvsp[(6) - (6)].setex)->p[i][j],(yyvsp[(6) - (6)].setex)->p[i][j]); + scoplib_matrix_add_vector((yyvsp[(6) - (6)].setex),parser_i_term,i); + } + scoplib_matrix_insert_matrix(parser_domain,(yyvsp[(6) - (6)].setex),parser_nb_cons); + + parser_nb_cons += (yyvsp[(6) - (6)].setex)->NbRows; + parser_consperdim[parser_depth] += (yyvsp[(6) - (6)].setex)->NbRows; + scoplib_vector_free(parser_i_term); + free((yyvsp[(3) - (6)].symbol)); + scoplib_matrix_free((yyvsp[(6) - (6)].setex)); + } + break; + + case 13: +#line 255 "parser.y" + { + scoplib_matrix_insert_matrix(parser_domain,(yyvsp[(9) - (9)].setex),parser_nb_cons); + parser_nb_cons += (yyvsp[(9) - (9)].setex)->NbRows; + parser_consperdim[parser_depth] += (yyvsp[(9) - (9)].setex)->NbRows; + } + break; + + case 14: +#line 263 "parser.y" + { + parser_depth++; + parser_scheduling[parser_depth] = 0; + } + break; + + case 15: +#line 268 "parser.y" + { + parser_depth--; + parser_scheduling[parser_depth]++; + parser_nb_cons -= parser_consperdim[parser_depth]; + parser_consperdim[parser_depth] = 0; + clan_symbol_remove(&parser_symbol, parser_iterators[parser_depth]); + } + break; + + case 16: +#line 280 "parser.y" + { + /* Insert the condition constraint in the current parser domain. */ + scoplib_matrix_insert_matrix(parser_domain,(yyvsp[(3) - (4)].setex),parser_nb_cons); + parser_nb_cons += (yyvsp[(3) - (4)].setex)->NbRows; + } + break; + + case 17: +#line 286 "parser.y" + { + parser_nb_cons -= (yyvsp[(3) - (6)].setex)->NbRows; + /* Remove the condition constraint from the current parser domain. */ + int i, j; + for (i = parser_nb_cons; i < parser_domain->NbRows - 1; ++i) + for (j = 0; j < parser_domain->NbColumns; ++j) + SCOPVAL_assign(parser_domain->p[i][j],parser_domain->p[i+1][j]); + } + break; + + case 18: +#line 298 "parser.y" + { + parser_statement = scoplib_statement_malloc(); + parser_record = (char *)malloc(SCOPLIB_MAX_STRING * sizeof(char)); + parser_recording = CLAN_TRUE; + /* Yacc needs Lex to read the next token to ensure we are starting + * an assignment. So we keep track of the latest text Lex read + * and we start the statement body with it. + */ + strcpy(parser_record,scanner_latest_text); + } + break; + + case 19: +#line 309 "parser.y" + { + /* Deal with statements without surrounding loop by adding a + fake iterator */ + int old_parser_depth = parser_depth; + if (parser_depth == 0) + { + char* fakeiter = strdup("fakeiter"); + clan_symbol_p symbol = clan_symbol_lookup(parser_symbol, fakeiter); + if (symbol) + free(fakeiter); + else + symbol = clan_symbol_add(&parser_symbol,fakeiter, + SCOPLIB_TYPE_ITERATOR,parser_depth+1); + parser_iterators[parser_depth] = symbol; + scoplib_vector_p constraint = + scoplib_vector_malloc(parser_domain->NbColumns); + SCOPVAL_set_si(constraint->p[1],1); + parser_depth++; + scoplib_matrix_replace_vector(parser_domain,constraint,parser_nb_cons); + parser_nb_cons++; + scoplib_vector_free(constraint); + } + /* Construct the statement structure from the parser state */ + parser_statement->domain = scoplib_matrix_list_malloc(); + parser_statement->domain->elt = scoplib_matrix_ncopy(parser_domain, + parser_nb_cons); + parser_statement->schedule = clan_matrix_scheduling(parser_scheduling, + parser_depth); + parser_statement->read = (yyvsp[(2) - (2)].rw)[0]; + parser_statement->write = (yyvsp[(2) - (2)].rw)[1]; + parser_statement->body = parser_record; + parser_statement->nb_iterators = parser_depth; + parser_statement->iterators = clan_symbol_iterators(parser_iterators, + parser_depth); + if (parser_statement->write == NULL) + parser_statement->write = + scoplib_matrix_malloc(0, parser_domain->NbColumns); + if (parser_statement->read == NULL) + parser_statement->read = + scoplib_matrix_malloc(0, parser_domain->NbColumns); + parser_recording = CLAN_FALSE; + scoplib_statement_add(&(parser_scop->statement),parser_statement); + /* We were parsing a statement without iterator. Restore the + original state */ + if (old_parser_depth == 0) + { + --parser_depth; + --parser_nb_cons; + parser_consperdim[parser_depth] = 0; + } + parser_scheduling[parser_depth]++; + } + break; + + case 20: +#line 367 "parser.y" + { + int i, j; + scoplib_matrix_p m = (yyvsp[(2) - (2)].setex); + for (i = 0; i < m->NbRows; ++i) + { + int id = SCOPVAL_get_si(m->p[i][0]); + for (j = 0; parser_variables_localvars[j] != -1 && + parser_variables_localvars[j] != id; ++j) + ; + if (j == CLAN_MAX_LOCAL_VARIABLES) + { + yyerror("[Clan] Error: maximum number of local variables reached\n"); + return 0; + } + if (parser_variables_localvars[j] == -1) + parser_variables_localvars[j] = id; + } + } + break; + + case 21: +#line 391 "parser.y" + { + int i, j; + scoplib_matrix_p m = (yyvsp[(2) - (2)].setex); + for (i = 0; i < m->NbRows; ++i) + { + int id = SCOPVAL_get_si(m->p[i][0]); + for (j = 0; parser_variables_liveout[j] != -1 && + parser_variables_liveout[j] != id; ++j) + ; + if (j == CLAN_MAX_LOCAL_VARIABLES) + { + yyerror("[Clan] Error: maximum number of live-out variables reached\n"); + return 0; + } + if (parser_variables_liveout[j] == -1) + parser_variables_liveout[j] = id; + } + } + break; + + case 22: +#line 420 "parser.y" + { + free((yyvsp[(1) - (2)].symbol)); + } + break; + + case 23: +#line 424 "parser.y" + { + free((yyvsp[(2) - (2)].symbol)); + } + break; + + case 24: +#line 428 "parser.y" + { + if ((yyvsp[(5) - (5)].value) != 1) + { + yyerror("[Clan] Error: loop increment is not 1\n"); + return 0; + } + free ((yyvsp[(1) - (5)].symbol)); + free ((yyvsp[(3) - (5)].symbol)); + } + break; + + case 25: +#line 438 "parser.y" + { + if ((yyvsp[(3) - (3)].value) != 1) + { + yyerror("[Clan] Error: loop increment is not 1\n"); + return 0; + } + free ((yyvsp[(1) - (3)].symbol)); + } + break; + + case 26: +#line 456 "parser.y" + { + (yyval.setex) = scoplib_matrix_from_vector((yyvsp[(1) - (1)].affex)); + scoplib_vector_free((yyvsp[(1) - (1)].affex)); + } + break; + + case 27: +#line 462 "parser.y" + { + (yyval.setex) = scoplib_matrix_concat((yyvsp[(3) - (6)].setex), (yyvsp[(5) - (6)].setex)); + } + break; + + case 28: +#line 475 "parser.y" + { + (yyval.setex) = scoplib_matrix_from_vector((yyvsp[(1) - (1)].affex)); + scoplib_vector_free((yyvsp[(1) - (1)].affex)); + } + break; + + case 29: +#line 481 "parser.y" + { + (yyval.setex) = scoplib_matrix_concat((yyvsp[(3) - (6)].setex), (yyvsp[(5) - (6)].setex)); + } + break; + + case 30: +#line 494 "parser.y" + { + (yyval.affex) = (yyvsp[(1) - (1)].affex); + } + break; + + case 31: +#line 498 "parser.y" + { + (yyval.affex) = scoplib_vector_add((yyvsp[(1) - (3)].affex),(yyvsp[(3) - (3)].affex)); + scoplib_vector_free((yyvsp[(1) - (3)].affex)); + scoplib_vector_free((yyvsp[(3) - (3)].affex)); + } + break; + + case 32: +#line 504 "parser.y" + { + (yyval.affex) = scoplib_vector_sub((yyvsp[(1) - (3)].affex),(yyvsp[(3) - (3)].affex)); + scoplib_vector_free((yyvsp[(1) - (3)].affex)); + scoplib_vector_free((yyvsp[(3) - (3)].affex)); + } + break; + + case 33: +#line 510 "parser.y" + { + (yyval.affex) = (yyvsp[(2) - (3)].affex); + } + break; + + case 34: +#line 514 "parser.y" + { + SCOPVAL_assign((yyvsp[(3) - (6)].affex)->p[0], (yyvsp[(5) - (6)].affex)->p[(yyvsp[(5) - (6)].affex)->Size - 1]); + (yyval.affex) = (yyvsp[(3) - (6)].affex); + } + break; + + case 35: +#line 519 "parser.y" + { + SCOPVAL_assign((yyvsp[(3) - (6)].affex)->p[0], (yyvsp[(5) - (6)].affex)->p[(yyvsp[(5) - (6)].affex)->Size - 1]); + (yyval.affex) = (yyvsp[(3) - (6)].affex); + } + break; + + case 36: +#line 536 "parser.y" + { + (yyval.affex) = clan_vector_term(parser_symbol,(yyvsp[(1) - (1)].value),NULL); + } + break; + + case 37: +#line 543 "parser.y" + { + clan_symbol_add(&parser_symbol,(yyvsp[(1) - (1)].symbol),SCOPLIB_TYPE_UNKNOWN,parser_depth); + (yyval.affex) = clan_vector_term(parser_symbol,1,(yyvsp[(1) - (1)].symbol)); + free((yyvsp[(1) - (1)].symbol)); + } + break; + + case 38: +#line 552 "parser.y" + { + (yyval.affex) = clan_vector_term(parser_symbol,-((yyvsp[(2) - (2)].value)),NULL); + } + break; + + case 39: +#line 559 "parser.y" + { + clan_symbol_add(&parser_symbol,(yyvsp[(3) - (3)].symbol),SCOPLIB_TYPE_UNKNOWN,parser_depth); + (yyval.affex) = clan_vector_term(parser_symbol,(yyvsp[(1) - (3)].value),(yyvsp[(3) - (3)].symbol)); + free((yyvsp[(3) - (3)].symbol)); + } + break; + + case 40: +#line 568 "parser.y" + { + clan_symbol_add(&parser_symbol,(yyvsp[(1) - (3)].symbol),SCOPLIB_TYPE_UNKNOWN,parser_depth); + (yyval.affex) = clan_vector_term(parser_symbol,(yyvsp[(3) - (3)].value),(yyvsp[(1) - (3)].symbol)); + free((yyvsp[(1) - (3)].symbol)); + } + break; + + case 41: +#line 577 "parser.y" + { + (yyval.affex) = clan_vector_term(parser_symbol, ((yyvsp[(1) - (3)].value)) * ((yyvsp[(3) - (3)].value)), NULL); + } + break; + + case 42: +#line 584 "parser.y" + { + (yyval.affex) = clan_vector_term(parser_symbol, ((yyvsp[(1) - (3)].value)) / ((yyvsp[(3) - (3)].value)), NULL); + } + break; + + case 43: +#line 591 "parser.y" + { + clan_symbol_add(&parser_symbol,(yyvsp[(4) - (4)].symbol),SCOPLIB_TYPE_UNKNOWN,parser_depth); + (yyval.affex) = clan_vector_term(parser_symbol,-((yyvsp[(2) - (4)].value)),(yyvsp[(4) - (4)].symbol)); + free((yyvsp[(4) - (4)].symbol)); + } + break; + + case 44: +#line 600 "parser.y" + { + clan_symbol_add(&parser_symbol,(yyvsp[(2) - (4)].symbol),SCOPLIB_TYPE_UNKNOWN,parser_depth); + (yyval.affex) = clan_vector_term(parser_symbol,-((yyvsp[(4) - (4)].value)),(yyvsp[(2) - (4)].symbol)); + free((yyvsp[(2) - (4)].symbol)); + } + break; + + case 45: +#line 609 "parser.y" + { + clan_symbol_add(&parser_symbol,(yyvsp[(2) - (2)].symbol),SCOPLIB_TYPE_UNKNOWN,parser_depth); + (yyval.affex) = clan_vector_term(parser_symbol,-1,(yyvsp[(2) - (2)].symbol)); + free((yyvsp[(2) - (2)].symbol)); + } + break; + + case 46: +#line 629 "parser.y" + { + /* a=0 */ + int i; + scoplib_vector_p tmp = scoplib_vector_add_scalar((yyvsp[(1) - (3)].affex),1); + scoplib_vector_tag_inequality(tmp); + for (i = 0; i < (yyvsp[(3) - (3)].setex)->NbRows; ++i) + { + /* We have parsed a ceild/floord at an earlier stage. */ + if (SCOPVAL_notzero_p((yyvsp[(3) - (3)].setex)->p[i][0]) && !SCOPVAL_one_p((yyvsp[(3) - (3)].setex)->p[i][0])) + { + scoplib_int_t val; SCOPVAL_init(val); + SCOPVAL_assign(val, (yyvsp[(3) - (3)].setex)->p[i][0]); + SCOPVAL_set_si((yyvsp[(3) - (3)].setex)->p[i][0], 0); + scoplib_vector_p tmp2 = scoplib_vector_add_scalar((yyvsp[(1) - (3)].affex),0); + int j; + for (j = 1; j < (yyvsp[(1) - (3)].affex)->Size; ++j) + SCOPVAL_multo(tmp2->p[j], (yyvsp[(1) - (3)].affex)->p[j], val); + scoplib_vector_p tmp3 = scoplib_vector_add_scalar(tmp2,1); + scoplib_vector_tag_inequality(tmp3); + scoplib_matrix_sub_vector((yyvsp[(3) - (3)].setex), tmp3, i); + scoplib_vector_free(tmp2); + scoplib_vector_free(tmp3); + SCOPVAL_clear(val); + } + else + scoplib_matrix_sub_vector((yyvsp[(3) - (3)].setex), tmp, i); + } + scoplib_vector_free((yyvsp[(1) - (3)].affex)); + scoplib_vector_free(tmp); + (yyval.setex) = (yyvsp[(3) - (3)].setex); + } + break; + + case 47: +#line 664 "parser.y" + { + /* a>b translates to a-b-1>=0 */ + int i, j; + scoplib_vector_p tmp = scoplib_vector_add_scalar((yyvsp[(1) - (3)].affex),-1); + scoplib_vector_tag_inequality(tmp); + for (i = 0; i < (yyvsp[(3) - (3)].setex)->NbRows; ++i) + { + for (j = 1; j < (yyvsp[(3) - (3)].setex)->NbColumns; ++j) + SCOPVAL_oppose((yyvsp[(3) - (3)].setex)->p[i][j],(yyvsp[(3) - (3)].setex)->p[i][j]); + /* We have parsed a ceild/floord at an earlier stage. */ + if (SCOPVAL_notzero_p((yyvsp[(3) - (3)].setex)->p[i][0]) && !SCOPVAL_one_p((yyvsp[(3) - (3)].setex)->p[i][0])) + { + scoplib_int_t val; SCOPVAL_init(val); + SCOPVAL_assign(val, (yyvsp[(3) - (3)].setex)->p[i][0]); + SCOPVAL_set_si((yyvsp[(3) - (3)].setex)->p[i][0], 0); + scoplib_vector_p tmp2 = scoplib_vector_add_scalar((yyvsp[(1) - (3)].affex),0); + int j; + for (j = 1; j < (yyvsp[(1) - (3)].affex)->Size; ++j) + SCOPVAL_multo(tmp2->p[j], (yyvsp[(1) - (3)].affex)->p[j], val); + scoplib_vector_p tmp3 = scoplib_vector_add_scalar(tmp2,-1); + scoplib_vector_tag_inequality(tmp3); + scoplib_matrix_add_vector((yyvsp[(3) - (3)].setex), tmp3, i); + scoplib_vector_free(tmp2); + scoplib_vector_free(tmp3); + SCOPVAL_clear(val); + } + else + scoplib_matrix_add_vector((yyvsp[(3) - (3)].setex),tmp,i); + } + scoplib_vector_free((yyvsp[(1) - (3)].affex)); + scoplib_vector_free(tmp); + (yyval.setex) = (yyvsp[(3) - (3)].setex); + } + break; + + case 48: +#line 701 "parser.y" + { + /* a<=b translates to -a+b>=0 */ + int i; + scoplib_vector_p tmp = scoplib_vector_add_scalar((yyvsp[(1) - (3)].affex),0); + scoplib_vector_tag_inequality(tmp); + for (i = 0; i < (yyvsp[(3) - (3)].setex)->NbRows; ++i) + { + /* We have parsed a ceild/floord at an earlier stage. */ + if (SCOPVAL_notzero_p((yyvsp[(3) - (3)].setex)->p[i][0]) && !SCOPVAL_one_p((yyvsp[(3) - (3)].setex)->p[i][0])) + { + scoplib_int_t val; SCOPVAL_init(val); + SCOPVAL_assign(val, (yyvsp[(3) - (3)].setex)->p[i][0]); + SCOPVAL_set_si((yyvsp[(3) - (3)].setex)->p[i][0], 0); + scoplib_vector_p tmp2 = scoplib_vector_add_scalar((yyvsp[(1) - (3)].affex),0); + int j; + for (j = 1; j < (yyvsp[(1) - (3)].affex)->Size; ++j) + SCOPVAL_multo(tmp2->p[j], (yyvsp[(1) - (3)].affex)->p[j], val); + scoplib_vector_tag_inequality(tmp2); + scoplib_matrix_sub_vector((yyvsp[(3) - (3)].setex), tmp2, i); + scoplib_vector_free(tmp2); + SCOPVAL_clear(val); + } + else + scoplib_matrix_sub_vector((yyvsp[(3) - (3)].setex),tmp,i); + } + scoplib_vector_free((yyvsp[(1) - (3)].affex)); + scoplib_vector_free(tmp); + (yyval.setex) = (yyvsp[(3) - (3)].setex); + } + break; + + case 49: +#line 734 "parser.y" + { + /* a>=b translates to a-b>=0 */ + int i, j; + scoplib_vector_p tmp = scoplib_vector_add_scalar((yyvsp[(1) - (3)].affex),0); + scoplib_vector_tag_inequality(tmp); + for (i = 0; i < (yyvsp[(3) - (3)].setex)->NbRows; ++i) + { + for (j = 1; j < (yyvsp[(3) - (3)].setex)->NbColumns; ++j) + SCOPVAL_oppose((yyvsp[(3) - (3)].setex)->p[i][j],(yyvsp[(3) - (3)].setex)->p[i][j]); + /* We have parsed a ceild/floord at an earlier stage. */ + if (SCOPVAL_notzero_p((yyvsp[(3) - (3)].setex)->p[i][0]) && !SCOPVAL_one_p((yyvsp[(3) - (3)].setex)->p[i][0])) + { + scoplib_int_t val; SCOPVAL_init(val); + SCOPVAL_assign(val, (yyvsp[(3) - (3)].setex)->p[i][0]); + SCOPVAL_set_si((yyvsp[(3) - (3)].setex)->p[i][0], 0); + scoplib_vector_p tmp2 = scoplib_vector_add_scalar((yyvsp[(1) - (3)].affex),0); + int j; + for (j = 1; j < (yyvsp[(1) - (3)].affex)->Size; ++j) + SCOPVAL_multo(tmp2->p[j], (yyvsp[(1) - (3)].affex)->p[j], val); + scoplib_vector_tag_inequality(tmp2); + scoplib_matrix_add_vector((yyvsp[(3) - (3)].setex), tmp2, i); + scoplib_vector_free(tmp2); + SCOPVAL_clear(val); + } + else + scoplib_matrix_add_vector((yyvsp[(3) - (3)].setex),tmp,i); + } + scoplib_vector_free((yyvsp[(1) - (3)].affex)); + scoplib_vector_free(tmp); + (yyval.setex) = (yyvsp[(3) - (3)].setex); + } + break; + + case 50: +#line 769 "parser.y" + { + /* a==b translates to a-b==0 */ + /* Warning: cases like ceild(M,32) == ceild(N,32) are not handled. + Assert if we encounter such a case. */ + assert ((SCOPVAL_zero_p((yyvsp[(1) - (3)].affex)->p[0]) || SCOPVAL_one_p((yyvsp[(1) - (3)].affex)->p[0])) + && (SCOPVAL_zero_p((yyvsp[(3) - (3)].affex)->p[0]) || SCOPVAL_one_p((yyvsp[(3) - (3)].affex)->p[0]))); + scoplib_vector_p res = scoplib_vector_sub((yyvsp[(1) - (3)].affex),(yyvsp[(3) - (3)].affex)); + scoplib_vector_tag_equality(res); + (yyval.setex) = scoplib_matrix_from_vector(res); + scoplib_vector_free(res); + scoplib_vector_free((yyvsp[(1) - (3)].affex)); + scoplib_vector_free((yyvsp[(3) - (3)].affex)); + } + break; + + case 51: +#line 786 "parser.y" + { + (yyval.setex) = (yyvsp[(2) - (3)].setex); + } + break; + + case 52: +#line 793 "parser.y" + { + (yyval.setex) = scoplib_matrix_concat((yyvsp[(1) - (3)].setex),(yyvsp[(3) - (3)].setex)); + scoplib_matrix_free((yyvsp[(1) - (3)].setex)); + scoplib_matrix_free((yyvsp[(3) - (3)].setex)); + } + break; + + case 63: +#line 837 "parser.y" + { + if ((yyvsp[(1) - (4)].setex) == NULL) + { + yyerror ("[Clan] Error: changing value of iterator/parameter"); + return 0; + } + (yyval.rw)[0] = (yyvsp[(3) - (4)].setex); + (yyval.rw)[1] = (yyvsp[(1) - (4)].setex); + } + break; + + case 64: +#line 850 "parser.y" + { + if ((yyvsp[(1) - (4)].setex) == NULL) + { + yyerror ("[Clan] Error: changing value of iterator/parameter"); + return 0; + } + (yyval.rw)[0] = scoplib_matrix_concat((yyvsp[(1) - (4)].setex),(yyvsp[(3) - (4)].setex)); + scoplib_matrix_free((yyvsp[(3) - (4)].setex)); + (yyval.rw)[1] = (yyvsp[(1) - (4)].setex); + } + break; + + case 65: +#line 864 "parser.y" + { + if ((yyvsp[(1) - (3)].setex) == NULL) + { + yyerror ("[Clan] Error: changing value of iterator/parameter"); + return 0; + } + (yyval.rw)[0] = (yyvsp[(1) - (3)].setex); + (yyval.rw)[1] = scoplib_matrix_copy((yyvsp[(1) - (3)].setex)); + } + break; + + case 66: +#line 877 "parser.y" + { + if ((yyvsp[(2) - (3)].setex) == NULL) + { + yyerror ("[Clan] Error: changing value of iterator/parameter"); + return 0; + } + (yyval.rw)[0] = (yyvsp[(2) - (3)].setex); + (yyval.rw)[1] = scoplib_matrix_copy((yyvsp[(2) - (3)].setex)); + } + break; + + case 67: +#line 890 "parser.y" + { + (yyval.rw)[0] = (yyvsp[(1) - (2)].setex); + (yyval.rw)[1] = NULL; + } + break; + + case 68: +#line 898 "parser.y" + { + (yyval.rw)[0] = (yyvsp[(2) - (3)].rw)[0]; + (yyval.rw)[1] = (yyvsp[(2) - (3)].rw)[1]; + } + break; + + case 82: +#line 934 "parser.y" + { + (yyval.setex) = NULL; + } + break; + + case 83: +#line 941 "parser.y" + { + (yyval.setex) = NULL; + } + break; + + case 84: +#line 948 "parser.y" + { + (yyval.setex) = (yyvsp[(1) - (1)].setex); + } + break; + + case 85: +#line 956 "parser.y" + { + (yyval.setex) = scoplib_matrix_concat((yyvsp[(1) - (3)].setex),(yyvsp[(3) - (3)].setex)); + scoplib_matrix_free((yyvsp[(1) - (3)].setex)); + scoplib_matrix_free((yyvsp[(3) - (3)].setex)); + } + break; + + case 86: +#line 965 "parser.y" + { + (yyval.setex) = (yyvsp[(2) - (2)].setex); + } + break; + + case 87: +#line 972 "parser.y" + { + (yyval.setex) = (yyvsp[(2) - (3)].setex); + } + break; + + case 88: +#line 979 "parser.y" + { + scoplib_matrix_p tmp = scoplib_matrix_concat((yyvsp[(1) - (5)].setex),(yyvsp[(3) - (5)].setex)); + (yyval.setex) = scoplib_matrix_concat(tmp,(yyvsp[(5) - (5)].setex)); + scoplib_matrix_free(tmp); + scoplib_matrix_free((yyvsp[(1) - (5)].setex)); + scoplib_matrix_free((yyvsp[(3) - (5)].setex)); + scoplib_matrix_free((yyvsp[(5) - (5)].setex)); + } + break; + + case 89: +#line 1001 "parser.y" + { + int rank; + scoplib_matrix_p matrix; + char* s = (char*) (yyvsp[(1) - (1)].symbol); + clan_symbol_p symbol = clan_symbol_lookup(parser_symbol, s); + // If the variable is an iterator or a parameter, discard it + // from the read/write clause. + if ((symbol && symbol->type == SCOPLIB_TYPE_ITERATOR) || + (symbol && symbol->type == SCOPLIB_TYPE_PARAMETER)) + (yyval.setex) = NULL; + else + { + clan_symbol_add(&parser_symbol, s, SCOPLIB_TYPE_ARRAY,parser_depth); + rank = clan_symbol_get_rank(parser_symbol, s); + matrix = scoplib_matrix_malloc + (1, CLAN_MAX_DEPTH + CLAN_MAX_PARAMETERS + 2); + clan_matrix_tag_array(matrix, rank); + (yyval.setex) = matrix; + } + free((yyvsp[(1) - (1)].symbol)); + } + break; + + case 90: +#line 1027 "parser.y" + { + int rank; + clan_symbol_add(&parser_symbol,(yyvsp[(1) - (2)].symbol),SCOPLIB_TYPE_ARRAY,parser_depth); + rank = clan_symbol_get_rank(parser_symbol,(yyvsp[(1) - (2)].symbol)); + clan_matrix_tag_array((yyvsp[(2) - (2)].setex),rank); + (yyval.setex) = (yyvsp[(2) - (2)].setex); + free((yyvsp[(1) - (2)].symbol)); + } + break; + + case 91: +#line 1040 "parser.y" + { + (yyval.setex) = (yyvsp[(3) - (4)].setex); + free((yyvsp[(1) - (4)].symbol)); + } + break; + + case 92: +#line 1048 "parser.y" + { + (yyval.setex) = (yyvsp[(2) - (2)].setex); + } + break; + + case 93: +#line 1055 "parser.y" + { + (yyval.setex) = (yyvsp[(2) - (2)].setex); + } + break; + + case 100: +#line 1083 "parser.y" + { + (yyval.setex) = (yyvsp[(1) - (1)].setex); + } + break; + + case 101: +#line 1090 "parser.y" + { + (yyval.setex) = scoplib_matrix_concat((yyvsp[(1) - (3)].setex),(yyvsp[(3) - (3)].setex)); + } + break; + + case 102: +#line 1097 "parser.y" + { + (yyval.setex) = (yyvsp[(1) - (3)].setex); + } + break; + + case 103: +#line 1104 "parser.y" + { + (yyval.setex) = NULL; + } + break; + + case 104: +#line 1111 "parser.y" + { + (yyval.setex) = NULL; + } + break; + + case 105: +#line 1127 "parser.y" + { + (yyval.setex) = scoplib_matrix_from_vector((yyvsp[(2) - (3)].affex)); + scoplib_vector_free((yyvsp[(2) - (3)].affex)); + } + break; + + case 106: +#line 1135 "parser.y" + { + if ((yyvsp[(1) - (4)].setex) != NULL) + scoplib_matrix_insert_vector((yyvsp[(1) - (4)].setex),(yyvsp[(3) - (4)].affex),(yyvsp[(1) - (4)].setex)->NbRows); + scoplib_vector_free((yyvsp[(3) - (4)].affex)); + (yyval.setex) = (yyvsp[(1) - (4)].setex); + } + break; + + case 107: +#line 1156 "parser.y" + { + (yyval.symbol) = (yyvsp[(1) - (1)].symbol); + } + break; + + case 108: +#line 1163 "parser.y" + { + (yyval.symbol) = (yyvsp[(2) - (3)].symbol); + } + break; + + case 109: +#line 1170 "parser.y" + { + (yyval.symbol) = (yyvsp[(2) - (2)].symbol); + } + break; + + case 110: +#line 1177 "parser.y" + { + (yyval.symbol) = NULL; + } + break; + + +/* Line 1267 of yacc.c. */ +#line 2614 "parser.c" + default: break; + } + YY_SYMBOL_PRINT ("-> $$ =", yyr1[yyn], &yyval, &yyloc); + + YYPOPSTACK (yylen); + yylen = 0; + YY_STACK_PRINT (yyss, yyssp); + + *++yyvsp = yyval; + + + /* Now `shift' the result of the reduction. Determine what state + that goes to, based on the state we popped back to and the rule + number reduced by. */ + + yyn = yyr1[yyn]; + + yystate = yypgoto[yyn - YYNTOKENS] + *yyssp; + if (0 <= yystate && yystate <= YYLAST && yycheck[yystate] == *yyssp) + yystate = yytable[yystate]; + else + yystate = yydefgoto[yyn - YYNTOKENS]; + + goto yynewstate; + + +/*------------------------------------. +| yyerrlab -- here on detecting error | +`------------------------------------*/ +yyerrlab: + /* If not already recovering from an error, report this error. */ + if (!yyerrstatus) + { + ++yynerrs; +#if ! YYERROR_VERBOSE + yyerror (YY_("syntax error")); +#else + { + YYSIZE_T yysize = yysyntax_error (0, yystate, yychar); + if (yymsg_alloc < yysize && yymsg_alloc < YYSTACK_ALLOC_MAXIMUM) + { + YYSIZE_T yyalloc = 2 * yysize; + if (! (yysize <= yyalloc && yyalloc <= YYSTACK_ALLOC_MAXIMUM)) + yyalloc = YYSTACK_ALLOC_MAXIMUM; + if (yymsg != yymsgbuf) + YYSTACK_FREE (yymsg); + yymsg = (char *) YYSTACK_ALLOC (yyalloc); + if (yymsg) + yymsg_alloc = yyalloc; + else + { + yymsg = yymsgbuf; + yymsg_alloc = sizeof yymsgbuf; + } + } + + if (0 < yysize && yysize <= yymsg_alloc) + { + (void) yysyntax_error (yymsg, yystate, yychar); + yyerror (yymsg); + } + else + { + yyerror (YY_("syntax error")); + if (yysize != 0) + goto yyexhaustedlab; + } + } +#endif + } + + + + if (yyerrstatus == 3) + { + /* If just tried and failed to reuse look-ahead token after an + error, discard it. */ + + if (yychar <= YYEOF) + { + /* Return failure if at end of input. */ + if (yychar == YYEOF) + YYABORT; + } + else + { + yydestruct ("Error: discarding", + yytoken, &yylval); + yychar = YYEMPTY; + } + } + + /* Else will try to reuse look-ahead token after shifting the error + token. */ + goto yyerrlab1; + + +/*---------------------------------------------------. +| yyerrorlab -- error raised explicitly by YYERROR. | +`---------------------------------------------------*/ +yyerrorlab: + + /* Pacify compilers like GCC when the user code never invokes + YYERROR and the label yyerrorlab therefore never appears in user + code. */ + if (/*CONSTCOND*/ 0) + goto yyerrorlab; + + /* Do not reclaim the symbols of the rule which action triggered + this YYERROR. */ + YYPOPSTACK (yylen); + yylen = 0; + YY_STACK_PRINT (yyss, yyssp); + yystate = *yyssp; + goto yyerrlab1; + + +/*-------------------------------------------------------------. +| yyerrlab1 -- common code for both syntax error and YYERROR. | +`-------------------------------------------------------------*/ +yyerrlab1: + yyerrstatus = 3; /* Each real token shifted decrements this. */ + + for (;;) + { + yyn = yypact[yystate]; + if (yyn != YYPACT_NINF) + { + yyn += YYTERROR; + if (0 <= yyn && yyn <= YYLAST && yycheck[yyn] == YYTERROR) + { + yyn = yytable[yyn]; + if (0 < yyn) + break; + } + } + + /* Pop the current state because it cannot handle the error token. */ + if (yyssp == yyss) + YYABORT; + + + yydestruct ("Error: popping", + yystos[yystate], yyvsp); + YYPOPSTACK (1); + yystate = *yyssp; + YY_STACK_PRINT (yyss, yyssp); + } + + if (yyn == YYFINAL) + YYACCEPT; + + *++yyvsp = yylval; + + + /* Shift the error token. */ + YY_SYMBOL_PRINT ("Shifting", yystos[yyn], yyvsp, yylsp); + + yystate = yyn; + goto yynewstate; + + +/*-------------------------------------. +| yyacceptlab -- YYACCEPT comes here. | +`-------------------------------------*/ +yyacceptlab: + yyresult = 0; + goto yyreturn; + +/*-----------------------------------. +| yyabortlab -- YYABORT comes here. | +`-----------------------------------*/ +yyabortlab: + yyresult = 1; + goto yyreturn; + +#ifndef yyoverflow +/*-------------------------------------------------. +| yyexhaustedlab -- memory exhaustion comes here. | +`-------------------------------------------------*/ +yyexhaustedlab: + yyerror (YY_("memory exhausted")); + yyresult = 2; + /* Fall through. */ +#endif + +yyreturn: + if (yychar != YYEOF && yychar != YYEMPTY) + yydestruct ("Cleanup: discarding lookahead", + yytoken, &yylval); + /* Do not reclaim the symbols of the rule which action triggered + this YYABORT or YYACCEPT. */ + YYPOPSTACK (yylen); + YY_STACK_PRINT (yyss, yyssp); + while (yyssp != yyss) + { + yydestruct ("Cleanup: popping", + yystos[*yyssp], yyvsp); + YYPOPSTACK (1); + } +#ifndef yyoverflow + if (yyss != yyssa) + YYSTACK_FREE (yyss); +#endif +#if YYERROR_VERBOSE + if (yymsg != yymsgbuf) + YYSTACK_FREE (yymsg); +#endif + /* Make sure YYID is used. */ + return YYID (yyresult); +} + + +#line 1189 "parser.y" + + + +void +yyerror(char *s) +{ + fprintf(stderr, "%s\n", s); + clan_parse_error = 1; +} + + +/** + * clan_parser_initialize_state function: + * this function achieves the initialization of the "parser state": a + * collection of variables that vary during the parsing and thanks to we + * can extract all SCoP informations. + ** + * - 02/05/2008: First version. + */ +void +clan_parser_initialize_state(clan_options_p options) +{ + int i, nb_rows, nb_columns, depth; + + nb_rows = CLAN_MAX_CONSTRAINTS; + nb_columns = CLAN_MAX_DEPTH + CLAN_MAX_PARAMETERS + 2; + depth = CLAN_MAX_DEPTH; + + parser_scop = scoplib_scop_malloc(); + parser_domain = scoplib_matrix_malloc(nb_rows,nb_columns); + parser_symbol = NULL; + + parser_scheduling = (int *)malloc(depth * sizeof(int)); + parser_consperdim = (int *)malloc(depth * sizeof(int)); + for (i = 0; i < depth; i++) + { + parser_scheduling[i] = 0; + parser_consperdim[i] = 0; + } + parser_iterators = (clan_symbol_p *)malloc(depth * sizeof(clan_symbol_p)); + parser_variables_localvars = + (int*)malloc((CLAN_MAX_LOCAL_VARIABLES + 1) * sizeof(int)); + parser_variables_liveout = + (int*)malloc((CLAN_MAX_LOCAL_VARIABLES + 1) * sizeof(int)); + parser_depth = 0; + parser_nb_cons = 0; + /* Reset also the Symbol global variables. */ + extern int symbol_nb_iterators; + symbol_nb_iterators = 0; + extern int symbol_nb_parameters; + symbol_nb_parameters = 0; + extern int symbol_nb_arrays; + symbol_nb_arrays = 0; + extern int symbol_nb_functions; + symbol_nb_functions = 0; + + for (i = 0; i <= CLAN_MAX_LOCAL_VARIABLES; ++i) + parser_variables_localvars[i] = -1; + for (i = 0; i <= CLAN_MAX_LOCAL_VARIABLES; ++i) + parser_variables_liveout[i] = -1; + + parser_options = options; +} + +/** + * clan_parser_free_state function: + * this function frees the memory allocated for the "parser state", except + * for parser_scop, obviously. + ** + * - 02/05/2008: First version. + */ +void +clan_parser_free_state() +{ + scoplib_matrix_free(parser_domain); + clan_symbol_free(parser_symbol); + free(parser_scheduling); + free(parser_consperdim); + free(parser_iterators); + free(parser_variables_localvars); + free(parser_variables_liveout); +} + +/** + * clan_parse function: + * this function parses a file to extract a SCoP and returns, if successful, + * a pointer to the scoplib_scop_t structure. + * \param input The file to parse (already open). + * \param options Options for file parsing. + ** + * - 01/05/2008: First version. + */ +scoplib_scop_p +clan_parse(FILE * input, clan_options_p options) +{ + yyin = input; + + clan_parser_initialize_state(options); + + yyparse(); + + fclose(yyin); + if (! clan_parse_error) + { + if (parser_variables_localvars[0] != -1 || + parser_variables_liveout[0] != -1) + clan_scop_fill_options(parser_scop, parser_variables_localvars, + parser_variables_liveout); + clan_scop_compact(parser_scop); + } + else + parser_scop = NULL; + clan_parser_free_state(); + + return parser_scop; +} + + diff --git a/clan/source/parser.h b/clan/source/parser.h new file mode 100644 index 0000000..6c66a26 --- /dev/null +++ b/clan/source/parser.h @@ -0,0 +1,173 @@ +/* A Bison parser, made by GNU Bison 2.3. */ + +/* Skeleton interface for Bison's Yacc-like parsers in C + + Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002, 2003, 2004, 2005, 2006 + Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. */ + +/* As a special exception, you may create a larger work that contains + part or all of the Bison parser skeleton and distribute that work + under terms of your choice, so long as that work isn't itself a + parser generator using the skeleton or a modified version thereof + as a parser skeleton. Alternatively, if you modify or redistribute + the parser skeleton itself, you may (at your option) remove this + special exception, which will cause the skeleton and the resulting + Bison output files to be licensed under the GNU General Public + License without this special exception. + + This special exception was added by the Free Software Foundation in + version 2.2 of Bison. */ + +/* Tokens. */ +#ifndef YYTOKENTYPE +# define YYTOKENTYPE + /* Put the tokens into the symbol table, so that GDB and other debuggers + know about them. */ + enum yytokentype { + IGNORE = 258, + IF = 259, + ELSE = 260, + FOR = 261, + PRAGMALOCALVARS = 262, + PRAGMALIVEOUT = 263, + MIN = 264, + MAX = 265, + CEILD = 266, + FLOORD = 267, + REAL = 268, + ID = 269, + INTEGER = 270, + syRPARENTHESIS = 271, + syLPARENTHESIS = 272, + syRBRACKET = 273, + syLBRACKET = 274, + syRBRACE = 275, + syLBRACE = 276, + sySEMICOLON = 277, + syCOMMA = 278, + syPOINT = 279, + syARROW = 280, + opEQUAL = 281, + opLEQ = 282, + opGEQ = 283, + opLOWER = 284, + opGREATER = 285, + opPLUS = 286, + opMINUS = 287, + opINCREMENTATION = 288, + opDECREMENTATION = 289, + opNOT = 290, + opMULTIPLY = 291, + opDIVIDE = 292, + opMOD = 293, + opAND = 294, + opOR = 295, + opCOMP = 296, + opASSIGNMENT = 297, + opPLUSEQUAL = 298, + opMINUSEQUAL = 299, + opMULTIPLYEQUAL = 300, + opDIVIDEEQUAL = 301, + opMODEQUAL = 302, + opANDEQUAL = 303, + opOREQUAL = 304, + opCOMPEQUAL = 305, + opLAND = 306, + opLOR = 307, + opQMARK = 308, + opCOLON = 309, + MAXPRIORITY = 310 + }; +#endif +/* Tokens. */ +#define IGNORE 258 +#define IF 259 +#define ELSE 260 +#define FOR 261 +#define PRAGMALOCALVARS 262 +#define PRAGMALIVEOUT 263 +#define MIN 264 +#define MAX 265 +#define CEILD 266 +#define FLOORD 267 +#define REAL 268 +#define ID 269 +#define INTEGER 270 +#define syRPARENTHESIS 271 +#define syLPARENTHESIS 272 +#define syRBRACKET 273 +#define syLBRACKET 274 +#define syRBRACE 275 +#define syLBRACE 276 +#define sySEMICOLON 277 +#define syCOMMA 278 +#define syPOINT 279 +#define syARROW 280 +#define opEQUAL 281 +#define opLEQ 282 +#define opGEQ 283 +#define opLOWER 284 +#define opGREATER 285 +#define opPLUS 286 +#define opMINUS 287 +#define opINCREMENTATION 288 +#define opDECREMENTATION 289 +#define opNOT 290 +#define opMULTIPLY 291 +#define opDIVIDE 292 +#define opMOD 293 +#define opAND 294 +#define opOR 295 +#define opCOMP 296 +#define opASSIGNMENT 297 +#define opPLUSEQUAL 298 +#define opMINUSEQUAL 299 +#define opMULTIPLYEQUAL 300 +#define opDIVIDEEQUAL 301 +#define opMODEQUAL 302 +#define opANDEQUAL 303 +#define opOREQUAL 304 +#define opCOMPEQUAL 305 +#define opLAND 306 +#define opLOR 307 +#define opQMARK 308 +#define opCOLON 309 +#define MAXPRIORITY 310 + + + + +#if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED +typedef union YYSTYPE +#line 90 "parser.y" +{ int value; /**< An integer value for integers */ + char * symbol; /**< A string for identifiers */ + scoplib_vector_p affex; /**< An affine expression */ + scoplib_matrix_p setex; /**< A set of affine expressions */ + scoplib_matrix_p rw[2]; /**< Read and write array accesses */ + } +/* Line 1489 of yacc.c. */ +#line 166 "parser.h" + YYSTYPE; +# define yystype YYSTYPE /* obsolescent; will be withdrawn */ +# define YYSTYPE_IS_DECLARED 1 +# define YYSTYPE_IS_TRIVIAL 1 +#endif + +extern YYSTYPE yylval; + diff --git a/clan/source/parser.y b/clan/source/parser.y new file mode 100644 index 0000000..49b32f4 --- /dev/null +++ b/clan/source/parser.y @@ -0,0 +1,1305 @@ + + /*+------- <| --------------------------------------------------------** + ** A Clan ** + **--- /.\ -----------------------------------------------------** + ** <| [""M# parser.y ** + **- A | # -----------------------------------------------------** + ** /.\ [""M# First version: 30/04/2008 ** + **- [""M# | # U"U#U -----------------------------------------------** + | # | # \ .:/ + | # | #___| # + ****** | "--' .-" ****************************************************** + * |"-"-"-"-"-#-#-## Clan : the Chunky Loop Analyzer (experimental) * + **** | # ## ###### ***************************************************** + * \ .::::'/ * + * \ ::::'/ Copyright (C) 2008 Cedric Bastoul * + * :8a| # # ## * + * ::88a ### This is free software; you can redistribute it * + * ::::888a 8a ##::. and/or modify it under the terms of the GNU Lesser * + * ::::::::888a88a[]::: General Public License as published by the Free * + *::8:::::::::SUNDOGa8a::. Software Foundation, either version 3 of the * + *::::::::8::::888:Y8888:: License, or (at your option) any later version. * + *::::':::88::::888::Y88a::::::::::::... * + *::'::.. . ..... .. ... . * + * This software is distributed in the hope that it will be useful, but * + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * + * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License * + * for more details. * + * * + * You should have received a copy of the GNU Lesser General Public License * + * along with software; if not, write to the Free Software Foundation, Inc., * + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * + * * + * Clan, the Chunky Loop Analyzer * + * Written by Cedric Bastoul, Cedric.Bastoul@inria.fr * + * * + ******************************************************************************/ + + +%{ + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + + int yylex(void); + void yyerror(char *); + int clan_parse_error = 0; /**< Set to 1 during parsing if + encountered an error */ + void clan_parser_log(char *); + scoplib_scop_p clan_parse(FILE *, clan_options_p); + + extern FILE * yyin; /**< File to be read by Lex */ + extern char scanner_latest_text[]; /**< Latest text read by Lex */ + + /* This is the "parser state", a collection of variables that vary + * during the parsing and thanks to we can extract all SCoP informations. + */ + scoplib_scop_p parser_scop; /**< SCoP in construction */ + scoplib_statement_p parser_statement; /**< Statement in construction */ + clan_symbol_p parser_symbol; /**< Top of the symbol table */ + int parser_recording; /**< Boolean: do we record or not? */ + char * parser_record; /**< What we record + (statement body) */ + int parser_depth = 0; /**< Current loop depth */ + int * parser_scheduling; /**< Current statement scheduling */ + clan_symbol_p * parser_iterators; /**< Current iterator list */ + scoplib_matrix_p parser_domain; /**< Current iteration domain */ + int parser_nb_cons = 0; /**< Current number of constraints */ + int * parser_consperdim; /**< Constraint nb for each + dimension */ + int* parser_variables_localvars;/**< List of variables + in #pragma + local-vars */ + int* parser_variables_liveout;/**< List of variables + in #pragma + live-out */ + /* Ugly global variable to keep/read Clan options during parsing. */ + clan_options_p parser_options = NULL; + + +%} + +%union { int value; /**< An integer value for integers */ + char * symbol; /**< A string for identifiers */ + scoplib_vector_p affex; /**< An affine expression */ + scoplib_matrix_p setex; /**< A set of affine expressions */ + scoplib_matrix_p rw[2]; /**< Read and write array accesses */ + } + +%token IGNORE +%token IF ELSE FOR PRAGMALOCALVARS PRAGMALIVEOUT +%token MIN MAX CEILD FLOORD +%token REAL +%token ID +%token INTEGER + +%token syRPARENTHESIS syLPARENTHESIS syRBRACKET syLBRACKET syRBRACE syLBRACE +%token sySEMICOLON syCOMMA syPOINT syARROW + +%token opEQUAL opLEQ opGEQ opLOWER opGREATER opPLUS opMINUS +%token opINCREMENTATION opDECREMENTATION opNOT +%token opMULTIPLY opDIVIDE opMOD opAND opOR opCOMP +%token opASSIGNMENT +%token opPLUSEQUAL opMINUSEQUAL opMULTIPLYEQUAL opDIVIDEEQUAL +%token opMODEQUAL opANDEQUAL opOREQUAL opCOMPEQUAL +%token opLAND opLOR opQMARK opCOLON + +%left opPLUS opMINUS +%left opMULTIPLY opDIVIDE opMOD opAND opOR opCOMP +%left opEQUAL opLEQ opGEQ opLOWER opGREATER opLAND opCOLON opQMARK +%left opNOT +%left MAXPRIORITY /* Dummy token to help in removing shift/reduce conflicts */ + +%type condition +%type min_affine_expression +%type max_affine_expression +%type affine_expression +%type term +%type array_index +%type variable +%type variable_list +%type expression +%type assignment +%type id + +%% + +/* + * Start rule. + * + */ +program: + instruction_list + { + /* The full program was parsed. Allocate and fill the final + .scop structures. */ + int nb_parameters, nb_arrays; + + parser_scop->parameters = clan_symbol_id_array(parser_symbol, + SCOPLIB_TYPE_PARAMETER, + &nb_parameters); + parser_scop->nb_parameters = nb_parameters; + parser_scop->arrays = clan_symbol_id_array(parser_symbol, + SCOPLIB_TYPE_ARRAY, + &nb_arrays); + parser_scop->nb_arrays = nb_arrays; + if (parser_options->bounded_context) + { + parser_scop->context = scoplib_matrix_malloc(nb_parameters, + nb_parameters+2); + int i; + for (i = 0; i < nb_parameters; ++i) + { + SCOPVAL_set_si(parser_scop->context->p[i][0], 1); + SCOPVAL_set_si(parser_scop->context->p[i][i+1], 1); + SCOPVAL_set_si(parser_scop->context->p[i][nb_parameters +1], 1); + } + } + else + parser_scop->context = scoplib_matrix_malloc(0,nb_parameters+2); + } + | + ; + +/* + * Rules for a list of instructions + * + */ +instruction_list: + instruction + | instruction_list instruction + | IGNORE + | instruction_list IGNORE + | syRBRACE instruction_list syLBRACE + ; + + +/* + * Rules for a bloc of instructions. + */ +bloc: +/* + * Rule 1: bloc -> instruction + */ + instruction +/* + * Rule 2: bloc -> { instruction_list } + */ + | syRBRACE instruction_list syLBRACE + ; + + +/* + * Rules for a program instruction. Either a for(..., if(..., or a + * regular statement. + * + */ +instruction: +/* + * Rule 1: instruction -> for ( id = ; condition; increment) bloc + * + */ + FOR + syRPARENTHESIS + id + { + clan_symbol_p symbol; + symbol = clan_symbol_add(&parser_symbol,$3, + SCOPLIB_TYPE_ITERATOR,parser_depth+1); + /* Ensure that the returned symbol was either a new one, + either from the same type. */ + if (symbol->type != SCOPLIB_TYPE_ITERATOR) + { + yyerror("[Clan] Error: the input file is not a SCoP\n" + "\t> A loop iterator was previously used as a parameter" + "\n"); + return 0; + } + /* Update the rank, in case a symbol with the same name was + already existing. */ + if (symbol->rank != parser_depth + 1) + symbol->rank = parser_depth + 1; + parser_iterators[parser_depth] = symbol; + /* Memorize the current iterator as a negative constraint prefix */ + } + opASSIGNMENT + max_affine_expression + { + scoplib_vector_p parser_i_term = clan_vector_term(parser_symbol,1,$3); + scoplib_vector_tag_inequality(parser_i_term); + int i, j; + for (i = 0; i < $6->NbRows; ++i) + { + for (j = 1; j < $6->NbColumns; ++j) + SCOPVAL_oppose($6->p[i][j],$6->p[i][j]); + scoplib_matrix_add_vector($6,parser_i_term,i); + } + scoplib_matrix_insert_matrix(parser_domain,$6,parser_nb_cons); + + parser_nb_cons += $6->NbRows; + parser_consperdim[parser_depth] += $6->NbRows; + scoplib_vector_free(parser_i_term); + free($3); + scoplib_matrix_free($6); + } + sySEMICOLON + condition + { + scoplib_matrix_insert_matrix(parser_domain,$9,parser_nb_cons); + parser_nb_cons += $9->NbRows; + parser_consperdim[parser_depth] += $9->NbRows; + } + sySEMICOLON + incrementation + syLPARENTHESIS + { + parser_depth++; + parser_scheduling[parser_depth] = 0; + } + bloc + { + parser_depth--; + parser_scheduling[parser_depth]++; + parser_nb_cons -= parser_consperdim[parser_depth]; + parser_consperdim[parser_depth] = 0; + clan_symbol_remove(&parser_symbol, parser_iterators[parser_depth]); + } +/* + * Rule 2: instruction -> if (condition) bloc + * + */ + | IF syRPARENTHESIS condition syLPARENTHESIS + { + /* Insert the condition constraint in the current parser domain. */ + scoplib_matrix_insert_matrix(parser_domain,$3,parser_nb_cons); + parser_nb_cons += $3->NbRows; + } + bloc + { + parser_nb_cons -= $3->NbRows; + /* Remove the condition constraint from the current parser domain. */ + int i, j; + for (i = parser_nb_cons; i < parser_domain->NbRows - 1; ++i) + for (j = 0; j < parser_domain->NbColumns; ++j) + SCOPVAL_assign(parser_domain->p[i][j],parser_domain->p[i+1][j]); + } +/* + * Rule 3: instruction -> assignment + * + */ + | { + parser_statement = scoplib_statement_malloc(); + parser_record = (char *)malloc(SCOPLIB_MAX_STRING * sizeof(char)); + parser_recording = CLAN_TRUE; + /* Yacc needs Lex to read the next token to ensure we are starting + * an assignment. So we keep track of the latest text Lex read + * and we start the statement body with it. + */ + strcpy(parser_record,scanner_latest_text); + } + assignment + { + /* Deal with statements without surrounding loop by adding a + fake iterator */ + int old_parser_depth = parser_depth; + if (parser_depth == 0) + { + char* fakeiter = strdup("fakeiter"); + clan_symbol_p symbol = clan_symbol_lookup(parser_symbol, fakeiter); + if (symbol) + free(fakeiter); + else + symbol = clan_symbol_add(&parser_symbol,fakeiter, + SCOPLIB_TYPE_ITERATOR,parser_depth+1); + parser_iterators[parser_depth] = symbol; + scoplib_vector_p constraint = + scoplib_vector_malloc(parser_domain->NbColumns); + SCOPVAL_set_si(constraint->p[1],1); + parser_depth++; + scoplib_matrix_replace_vector(parser_domain,constraint,parser_nb_cons); + parser_nb_cons++; + scoplib_vector_free(constraint); + } + /* Construct the statement structure from the parser state */ + parser_statement->domain = scoplib_matrix_list_malloc(); + parser_statement->domain->elt = scoplib_matrix_ncopy(parser_domain, + parser_nb_cons); + parser_statement->schedule = clan_matrix_scheduling(parser_scheduling, + parser_depth); + parser_statement->read = $2[0]; + parser_statement->write = $2[1]; + parser_statement->body = parser_record; + parser_statement->nb_iterators = parser_depth; + parser_statement->iterators = clan_symbol_iterators(parser_iterators, + parser_depth); + if (parser_statement->write == NULL) + parser_statement->write = + scoplib_matrix_malloc(0, parser_domain->NbColumns); + if (parser_statement->read == NULL) + parser_statement->read = + scoplib_matrix_malloc(0, parser_domain->NbColumns); + parser_recording = CLAN_FALSE; + scoplib_statement_add(&(parser_scop->statement),parser_statement); + /* We were parsing a statement without iterator. Restore the + original state */ + if (old_parser_depth == 0) + { + --parser_depth; + --parser_nb_cons; + parser_consperdim[parser_depth] = 0; + } + parser_scheduling[parser_depth]++; + } +/* + * Rule 4: instruction -> #pragma local-vars + * NOTE: THIS RULE IS REPONSIBLE FOR 10 shift/reduce conflicts. + * It is ok, though, the parsing will be correct. + */ + | PRAGMALOCALVARS variable_list + { + int i, j; + scoplib_matrix_p m = $2; + for (i = 0; i < m->NbRows; ++i) + { + int id = SCOPVAL_get_si(m->p[i][0]); + for (j = 0; parser_variables_localvars[j] != -1 && + parser_variables_localvars[j] != id; ++j) + ; + if (j == CLAN_MAX_LOCAL_VARIABLES) + { + yyerror("[Clan] Error: maximum number of local variables reached\n"); + return 0; + } + if (parser_variables_localvars[j] == -1) + parser_variables_localvars[j] = id; + } + } +/* + * Rule 5: instruction -> #pragma live-out + * NOTE: THIS RULE IS REPONSIBLE FOR 10 shift/reduce conflicts. + * It is ok, though, the parsing will be correct. + */ + | PRAGMALIVEOUT variable_list + { + int i, j; + scoplib_matrix_p m = $2; + for (i = 0; i < m->NbRows; ++i) + { + int id = SCOPVAL_get_si(m->p[i][0]); + for (j = 0; parser_variables_liveout[j] != -1 && + parser_variables_liveout[j] != id; ++j) + ; + if (j == CLAN_MAX_LOCAL_VARIABLES) + { + yyerror("[Clan] Error: maximum number of live-out variables reached\n"); + return 0; + } + if (parser_variables_liveout[j] == -1) + parser_variables_liveout[j] = id; + } + } + ; + + +/* + * Rules for the for loop increment. + * Handled cases: + * i++, ++i, i = i + 1, i += 1 + * + */ +incrementation: + id opINCREMENTATION + { + free($1); + } + | opINCREMENTATION id + { + free($2); + } + | id opASSIGNMENT id opPLUS INTEGER + { + if ($5 != 1) + { + yyerror("[Clan] Error: loop increment is not 1\n"); + return 0; + } + free ($1); + free ($3); + } + | id opPLUSEQUAL INTEGER + { + if ($3 != 1) + { + yyerror("[Clan] Error: loop increment is not 1\n"); + return 0; + } + free ($1); + } + ; + + +/* + * Reduction rules for min(... operators. + * return + * + */ +min_affine_expression: + affine_expression + { + $$ = scoplib_matrix_from_vector($1); + scoplib_vector_free($1); + } + | MIN syRPARENTHESIS min_affine_expression syCOMMA min_affine_expression + syLPARENTHESIS + { + $$ = scoplib_matrix_concat($3, $5); + } + ; + + +/* + * Reduction rules for max(... operators. + * return + * + */ +max_affine_expression: + affine_expression + { + $$ = scoplib_matrix_from_vector($1); + scoplib_vector_free($1); + } + | MAX syRPARENTHESIS max_affine_expression syCOMMA max_affine_expression + syLPARENTHESIS + { + $$ = scoplib_matrix_concat($3, $5); + } + ; + + +/* + * Reduction rules for affine expression. + * return + * + */ +affine_expression: + term + { + $$ = $1; + } + | affine_expression opPLUS affine_expression + { + $$ = scoplib_vector_add($1,$3); + scoplib_vector_free($1); + scoplib_vector_free($3); + } + | affine_expression opMINUS affine_expression + { + $$ = scoplib_vector_sub($1,$3); + scoplib_vector_free($1); + scoplib_vector_free($3); + } + | syRPARENTHESIS affine_expression syLPARENTHESIS + { + $$ = $2; + } + | CEILD syRPARENTHESIS affine_expression syCOMMA term syLPARENTHESIS + { + SCOPVAL_assign($3->p[0], $5->p[$5->Size - 1]); + $$ = $3; + } + | FLOORD syRPARENTHESIS affine_expression syCOMMA term syLPARENTHESIS + { + SCOPVAL_assign($3->p[0], $5->p[$5->Size - 1]); + $$ = $3; + } + ; + + +/* + * Reduction rules for a term. + * return + * + */ +term: +/* + * Rule 1: term -> INT + */ + INTEGER + { + $$ = clan_vector_term(parser_symbol,$1,NULL); + } +/* + * Rule 2: term -> id + */ + | id + { + clan_symbol_add(&parser_symbol,$1,SCOPLIB_TYPE_UNKNOWN,parser_depth); + $$ = clan_vector_term(parser_symbol,1,$1); + free($1); + } +/* + * Rule 3: term -> - INT + */ + | opMINUS INTEGER + { + $$ = clan_vector_term(parser_symbol,-($2),NULL); + } +/* + * Rule 4: term -> INT * id + */ + | INTEGER opMULTIPLY id + { + clan_symbol_add(&parser_symbol,$3,SCOPLIB_TYPE_UNKNOWN,parser_depth); + $$ = clan_vector_term(parser_symbol,$1,$3); + free($3); + } +/* + * Rule 4': term -> id * INT + */ + | id opMULTIPLY INTEGER + { + clan_symbol_add(&parser_symbol,$1,SCOPLIB_TYPE_UNKNOWN,parser_depth); + $$ = clan_vector_term(parser_symbol,$3,$1); + free($1); + } +/* + * Rule 5: term -> INT * INT + */ + | INTEGER opMULTIPLY INTEGER + { + $$ = clan_vector_term(parser_symbol, ($1) * ($3), NULL); + } +/* + * Rule 6: term -> INT / INT + */ + | INTEGER opDIVIDE INTEGER + { + $$ = clan_vector_term(parser_symbol, ($1) / ($3), NULL); + } +/* + * Rule 7: term -> - INT * id + */ + | opMINUS INTEGER opMULTIPLY id + { + clan_symbol_add(&parser_symbol,$4,SCOPLIB_TYPE_UNKNOWN,parser_depth); + $$ = clan_vector_term(parser_symbol,-($2),$4); + free($4); + } +/* + * Rule 7': term -> - id * INT + */ + | opMINUS id opMULTIPLY INTEGER + { + clan_symbol_add(&parser_symbol,$2,SCOPLIB_TYPE_UNKNOWN,parser_depth); + $$ = clan_vector_term(parser_symbol,-($4),$2); + free($2); + } +/* + * Rule 8: term -> - id + */ + | opMINUS id + { + clan_symbol_add(&parser_symbol,$2,SCOPLIB_TYPE_UNKNOWN,parser_depth); + $$ = clan_vector_term(parser_symbol,-1,$2); + free($2); + } + ; + + +/* + * Rules for defining a condition. A condition is an affine expression + * (possibly with min/max operator(s)) of the form 'affex1 op affex2' + * where affex2 may contain min operators iff op is '<' or '<=', and + * max operators iff op is '>' or '>='. + * return: + */ +condition: +/* + * Rule 1: condition -> < min_affex + */ + affine_expression opLOWER min_affine_expression + { + /* a=0 */ + int i; + scoplib_vector_p tmp = scoplib_vector_add_scalar($1,1); + scoplib_vector_tag_inequality(tmp); + for (i = 0; i < $3->NbRows; ++i) + { + /* We have parsed a ceild/floord at an earlier stage. */ + if (SCOPVAL_notzero_p($3->p[i][0]) && !SCOPVAL_one_p($3->p[i][0])) + { + scoplib_int_t val; SCOPVAL_init(val); + SCOPVAL_assign(val, $3->p[i][0]); + SCOPVAL_set_si($3->p[i][0], 0); + scoplib_vector_p tmp2 = scoplib_vector_add_scalar($1,0); + int j; + for (j = 1; j < $1->Size; ++j) + SCOPVAL_multo(tmp2->p[j], $1->p[j], val); + scoplib_vector_p tmp3 = scoplib_vector_add_scalar(tmp2,1); + scoplib_vector_tag_inequality(tmp3); + scoplib_matrix_sub_vector($3, tmp3, i); + scoplib_vector_free(tmp2); + scoplib_vector_free(tmp3); + SCOPVAL_clear(val); + } + else + scoplib_matrix_sub_vector($3, tmp, i); + } + scoplib_vector_free($1); + scoplib_vector_free(tmp); + $$ = $3; + } +/* + * Rule 2: condition -> > max_affex + */ + | affine_expression opGREATER max_affine_expression + { + /* a>b translates to a-b-1>=0 */ + int i, j; + scoplib_vector_p tmp = scoplib_vector_add_scalar($1,-1); + scoplib_vector_tag_inequality(tmp); + for (i = 0; i < $3->NbRows; ++i) + { + for (j = 1; j < $3->NbColumns; ++j) + SCOPVAL_oppose($3->p[i][j],$3->p[i][j]); + /* We have parsed a ceild/floord at an earlier stage. */ + if (SCOPVAL_notzero_p($3->p[i][0]) && !SCOPVAL_one_p($3->p[i][0])) + { + scoplib_int_t val; SCOPVAL_init(val); + SCOPVAL_assign(val, $3->p[i][0]); + SCOPVAL_set_si($3->p[i][0], 0); + scoplib_vector_p tmp2 = scoplib_vector_add_scalar($1,0); + int j; + for (j = 1; j < $1->Size; ++j) + SCOPVAL_multo(tmp2->p[j], $1->p[j], val); + scoplib_vector_p tmp3 = scoplib_vector_add_scalar(tmp2,-1); + scoplib_vector_tag_inequality(tmp3); + scoplib_matrix_add_vector($3, tmp3, i); + scoplib_vector_free(tmp2); + scoplib_vector_free(tmp3); + SCOPVAL_clear(val); + } + else + scoplib_matrix_add_vector($3,tmp,i); + } + scoplib_vector_free($1); + scoplib_vector_free(tmp); + $$ = $3; + } +/* + * Rule 3: condition -> <= min_affex + */ + | affine_expression opLEQ min_affine_expression + { + /* a<=b translates to -a+b>=0 */ + int i; + scoplib_vector_p tmp = scoplib_vector_add_scalar($1,0); + scoplib_vector_tag_inequality(tmp); + for (i = 0; i < $3->NbRows; ++i) + { + /* We have parsed a ceild/floord at an earlier stage. */ + if (SCOPVAL_notzero_p($3->p[i][0]) && !SCOPVAL_one_p($3->p[i][0])) + { + scoplib_int_t val; SCOPVAL_init(val); + SCOPVAL_assign(val, $3->p[i][0]); + SCOPVAL_set_si($3->p[i][0], 0); + scoplib_vector_p tmp2 = scoplib_vector_add_scalar($1,0); + int j; + for (j = 1; j < $1->Size; ++j) + SCOPVAL_multo(tmp2->p[j], $1->p[j], val); + scoplib_vector_tag_inequality(tmp2); + scoplib_matrix_sub_vector($3, tmp2, i); + scoplib_vector_free(tmp2); + SCOPVAL_clear(val); + } + else + scoplib_matrix_sub_vector($3,tmp,i); + } + scoplib_vector_free($1); + scoplib_vector_free(tmp); + $$ = $3; + } +/* + * Rule 4: condition -> >= max_affex + */ + | affine_expression opGEQ max_affine_expression + { + /* a>=b translates to a-b>=0 */ + int i, j; + scoplib_vector_p tmp = scoplib_vector_add_scalar($1,0); + scoplib_vector_tag_inequality(tmp); + for (i = 0; i < $3->NbRows; ++i) + { + for (j = 1; j < $3->NbColumns; ++j) + SCOPVAL_oppose($3->p[i][j],$3->p[i][j]); + /* We have parsed a ceild/floord at an earlier stage. */ + if (SCOPVAL_notzero_p($3->p[i][0]) && !SCOPVAL_one_p($3->p[i][0])) + { + scoplib_int_t val; SCOPVAL_init(val); + SCOPVAL_assign(val, $3->p[i][0]); + SCOPVAL_set_si($3->p[i][0], 0); + scoplib_vector_p tmp2 = scoplib_vector_add_scalar($1,0); + int j; + for (j = 1; j < $1->Size; ++j) + SCOPVAL_multo(tmp2->p[j], $1->p[j], val); + scoplib_vector_tag_inequality(tmp2); + scoplib_matrix_add_vector($3, tmp2, i); + scoplib_vector_free(tmp2); + SCOPVAL_clear(val); + } + else + scoplib_matrix_add_vector($3,tmp,i); + } + scoplib_vector_free($1); + scoplib_vector_free(tmp); + $$ = $3; + } +/* + * Rule 5: condition -> == + */ + | affine_expression opEQUAL affine_expression + { + /* a==b translates to a-b==0 */ + /* Warning: cases like ceild(M,32) == ceild(N,32) are not handled. + Assert if we encounter such a case. */ + assert ((SCOPVAL_zero_p($1->p[0]) || SCOPVAL_one_p($1->p[0])) + && (SCOPVAL_zero_p($3->p[0]) || SCOPVAL_one_p($3->p[0]))); + scoplib_vector_p res = scoplib_vector_sub($1,$3); + scoplib_vector_tag_equality(res); + $$ = scoplib_matrix_from_vector(res); + scoplib_vector_free(res); + scoplib_vector_free($1); + scoplib_vector_free($3); + } +/* + * Rule 6: condition -> ( condition ) + */ + | syRPARENTHESIS condition syLPARENTHESIS + { + $$ = $2; + } +/* + * Rule 7: condition -> condition && condition + */ + | condition opLAND condition + { + $$ = scoplib_matrix_concat($1,$3); + scoplib_matrix_free($1); + scoplib_matrix_free($3); + } + ; + + +/* + * Shortcut rules for reduction operators (+=, -=, ...) + * + */ +reduction_operator: + opPLUSEQUAL + | opMINUSEQUAL + | opMULTIPLYEQUAL + | opDIVIDEEQUAL + | opMODEQUAL + | opANDEQUAL + | opOREQUAL + | opCOMPEQUAL + ; + + +/* + * Shortcut rules for unary increment/decrement operators (-- and ++) + * + */ +unary_operator: + opINCREMENTATION + | opDECREMENTATION + ; + + +/* + * Rules for an assignment (an instruction which is not a 'for' nor an 'if') + * return: + * + */ +assignment: +/* + * Rule 1: assignment -> var = expression; + */ + variable opASSIGNMENT expression sySEMICOLON + { + if ($1 == NULL) + { + yyerror ("[Clan] Error: changing value of iterator/parameter"); + return 0; + } + $$[0] = $3; + $$[1] = $1; + } +/* + * Rule 2: assignment -> var red_op expression; + */ + | variable reduction_operator expression sySEMICOLON + { + if ($1 == NULL) + { + yyerror ("[Clan] Error: changing value of iterator/parameter"); + return 0; + } + $$[0] = scoplib_matrix_concat($1,$3); + scoplib_matrix_free($3); + $$[1] = $1; + } +/* + * Rule 3: assignment -> var un_op; + */ + | variable unary_operator sySEMICOLON + { + if ($1 == NULL) + { + yyerror ("[Clan] Error: changing value of iterator/parameter"); + return 0; + } + $$[0] = $1; + $$[1] = scoplib_matrix_copy($1); + } +/* + * Rule 4: assignment -> un_op var; + */ + | unary_operator variable sySEMICOLON + { + if ($2 == NULL) + { + yyerror ("[Clan] Error: changing value of iterator/parameter"); + return 0; + } + $$[0] = $2; + $$[1] = scoplib_matrix_copy($2); + } +/* + * Rule 5: assignment -> var; + */ + | variable sySEMICOLON + { + $$[0] = $1; + $$[1] = NULL; + } +/* + * Rule 5: assignment -> { assignment }; + */ + | syRBRACE assignment syLBRACE + { + $$[0] = $2[0]; + $$[1] = $2[1]; + } + ; + + +/* + * Shortcut rules for all binary operators BUT '='. + * + */ +binary_operator: + opPLUS + | opMINUS + | opMULTIPLY + | opDIVIDE + | opMOD + | opGEQ + | opGREATER + | opLEQ + | opLOWER + | opEQUAL + | opAND + | opOR + | opCOMP + ; + +/* + * Rules for an expression. + * return: + */ +expression: +/* + * Rule 1: expression -> number + */ + NUMBER + { + $$ = NULL; + } +/* + * Rule 2: expression -> - number + */ + | opMINUS NUMBER + { + $$ = NULL; + } +/* + * Rule 3: expression -> variable + */ + | variable + { + $$ = $1; + } +/* + * Rule 4: expression -> expression bin_op expression + * The %prec is a hack to force to shift in this rule. + */ + | expression binary_operator expression %prec MAXPRIORITY + { + $$ = scoplib_matrix_concat($1,$3); + scoplib_matrix_free($1); + scoplib_matrix_free($3); + } +/* + * Rule 5: expression -> ! expression + */ + | opNOT expression + { + $$ = $2; + } +/* + * Rule 6: expression -> ( expression ) + */ + | syRPARENTHESIS expression syLPARENTHESIS + { + $$ = $2; + } +/* + * Rule 7: expression -> expression : expression ? expression + */ + | expression opQMARK expression opCOLON expression + { + scoplib_matrix_p tmp = scoplib_matrix_concat($1,$3); + $$ = scoplib_matrix_concat(tmp,$5); + scoplib_matrix_free(tmp); + scoplib_matrix_free($1); + scoplib_matrix_free($3); + scoplib_matrix_free($5); + } + ; + + +/* + * Rules to describe a variable. It can be a scalar ('a'), a + * n-dimensional array ('a[i]'), or a procedure call ('a(b,c,d)') + * return: + */ +variable: +/* + * Rule 1: variable -> id + * ex: variable -> a + */ + id + { + int rank; + scoplib_matrix_p matrix; + char* s = (char*) $1; + clan_symbol_p symbol = clan_symbol_lookup(parser_symbol, s); + // If the variable is an iterator or a parameter, discard it + // from the read/write clause. + if ((symbol && symbol->type == SCOPLIB_TYPE_ITERATOR) || + (symbol && symbol->type == SCOPLIB_TYPE_PARAMETER)) + $$ = NULL; + else + { + clan_symbol_add(&parser_symbol, s, SCOPLIB_TYPE_ARRAY,parser_depth); + rank = clan_symbol_get_rank(parser_symbol, s); + matrix = scoplib_matrix_malloc + (1, CLAN_MAX_DEPTH + CLAN_MAX_PARAMETERS + 2); + clan_matrix_tag_array(matrix, rank); + $$ = matrix; + } + free($1); + } +/* + * Rule 2: variable -> id array_index + * ex: variable -> a[i][j] + */ + | id array_index + { + int rank; + clan_symbol_add(&parser_symbol,$1,SCOPLIB_TYPE_ARRAY,parser_depth); + rank = clan_symbol_get_rank(parser_symbol,$1); + clan_matrix_tag_array($2,rank); + $$ = $2; + free($1); + } +/* + * Rule 3: variable -> id ( variable_list ) + * ex: variable -> a(b,c,d) + */ + | id syRPARENTHESIS variable_list syLPARENTHESIS + { + $$ = $3; + free($1); + } +/* + * Rule 4: variable -> - variable + */ + | opMINUS variable + { + $$ = $2; + } +/* + * Rule 5: variable -> + variable + */ + | opPLUS variable + { + $$ = $2; + } + ; + + +/* + * Dummy rule for basic arithmetic expression. Used in variable_list. + */ +arithmetic_expression: + NUMBER + | arithmetic_expression opMINUS arithmetic_expression + | arithmetic_expression opPLUS arithmetic_expression + | arithmetic_expression opMULTIPLY arithmetic_expression + | arithmetic_expression opDIVIDE arithmetic_expression + | syRPARENTHESIS arithmetic_expression syLPARENTHESIS + ; + + +/* + * Rules to describe a list of variables, separated by a comma. + * return: + */ +variable_list: +/* + * Rule 1: variable_list -> variable + */ + variable + { + $$ = $1; + } +/* + * Rule 2: variable_list -> variable_list , variable + */ + | variable_list syCOMMA variable + { + $$ = scoplib_matrix_concat($1,$3); + } +/* + * Rule 3: variable_list -> variable_list , arithmetic_expression + */ + | variable_list syCOMMA arithmetic_expression + { + $$ = $1; + } +/* + * Rule 3: variable_list -> arithmetic_expression, variable_list + */ + | arithmetic_expression + { + $$ = NULL; + } +/* + * Rule 3: variable_list -> + */ + | + { + $$ = NULL; + } + ; + + +/* + * Rules for n-level array indices + * return: + * + */ +array_index: +/* + * Rule 1: array_index -> [ ] + */ + syRBRACKET affine_expression syLBRACKET + { + $$ = scoplib_matrix_from_vector($2); + scoplib_vector_free($2); + } +/* + * Rule 2: array_index -> array_index [ ] + */ + | array_index syRBRACKET affine_expression syLBRACKET + { + if ($1 != NULL) + scoplib_matrix_insert_vector($1,$3,$1->NbRows); + scoplib_vector_free($3); + $$ = $1; + } + ; + + +/* + * Rules to (1) eliminate the parenthesis around an identifier, and + * (2) support the &ID reference operator + * operator. + * + * return + */ +id: +/* + * Rule 1: id -> ID + */ + ID + { + $$ = $1; + } +/* + * Rule 2: id -> ( ID ) + */ + | syRPARENTHESIS ID syLPARENTHESIS + { + $$ = $2; + } +/* + * Rule 3: id -> & ID + */ + | opAND ID + { + $$ = $2; + } +/* + * Rule 4: id -> math_func_list + */ + | math_func_list + { + $$ = NULL; + } + ; + +math_func_list: MIN | MAX | CEILD | FLOORD; + +NUMBER: + INTEGER + | REAL + ; + +%% + + +void +yyerror(char *s) +{ + fprintf(stderr, "%s\n", s); + clan_parse_error = 1; +} + + +/** + * clan_parser_initialize_state function: + * this function achieves the initialization of the "parser state": a + * collection of variables that vary during the parsing and thanks to we + * can extract all SCoP informations. + ** + * - 02/05/2008: First version. + */ +void +clan_parser_initialize_state(clan_options_p options) +{ + int i, nb_rows, nb_columns, depth; + + nb_rows = CLAN_MAX_CONSTRAINTS; + nb_columns = CLAN_MAX_DEPTH + CLAN_MAX_PARAMETERS + 2; + depth = CLAN_MAX_DEPTH; + + parser_scop = scoplib_scop_malloc(); + parser_domain = scoplib_matrix_malloc(nb_rows,nb_columns); + parser_symbol = NULL; + + parser_scheduling = (int *)malloc(depth * sizeof(int)); + parser_consperdim = (int *)malloc(depth * sizeof(int)); + for (i = 0; i < depth; i++) + { + parser_scheduling[i] = 0; + parser_consperdim[i] = 0; + } + parser_iterators = (clan_symbol_p *)malloc(depth * sizeof(clan_symbol_p)); + parser_variables_localvars = + (int*)malloc((CLAN_MAX_LOCAL_VARIABLES + 1) * sizeof(int)); + parser_variables_liveout = + (int*)malloc((CLAN_MAX_LOCAL_VARIABLES + 1) * sizeof(int)); + parser_depth = 0; + parser_nb_cons = 0; + /* Reset also the Symbol global variables. */ + extern int symbol_nb_iterators; + symbol_nb_iterators = 0; + extern int symbol_nb_parameters; + symbol_nb_parameters = 0; + extern int symbol_nb_arrays; + symbol_nb_arrays = 0; + extern int symbol_nb_functions; + symbol_nb_functions = 0; + + for (i = 0; i <= CLAN_MAX_LOCAL_VARIABLES; ++i) + parser_variables_localvars[i] = -1; + for (i = 0; i <= CLAN_MAX_LOCAL_VARIABLES; ++i) + parser_variables_liveout[i] = -1; + + parser_options = options; +} + +/** + * clan_parser_free_state function: + * this function frees the memory allocated for the "parser state", except + * for parser_scop, obviously. + ** + * - 02/05/2008: First version. + */ +void +clan_parser_free_state() +{ + scoplib_matrix_free(parser_domain); + clan_symbol_free(parser_symbol); + free(parser_scheduling); + free(parser_consperdim); + free(parser_iterators); + free(parser_variables_localvars); + free(parser_variables_liveout); +} + +/** + * clan_parse function: + * this function parses a file to extract a SCoP and returns, if successful, + * a pointer to the scoplib_scop_t structure. + * \param input The file to parse (already open). + * \param options Options for file parsing. + ** + * - 01/05/2008: First version. + */ +scoplib_scop_p +clan_parse(FILE * input, clan_options_p options) +{ + yyin = input; + + clan_parser_initialize_state(options); + + yyparse(); + + fclose(yyin); + if (! clan_parse_error) + { + if (parser_variables_localvars[0] != -1 || + parser_variables_liveout[0] != -1) + clan_scop_fill_options(parser_scop, parser_variables_localvars, + parser_variables_liveout); + clan_scop_compact(parser_scop); + } + else + parser_scop = NULL; + clan_parser_free_state(); + + return parser_scop; +} + diff --git a/clan/source/scanner.c b/clan/source/scanner.c new file mode 100644 index 0000000..332d037 --- /dev/null +++ b/clan/source/scanner.c @@ -0,0 +1,2269 @@ + +#line 3 "scanner.c" + +#define YY_INT_ALIGNED short int + +/* A lexical scanner generated by flex */ + +#define FLEX_SCANNER +#define YY_FLEX_MAJOR_VERSION 2 +#define YY_FLEX_MINOR_VERSION 5 +#define YY_FLEX_SUBMINOR_VERSION 35 +#if YY_FLEX_SUBMINOR_VERSION > 0 +#define FLEX_BETA +#endif + +/* First, we deal with platform-specific or compiler-specific issues. */ + +/* begin standard C headers. */ +#include +#include +#include +#include + +/* end standard C headers. */ + +/* flex integer type definitions */ + +#ifndef FLEXINT_H +#define FLEXINT_H + +/* C99 systems have . Non-C99 systems may or may not. */ + +#if defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L + +/* C99 says to define __STDC_LIMIT_MACROS before including stdint.h, + * if you want the limit (max/min) macros for int types. + */ +#ifndef __STDC_LIMIT_MACROS +#define __STDC_LIMIT_MACROS 1 +#endif + +#include +typedef int8_t flex_int8_t; +typedef uint8_t flex_uint8_t; +typedef int16_t flex_int16_t; +typedef uint16_t flex_uint16_t; +typedef int32_t flex_int32_t; +typedef uint32_t flex_uint32_t; +#else +typedef signed char flex_int8_t; +typedef short int flex_int16_t; +typedef int flex_int32_t; +typedef unsigned char flex_uint8_t; +typedef unsigned short int flex_uint16_t; +typedef unsigned int flex_uint32_t; + +/* Limits of integral types. */ +#ifndef INT8_MIN +#define INT8_MIN (-128) +#endif +#ifndef INT16_MIN +#define INT16_MIN (-32767-1) +#endif +#ifndef INT32_MIN +#define INT32_MIN (-2147483647-1) +#endif +#ifndef INT8_MAX +#define INT8_MAX (127) +#endif +#ifndef INT16_MAX +#define INT16_MAX (32767) +#endif +#ifndef INT32_MAX +#define INT32_MAX (2147483647) +#endif +#ifndef UINT8_MAX +#define UINT8_MAX (255U) +#endif +#ifndef UINT16_MAX +#define UINT16_MAX (65535U) +#endif +#ifndef UINT32_MAX +#define UINT32_MAX (4294967295U) +#endif + +#endif /* ! C99 */ + +#endif /* ! FLEXINT_H */ + +#ifdef __cplusplus + +/* The "const" storage-class-modifier is valid. */ +#define YY_USE_CONST + +#else /* ! __cplusplus */ + +/* C99 requires __STDC__ to be defined as 1. */ +#if defined (__STDC__) + +#define YY_USE_CONST + +#endif /* defined (__STDC__) */ +#endif /* ! __cplusplus */ + +#ifdef YY_USE_CONST +#define yyconst const +#else +#define yyconst +#endif + +/* Returned upon end-of-file. */ +#define YY_NULL 0 + +/* Promotes a possibly negative, possibly signed char to an unsigned + * integer for use as an array index. If the signed char is negative, + * we want to instead treat it as an 8-bit unsigned char, hence the + * double cast. + */ +#define YY_SC_TO_UI(c) ((unsigned int) (unsigned char) c) + +/* Enter a start condition. This macro really ought to take a parameter, + * but we do it the disgusting crufty way forced on us by the ()-less + * definition of BEGIN. + */ +#define BEGIN (yy_start) = 1 + 2 * + +/* Translate the current start state into a value that can be later handed + * to BEGIN to return to the state. The YYSTATE alias is for lex + * compatibility. + */ +#define YY_START (((yy_start) - 1) / 2) +#define YYSTATE YY_START + +/* Action number for EOF rule of a given start state. */ +#define YY_STATE_EOF(state) (YY_END_OF_BUFFER + state + 1) + +/* Special action meaning "start processing a new file". */ +#define YY_NEW_FILE yyrestart(yyin ) + +#define YY_END_OF_BUFFER_CHAR 0 + +/* Size of default input buffer. */ +#ifndef YY_BUF_SIZE +#ifdef __ia64__ +/* On IA-64, the buffer size is 16k, not 8k. + * Moreover, YY_BUF_SIZE is 2*YY_READ_BUF_SIZE in the general case. + * Ditto for the __ia64__ case accordingly. + */ +#define YY_BUF_SIZE 32768 +#else +#define YY_BUF_SIZE 16384 +#endif /* __ia64__ */ +#endif + +/* The state buf must be large enough to hold one state per character in the main buffer. + */ +#define YY_STATE_BUF_SIZE ((YY_BUF_SIZE + 2) * sizeof(yy_state_type)) + +#ifndef YY_TYPEDEF_YY_BUFFER_STATE +#define YY_TYPEDEF_YY_BUFFER_STATE +typedef struct yy_buffer_state *YY_BUFFER_STATE; +#endif + +extern int yyleng; + +extern FILE *yyin, *yyout; + +#define EOB_ACT_CONTINUE_SCAN 0 +#define EOB_ACT_END_OF_FILE 1 +#define EOB_ACT_LAST_MATCH 2 + + #define YY_LESS_LINENO(n) + +/* Return all but the first "n" matched characters back to the input stream. */ +#define yyless(n) \ + do \ + { \ + /* Undo effects of setting up yytext. */ \ + int yyless_macro_arg = (n); \ + YY_LESS_LINENO(yyless_macro_arg);\ + *yy_cp = (yy_hold_char); \ + YY_RESTORE_YY_MORE_OFFSET \ + (yy_c_buf_p) = yy_cp = yy_bp + yyless_macro_arg - YY_MORE_ADJ; \ + YY_DO_BEFORE_ACTION; /* set up yytext again */ \ + } \ + while ( 0 ) + +#define unput(c) yyunput( c, (yytext_ptr) ) + +#ifndef YY_TYPEDEF_YY_SIZE_T +#define YY_TYPEDEF_YY_SIZE_T +typedef size_t yy_size_t; +#endif + +#ifndef YY_STRUCT_YY_BUFFER_STATE +#define YY_STRUCT_YY_BUFFER_STATE +struct yy_buffer_state + { + FILE *yy_input_file; + + char *yy_ch_buf; /* input buffer */ + char *yy_buf_pos; /* current position in input buffer */ + + /* Size of input buffer in bytes, not including room for EOB + * characters. + */ + yy_size_t yy_buf_size; + + /* Number of characters read into yy_ch_buf, not including EOB + * characters. + */ + int yy_n_chars; + + /* Whether we "own" the buffer - i.e., we know we created it, + * and can realloc() it to grow it, and should free() it to + * delete it. + */ + int yy_is_our_buffer; + + /* Whether this is an "interactive" input source; if so, and + * if we're using stdio for input, then we want to use getc() + * instead of fread(), to make sure we stop fetching input after + * each newline. + */ + int yy_is_interactive; + + /* Whether we're considered to be at the beginning of a line. + * If so, '^' rules will be active on the next match, otherwise + * not. + */ + int yy_at_bol; + + int yy_bs_lineno; /**< The line count. */ + int yy_bs_column; /**< The column count. */ + + /* Whether to try to fill the input buffer when we reach the + * end of it. + */ + int yy_fill_buffer; + + int yy_buffer_status; + +#define YY_BUFFER_NEW 0 +#define YY_BUFFER_NORMAL 1 + /* When an EOF's been seen but there's still some text to process + * then we mark the buffer as YY_EOF_PENDING, to indicate that we + * shouldn't try reading from the input source any more. We might + * still have a bunch of tokens to match, though, because of + * possible backing-up. + * + * When we actually see the EOF, we change the status to "new" + * (via yyrestart()), so that the user can continue scanning by + * just pointing yyin at a new input file. + */ +#define YY_BUFFER_EOF_PENDING 2 + + }; +#endif /* !YY_STRUCT_YY_BUFFER_STATE */ + +/* Stack of input buffers. */ +static size_t yy_buffer_stack_top = 0; /**< index of top of stack. */ +static size_t yy_buffer_stack_max = 0; /**< capacity of stack. */ +static YY_BUFFER_STATE * yy_buffer_stack = 0; /**< Stack as an array. */ + +/* We provide macros for accessing buffer states in case in the + * future we want to put the buffer states in a more general + * "scanner state". + * + * Returns the top of the stack, or NULL. + */ +#define YY_CURRENT_BUFFER ( (yy_buffer_stack) \ + ? (yy_buffer_stack)[(yy_buffer_stack_top)] \ + : NULL) + +/* Same as previous macro, but useful when we know that the buffer stack is not + * NULL or when we need an lvalue. For internal use only. + */ +#define YY_CURRENT_BUFFER_LVALUE (yy_buffer_stack)[(yy_buffer_stack_top)] + +/* yy_hold_char holds the character lost when yytext is formed. */ +static char yy_hold_char; +static int yy_n_chars; /* number of characters read into yy_ch_buf */ +int yyleng; + +/* Points to current character in buffer. */ +static char *yy_c_buf_p = (char *) 0; +static int yy_init = 0; /* whether we need to initialize */ +static int yy_start = 0; /* start state number */ + +/* Flag which is used to allow yywrap()'s to do buffer switches + * instead of setting up a fresh yyin. A bit of a hack ... + */ +static int yy_did_buffer_switch_on_eof; + +void yyrestart (FILE *input_file ); +void yy_switch_to_buffer (YY_BUFFER_STATE new_buffer ); +YY_BUFFER_STATE yy_create_buffer (FILE *file,int size ); +void yy_delete_buffer (YY_BUFFER_STATE b ); +void yy_flush_buffer (YY_BUFFER_STATE b ); +void yypush_buffer_state (YY_BUFFER_STATE new_buffer ); +void yypop_buffer_state (void ); + +static void yyensure_buffer_stack (void ); +static void yy_load_buffer_state (void ); +static void yy_init_buffer (YY_BUFFER_STATE b,FILE *file ); + +#define YY_FLUSH_BUFFER yy_flush_buffer(YY_CURRENT_BUFFER ) + +YY_BUFFER_STATE yy_scan_buffer (char *base,yy_size_t size ); +YY_BUFFER_STATE yy_scan_string (yyconst char *yy_str ); +YY_BUFFER_STATE yy_scan_bytes (yyconst char *bytes,int len ); + +void *yyalloc (yy_size_t ); +void *yyrealloc (void *,yy_size_t ); +void yyfree (void * ); + +#define yy_new_buffer yy_create_buffer + +#define yy_set_interactive(is_interactive) \ + { \ + if ( ! YY_CURRENT_BUFFER ){ \ + yyensure_buffer_stack (); \ + YY_CURRENT_BUFFER_LVALUE = \ + yy_create_buffer(yyin,YY_BUF_SIZE ); \ + } \ + YY_CURRENT_BUFFER_LVALUE->yy_is_interactive = is_interactive; \ + } + +#define yy_set_bol(at_bol) \ + { \ + if ( ! YY_CURRENT_BUFFER ){\ + yyensure_buffer_stack (); \ + YY_CURRENT_BUFFER_LVALUE = \ + yy_create_buffer(yyin,YY_BUF_SIZE ); \ + } \ + YY_CURRENT_BUFFER_LVALUE->yy_at_bol = at_bol; \ + } + +#define YY_AT_BOL() (YY_CURRENT_BUFFER_LVALUE->yy_at_bol) + +/* Begin user sect3 */ + +typedef unsigned char YY_CHAR; + +FILE *yyin = (FILE *) 0, *yyout = (FILE *) 0; + +typedef int yy_state_type; + +extern int yylineno; + +int yylineno = 1; + +extern char *yytext; +#define yytext_ptr yytext + +static yy_state_type yy_get_previous_state (void ); +static yy_state_type yy_try_NUL_trans (yy_state_type current_state ); +static int yy_get_next_buffer (void ); +static void yy_fatal_error (yyconst char msg[] ); + +/* Done after the current pattern has been matched and before the + * corresponding action - sets up yytext. + */ +#define YY_DO_BEFORE_ACTION \ + (yytext_ptr) = yy_bp; \ + yyleng = (size_t) (yy_cp - yy_bp); \ + (yy_hold_char) = *yy_cp; \ + *yy_cp = '\0'; \ + (yy_c_buf_p) = yy_cp; + +#define YY_NUM_RULES 65 +#define YY_END_OF_BUFFER 66 +/* This struct is not used in this scanner, + but its presence is necessary. */ +struct yy_trans_info + { + flex_int32_t yy_verify; + flex_int32_t yy_nxt; + }; +static yyconst flex_int16_t yy_accept[134] = + { 0, + 6, 6, 0, 0, 0, 0, 66, 64, 6, 6, + 36, 64, 57, 58, 25, 26, 55, 53, 31, 54, + 33, 56, 24, 35, 32, 51, 63, 52, 37, 22, + 27, 28, 62, 22, 22, 22, 22, 22, 29, 60, + 30, 5, 4, 3, 65, 3, 3, 6, 0, 47, + 59, 46, 42, 38, 40, 39, 41, 34, 8, 7, + 43, 23, 24, 49, 48, 50, 0, 20, 22, 45, + 22, 22, 22, 22, 13, 22, 22, 44, 61, 1, + 2, 0, 23, 23, 21, 20, 22, 22, 22, 15, + 17, 16, 0, 21, 22, 14, 22, 0, 18, 22, + + 0, 19, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, + 0, 0, 0, 0, 0, 10, 0, 0, 12, 0, + 0, 11, 0 + } ; + +static yyconst flex_int32_t yy_ec[256] = + { 0, + 1, 1, 1, 1, 1, 1, 1, 1, 2, 3, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 4, 5, 1, 6, 1, 7, 8, 1, 9, + 10, 11, 12, 13, 14, 15, 16, 17, 17, 17, + 17, 17, 17, 17, 17, 17, 17, 18, 19, 20, + 21, 22, 23, 1, 24, 24, 24, 24, 24, 24, + 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, + 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, + 25, 1, 26, 27, 24, 1, 28, 24, 29, 30, + + 31, 32, 33, 24, 34, 24, 24, 35, 36, 37, + 38, 39, 24, 40, 41, 42, 43, 44, 24, 45, + 24, 24, 46, 47, 48, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1 + } ; + +static yyconst flex_int32_t yy_meta[49] = + { 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 2, 2, 1, 3, 1, 1, 1, + 1, 1, 1, 3, 1, 1, 1, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 1, 1, 1 + } ; + +static yyconst flex_int16_t yy_base[139] = + { 0, + 0, 0, 216, 215, 46, 47, 217, 220, 49, 52, + 220, 177, 194, 51, 220, 220, 193, 48, 220, 52, + 220, 54, 61, 220, 220, 192, 191, 190, 220, 53, + 220, 220, 189, 65, 67, 69, 71, 77, 220, 40, + 220, 220, 220, 220, 220, 193, 197, 86, 167, 220, + 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, + 220, 80, 83, 220, 220, 220, 184, 0, 80, 220, + 94, 99, 101, 103, 105, 107, 109, 220, 220, 220, + 220, 177, 112, 117, 0, 0, 118, 123, 112, 121, + 141, 143, 171, 0, 145, 147, 149, 167, 151, 153, + + 174, 155, 197, 141, 163, 139, 170, 168, 144, 158, + 148, 144, 153, 153, 141, 150, 164, 139, 220, 133, + 113, 134, 102, 88, 85, 220, 64, 73, 220, 59, + 36, 220, 220, 189, 192, 194, 68, 61 + } ; + +static yyconst flex_int16_t yy_def[139] = + { 0, + 133, 1, 134, 134, 135, 135, 133, 133, 133, 133, + 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, + 133, 133, 133, 133, 133, 133, 133, 133, 133, 136, + 133, 133, 133, 136, 136, 136, 136, 136, 133, 133, + 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, + 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, + 133, 133, 133, 133, 133, 133, 133, 137, 136, 133, + 136, 136, 136, 136, 136, 136, 136, 133, 133, 133, + 133, 133, 133, 133, 138, 137, 136, 136, 136, 136, + 136, 136, 133, 138, 136, 136, 136, 133, 136, 136, + + 133, 136, 133, 133, 133, 133, 133, 133, 133, 133, + 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, + 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, + 133, 133, 0, 133, 133, 133, 133, 133 + } ; + +static yyconst flex_int16_t yy_nxt[269] = + { 0, + 8, 9, 10, 9, 11, 12, 13, 14, 15, 16, + 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, + 27, 28, 29, 30, 31, 32, 33, 30, 34, 30, + 35, 36, 30, 37, 30, 38, 30, 30, 30, 30, + 30, 30, 30, 30, 30, 39, 40, 41, 45, 45, + 48, 48, 48, 48, 48, 48, 46, 46, 51, 54, + 78, 47, 47, 94, 59, 56, 67, 68, 55, 60, + 86, 52, 57, 58, 61, 62, 132, 63, 67, 68, + 67, 68, 67, 68, 67, 68, 79, 48, 48, 48, + 67, 68, 83, 133, 133, 71, 84, 62, 131, 63, + + 130, 72, 75, 73, 76, 129, 74, 133, 133, 83, + 77, 83, 133, 133, 133, 133, 133, 133, 133, 133, + 133, 133, 133, 133, 83, 133, 133, 87, 128, 83, + 127, 133, 133, 84, 133, 133, 133, 133, 89, 88, + 126, 83, 90, 83, 104, 92, 83, 125, 83, 97, + 124, 91, 95, 96, 133, 133, 133, 133, 133, 133, + 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, + 123, 105, 109, 122, 99, 106, 110, 121, 120, 119, + 118, 107, 102, 117, 116, 115, 114, 113, 100, 42, + 42, 42, 44, 44, 44, 69, 69, 112, 111, 108, + + 104, 103, 101, 98, 93, 85, 82, 81, 80, 70, + 66, 65, 64, 53, 50, 49, 133, 43, 43, 7, + 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, + 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, + 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, + 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, + 133, 133, 133, 133, 133, 133, 133, 133 + } ; + +static yyconst flex_int16_t yy_chk[269] = + { 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 5, 6, + 9, 9, 9, 10, 10, 10, 5, 6, 14, 18, + 40, 5, 6, 138, 22, 20, 30, 30, 18, 22, + 137, 14, 20, 20, 22, 23, 131, 23, 34, 34, + 35, 35, 36, 36, 37, 37, 40, 48, 48, 48, + 38, 38, 62, 69, 69, 34, 62, 63, 130, 63, + + 128, 35, 37, 36, 38, 127, 36, 71, 71, 62, + 38, 62, 72, 72, 73, 73, 74, 74, 75, 75, + 76, 76, 77, 77, 83, 89, 89, 71, 125, 84, + 124, 87, 87, 84, 90, 90, 88, 88, 73, 72, + 123, 83, 74, 83, 104, 77, 84, 122, 84, 89, + 121, 76, 87, 88, 91, 91, 92, 92, 95, 95, + 96, 96, 97, 97, 99, 99, 100, 100, 102, 102, + 120, 104, 106, 118, 95, 104, 106, 117, 116, 115, + 114, 104, 100, 113, 112, 111, 110, 109, 97, 134, + 134, 134, 135, 135, 135, 136, 136, 108, 107, 105, + + 103, 101, 98, 93, 82, 67, 49, 47, 46, 33, + 28, 27, 26, 17, 13, 12, 7, 4, 3, 133, + 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, + 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, + 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, + 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, + 133, 133, 133, 133, 133, 133, 133, 133 + } ; + +static yy_state_type yy_last_accepting_state; +static char *yy_last_accepting_cpos; + +extern int yy_flex_debug; +int yy_flex_debug = 0; + +/* The intent behind this definition is that it'll catch + * any uses of REJECT which flex missed. + */ +#define REJECT reject_used_but_not_detected +#define yymore() yymore_used_but_not_detected +#define YY_MORE_ADJ 0 +#define YY_RESTORE_YY_MORE_OFFSET +char *yytext; +#line 1 "scanner.l" +/*+------- <| --------------------------------------------------------** +** A Clan ** +**--- /.\ -----------------------------------------------------** +** <| [""M# scanner.l ** +**- A | # -----------------------------------------------------** +** /.\ [""M# First version: 30/04/2008 ** +**- [""M# | # U"U#U -----------------------------------------------** +| # | # \ .:/ +| # | #___| # +****** | "--' .-" ****************************************************** +* |"-"-"-"-"-#-#-## Clan : the Chunky Loop Analyzer (experimental) * +**** | # ## ###### ***************************************************** +* \ .::::'/ * +* \ ::::'/ Copyright (C) 2008 Cedric Bastoul * +* :8a| # # ## * +* ::88a ### This is free software; you can redistribute it * +* ::::888a 8a ##::. and/or modify it under the terms of the GNU Lesser * +* ::::::::888a88a[]::: General Public License as published by the Free * +*::8:::::::::SUNDOGa8a::. Software Foundation, either version 3 of the * +*::::::::8::::888:Y8888:: License, or (at your option) any later version. * +*::::':::88::::888::Y88a::::::::::::... * +*::'::.. . ..... .. ... . * +* This software is distributed in the hope that it will be useful, but * +* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * +* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License * +* for more details. * +* * +* You should have received a copy of the GNU Lesser General Public License * +* along with software; if not, write to the Free Software Foundation, Inc., * +* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * +* * +* Clan, the Chunky Loop Analyzer * +* Written by Cedric Bastoul, Cedric.Bastoul@inria.fr * +* * +******************************************************************************/ +#line 40 "scanner.l" + #include + #include + #include + #include + #include + #include + + void yyerror(char *); + int clan_scanner(int, char *, char *); + + extern int parser_recording; /**< Do we record what we read ? */ + extern char * parser_record; /**< What we record */ + extern clan_symbol_p parser_symbol; /**< Top of the symbol table */ + + int scanner_parsing = CLAN_FALSE; /**< Do we parse or not ? */ + int scanner_comment = 0; /**< Comment nesting depth */ + char scanner_latest_text[SCOPLIB_MAX_STRING]; /**< Latest text read */ + + +#line 615 "scanner.c" + +#define INITIAL 0 +#define LINECOMMENT 1 +#define FULLCOMMENT 2 + +#ifndef YY_NO_UNISTD_H +/* Special case for "unistd.h", since it is non-ANSI. We include it way + * down here because we want the user's section 1 to have been scanned first. + * The user has a chance to override it with an option. + */ +#include +#endif + +#ifndef YY_EXTRA_TYPE +#define YY_EXTRA_TYPE void * +#endif + +static int yy_init_globals (void ); + +/* Accessor methods to globals. + These are made visible to non-reentrant scanners for convenience. */ + +int yylex_destroy (void ); + +int yyget_debug (void ); + +void yyset_debug (int debug_flag ); + +YY_EXTRA_TYPE yyget_extra (void ); + +void yyset_extra (YY_EXTRA_TYPE user_defined ); + +FILE *yyget_in (void ); + +void yyset_in (FILE * in_str ); + +FILE *yyget_out (void ); + +void yyset_out (FILE * out_str ); + +int yyget_leng (void ); + +char *yyget_text (void ); + +int yyget_lineno (void ); + +void yyset_lineno (int line_number ); + +/* Macros after this point can all be overridden by user definitions in + * section 1. + */ + +#ifndef YY_SKIP_YYWRAP +#ifdef __cplusplus +extern "C" int yywrap (void ); +#else +extern int yywrap (void ); +#endif +#endif + + static void yyunput (int c,char *buf_ptr ); + +#ifndef yytext_ptr +static void yy_flex_strncpy (char *,yyconst char *,int ); +#endif + +#ifdef YY_NEED_STRLEN +static int yy_flex_strlen (yyconst char * ); +#endif + +#ifndef YY_NO_INPUT + +#ifdef __cplusplus +static int yyinput (void ); +#else +static int input (void ); +#endif + +#endif + +/* Amount of stuff to slurp up with each read. */ +#ifndef YY_READ_BUF_SIZE +#ifdef __ia64__ +/* On IA-64, the buffer size is 16k, not 8k */ +#define YY_READ_BUF_SIZE 16384 +#else +#define YY_READ_BUF_SIZE 8192 +#endif /* __ia64__ */ +#endif + +/* Copy whatever the last rule matched to the standard output. */ +#ifndef ECHO +/* This used to be an fputs(), but since the string might contain NUL's, + * we now use fwrite(). + */ +#define ECHO do { if (fwrite( yytext, yyleng, 1, yyout )) {} } while (0) +#endif + +/* Gets input and stuffs it into "buf". number of characters read, or YY_NULL, + * is returned in "result". + */ +#ifndef YY_INPUT +#define YY_INPUT(buf,result,max_size) \ + if ( YY_CURRENT_BUFFER_LVALUE->yy_is_interactive ) \ + { \ + int c = '*'; \ + size_t n; \ + for ( n = 0; n < max_size && \ + (c = getc( yyin )) != EOF && c != '\n'; ++n ) \ + buf[n] = (char) c; \ + if ( c == '\n' ) \ + buf[n++] = (char) c; \ + if ( c == EOF && ferror( yyin ) ) \ + YY_FATAL_ERROR( "input in flex scanner failed" ); \ + result = n; \ + } \ + else \ + { \ + errno=0; \ + while ( (result = fread(buf, 1, max_size, yyin))==0 && ferror(yyin)) \ + { \ + if( errno != EINTR) \ + { \ + YY_FATAL_ERROR( "input in flex scanner failed" ); \ + break; \ + } \ + errno=0; \ + clearerr(yyin); \ + } \ + }\ +\ + +#endif + +/* No semi-colon after return; correct usage is to write "yyterminate();" - + * we don't want an extra ';' after the "return" because that will cause + * some compilers to complain about unreachable statements. + */ +#ifndef yyterminate +#define yyterminate() return YY_NULL +#endif + +/* Number of entries by which start-condition stack grows. */ +#ifndef YY_START_STACK_INCR +#define YY_START_STACK_INCR 25 +#endif + +/* Report a fatal error. */ +#ifndef YY_FATAL_ERROR +#define YY_FATAL_ERROR(msg) yy_fatal_error( msg ) +#endif + +/* end tables serialization structures and prototypes */ + +/* Default declaration of generated scanner - a define so the user can + * easily add parameters. + */ +#ifndef YY_DECL +#define YY_DECL_IS_OURS 1 + +extern int yylex (void); + +#define YY_DECL int yylex (void) +#endif /* !YY_DECL */ + +/* Code executed at the beginning of each rule, after yytext and yyleng + * have been set up. + */ +#ifndef YY_USER_ACTION +#define YY_USER_ACTION +#endif + +/* Code executed at the end of each rule. */ +#ifndef YY_BREAK +#define YY_BREAK break; +#endif + +#define YY_RULE_SETUP \ + YY_USER_ACTION + +/** The main scanner function which does all the work. + */ +YY_DECL +{ + register yy_state_type yy_current_state; + register char *yy_cp, *yy_bp; + register int yy_act; + +#line 62 "scanner.l" + + +#line 807 "scanner.c" + + if ( !(yy_init) ) + { + (yy_init) = 1; + +#ifdef YY_USER_INIT + YY_USER_INIT; +#endif + + if ( ! (yy_start) ) + (yy_start) = 1; /* first start state */ + + if ( ! yyin ) + yyin = stdin; + + if ( ! yyout ) + yyout = stdout; + + if ( ! YY_CURRENT_BUFFER ) { + yyensure_buffer_stack (); + YY_CURRENT_BUFFER_LVALUE = + yy_create_buffer(yyin,YY_BUF_SIZE ); + } + + yy_load_buffer_state( ); + } + + while ( 1 ) /* loops until end-of-file is reached */ + { + yy_cp = (yy_c_buf_p); + + /* Support of yytext. */ + *yy_cp = (yy_hold_char); + + /* yy_bp points to the position in yy_ch_buf of the start of + * the current run. + */ + yy_bp = yy_cp; + + yy_current_state = (yy_start); +yy_match: + do + { + register YY_CHAR yy_c = yy_ec[YY_SC_TO_UI(*yy_cp)]; + if ( yy_accept[yy_current_state] ) + { + (yy_last_accepting_state) = yy_current_state; + (yy_last_accepting_cpos) = yy_cp; + } + while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) + { + yy_current_state = (int) yy_def[yy_current_state]; + if ( yy_current_state >= 134 ) + yy_c = yy_meta[(unsigned int) yy_c]; + } + yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; + ++yy_cp; + } + while ( yy_base[yy_current_state] != 220 ); + +yy_find_action: + yy_act = yy_accept[yy_current_state]; + if ( yy_act == 0 ) + { /* have to back up */ + yy_cp = (yy_last_accepting_cpos); + yy_current_state = (yy_last_accepting_state); + yy_act = yy_accept[yy_current_state]; + } + + YY_DO_BEFORE_ACTION; + +do_action: /* This label is used only to access EOF actions. */ + + switch ( yy_act ) + { /* beginning of action switch */ + case 0: /* must back up */ + /* undo the effects of YY_DO_BEFORE_ACTION */ + *yy_cp = (yy_hold_char); + yy_cp = (yy_last_accepting_cpos); + yy_current_state = (yy_last_accepting_state); + goto yy_find_action; + +case 1: +YY_RULE_SETUP +#line 64 "scanner.l" +{ + scanner_comment --; + if (scanner_comment == 0) + BEGIN INITIAL; /* Quit any mode */ + } + YY_BREAK +case 2: +YY_RULE_SETUP +#line 69 "scanner.l" +{ scanner_comment ++; } + YY_BREAK +case 3: +YY_RULE_SETUP +#line 70 "scanner.l" +; /* Do nothing */ + YY_BREAK +case 4: +/* rule 4 can match eol */ +YY_RULE_SETUP +#line 72 "scanner.l" +{ BEGIN INITIAL; /* Quit any mode */ } + YY_BREAK +case 5: +YY_RULE_SETUP +#line 73 "scanner.l" +; /* Do nothing */ + YY_BREAK +case 6: +/* rule 6 can match eol */ +YY_RULE_SETUP +#line 75 "scanner.l" +; /* Skip whitespaces */ + YY_BREAK +case 7: +YY_RULE_SETUP +#line 76 "scanner.l" +{ BEGIN LINECOMMENT; /* Enter LINECOMMENT mode */ } + YY_BREAK +case 8: +YY_RULE_SETUP +#line 77 "scanner.l" +{ + BEGIN FULLCOMMENT; /* Enter FULLCOMMENT mode */ + scanner_comment ++; + } + YY_BREAK +case 9: +YY_RULE_SETUP +#line 81 "scanner.l" +{ scanner_parsing = CLAN_TRUE; /* Start parsing */ } + YY_BREAK +case 10: +YY_RULE_SETUP +#line 82 "scanner.l" +{ scanner_parsing = CLAN_FALSE; /* Stop parsing */ } + YY_BREAK +case 11: +YY_RULE_SETUP +#line 83 "scanner.l" +{ return clan_scanner(PRAGMALOCALVARS, yytext,"PRAGMALOCALVARS"); } + YY_BREAK +case 12: +YY_RULE_SETUP +#line 84 "scanner.l" +{ return clan_scanner(PRAGMALIVEOUT, yytext,"PRAGMALIVEOUT"); } + YY_BREAK +case 13: +YY_RULE_SETUP +#line 85 "scanner.l" +{ return clan_scanner(IF, yytext,"IF"); } + YY_BREAK +case 14: +YY_RULE_SETUP +#line 86 "scanner.l" +{ return clan_scanner(ELSE, yytext,"ELSE"); } + YY_BREAK +case 15: +YY_RULE_SETUP +#line 87 "scanner.l" +{ return clan_scanner(FOR, yytext,"FOR"); } + YY_BREAK +case 16: +YY_RULE_SETUP +#line 88 "scanner.l" +{ return clan_scanner(MIN, yytext,"min"); } + YY_BREAK +case 17: +YY_RULE_SETUP +#line 89 "scanner.l" +{ return clan_scanner(MAX, yytext,"max"); } + YY_BREAK +case 18: +YY_RULE_SETUP +#line 90 "scanner.l" +{ return clan_scanner(CEILD, yytext,"ceild"); } + YY_BREAK +case 19: +YY_RULE_SETUP +#line 91 "scanner.l" +{ return clan_scanner(FLOORD, yytext,"floord"); } + YY_BREAK +case 20: +#line 94 "scanner.l" +case 21: +#line 95 "scanner.l" +case 22: +YY_RULE_SETUP +#line 95 "scanner.l" +{ + char * word; + word = (char *)malloc((strlen(yytext)+1)*sizeof(char)); + strcpy(word,yytext); + yylval.symbol = word; + return clan_scanner(ID,yytext,"ID"); + } + YY_BREAK +case 23: +YY_RULE_SETUP +#line 102 "scanner.l" +{ return clan_scanner(REAL,yytext,"REAL"); } + YY_BREAK +case 24: +YY_RULE_SETUP +#line 103 "scanner.l" +{ + yylval.value = atoi(yytext) ; + return clan_scanner(INTEGER,yytext,"INTEGER"); + } + YY_BREAK +case 25: +YY_RULE_SETUP +#line 108 "scanner.l" +{ return clan_scanner(syRPARENTHESIS, yytext,"("); } + YY_BREAK +case 26: +YY_RULE_SETUP +#line 109 "scanner.l" +{ return clan_scanner(syLPARENTHESIS, yytext,")"); } + YY_BREAK +case 27: +YY_RULE_SETUP +#line 110 "scanner.l" +{ return clan_scanner(syRBRACKET, yytext,"["); } + YY_BREAK +case 28: +YY_RULE_SETUP +#line 111 "scanner.l" +{ return clan_scanner(syLBRACKET, yytext,"]"); } + YY_BREAK +case 29: +YY_RULE_SETUP +#line 112 "scanner.l" +{ return clan_scanner(syRBRACE, yytext,"{"); } + YY_BREAK +case 30: +YY_RULE_SETUP +#line 113 "scanner.l" +{ return clan_scanner(syLBRACE, yytext,"}"); } + YY_BREAK +case 31: +YY_RULE_SETUP +#line 114 "scanner.l" +{ return clan_scanner(syCOMMA, yytext,","); } + YY_BREAK +case 32: +YY_RULE_SETUP +#line 115 "scanner.l" +{ return clan_scanner(sySEMICOLON, yytext,";"); } + YY_BREAK +case 33: +YY_RULE_SETUP +#line 116 "scanner.l" +{ return clan_scanner(syPOINT, yytext,"."); } + YY_BREAK +case 34: +YY_RULE_SETUP +#line 117 "scanner.l" +{ return clan_scanner(syARROW, yytext,"->"); } + YY_BREAK +case 35: +YY_RULE_SETUP +#line 118 "scanner.l" +{ return clan_scanner(opCOLON, yytext,":"); } + YY_BREAK +case 36: +YY_RULE_SETUP +#line 119 "scanner.l" +{ return clan_scanner(opNOT, yytext,"!"); } + YY_BREAK +case 37: +YY_RULE_SETUP +#line 120 "scanner.l" +{ return clan_scanner(opQMARK, yytext,"?"); } + YY_BREAK +case 38: +YY_RULE_SETUP +#line 121 "scanner.l" +{ return clan_scanner(opINCREMENTATION, yytext,"++"); } + YY_BREAK +case 39: +YY_RULE_SETUP +#line 122 "scanner.l" +{ return clan_scanner(opDECREMENTATION, yytext,"--"); } + YY_BREAK +case 40: +YY_RULE_SETUP +#line 123 "scanner.l" +{ return clan_scanner(opPLUSEQUAL, yytext,"+="); } + YY_BREAK +case 41: +YY_RULE_SETUP +#line 124 "scanner.l" +{ return clan_scanner(opMINUSEQUAL, yytext,"-="); } + YY_BREAK +case 42: +YY_RULE_SETUP +#line 125 "scanner.l" +{ return clan_scanner(opMULTIPLYEQUAL, yytext,"*="); } + YY_BREAK +case 43: +YY_RULE_SETUP +#line 126 "scanner.l" +{ return clan_scanner(opDIVIDEEQUAL, yytext,"/="); } + YY_BREAK +case 44: +YY_RULE_SETUP +#line 127 "scanner.l" +{ return clan_scanner(opOREQUAL, yytext,"|="); } + YY_BREAK +case 45: +YY_RULE_SETUP +#line 128 "scanner.l" +{ return clan_scanner(opCOMPEQUAL, yytext,"^="); } + YY_BREAK +case 46: +YY_RULE_SETUP +#line 129 "scanner.l" +{ return clan_scanner(opANDEQUAL, yytext,"&="); } + YY_BREAK +case 47: +YY_RULE_SETUP +#line 130 "scanner.l" +{ return clan_scanner(opMODEQUAL, yytext,"%="); } + YY_BREAK +case 48: +YY_RULE_SETUP +#line 131 "scanner.l" +{ return clan_scanner(opEQUAL, yytext,"=="); } + YY_BREAK +case 49: +YY_RULE_SETUP +#line 132 "scanner.l" +{ return clan_scanner(opLEQ, yytext,"<="); } + YY_BREAK +case 50: +YY_RULE_SETUP +#line 133 "scanner.l" +{ return clan_scanner(opGEQ, yytext,">="); } + YY_BREAK +case 51: +YY_RULE_SETUP +#line 134 "scanner.l" +{ return clan_scanner(opLOWER, yytext,"<"); } + YY_BREAK +case 52: +YY_RULE_SETUP +#line 135 "scanner.l" +{ return clan_scanner(opGREATER, yytext,">"); } + YY_BREAK +case 53: +YY_RULE_SETUP +#line 136 "scanner.l" +{ return clan_scanner(opPLUS, yytext,"+"); } + YY_BREAK +case 54: +YY_RULE_SETUP +#line 137 "scanner.l" +{ return clan_scanner(opMINUS, yytext,"-"); } + YY_BREAK +case 55: +YY_RULE_SETUP +#line 138 "scanner.l" +{ return clan_scanner(opMULTIPLY, yytext,"*"); } + YY_BREAK +case 56: +YY_RULE_SETUP +#line 139 "scanner.l" +{ return clan_scanner(opDIVIDE, yytext,"/"); } + YY_BREAK +case 57: +YY_RULE_SETUP +#line 140 "scanner.l" +{ return clan_scanner(opMOD, yytext,"%"); } + YY_BREAK +case 58: +YY_RULE_SETUP +#line 141 "scanner.l" +{ return clan_scanner(opAND, yytext,"&"); } + YY_BREAK +case 59: +YY_RULE_SETUP +#line 142 "scanner.l" +{ return clan_scanner(opLAND, yytext,"&&"); } + YY_BREAK +case 60: +YY_RULE_SETUP +#line 143 "scanner.l" +{ return clan_scanner(opOR, yytext,"|"); } + YY_BREAK +case 61: +YY_RULE_SETUP +#line 144 "scanner.l" +{ return clan_scanner(opLOR, yytext,"||"); } + YY_BREAK +case 62: +YY_RULE_SETUP +#line 145 "scanner.l" +{ return clan_scanner(opCOMP, yytext,"^"); } + YY_BREAK +case 63: +YY_RULE_SETUP +#line 146 "scanner.l" +{ return clan_scanner(opASSIGNMENT, yytext,"="); } + YY_BREAK +case 64: +YY_RULE_SETUP +#line 148 "scanner.l" +{ if (scanner_parsing == CLAN_TRUE) + { + //if (CLAN_DEBUG) + // printf("Lex: Unknown character (%s)\n",yytext); + //yyerror("Lex: Unknown character"); + } + } + YY_BREAK +case 65: +YY_RULE_SETUP +#line 156 "scanner.l" +ECHO; + YY_BREAK +#line 1233 "scanner.c" +case YY_STATE_EOF(INITIAL): +case YY_STATE_EOF(LINECOMMENT): +case YY_STATE_EOF(FULLCOMMENT): + yyterminate(); + + case YY_END_OF_BUFFER: + { + /* Amount of text matched not including the EOB char. */ + int yy_amount_of_matched_text = (int) (yy_cp - (yytext_ptr)) - 1; + + /* Undo the effects of YY_DO_BEFORE_ACTION. */ + *yy_cp = (yy_hold_char); + YY_RESTORE_YY_MORE_OFFSET + + if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_NEW ) + { + /* We're scanning a new file or input source. It's + * possible that this happened because the user + * just pointed yyin at a new source and called + * yylex(). If so, then we have to assure + * consistency between YY_CURRENT_BUFFER and our + * globals. Here is the right place to do so, because + * this is the first action (other than possibly a + * back-up) that will match for the new input source. + */ + (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_n_chars; + YY_CURRENT_BUFFER_LVALUE->yy_input_file = yyin; + YY_CURRENT_BUFFER_LVALUE->yy_buffer_status = YY_BUFFER_NORMAL; + } + + /* Note that here we test for yy_c_buf_p "<=" to the position + * of the first EOB in the buffer, since yy_c_buf_p will + * already have been incremented past the NUL character + * (since all states make transitions on EOB to the + * end-of-buffer state). Contrast this with the test + * in input(). + */ + if ( (yy_c_buf_p) <= &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] ) + { /* This was really a NUL. */ + yy_state_type yy_next_state; + + (yy_c_buf_p) = (yytext_ptr) + yy_amount_of_matched_text; + + yy_current_state = yy_get_previous_state( ); + + /* Okay, we're now positioned to make the NUL + * transition. We couldn't have + * yy_get_previous_state() go ahead and do it + * for us because it doesn't know how to deal + * with the possibility of jamming (and we don't + * want to build jamming into it because then it + * will run more slowly). + */ + + yy_next_state = yy_try_NUL_trans( yy_current_state ); + + yy_bp = (yytext_ptr) + YY_MORE_ADJ; + + if ( yy_next_state ) + { + /* Consume the NUL. */ + yy_cp = ++(yy_c_buf_p); + yy_current_state = yy_next_state; + goto yy_match; + } + + else + { + yy_cp = (yy_c_buf_p); + goto yy_find_action; + } + } + + else switch ( yy_get_next_buffer( ) ) + { + case EOB_ACT_END_OF_FILE: + { + (yy_did_buffer_switch_on_eof) = 0; + + if ( yywrap( ) ) + { + /* Note: because we've taken care in + * yy_get_next_buffer() to have set up + * yytext, we can now set up + * yy_c_buf_p so that if some total + * hoser (like flex itself) wants to + * call the scanner after we return the + * YY_NULL, it'll still work - another + * YY_NULL will get returned. + */ + (yy_c_buf_p) = (yytext_ptr) + YY_MORE_ADJ; + + yy_act = YY_STATE_EOF(YY_START); + goto do_action; + } + + else + { + if ( ! (yy_did_buffer_switch_on_eof) ) + YY_NEW_FILE; + } + break; + } + + case EOB_ACT_CONTINUE_SCAN: + (yy_c_buf_p) = + (yytext_ptr) + yy_amount_of_matched_text; + + yy_current_state = yy_get_previous_state( ); + + yy_cp = (yy_c_buf_p); + yy_bp = (yytext_ptr) + YY_MORE_ADJ; + goto yy_match; + + case EOB_ACT_LAST_MATCH: + (yy_c_buf_p) = + &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)]; + + yy_current_state = yy_get_previous_state( ); + + yy_cp = (yy_c_buf_p); + yy_bp = (yytext_ptr) + YY_MORE_ADJ; + goto yy_find_action; + } + break; + } + + default: + YY_FATAL_ERROR( + "fatal flex scanner internal error--no action found" ); + } /* end of action switch */ + } /* end of scanning one token */ +} /* end of yylex */ + +/* yy_get_next_buffer - try to read in a new buffer + * + * Returns a code representing an action: + * EOB_ACT_LAST_MATCH - + * EOB_ACT_CONTINUE_SCAN - continue scanning from current position + * EOB_ACT_END_OF_FILE - end of file + */ +static int yy_get_next_buffer (void) +{ + register char *dest = YY_CURRENT_BUFFER_LVALUE->yy_ch_buf; + register char *source = (yytext_ptr); + register int number_to_move, i; + int ret_val; + + if ( (yy_c_buf_p) > &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars) + 1] ) + YY_FATAL_ERROR( + "fatal flex scanner internal error--end of buffer missed" ); + + if ( YY_CURRENT_BUFFER_LVALUE->yy_fill_buffer == 0 ) + { /* Don't try to fill the buffer, so this is an EOF. */ + if ( (yy_c_buf_p) - (yytext_ptr) - YY_MORE_ADJ == 1 ) + { + /* We matched a single character, the EOB, so + * treat this as a final EOF. + */ + return EOB_ACT_END_OF_FILE; + } + + else + { + /* We matched some text prior to the EOB, first + * process it. + */ + return EOB_ACT_LAST_MATCH; + } + } + + /* Try to read more data. */ + + /* First move last chars to start of buffer. */ + number_to_move = (int) ((yy_c_buf_p) - (yytext_ptr)) - 1; + + for ( i = 0; i < number_to_move; ++i ) + *(dest++) = *(source++); + + if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_EOF_PENDING ) + /* don't do the read, it's not guaranteed to return an EOF, + * just force an EOF + */ + YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars) = 0; + + else + { + int num_to_read = + YY_CURRENT_BUFFER_LVALUE->yy_buf_size - number_to_move - 1; + + while ( num_to_read <= 0 ) + { /* Not enough room in the buffer - grow it. */ + + /* just a shorter name for the current buffer */ + YY_BUFFER_STATE b = YY_CURRENT_BUFFER; + + int yy_c_buf_p_offset = + (int) ((yy_c_buf_p) - b->yy_ch_buf); + + if ( b->yy_is_our_buffer ) + { + int new_size = b->yy_buf_size * 2; + + if ( new_size <= 0 ) + b->yy_buf_size += b->yy_buf_size / 8; + else + b->yy_buf_size *= 2; + + b->yy_ch_buf = (char *) + /* Include room in for 2 EOB chars. */ + yyrealloc((void *) b->yy_ch_buf,b->yy_buf_size + 2 ); + } + else + /* Can't grow it, we don't own it. */ + b->yy_ch_buf = 0; + + if ( ! b->yy_ch_buf ) + YY_FATAL_ERROR( + "fatal error - scanner input buffer overflow" ); + + (yy_c_buf_p) = &b->yy_ch_buf[yy_c_buf_p_offset]; + + num_to_read = YY_CURRENT_BUFFER_LVALUE->yy_buf_size - + number_to_move - 1; + + } + + if ( num_to_read > YY_READ_BUF_SIZE ) + num_to_read = YY_READ_BUF_SIZE; + + /* Read in more data. */ + YY_INPUT( (&YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[number_to_move]), + (yy_n_chars), (size_t) num_to_read ); + + YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars); + } + + if ( (yy_n_chars) == 0 ) + { + if ( number_to_move == YY_MORE_ADJ ) + { + ret_val = EOB_ACT_END_OF_FILE; + yyrestart(yyin ); + } + + else + { + ret_val = EOB_ACT_LAST_MATCH; + YY_CURRENT_BUFFER_LVALUE->yy_buffer_status = + YY_BUFFER_EOF_PENDING; + } + } + + else + ret_val = EOB_ACT_CONTINUE_SCAN; + + if ((yy_size_t) ((yy_n_chars) + number_to_move) > YY_CURRENT_BUFFER_LVALUE->yy_buf_size) { + /* Extend the array by 50%, plus the number we really need. */ + yy_size_t new_size = (yy_n_chars) + number_to_move + ((yy_n_chars) >> 1); + YY_CURRENT_BUFFER_LVALUE->yy_ch_buf = (char *) yyrealloc((void *) YY_CURRENT_BUFFER_LVALUE->yy_ch_buf,new_size ); + if ( ! YY_CURRENT_BUFFER_LVALUE->yy_ch_buf ) + YY_FATAL_ERROR( "out of dynamic memory in yy_get_next_buffer()" ); + } + + (yy_n_chars) += number_to_move; + YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] = YY_END_OF_BUFFER_CHAR; + YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars) + 1] = YY_END_OF_BUFFER_CHAR; + + (yytext_ptr) = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[0]; + + return ret_val; +} + +/* yy_get_previous_state - get the state just before the EOB char was reached */ + + static yy_state_type yy_get_previous_state (void) +{ + register yy_state_type yy_current_state; + register char *yy_cp; + + yy_current_state = (yy_start); + + for ( yy_cp = (yytext_ptr) + YY_MORE_ADJ; yy_cp < (yy_c_buf_p); ++yy_cp ) + { + register YY_CHAR yy_c = (*yy_cp ? yy_ec[YY_SC_TO_UI(*yy_cp)] : 1); + if ( yy_accept[yy_current_state] ) + { + (yy_last_accepting_state) = yy_current_state; + (yy_last_accepting_cpos) = yy_cp; + } + while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) + { + yy_current_state = (int) yy_def[yy_current_state]; + if ( yy_current_state >= 134 ) + yy_c = yy_meta[(unsigned int) yy_c]; + } + yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; + } + + return yy_current_state; +} + +/* yy_try_NUL_trans - try to make a transition on the NUL character + * + * synopsis + * next_state = yy_try_NUL_trans( current_state ); + */ + static yy_state_type yy_try_NUL_trans (yy_state_type yy_current_state ) +{ + register int yy_is_jam; + register char *yy_cp = (yy_c_buf_p); + + register YY_CHAR yy_c = 1; + if ( yy_accept[yy_current_state] ) + { + (yy_last_accepting_state) = yy_current_state; + (yy_last_accepting_cpos) = yy_cp; + } + while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) + { + yy_current_state = (int) yy_def[yy_current_state]; + if ( yy_current_state >= 134 ) + yy_c = yy_meta[(unsigned int) yy_c]; + } + yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; + yy_is_jam = (yy_current_state == 133); + + return yy_is_jam ? 0 : yy_current_state; +} + + static void yyunput (int c, register char * yy_bp ) +{ + register char *yy_cp; + + yy_cp = (yy_c_buf_p); + + /* undo effects of setting up yytext */ + *yy_cp = (yy_hold_char); + + if ( yy_cp < YY_CURRENT_BUFFER_LVALUE->yy_ch_buf + 2 ) + { /* need to shift things up to make room */ + /* +2 for EOB chars. */ + register int number_to_move = (yy_n_chars) + 2; + register char *dest = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[ + YY_CURRENT_BUFFER_LVALUE->yy_buf_size + 2]; + register char *source = + &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[number_to_move]; + + while ( source > YY_CURRENT_BUFFER_LVALUE->yy_ch_buf ) + *--dest = *--source; + + yy_cp += (int) (dest - source); + yy_bp += (int) (dest - source); + YY_CURRENT_BUFFER_LVALUE->yy_n_chars = + (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_buf_size; + + if ( yy_cp < YY_CURRENT_BUFFER_LVALUE->yy_ch_buf + 2 ) + YY_FATAL_ERROR( "flex scanner push-back overflow" ); + } + + *--yy_cp = (char) c; + + (yytext_ptr) = yy_bp; + (yy_hold_char) = *yy_cp; + (yy_c_buf_p) = yy_cp; +} + +#ifndef YY_NO_INPUT +#ifdef __cplusplus + static int yyinput (void) +#else + static int input (void) +#endif + +{ + int c; + + *(yy_c_buf_p) = (yy_hold_char); + + if ( *(yy_c_buf_p) == YY_END_OF_BUFFER_CHAR ) + { + /* yy_c_buf_p now points to the character we want to return. + * If this occurs *before* the EOB characters, then it's a + * valid NUL; if not, then we've hit the end of the buffer. + */ + if ( (yy_c_buf_p) < &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] ) + /* This was really a NUL. */ + *(yy_c_buf_p) = '\0'; + + else + { /* need more input */ + int offset = (yy_c_buf_p) - (yytext_ptr); + ++(yy_c_buf_p); + + switch ( yy_get_next_buffer( ) ) + { + case EOB_ACT_LAST_MATCH: + /* This happens because yy_g_n_b() + * sees that we've accumulated a + * token and flags that we need to + * try matching the token before + * proceeding. But for input(), + * there's no matching to consider. + * So convert the EOB_ACT_LAST_MATCH + * to EOB_ACT_END_OF_FILE. + */ + + /* Reset buffer status. */ + yyrestart(yyin ); + + /*FALLTHROUGH*/ + + case EOB_ACT_END_OF_FILE: + { + if ( yywrap( ) ) + return EOF; + + if ( ! (yy_did_buffer_switch_on_eof) ) + YY_NEW_FILE; +#ifdef __cplusplus + return yyinput(); +#else + return input(); +#endif + } + + case EOB_ACT_CONTINUE_SCAN: + (yy_c_buf_p) = (yytext_ptr) + offset; + break; + } + } + } + + c = *(unsigned char *) (yy_c_buf_p); /* cast for 8-bit char's */ + *(yy_c_buf_p) = '\0'; /* preserve yytext */ + (yy_hold_char) = *++(yy_c_buf_p); + + return c; +} +#endif /* ifndef YY_NO_INPUT */ + +/** Immediately switch to a different input stream. + * @param input_file A readable stream. + * + * @note This function does not reset the start condition to @c INITIAL . + */ + void yyrestart (FILE * input_file ) +{ + + if ( ! YY_CURRENT_BUFFER ){ + yyensure_buffer_stack (); + YY_CURRENT_BUFFER_LVALUE = + yy_create_buffer(yyin,YY_BUF_SIZE ); + } + + yy_init_buffer(YY_CURRENT_BUFFER,input_file ); + yy_load_buffer_state( ); +} + +/** Switch to a different input buffer. + * @param new_buffer The new input buffer. + * + */ + void yy_switch_to_buffer (YY_BUFFER_STATE new_buffer ) +{ + + /* TODO. We should be able to replace this entire function body + * with + * yypop_buffer_state(); + * yypush_buffer_state(new_buffer); + */ + yyensure_buffer_stack (); + if ( YY_CURRENT_BUFFER == new_buffer ) + return; + + if ( YY_CURRENT_BUFFER ) + { + /* Flush out information for old buffer. */ + *(yy_c_buf_p) = (yy_hold_char); + YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = (yy_c_buf_p); + YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars); + } + + YY_CURRENT_BUFFER_LVALUE = new_buffer; + yy_load_buffer_state( ); + + /* We don't actually know whether we did this switch during + * EOF (yywrap()) processing, but the only time this flag + * is looked at is after yywrap() is called, so it's safe + * to go ahead and always set it. + */ + (yy_did_buffer_switch_on_eof) = 1; +} + +static void yy_load_buffer_state (void) +{ + (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_n_chars; + (yytext_ptr) = (yy_c_buf_p) = YY_CURRENT_BUFFER_LVALUE->yy_buf_pos; + yyin = YY_CURRENT_BUFFER_LVALUE->yy_input_file; + (yy_hold_char) = *(yy_c_buf_p); +} + +/** Allocate and initialize an input buffer state. + * @param file A readable stream. + * @param size The character buffer size in bytes. When in doubt, use @c YY_BUF_SIZE. + * + * @return the allocated buffer state. + */ + YY_BUFFER_STATE yy_create_buffer (FILE * file, int size ) +{ + YY_BUFFER_STATE b; + + b = (YY_BUFFER_STATE) yyalloc(sizeof( struct yy_buffer_state ) ); + if ( ! b ) + YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" ); + + b->yy_buf_size = size; + + /* yy_ch_buf has to be 2 characters longer than the size given because + * we need to put in 2 end-of-buffer characters. + */ + b->yy_ch_buf = (char *) yyalloc(b->yy_buf_size + 2 ); + if ( ! b->yy_ch_buf ) + YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" ); + + b->yy_is_our_buffer = 1; + + yy_init_buffer(b,file ); + + return b; +} + +/** Destroy the buffer. + * @param b a buffer created with yy_create_buffer() + * + */ + void yy_delete_buffer (YY_BUFFER_STATE b ) +{ + + if ( ! b ) + return; + + if ( b == YY_CURRENT_BUFFER ) /* Not sure if we should pop here. */ + YY_CURRENT_BUFFER_LVALUE = (YY_BUFFER_STATE) 0; + + if ( b->yy_is_our_buffer ) + yyfree((void *) b->yy_ch_buf ); + + yyfree((void *) b ); +} + +#ifndef __cplusplus +extern int isatty (int ); +#endif /* __cplusplus */ + +/* Initializes or reinitializes a buffer. + * This function is sometimes called more than once on the same buffer, + * such as during a yyrestart() or at EOF. + */ + static void yy_init_buffer (YY_BUFFER_STATE b, FILE * file ) + +{ + int oerrno = errno; + + yy_flush_buffer(b ); + + b->yy_input_file = file; + b->yy_fill_buffer = 1; + + /* If b is the current buffer, then yy_init_buffer was _probably_ + * called from yyrestart() or through yy_get_next_buffer. + * In that case, we don't want to reset the lineno or column. + */ + if (b != YY_CURRENT_BUFFER){ + b->yy_bs_lineno = 1; + b->yy_bs_column = 0; + } + + b->yy_is_interactive = file ? (isatty( fileno(file) ) > 0) : 0; + + errno = oerrno; +} + +/** Discard all buffered characters. On the next scan, YY_INPUT will be called. + * @param b the buffer state to be flushed, usually @c YY_CURRENT_BUFFER. + * + */ + void yy_flush_buffer (YY_BUFFER_STATE b ) +{ + if ( ! b ) + return; + + b->yy_n_chars = 0; + + /* We always need two end-of-buffer characters. The first causes + * a transition to the end-of-buffer state. The second causes + * a jam in that state. + */ + b->yy_ch_buf[0] = YY_END_OF_BUFFER_CHAR; + b->yy_ch_buf[1] = YY_END_OF_BUFFER_CHAR; + + b->yy_buf_pos = &b->yy_ch_buf[0]; + + b->yy_at_bol = 1; + b->yy_buffer_status = YY_BUFFER_NEW; + + if ( b == YY_CURRENT_BUFFER ) + yy_load_buffer_state( ); +} + +/** Pushes the new state onto the stack. The new state becomes + * the current state. This function will allocate the stack + * if necessary. + * @param new_buffer The new state. + * + */ +void yypush_buffer_state (YY_BUFFER_STATE new_buffer ) +{ + if (new_buffer == NULL) + return; + + yyensure_buffer_stack(); + + /* This block is copied from yy_switch_to_buffer. */ + if ( YY_CURRENT_BUFFER ) + { + /* Flush out information for old buffer. */ + *(yy_c_buf_p) = (yy_hold_char); + YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = (yy_c_buf_p); + YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars); + } + + /* Only push if top exists. Otherwise, replace top. */ + if (YY_CURRENT_BUFFER) + (yy_buffer_stack_top)++; + YY_CURRENT_BUFFER_LVALUE = new_buffer; + + /* copied from yy_switch_to_buffer. */ + yy_load_buffer_state( ); + (yy_did_buffer_switch_on_eof) = 1; +} + +/** Removes and deletes the top of the stack, if present. + * The next element becomes the new top. + * + */ +void yypop_buffer_state (void) +{ + if (!YY_CURRENT_BUFFER) + return; + + yy_delete_buffer(YY_CURRENT_BUFFER ); + YY_CURRENT_BUFFER_LVALUE = NULL; + if ((yy_buffer_stack_top) > 0) + --(yy_buffer_stack_top); + + if (YY_CURRENT_BUFFER) { + yy_load_buffer_state( ); + (yy_did_buffer_switch_on_eof) = 1; + } +} + +/* Allocates the stack if it does not exist. + * Guarantees space for at least one push. + */ +static void yyensure_buffer_stack (void) +{ + int num_to_alloc; + + if (!(yy_buffer_stack)) { + + /* First allocation is just for 2 elements, since we don't know if this + * scanner will even need a stack. We use 2 instead of 1 to avoid an + * immediate realloc on the next call. + */ + num_to_alloc = 1; + (yy_buffer_stack) = (struct yy_buffer_state**)yyalloc + (num_to_alloc * sizeof(struct yy_buffer_state*) + ); + if ( ! (yy_buffer_stack) ) + YY_FATAL_ERROR( "out of dynamic memory in yyensure_buffer_stack()" ); + + memset((yy_buffer_stack), 0, num_to_alloc * sizeof(struct yy_buffer_state*)); + + (yy_buffer_stack_max) = num_to_alloc; + (yy_buffer_stack_top) = 0; + return; + } + + if ((yy_buffer_stack_top) >= ((yy_buffer_stack_max)) - 1){ + + /* Increase the buffer to prepare for a possible push. */ + int grow_size = 8 /* arbitrary grow size */; + + num_to_alloc = (yy_buffer_stack_max) + grow_size; + (yy_buffer_stack) = (struct yy_buffer_state**)yyrealloc + ((yy_buffer_stack), + num_to_alloc * sizeof(struct yy_buffer_state*) + ); + if ( ! (yy_buffer_stack) ) + YY_FATAL_ERROR( "out of dynamic memory in yyensure_buffer_stack()" ); + + /* zero only the new slots.*/ + memset((yy_buffer_stack) + (yy_buffer_stack_max), 0, grow_size * sizeof(struct yy_buffer_state*)); + (yy_buffer_stack_max) = num_to_alloc; + } +} + +/** Setup the input buffer state to scan directly from a user-specified character buffer. + * @param base the character buffer + * @param size the size in bytes of the character buffer + * + * @return the newly allocated buffer state object. + */ +YY_BUFFER_STATE yy_scan_buffer (char * base, yy_size_t size ) +{ + YY_BUFFER_STATE b; + + if ( size < 2 || + base[size-2] != YY_END_OF_BUFFER_CHAR || + base[size-1] != YY_END_OF_BUFFER_CHAR ) + /* They forgot to leave room for the EOB's. */ + return 0; + + b = (YY_BUFFER_STATE) yyalloc(sizeof( struct yy_buffer_state ) ); + if ( ! b ) + YY_FATAL_ERROR( "out of dynamic memory in yy_scan_buffer()" ); + + b->yy_buf_size = size - 2; /* "- 2" to take care of EOB's */ + b->yy_buf_pos = b->yy_ch_buf = base; + b->yy_is_our_buffer = 0; + b->yy_input_file = 0; + b->yy_n_chars = b->yy_buf_size; + b->yy_is_interactive = 0; + b->yy_at_bol = 1; + b->yy_fill_buffer = 0; + b->yy_buffer_status = YY_BUFFER_NEW; + + yy_switch_to_buffer(b ); + + return b; +} + +/** Setup the input buffer state to scan a string. The next call to yylex() will + * scan from a @e copy of @a str. + * @param yystr a NUL-terminated string to scan + * + * @return the newly allocated buffer state object. + * @note If you want to scan bytes that may contain NUL values, then use + * yy_scan_bytes() instead. + */ +YY_BUFFER_STATE yy_scan_string (yyconst char * yystr ) +{ + + return yy_scan_bytes(yystr,strlen(yystr) ); +} + +/** Setup the input buffer state to scan the given bytes. The next call to yylex() will + * scan from a @e copy of @a bytes. + * @param yybytes the byte buffer to scan + * @param _yybytes_len the number of bytes in the buffer pointed to by @a bytes. + * + * @return the newly allocated buffer state object. + */ +YY_BUFFER_STATE yy_scan_bytes (yyconst char * yybytes, int _yybytes_len ) +{ + YY_BUFFER_STATE b; + char *buf; + yy_size_t n; + int i; + + /* Get memory for full buffer, including space for trailing EOB's. */ + n = _yybytes_len + 2; + buf = (char *) yyalloc(n ); + if ( ! buf ) + YY_FATAL_ERROR( "out of dynamic memory in yy_scan_bytes()" ); + + for ( i = 0; i < _yybytes_len; ++i ) + buf[i] = yybytes[i]; + + buf[_yybytes_len] = buf[_yybytes_len+1] = YY_END_OF_BUFFER_CHAR; + + b = yy_scan_buffer(buf,n ); + if ( ! b ) + YY_FATAL_ERROR( "bad buffer in yy_scan_bytes()" ); + + /* It's okay to grow etc. this buffer, and we should throw it + * away when we're done. + */ + b->yy_is_our_buffer = 1; + + return b; +} + +#ifndef YY_EXIT_FAILURE +#define YY_EXIT_FAILURE 2 +#endif + +static void yy_fatal_error (yyconst char* msg ) +{ + (void) fprintf( stderr, "%s\n", msg ); + exit( YY_EXIT_FAILURE ); +} + +/* Redefine yyless() so it works in section 3 code. */ + +#undef yyless +#define yyless(n) \ + do \ + { \ + /* Undo effects of setting up yytext. */ \ + int yyless_macro_arg = (n); \ + YY_LESS_LINENO(yyless_macro_arg);\ + yytext[yyleng] = (yy_hold_char); \ + (yy_c_buf_p) = yytext + yyless_macro_arg; \ + (yy_hold_char) = *(yy_c_buf_p); \ + *(yy_c_buf_p) = '\0'; \ + yyleng = yyless_macro_arg; \ + } \ + while ( 0 ) + +/* Accessor methods (get/set functions) to struct members. */ + +/** Get the current line number. + * + */ +int yyget_lineno (void) +{ + + return yylineno; +} + +/** Get the input stream. + * + */ +FILE *yyget_in (void) +{ + return yyin; +} + +/** Get the output stream. + * + */ +FILE *yyget_out (void) +{ + return yyout; +} + +/** Get the length of the current token. + * + */ +int yyget_leng (void) +{ + return yyleng; +} + +/** Get the current token. + * + */ + +char *yyget_text (void) +{ + return yytext; +} + +/** Set the current line number. + * @param line_number + * + */ +void yyset_lineno (int line_number ) +{ + + yylineno = line_number; +} + +/** Set the input stream. This does not discard the current + * input buffer. + * @param in_str A readable stream. + * + * @see yy_switch_to_buffer + */ +void yyset_in (FILE * in_str ) +{ + yyin = in_str ; +} + +void yyset_out (FILE * out_str ) +{ + yyout = out_str ; +} + +int yyget_debug (void) +{ + return yy_flex_debug; +} + +void yyset_debug (int bdebug ) +{ + yy_flex_debug = bdebug ; +} + +static int yy_init_globals (void) +{ + /* Initialization is the same as for the non-reentrant scanner. + * This function is called from yylex_destroy(), so don't allocate here. + */ + + (yy_buffer_stack) = 0; + (yy_buffer_stack_top) = 0; + (yy_buffer_stack_max) = 0; + (yy_c_buf_p) = (char *) 0; + (yy_init) = 0; + (yy_start) = 0; + +/* Defined in main.c */ +#ifdef YY_STDINIT + yyin = stdin; + yyout = stdout; +#else + yyin = (FILE *) 0; + yyout = (FILE *) 0; +#endif + + /* For future reference: Set errno on error, since we are called by + * yylex_init() + */ + return 0; +} + +/* yylex_destroy is for both reentrant and non-reentrant scanners. */ +int yylex_destroy (void) +{ + + /* Pop the buffer stack, destroying each element. */ + while(YY_CURRENT_BUFFER){ + yy_delete_buffer(YY_CURRENT_BUFFER ); + YY_CURRENT_BUFFER_LVALUE = NULL; + yypop_buffer_state(); + } + + /* Destroy the stack itself. */ + yyfree((yy_buffer_stack) ); + (yy_buffer_stack) = NULL; + + /* Reset the globals. This is important in a non-reentrant scanner so the next time + * yylex() is called, initialization will occur. */ + yy_init_globals( ); + + return 0; +} + +/* + * Internal utility routines. + */ + +#ifndef yytext_ptr +static void yy_flex_strncpy (char* s1, yyconst char * s2, int n ) +{ + register int i; + for ( i = 0; i < n; ++i ) + s1[i] = s2[i]; +} +#endif + +#ifdef YY_NEED_STRLEN +static int yy_flex_strlen (yyconst char * s ) +{ + register int n; + for ( n = 0; s[n]; ++n ) + ; + + return n; +} +#endif + +void *yyalloc (yy_size_t size ) +{ + return (void *) malloc( size ); +} + +void *yyrealloc (void * ptr, yy_size_t size ) +{ + /* The cast to (char *) in the following accommodates both + * implementations that use char* generic pointers, and those + * that use void* generic pointers. It works with the latter + * because both ANSI C and C++ allow castless assignment from + * any pointer type to void*, and deal with argument conversions + * as though doing an assignment. + */ + return (void *) realloc( (char *) ptr, size ); +} + +void yyfree (void * ptr ) +{ + free( (char *) ptr ); /* see yyrealloc() for (char *) cast */ +} + +#define YYTABLES_NAME "yytables" + +#line 156 "scanner.l" + + + +int yywrap(void) +{ + return 1; +} + + +/** + * clan_scanner function: + * This function achieves some basic work when Lex recognize something: it + * prints a log information if necessary for debugging, it updates the string + * scanner_latest_text with the string that have been read and returns the + * token if we are scanning a SCoP or the special token IGNORE otherwise. + * \param token The token code to send to Yacc for the Lex item. + * \param text The textual Lex item. + * \param message A string to be printed for debugging. + ** + * - 30/04/2008: first version. + */ + +int clan_scanner(int token, char * text, char * message) +{ + //if (CLAN_DEBUG) + // printf("Lex: %s (%s)\n",message,text); + + sprintf(scanner_latest_text,"%s",text); + if (parser_recording) + strcat(parser_record,text); + + if (scanner_parsing == CLAN_TRUE) + return token; + else + return IGNORE; +} + diff --git a/clan/source/scanner.l b/clan/source/scanner.l new file mode 100644 index 0000000..1a8c209 --- /dev/null +++ b/clan/source/scanner.l @@ -0,0 +1,190 @@ + + /*+------- <| --------------------------------------------------------** + ** A Clan ** + **--- /.\ -----------------------------------------------------** + ** <| [""M# scanner.l ** + **- A | # -----------------------------------------------------** + ** /.\ [""M# First version: 30/04/2008 ** + **- [""M# | # U"U#U -----------------------------------------------** + | # | # \ .:/ + | # | #___| # + ****** | "--' .-" ****************************************************** + * |"-"-"-"-"-#-#-## Clan : the Chunky Loop Analyzer (experimental) * + **** | # ## ###### ***************************************************** + * \ .::::'/ * + * \ ::::'/ Copyright (C) 2008 Cedric Bastoul * + * :8a| # # ## * + * ::88a ### This is free software; you can redistribute it * + * ::::888a 8a ##::. and/or modify it under the terms of the GNU Lesser * + * ::::::::888a88a[]::: General Public License as published by the Free * + *::8:::::::::SUNDOGa8a::. Software Foundation, either version 3 of the * + *::::::::8::::888:Y8888:: License, or (at your option) any later version. * + *::::':::88::::888::Y88a::::::::::::... * + *::'::.. . ..... .. ... . * + * This software is distributed in the hope that it will be useful, but * + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * + * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License * + * for more details. * + * * + * You should have received a copy of the GNU Lesser General Public License * + * along with software; if not, write to the Free Software Foundation, Inc., * + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * + * * + * Clan, the Chunky Loop Analyzer * + * Written by Cedric Bastoul, Cedric.Bastoul@inria.fr * + * * + ******************************************************************************/ + + +%{ + #include + #include + #include + #include + #include + #include + + void yyerror(char *); + int clan_scanner(int, char *, char *); + + extern int parser_recording; /**< Do we record what we read ? */ + extern char * parser_record; /**< What we record */ + extern clan_symbol_p parser_symbol; /**< Top of the symbol table */ + + int scanner_parsing = CLAN_FALSE; /**< Do we parse or not ? */ + int scanner_comment = 0; /**< Comment nesting depth */ + char scanner_latest_text[SCOPLIB_MAX_STRING]; /**< Latest text read */ +%} + +%x LINECOMMENT +%x FULLCOMMENT + +%% + +"*/" { + scanner_comment --; + if (scanner_comment == 0) + BEGIN INITIAL; /* Quit any mode */ + } +"/*" { scanner_comment ++; } +. ; /* Do nothing */ + +\n { BEGIN INITIAL; /* Quit any mode */ } +. ; /* Do nothing */ + +[ \t\n]* ; /* Skip whitespaces */ +"//" { BEGIN LINECOMMENT; /* Enter LINECOMMENT mode */ } +"/*" { + BEGIN FULLCOMMENT; /* Enter FULLCOMMENT mode */ + scanner_comment ++; + } +"#pragma"[ ]+"scop" { scanner_parsing = CLAN_TRUE; /* Start parsing */ } +"#pragma"[ ]+"endscop" { scanner_parsing = CLAN_FALSE; /* Stop parsing */ } +"#pragma"[ ]+"local-vars" { return clan_scanner(PRAGMALOCALVARS, yytext,"PRAGMALOCALVARS"); } +"#pragma"[ ]+"live-out" { return clan_scanner(PRAGMALIVEOUT, yytext,"PRAGMALIVEOUT"); } +"if" { return clan_scanner(IF, yytext,"IF"); } +"else" { return clan_scanner(ELSE, yytext,"ELSE"); } +"for" { return clan_scanner(FOR, yytext,"FOR"); } +"min" { return clan_scanner(MIN, yytext,"min"); } +"max" { return clan_scanner(MAX, yytext,"max"); } +"ceild" { return clan_scanner(CEILD, yytext,"ceild"); } +"floord" { return clan_scanner(FLOORD, yytext,"floord"); } + +[_A-Za-z]"."[A-Za-z0-9_]* | +[_A-Za-z]"->"[A-Za-z0-9_]* | +[_A-Za-z][A-Za-z0-9_]* { + char * word; + word = (char *)malloc((strlen(yytext)+1)*sizeof(char)); + strcpy(word,yytext); + yylval.symbol = word; + return clan_scanner(ID,yytext,"ID"); + } +[0-9]+"."[0-9]*[d,f]* { return clan_scanner(REAL,yytext,"REAL"); } +[0-9]+ { + yylval.value = atoi(yytext) ; + return clan_scanner(INTEGER,yytext,"INTEGER"); + } + +"(" { return clan_scanner(syRPARENTHESIS, yytext,"("); } +")" { return clan_scanner(syLPARENTHESIS, yytext,")"); } +"[" { return clan_scanner(syRBRACKET, yytext,"["); } +"]" { return clan_scanner(syLBRACKET, yytext,"]"); } +"{" { return clan_scanner(syRBRACE, yytext,"{"); } +"}" { return clan_scanner(syLBRACE, yytext,"}"); } +"," { return clan_scanner(syCOMMA, yytext,","); } +";" { return clan_scanner(sySEMICOLON, yytext,";"); } +"." { return clan_scanner(syPOINT, yytext,"."); } +"->" { return clan_scanner(syARROW, yytext,"->"); } +":" { return clan_scanner(opCOLON, yytext,":"); } +"!" { return clan_scanner(opNOT, yytext,"!"); } +"?" { return clan_scanner(opQMARK, yytext,"?"); } +"++" { return clan_scanner(opINCREMENTATION, yytext,"++"); } +"--" { return clan_scanner(opDECREMENTATION, yytext,"--"); } +"+=" { return clan_scanner(opPLUSEQUAL, yytext,"+="); } +"-=" { return clan_scanner(opMINUSEQUAL, yytext,"-="); } +"*=" { return clan_scanner(opMULTIPLYEQUAL, yytext,"*="); } +"/=" { return clan_scanner(opDIVIDEEQUAL, yytext,"/="); } +"|=" { return clan_scanner(opOREQUAL, yytext,"|="); } +"^=" { return clan_scanner(opCOMPEQUAL, yytext,"^="); } +"&=" { return clan_scanner(opANDEQUAL, yytext,"&="); } +"%=" { return clan_scanner(opMODEQUAL, yytext,"%="); } +"==" { return clan_scanner(opEQUAL, yytext,"=="); } +"<=" { return clan_scanner(opLEQ, yytext,"<="); } +">=" { return clan_scanner(opGEQ, yytext,">="); } +"<" { return clan_scanner(opLOWER, yytext,"<"); } +">" { return clan_scanner(opGREATER, yytext,">"); } +"+" { return clan_scanner(opPLUS, yytext,"+"); } +"-" { return clan_scanner(opMINUS, yytext,"-"); } +"*" { return clan_scanner(opMULTIPLY, yytext,"*"); } +"/" { return clan_scanner(opDIVIDE, yytext,"/"); } +"%" { return clan_scanner(opMOD, yytext,"%"); } +"&" { return clan_scanner(opAND, yytext,"&"); } +"&&" { return clan_scanner(opLAND, yytext,"&&"); } +"|" { return clan_scanner(opOR, yytext,"|"); } +"||" { return clan_scanner(opLOR, yytext,"||"); } +"^" { return clan_scanner(opCOMP, yytext,"^"); } +"=" { return clan_scanner(opASSIGNMENT, yytext,"="); } + +. { if (scanner_parsing == CLAN_TRUE) + { + //if (CLAN_DEBUG) + // printf("Lex: Unknown character (%s)\n",yytext); + //yyerror("Lex: Unknown character"); + } + } + +%% + +int yywrap(void) +{ + return 1; +} + + +/** + * clan_scanner function: + * This function achieves some basic work when Lex recognize something: it + * prints a log information if necessary for debugging, it updates the string + * scanner_latest_text with the string that have been read and returns the + * token if we are scanning a SCoP or the special token IGNORE otherwise. + * \param token The token code to send to Yacc for the Lex item. + * \param text The textual Lex item. + * \param message A string to be printed for debugging. + ** + * - 30/04/2008: first version. + */ + +int clan_scanner(int token, char * text, char * message) +{ + //if (CLAN_DEBUG) + // printf("Lex: %s (%s)\n",message,text); + + sprintf(scanner_latest_text,"%s",text); + if (parser_recording) + strcat(parser_record,text); + + if (scanner_parsing == CLAN_TRUE) + return token; + else + return IGNORE; +} diff --git a/clan/source/scop.c b/clan/source/scop.c new file mode 100644 index 0000000..ed68c37 --- /dev/null +++ b/clan/source/scop.c @@ -0,0 +1,186 @@ + + /*+------- <| --------------------------------------------------------** + ** A Clan ** + **--- /.\ -----------------------------------------------------** + ** <| [""M# scop.c ** + **- A | # -----------------------------------------------------** + ** /.\ [""M# First version: 30/04/2008 ** + **- [""M# | # U"U#U -----------------------------------------------** + | # | # \ .:/ + | # | #___| # + ****** | "--' .-" ****************************************************** + * |"-"-"-"-"-#-#-## Clan : the Chunky Loop Analyzer (experimental) * + **** | # ## ###### ***************************************************** + * \ .::::'/ * + * \ ::::'/ Copyright (C) 2008 Cedric Bastoul * + * :8a| # # ## * + * ::88a ### This is free software; you can redistribute it * + * ::::888a 8a ##::. and/or modify it under the terms of the GNU Lesser * + * ::::::::888a88a[]::: General Public License as published by the Free * + *::8:::::::::SUNDOGa8a::. Software Foundation, either version 3 of the * + *::::::::8::::888:Y8888:: License, or (at your option) any later version. * + *::::':::88::::888::Y88a::::::::::::... * + *::'::.. . ..... .. ... . * + * This software is distributed in the hope that it will be useful, but * + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * + * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License * + * for more details. * + * * + * You should have received a copy of the GNU Lesser General Public License * + * along with software; if not, write to the Free Software Foundation, Inc., * + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * + * * + * Clan, the Chunky Loop Analyzer * + * Written by Cedric Bastoul, Cedric.Bastoul@inria.fr * + * * + ******************************************************************************/ + + +# include +# include +# include +# include +# include +# include +# include + + +/*+**************************************************************************** + * Processing functions * + ******************************************************************************/ + +scoplib_scop_p +clan_parse(FILE *, clan_options_p); + +/** + * clan_scop_extract function: + * this function is a wrapper clan_parse function that parses a file to + * extract a SCoP and returns, if successful, a pointer to the scoplib_scop_t + * structure. + * \param input The file to parse (already open). + * \param options Options for file parsing. + ** + * - 24/05/2008: First version. + */ +scoplib_scop_p +clan_scop_extract(FILE * input, clan_options_p options) +{ + return clan_parse(input,options); +} + + +/** + * clan_scop_compact function: + * This function scans the SCoP to put the right number of columns to every + * matrix (during construction we used CLAN_MAX_DEPTH and CLAN_MAX_PARAMETERS + * to define matrix and vector sizes). + * \param scop The scop to scan to compact matrices. + ** + * - 02/05/2008: first version. + */ +void +clan_scop_compact(scoplib_scop_p scop) +{ + clan_statement_compact(scop->statement,scop->nb_parameters); +} + + +/** + * clan_scop_fill_options: + * This function stores the list of variables id in 'varlist' in the + * option tag of the scop, enclosed by + * . + * + */ +void +clan_scop_fill_options(scoplib_scop_p scop, int* localvars, int* liveoutvars) +{ + /* Build the string of ids. */ + int i, size; + char* tag = NULL; + char* tag1 = NULL; + char* tag2 = NULL; + if (localvars && localvars[0] != -1) + { + /* localvars is a -1-terminated array. */ + for (i = 0; localvars[i] != -1; ++i) + ; + size = i; + char* ids = (char*)malloc(((size * 5) + 1) * sizeof(char)); + ids[0] = '\0'; + char buffer[16]; + for (i = 0; i < size; ++i) + { + if (i == 0) + sprintf(buffer, "%d", localvars[i]); + else + sprintf(buffer, " %d", localvars[i]); + strcat(ids, buffer); + } + size = strlen("\n") + strlen (ids) + + strlen ("\n"); + tag1 = (char*)malloc((size + 1) * sizeof(char)); + strcpy(tag1, "\n"); + strcat(tag1, ids); + strcat(tag1, "\n"); + strcat(tag1, "\n"); + free(ids); + } + + if (liveoutvars && liveoutvars[0] != -1) + { + /* liveoutvars is a -1-terminated array. */ + for (i = 0; liveoutvars[i] != -1; ++i) + ; + size = i; + char* ids = (char*)malloc(((size * 5) + 1) * sizeof(char)); + ids[0] = '\0'; + char buffer[16]; + for (i = 0; i < size; ++i) + { + if (i == 0) + sprintf(buffer, "%d", liveoutvars[i]); + else + sprintf(buffer, " %d", liveoutvars[i]); + strcat(ids, buffer); + } + size = strlen("\n") + strlen (ids) + + strlen ("\n"); + tag2 = (char*)malloc((size + 1) * sizeof(char)); + strcpy(tag2, "\n"); + strcat(tag2, ids); + strcat(tag2, "\n"); + strcat(tag2, "\n"); + free(ids); + } + + /* Concatenate the tags. */ + if (tag1 || tag2) + { + if (tag1 == NULL) + tag = tag2; + else if (tag2 == NULL) + tag = tag1; + else + { + tag = (char*)malloc((strlen(tag1) + strlen(tag2) + 1)); + strcpy(tag, tag1); + strcat(tag, tag2); + free(tag1); + free(tag2); + } + } + + if (scop->optiontags == NULL) + scop->optiontags = tag; + else + { + char* newtag = (char*)malloc((strlen(tag) + strlen(scop->optiontags) + 2) + * sizeof(char)); + strcpy(newtag, scop->optiontags); + strcat(newtag, "\n"); + strcat(newtag, tag); + free(scop->optiontags); + scop->optiontags = newtag; + } +} diff --git a/clan/source/statement.c b/clan/source/statement.c new file mode 100644 index 0000000..7621f13 --- /dev/null +++ b/clan/source/statement.c @@ -0,0 +1,80 @@ + + /*+------- <| --------------------------------------------------------** + ** A Clan ** + **--- /.\ -----------------------------------------------------** + ** <| [""M# statement.c ** + **- A | # -----------------------------------------------------** + ** /.\ [""M# First version: 30/04/2008 ** + **- [""M# | # U"U#U -----------------------------------------------** + | # | # \ .:/ + | # | #___| # + ****** | "--' .-" ****************************************************** + * |"-"-"-"-"-#-#-## Clan : the Chunky Loop Analyzer (experimental) * + **** | # ## ###### ***************************************************** + * \ .::::'/ * + * \ ::::'/ Copyright (C) 2008 Cedric Bastoul * + * :8a| # # ## * + * ::88a ### This is free software; you can redistribute it * + * ::::888a 8a ##::. and/or modify it under the terms of the GNU Lesser * + * ::::::::888a88a[]::: General Public License as published by the Free * + *::8:::::::::SUNDOGa8a::. Software Foundation, either version 3 of the * + *::::::::8::::888:Y8888:: License, or (at your option) any later version. * + *::::':::88::::888::Y88a::::::::::::... * + *::'::.. . ..... .. ... . * + * This software is distributed in the hope that it will be useful, but * + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * + * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License * + * for more details. * + * * + * You should have received a copy of the GNU Lesser General Public License * + * along with software; if not, write to the Free Software Foundation, Inc., * + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * + * * + * Clan, the Chunky Loop Analyzer * + * Written by Cedric Bastoul, Cedric.Bastoul@inria.fr * + * * + ******************************************************************************/ + + +# include +# include +# include +# include +# include + + +/*+**************************************************************************** + * Processing functions * + ******************************************************************************/ + +/** + * clan_statement_compact function: + * This function scans the statement list to put the right number of columns + * to every matrix (during construction we used CLAN_MAX_DEPTH and + * CLAN_MAX_PARAMETERS to define matrix and vector sizes). + * \param statement The first statement to scan to compact matrices. + * \param nb_parameters The true number of parameters in the SCoP. + ** + * - 02/05/2008: first version. + */ +void +clan_statement_compact(scoplib_statement_p statement, int nb_parameters) +{ + int nb_iterators; + scoplib_matrix_list_p tmp; + + while (statement != NULL) + { + nb_iterators = statement->nb_iterators; + tmp = statement->domain; + while (tmp) + { + clan_matrix_compact(tmp->elt,nb_iterators,nb_parameters); + tmp = tmp->next; + } + clan_matrix_compact(statement->schedule,nb_iterators,nb_parameters); + clan_matrix_compact(statement->read,nb_iterators,nb_parameters); + clan_matrix_compact(statement->write,nb_iterators,nb_parameters); + statement = statement->next; + } +} diff --git a/clan/source/symbol.c b/clan/source/symbol.c new file mode 100644 index 0000000..1a9e496 --- /dev/null +++ b/clan/source/symbol.c @@ -0,0 +1,483 @@ + + /*+------- <| --------------------------------------------------------** + ** A Clan ** + **--- /.\ -----------------------------------------------------** + ** <| [""M# symbol.c ** + **- A | # -----------------------------------------------------** + ** /.\ [""M# First version: 01/05/2008 ** + **- [""M# | # U"U#U -----------------------------------------------** + | # | # \ .:/ + | # | #___| # + ****** | "--' .-" ****************************************************** + * |"-"-"-"-"-#-#-## Clan : the Chunky Loop Analyzer (experimental) * + **** | # ## ###### ***************************************************** + * \ .::::'/ * + * \ ::::'/ Copyright (C) 2008 Cedric Bastoul * + * :8a| # # ## * + * ::88a ### This is free software; you can redistribute it * + * ::::888a 8a ##::. and/or modify it under the terms of the GNU Lesser * + * ::::::::888a88a[]::: General Public License as published by the Free * + *::8:::::::::SUNDOGa8a::. Software Foundation, either version 3 of the * + *::::::::8::::888:Y8888:: License, or (at your option) any later version. * + *::::':::88::::888::Y88a::::::::::::... * + *::'::.. . ..... .. ... . * + * This software is distributed in the hope that it will be useful, but * + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * + * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License * + * for more details. * + * * + * You should have received a copy of the GNU Lesser General Public License * + * along with software; if not, write to the Free Software Foundation, Inc., * + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * + * * + * Clan, the Chunky Loop Analyzer * + * Written by Cedric Bastoul, Cedric.Bastoul@inria.fr * + * * + ******************************************************************************/ + + +# include +# include +# include +# include +# include + + +/*+**************************************************************************** + * Global variables * + ******************************************************************************/ + + +int symbol_nb_iterators = 0; /**< Current number of iterator symbols */ +int symbol_nb_parameters = 0; /**< Current number of parameter symbols */ +int symbol_nb_arrays = 0; /**< Current number of array symbols */ +int symbol_nb_functions = 0; /**< Current number of function symbols */ + + +/*+**************************************************************************** + * Structure display function * + ******************************************************************************/ + + +/** + * clan_symbol_print_structure function: + * Displays a clan_symbol_t structure (*symbol) into a file (file, possibly + * stdout) in a way that trends to be understandable without falling in a deep + * depression or, for the lucky ones, getting a headache... It includes an + * indentation level (level) in order to work with others print_structure + * functions. + * \param file File where informations are printed. + * \param symbol The symbol whose information have to be printed. + * \param level Number of spaces before printing, for each line. + ** + * - 01/05/2008: first version. + */ +void +clan_symbol_print_structure(FILE * file, clan_symbol_p symbol, int level) +{ + int i, j, first = 1, number = 1; + + if (symbol != NULL) + { + /* Go to the right level. */ + for(j = 0; j < level; j++) + fprintf(file,"|\t"); + fprintf(file,"+-- clan_symbol_t (node %d)\n",number); + } + else + { + /* Go to the right level. */ + for(j = 0; j < level; j++) + fprintf(file,"|\t"); + fprintf(file,"+-- NULL symbol\n"); + } + + while (symbol != NULL) + { if (!first) + { + /* Go to the right level. */ + for (j = 0; j < level; j++) + fprintf(file,"|\t"); + fprintf(file,"| clan_symbol_t (node %d)\n",number); + } + else + first = 0; + + /* A blank line. */ + for (j = 0; j <= level+1; j++) + fprintf(file,"|\t"); + fprintf(file,"\n"); + + /* Print the identifier. */ + for (i = 0; i <= level; i++) + fprintf(file,"|\t"); + if (symbol->identifier != NULL) + fprintf(file,"+-- Identifier: %s\n",symbol->identifier); + else + fprintf(file,"+-- No identifier\n"); + + /* A blank line. */ + for(j = 0; j <= level+1; j++) + fprintf(file,"|\t") ; + fprintf(file,"\n") ; + + /* Go to the right level and print the type. */ + for (j = 0; j <= level; j++) + fprintf(file,"|\t") ; + fprintf(file,"Type: ") ; + switch (symbol->type) + { case SCOPLIB_TYPE_ITERATOR : fprintf(file,"Iterator\n"); break; + case SCOPLIB_TYPE_PARAMETER: fprintf(file,"Parameter\n"); break; + case SCOPLIB_TYPE_ARRAY : fprintf(file,"Array\n"); break; + case SCOPLIB_TYPE_FUNCTION : fprintf(file,"Function\n"); break; + default : fprintf(file,"Unknown\n") ; + } + + /* A blank line. */ + for (j = 0; j <= level+1; j++) + fprintf(file,"|\t"); + fprintf(file,"\n"); + + /* Go to the right level and print the rank. */ + for (j = 0; j <= level; j++) + fprintf(file,"|\t"); + fprintf(file,"Rank: %d\n",symbol->rank); + + /* A blank line. */ + for (j = 0; j <= level+1; j++) + fprintf(file,"|\t"); + fprintf(file,"\n"); + + symbol = symbol->next; + number++; + + /* Next line. */ + if (symbol != NULL) + { + for (j = 0; j <= level; j++) + fprintf(file,"|\t"); + fprintf(file,"V\n"); + } + } + + /* The last line. */ + for(j=0; j<=level; j++) + fprintf(file,"|\t"); + fprintf(file,"\n"); +} + + +/** + * clan_symbol_print function: + * This function prints the content of a clan_symbol_t structure (*symbol) into + * a file (file, possibly stdout). + * \param file File where informations are printed. + * \param symbol The symbol whose information have to be printed. + ** + * - 01/05/2008: first version. + */ +void +clan_symbol_print(FILE * file, clan_symbol_p symbol) +{ + clan_symbol_print_structure(file,symbol,0); +} + + +/*+**************************************************************************** + * Memory allocation/deallocation function * + ******************************************************************************/ + + +/** + * clan_symbol_malloc function: + * This function allocates the memory space for a clan_symbol_t structure and + * sets its fields with default values. Then it returns a pointer to the + * allocated space. + ** + * - 01/05/2008: first version. + */ +clan_symbol_p +clan_symbol_malloc() +{ + clan_symbol_p symbol; + + symbol = (clan_symbol_p)malloc(sizeof(clan_symbol_t)); + if (symbol == NULL) + { + fprintf(stderr, "[Clan] Memory Overflow.\n"); + exit(1); + } + + symbol->identifier = NULL; + symbol->next = NULL; + + return symbol; +} + + +/** + * clan_symbol_free function: + * This function frees the allocated memory for a clan_symbol_t structure. + * \param symbol The pointer to the symbol we want to free. + ** + * - 01/05/2008: first version. + */ +void +clan_symbol_free(clan_symbol_p symbol) +{ + clan_symbol_p next; + + while (symbol != NULL) + { + next = symbol->next; + free(symbol->identifier); + free(symbol); + symbol = next; + } +} + + +/*+**************************************************************************** + * Processing functions * + ******************************************************************************/ + + +/** + * clan_symbol_lookup function: + * This function searches the symbol table for a symbol with the identifier + * provided as parameter. It returns the pointer to the symbol if it already + * exists inside the table, NULL otherwise. + * \param symbol The first node of the list of symbols. + * \param identifier The identifier we are looking for. + ** + * - 01/05/2008: first version. + */ +clan_symbol_p +clan_symbol_lookup(clan_symbol_p symbol, char * identifier) +{ + while (symbol != NULL) + { + if (strcmp(symbol->identifier,identifier) == 0) + return symbol; + else + symbol = symbol->next; + } + return NULL; +} + + +/** + * clan_symbol_add function: + * This function adds a new clan_symbol_t in the symbol table whose address + * is provided as a parameter. If the symbol table is empty (NULL), the new + * node will become its first element. A new node is added only if an + * existing node with the same identifier does not already exist. It returns + * the pointer to the symbol table node corresponding to the identifier. + * \param location The address of the symbol table. + * \param identifier The identifier of the symbol we want to add. + * \param type The new symbol type + * \param rank The new symbol rank (depth if iterator, ignored otherwise) + ** + * - 01/05/2008: first version. + */ +clan_symbol_p +clan_symbol_add(clan_symbol_p * location, char * identifier, int type, int rank) +{ + clan_symbol_p symbol; + + /* If the identifier is already in the table, do nothing. */ + symbol = clan_symbol_lookup(*location,identifier); + if (symbol != NULL) + return symbol; + + /* Else, we allocate and fill a new clan_symbol_t node. */ + symbol = clan_symbol_malloc(); + + symbol->identifier = (char *)malloc(SCOPLIB_MAX_STRING * sizeof(char)); + strcpy(symbol->identifier,identifier); + + /* If the type was unknown (iterator or parameter) we know now that it is + * a parameter, it would have been already in the table otherwise. + */ + if (type == SCOPLIB_TYPE_UNKNOWN) + type = SCOPLIB_TYPE_PARAMETER; + symbol->type = type; + + switch (symbol->type) + { + case SCOPLIB_TYPE_ITERATOR : symbol->rank = rank; + symbol_nb_iterators++; + break; + case SCOPLIB_TYPE_PARAMETER: symbol->rank = ++symbol_nb_parameters; break; + case SCOPLIB_TYPE_ARRAY : symbol->rank = ++symbol_nb_arrays; break; + case SCOPLIB_TYPE_FUNCTION : symbol->rank = ++symbol_nb_functions; break; + } + + /* We put the new symbol at the beginning of the table (easier ;-) !). */ + symbol->next = *location; + *location = symbol; + + return symbol; +} + +/** + * clan_symbol_remove function: + * Deletes a symbol from the list. + * + */ +void +clan_symbol_remove(clan_symbol_p* location, clan_symbol_p symbol) +{ + clan_symbol_p s = *location; + if (s == NULL || symbol == NULL) + return; + if (s == symbol) + *location = symbol->next; + else + { + while (s && s->next != symbol) + s = s->next; + if (s) + { + s->next = symbol->next; + free(symbol); + } + } +} + + +/** + * clan_symbol_get_rank function: + * This function returns the rank of the symbol with identifier "identifier" + * in the symbol table whose first element is "symbol". If the symbol with + * the specified identifier is not found, it returns -1. + * \param symbol The first node of the list of symbols. + * \param identifier The identifier we want to know the rank. + ** + * - 01/05/2008: first version. + */ +int +clan_symbol_get_rank(clan_symbol_p symbol, char * identifier) +{ + while (symbol != NULL) + { + if (strcmp(symbol->identifier,identifier) == 0) + return symbol->rank; + else + symbol = symbol->next; + } + return -1; +} + + +/** + * clan_symbol_get_type function: + * This function returns the type of the symbol with identifier "identifier" + * in the symbol table whose first element is "symbol". If the symbol with + * the specified identifier is not found, it returns -1. + * \param symbol The first node of the list of symbols. + * \param identifier The identifier we want to know the type. + ** + * - 01/05/2008: first version. + */ +int +clan_symbol_get_type(clan_symbol_p symbol, char * identifier) +{ + while (symbol != NULL) + { + if (strcmp(symbol->identifier,identifier) == 0) + return symbol->type; + else + symbol = symbol->next; + } + return -1; +} + + +/** + * clan_symbol_iterators function: + * this function builds the array of original iterator names for the + * scoplib_statement_t structures thanks to the parser current state of + * parser_depth (depth) and parser_iterators (symbols). "symbols" + * is an array of references to symbol table entries, one for each + * loop enclosing the statement. + * \param symbols Array of iterator symbols for the statement. + * \param depth The depth of the statement. + ** + * - 01/05/2008: First version. + */ +char ** +clan_symbol_iterators(clan_symbol_p * symbols, int depth) +{ + int i, length; + char ** iterators; + + iterators = (char **)malloc(depth * sizeof (char *)); + + for (i = 0; i < depth; i++) + { + length = strlen((symbols[i])->identifier) + 1; + iterators[i] = (char *)malloc(length * sizeof(char)); + strcpy(iterators[i],(symbols[i])->identifier); + } + + return iterators; +} + + +/** + * clan_symbol_id_array function: + * this function builds an array of identifier names of a given type + * thanks to the informations stored in the symbol + * table and returns it. The identifiers are sort according to their rank. + * It also returns the array size to the parameter "size". + * \param symbol The first element of the symbol table. + * \param type The type of interesting elements. + * \param size The returned array size (this is a _result_). + ** + * - 02/05/2008: First version. + * - 03/05/2008: More generic, no more dedicated to parameters only. + */ +char ** +clan_symbol_id_array(clan_symbol_p symbol, int type, int * size) +{ + int i, length, nb_identifiers = 0; + char ** identifiers; + clan_symbol_p start; + + /* A first scan of the table to find the number of identifiers of "type". */ + start = symbol; + while (symbol != NULL) + { + if (symbol->type == type) + nb_identifiers++; + symbol = symbol->next; + } + + identifiers = (char **)malloc(nb_identifiers * sizeof(char *)); + + /* We scan the table a second time to fill the identifier array + * Not optimal to act this way but overkills are worse! + */ + i = 0; + symbol = start; + while (symbol != NULL) + { + if (symbol->type == type) + { + length = strlen(symbol->identifier) + 1; + identifiers[symbol->rank - 1] = (char *)malloc(length * sizeof(char)); + strcpy(identifiers[symbol->rank - 1],symbol->identifier); + i++; + } + symbol = symbol->next; + } + + if (size != NULL) + *size = nb_identifiers; + + return identifiers; +} + + + diff --git a/clan/source/vector.c b/clan/source/vector.c new file mode 100644 index 0000000..0846e39 --- /dev/null +++ b/clan/source/vector.c @@ -0,0 +1,83 @@ + + /*+------- <| --------------------------------------------------------** + ** A Clan ** + **--- /.\ -----------------------------------------------------** + ** <| [""M# vector.c ** + **- A | # -----------------------------------------------------** + ** /.\ [""M# First version: 01/05/2008 ** + **- [""M# | # U"U#U -----------------------------------------------** + | # | # \ .:/ + | # | #___| # + ****** | "--' .-" ****************************************************** + * |"-"-"-"-"-#-#-## Clan : the Chunky Loop Analyzer (experimental) * + **** | # ## ###### ***************************************************** + * \ .::::'/ * + * \ ::::'/ Copyright (C) 2008 Cedric Bastoul * + * :8a| # # ## * + * ::88a ### This is free software; you can redistribute it * + * ::::888a 8a ##::. and/or modify it under the terms of the GNU Lesser * + * ::::::::888a88a[]::: General Public License as published by the Free * + *::8:::::::::SUNDOGa8a::. Software Foundation, either version 3 of the * + *::::::::8::::888:Y8888:: License, or (at your option) any later version. * + *::::':::88::::888::Y88a::::::::::::... * + *::'::.. . ..... .. ... . * + * This software is distributed in the hope that it will be useful, but * + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * + * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License * + * for more details. * + * * + * You should have received a copy of the GNU Lesser General Public License * + * along with software; if not, write to the Free Software Foundation, Inc., * + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * + * * + * Clan, the Chunky Loop Analyzer * + * Written by Cedric Bastoul, Cedric.Bastoul@inria.fr * + * * + ******************************************************************************/ + + +# include +# include +# include +# include + + +/*+**************************************************************************** + * Processing functions * + ******************************************************************************/ + + +/** + * clan_vector_term function: + * This function generates the vector representation of a term. It allocates + * a vector with maximal size and put the term value at the right place + * depending if the term is a constant, an iterator coefficient or a + * parameter coefficient (see the structure of a PolyLib row if unsure!). + * \param symbol The first node of the list of symbols. + * \param coefficient The constant or coefficient. + * \param identifier Identifier of iterator or parameter (NULL for constant). + ** + * - 01/05/2008: first version. + */ +scoplib_vector_p +clan_vector_term(clan_symbol_p symbol, int coefficient, char * identifier) +{ + int rank, size; + scoplib_vector_p vector; + + size = CLAN_MAX_DEPTH + CLAN_MAX_PARAMETERS + 2 ; + vector = scoplib_vector_malloc(size); + + if (identifier == NULL) + SCOPVAL_set_si(vector->p[size - 1],coefficient); + else + { + rank = clan_symbol_get_rank(symbol,identifier); + + if (clan_symbol_get_type(symbol,identifier) == SCOPLIB_TYPE_ITERATOR) + SCOPVAL_set_si(vector->p[rank],coefficient); + else + SCOPVAL_set_si(vector->p[CLAN_MAX_DEPTH + rank],coefficient); + } + return vector; +} diff --git a/clan/tests/Makefile.am b/clan/tests/Makefile.am new file mode 100644 index 0000000..080eeca --- /dev/null +++ b/clan/tests/Makefile.am @@ -0,0 +1,131 @@ +# +# /**------- <| --------------------------------------------------------** +# ** A Clan ** +# **--- /.\ -----------------------------------------------------** +# ** <| [""M# makefile.am ** +# **- A | # -----------------------------------------------------** +# ** /.\ [""M# First version: 30/04/2008 ** +# **- [""M# | # U"U#U -----------------------------------------------** +# | # | # \ .:/ +# | # | #___| # +# ****** | "--' .-" ***************************************************** +# * |"-"-"-"-"-#-#-## Clan : the Chunky Loop Analyser (experimental) * +# **** | # ## ###### **************************************************** +# * \ .::::'/ * +# * \ ::::'/ Copyright (C) 2008 Cedric Bastoul * +# * :8a| # # ## * +# * ::88a ### This is free software; you can redistribute it * +# * ::::888a 8a ##::. and/or modify it under the terms of the GNU * +# * ::::::::888a88a[]::: Lesser General Public License as published by * +# *::8:::::::::SUNDOGa8a::. the Free Software Foundation, either version 3 of * +# *::::::::8::::888:Y8888:: the License, or (at your option) * +# *::::':::88::::888::Y88a::::::::::::... any later version. * +# *::'::.. . ..... .. ... . * +# * This software is distributed in the hope that it will be useful, but * +# * WITHOUT ANY WARRANTY; without even the implied warranty of * +# * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General * +# * Public License for more details. * +# * * +# * You should have received a copy of the GNU Lesser General Public * +# * License along with software; if not, write to the Free Software * +# * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * +# * * +# * Clan, the Chunky Loop Analyser * +# * Written by Cedric Bastoul, Cedric.Bastoul@inria.fr * +# * * +# *****************************************************************************/ +# +# Makefile.am (or makefile if generated) of Clan, the Chunky Loop Analyser. +# Makefile.am is not a makefile, you must run the 'autogen.sh' THEN the +# configure shellscript to generate the Makefile thanks to this file. + + +############################################################################# +SUBDIRS = + +############################################################################# + +MAINTAINERCLEANFILES = Makefile.in + +TESTS_ENVIRONMENT = top_builddir=$(top_builddir) SRCDIR=$(srcdir) + +############################################################################# + +EXTRA_DIST = checker.sh + +check_SCRIPTS = check_unitary.sh check_complex.sh + +## Replace by program names when needed +# check_PROGRAMS = ... +TESTS = $(check_SCRIPTS) + +TEST_FILES = \ + $(top_srcdir)/tests/ax-do.c \ + $(top_srcdir)/tests/gauss.c \ + $(top_srcdir)/tests/gemver.c \ + $(top_srcdir)/tests/iir_4_64.c \ + $(top_srcdir)/tests/matmul.c \ + $(top_srcdir)/tests/swim.c + +UNITARY_TEST_FILES = \ + $(top_srcdir)/tests/unitary/classicloop.c \ + $(top_srcdir)/tests/unitary/simpleloop.c \ + $(top_srcdir)/tests/unitary/basicnest.c \ + $(top_srcdir)/tests/unitary/empty.c \ + $(top_srcdir)/tests/unitary/simplecond.c \ + $(top_srcdir)/tests/unitary/twoconds.c \ + $(top_srcdir)/tests/unitary/twocondincond.c \ + $(top_srcdir)/tests/unitary/complexcond.c \ + $(top_srcdir)/tests/unitary/multiparenthcond.c \ + $(top_srcdir)/tests/unitary/maxloopsimple.c \ + $(top_srcdir)/tests/unitary/maxloopcomplex.c \ + $(top_srcdir)/tests/unitary/minloopsimple.c \ + $(top_srcdir)/tests/unitary/minloopcomplex.c \ + $(top_srcdir)/tests/unitary/minmax.c \ + $(top_srcdir)/tests/unitary/negassign.c \ + $(top_srcdir)/tests/unitary/binop.c \ + $(top_srcdir)/tests/unitary/complexop.c \ + $(top_srcdir)/tests/unitary/complexprog.c \ + $(top_srcdir)/tests/unitary/noloop.c \ + $(top_srcdir)/tests/unitary/noloop2.c \ + $(top_srcdir)/tests/unitary/ternary.c \ + $(top_srcdir)/tests/unitary/functioncall.c \ + $(top_srcdir)/tests/unitary/functioncall2.c \ + $(top_srcdir)/tests/unitary/redefiter.c \ + $(top_srcdir)/tests/unitary/comments.c \ + $(top_srcdir)/tests/unitary/underscore.c \ + $(top_srcdir)/tests/unitary/parenthesis.c \ + $(top_srcdir)/tests/unitary/intaddit.c \ + $(top_srcdir)/tests/unitary/assigniter.c \ + $(top_srcdir)/tests/unitary/assigniter2.c \ + $(top_srcdir)/tests/unitary/increment.c \ + $(top_srcdir)/tests/unitary/field.c \ + $(top_srcdir)/tests/unitary/object.c \ + $(top_srcdir)/tests/unitary/nestedcurly.c \ + $(top_srcdir)/tests/unitary/float.c + + +TEST_FILES_REF = $(TEST_FILES:.c=.c.scop) +UNITARY_TEST_FILES_REF = $(UNITARY_TEST_FILES:.c=.c.scop) + +TEST_FILES_CLEAN = $(TEST_FILES:.c=.c.test) +UNITARY_TEST_FILES_CLEAN = $(UNITARY_TEST_FILES:.c=.c.test) + + +CLEANFILES = \ + $(TEST_FILES_CLEAN) \ + $(UNITARY_TEST_FILES_CLEAN) + + +EXTRA_DIST += \ + $(TEST_FILES) \ + $(TEST_FILES_REF) \ + $(UNITARY_TEST_FILES) \ + $(UNITARY_TEST_FILES_REF) \ + $(check_SCRIPTS) + + +TESTS_ENVIRONMENT += \ + CHECKER="$(top_srcdir)/tests/checker.sh" \ + TEST_FILES="$(TEST_FILES)" \ + UNITARY_TEST_FILES="$(UNITARY_TEST_FILES)" diff --git a/clan/tests/ax-do.c b/clan/tests/ax-do.c new file mode 100644 index 0000000..2ce4594 --- /dev/null +++ b/clan/tests/ax-do.c @@ -0,0 +1,21 @@ +#include +#define N 100 + +int main() +{ int i=0, j=0, n=100 ; + float a[N+1][N+1], b[N+1], c[N+1], result ; + + /* ax-do kernel */ +#pragma scop + for (i=1;i<=n;i++) + c[i] = 0 ; + for (i=1;i<=n;i++) + for (j=1;j<=n;j++) + c[i] = c[i] + a[i][j] * b[j] ; +#pragma endscop + + result = c[N-1]; + printf("fib[%d] = %d\n", N-1, result); + + return 0; +} diff --git a/clan/tests/ax-do.c.scop b/clan/tests/ax-do.c.scop new file mode 100644 index 0000000..2a5bf7a --- /dev/null +++ b/clan/tests/ax-do.c.scop @@ -0,0 +1,129 @@ +# +# <| +# A +# /.\ +# <| [""M# +# A | # Clan McCloog Castle +# /.\ [""M# [File generated by Clan 0.5.0 64 bits] +# [""M# | # U"U#U +# | # | # \ .:/ +# | # | #___| # +# | "--' .-" +# |"-"-"-"-"-#-#-## +# | # ## ###### +# \ .::::'/ +# \ ::::'/ +# :8a| # # ## +# ::88a ### +# ::::888a 8a ##::. +# ::::::888a88a[]:::: +# :::::::::SUNDOGa8a::::. .. +# :::::8::::888:Y8888:::::::::... +#::':::88::::888::Y88a______________________________________________________ +#:: ::::88a::::88a:Y88a __---__-- __ +#' .: ::Y88a:::::8a:Y88a __----_-- -------_-__ +# :' ::::8P::::::::::88aa. _ _- -- --_ --- __ --- __-- +#.:: :::::::::::::::::::Y88as88a...s88aa. + +SCoP + +# =============================================== Global +# Language +C + +# Context +0 3 + +# Parameter names are provided +1 +# Parameter names +n + +# Number of statements +2 + +# =============================================== Statement 1 +# ---------------------------------------------- 1.1 Domain +# Iteration domain +1 +2 4 + 1 1 0 -1 ## i-1 >= 0 + 1 -1 1 0 ## -i+n >= 0 + +# ---------------------------------------------- 1.2 Scattering +# Scattering function is provided +1 +# Scattering function +3 4 + 0 0 0 0 ## 0 + 0 1 0 0 ## i + 0 0 0 0 ## 0 + +# ---------------------------------------------- 1.3 Access +# Access informations are provided +1 +# Read access informations +0 4 +# Write access informations +1 4 + 1 1 0 0 ## c[i] + +# ---------------------------------------------- 1.4 Body +# Statement body is provided +1 +# Original iterator names +i +# Statement body +c[i]=0; + + +# =============================================== Statement 2 +# ---------------------------------------------- 2.1 Domain +# Iteration domain +1 +4 5 + 1 1 0 0 -1 ## i-1 >= 0 + 1 -1 0 1 0 ## -i+n >= 0 + 1 0 1 0 -1 ## j-1 >= 0 + 1 0 -1 1 0 ## -j+n >= 0 + +# ---------------------------------------------- 2.2 Scattering +# Scattering function is provided +1 +# Scattering function +5 5 + 0 0 0 0 1 ## 1 + 0 1 0 0 0 ## i + 0 0 0 0 0 ## 0 + 0 0 1 0 0 ## j + 0 0 0 0 0 ## 0 + +# ---------------------------------------------- 2.3 Access +# Access informations are provided +1 +# Read access informations +4 5 + 1 1 0 0 0 ## c[i] + 2 1 0 0 0 ## a[i][j] + 0 0 1 0 0 ## + 3 0 1 0 0 ## b[j] +# Write access informations +1 5 + 1 1 0 0 0 ## c[i] + +# ---------------------------------------------- 2.4 Body +# Statement body is provided +1 +# Original iterator names +i j +# Statement body +c[i]=c[i]+a[i][j]*b[j]; + + +# =============================================== Options + +3 +1 c +2 a +3 b + diff --git a/clan/tests/check_complex.sh b/clan/tests/check_complex.sh new file mode 100755 index 0000000..8770168 --- /dev/null +++ b/clan/tests/check_complex.sh @@ -0,0 +1,40 @@ +#! /bin/sh +# +# /**------- <| --------------------------------------------------------** +# ** A Clan ** +# **--- /.\ -----------------------------------------------------** +# ** <| [""M# check_complex.sh ** +# **- A | # -----------------------------------------------------** +# ** /.\ [""M# First version: 30/04/2008 ** +# **- [""M# | # U"U#U -----------------------------------------------** +# | # | # \ .:/ +# | # | #___| # +# ****** | "--' .-" ***************************************************** +# * |"-"-"-"-"-#-#-## Clan : the Chunky Loop Analyser (experimental) * +# **** | # ## ###### **************************************************** +# * \ .::::'/ * +# * \ ::::'/ Copyright (C) 2008 Cedric Bastoul * +# * :8a| # # ## * +# * ::88a ### This is free software; you can redistribute it * +# * ::::888a 8a ##::. and/or modify it under the terms of the GNU * +# * ::::::::888a88a[]::: Lesser General Public License as published by * +# *::8:::::::::SUNDOGa8a::. the Free Software Foundation, either version 3 of * +# *::::::::8::::888:Y8888:: the License, or (at your option) * +# *::::':::88::::888::Y88a::::::::::::... any later version. * +# *::'::.. . ..... .. ... . * +# * This software is distributed in the hope that it will be useful, but * +# * WITHOUT ANY WARRANTY; without even the implied warranty of * +# * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General * +# * Public License for more details. * +# * * +# * You should have received a copy of the GNU Lesser General Public * +# * License along with software; if not, write to the Free Software * +# * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * +# * * +# * Clan, the Chunky Loop Analyser * +# * Written by Cedric Bastoul, Cedric.Bastoul@inria.fr * +# * * +# *****************************************************************************/ + + +./$CHECKER "Complex test suite" "$TEST_FILES" diff --git a/clan/tests/check_unitary.sh b/clan/tests/check_unitary.sh new file mode 100755 index 0000000..1465c51 --- /dev/null +++ b/clan/tests/check_unitary.sh @@ -0,0 +1,40 @@ +#! /bin/sh +# +# /**------- <| --------------------------------------------------------** +# ** A Clan ** +# **--- /.\ -----------------------------------------------------** +# ** <| [""M# check_unitary.sh ** +# **- A | # -----------------------------------------------------** +# ** /.\ [""M# First version: 30/04/2008 ** +# **- [""M# | # U"U#U -----------------------------------------------** +# | # | # \ .:/ +# | # | #___| # +# ****** | "--' .-" ***************************************************** +# * |"-"-"-"-"-#-#-## Clan : the Chunky Loop Analyser (experimental) * +# **** | # ## ###### **************************************************** +# * \ .::::'/ * +# * \ ::::'/ Copyright (C) 2008 Cedric Bastoul * +# * :8a| # # ## * +# * ::88a ### This is free software; you can redistribute it * +# * ::::888a 8a ##::. and/or modify it under the terms of the GNU * +# * ::::::::888a88a[]::: Lesser General Public License as published by * +# *::8:::::::::SUNDOGa8a::. the Free Software Foundation, either version 3 of * +# *::::::::8::::888:Y8888:: the License, or (at your option) * +# *::::':::88::::888::Y88a::::::::::::... any later version. * +# *::'::.. . ..... .. ... . * +# * This software is distributed in the hope that it will be useful, but * +# * WITHOUT ANY WARRANTY; without even the implied warranty of * +# * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General * +# * Public License for more details. * +# * * +# * You should have received a copy of the GNU Lesser General Public * +# * License along with software; if not, write to the Free Software * +# * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * +# * * +# * Clan, the Chunky Loop Analyser * +# * Written by Cedric Bastoul, Cedric.Bastoul@inria.fr * +# * * +# *****************************************************************************/ + + +./$CHECKER "Unitary test suite" "$UNITARY_TEST_FILES" diff --git a/clan/tests/checker.sh b/clan/tests/checker.sh new file mode 100755 index 0000000..7de0db9 --- /dev/null +++ b/clan/tests/checker.sh @@ -0,0 +1,85 @@ +#! /bin/sh +# +# /**------- <| --------------------------------------------------------** +# ** A Clan ** +# **--- /.\ -----------------------------------------------------** +# ** <| [""M# checker.sh ** +# **- A | # -----------------------------------------------------** +# ** /.\ [""M# First version: 30/04/2008 ** +# **- [""M# | # U"U#U -----------------------------------------------** +# | # | # \ .:/ +# | # | #___| # +# ****** | "--' .-" ***************************************************** +# * |"-"-"-"-"-#-#-## Clan : the Chunky Loop Analyser (experimental) * +# **** | # ## ###### **************************************************** +# * \ .::::'/ * +# * \ ::::'/ Copyright (C) 2008 Cedric Bastoul * +# * :8a| # # ## * +# * ::88a ### This is free software; you can redistribute it * +# * ::::888a 8a ##::. and/or modify it under the terms of the GNU * +# * ::::::::888a88a[]::: Lesser General Public License as published by * +# *::8:::::::::SUNDOGa8a::. the Free Software Foundation, either version 3 of * +# *::::::::8::::888:Y8888:: the License, or (at your option) * +# *::::':::88::::888::Y88a::::::::::::... any later version. * +# *::'::.. . ..... .. ... . * +# * This software is distributed in the hope that it will be useful, but * +# * WITHOUT ANY WARRANTY; without even the implied warranty of * +# * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General * +# * Public License for more details. * +# * * +# * You should have received a copy of the GNU Lesser General Public * +# * License along with software; if not, write to the Free Software * +# * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * +# * * +# * Clan, the Chunky Loop Analyser * +# * Written by Cedric Bastoul, Cedric.Bastoul@inria.fr * +# * * +# *****************************************************************************/ + +output=0 +nb_tests=0; +TEST_FILES="$2"; +echo "[CHECK:] $1"; +for i in $TEST_FILES; do + nb_tests=$(($nb_tests + 1)) + outtemp=0 + echo "[TEST:] Source parser test:== $i =="; + $top_builddir/source/clan $i -arraystag > $i.test 2>/tmp/clanout + z=`diff --ignore-matching-lines='generated by ' $i.test $i.scop 2>&1` + err=`cat /tmp/clanout`; + if ! [ -z "$z" ]; then + echo -e "\033[31m[FAIL:] Source parser test: Wrong .scop generated\033[0m"; + outtemp=1; + output=1 + fi + if ! [ -z "$err" ]; then + if [ $outtemp = "0" ]; then + echo "[INFO:] Source parser test: .scop OK"; + fi + echo -e "\033[31m[FAIL:] Source parser test: stderr output: $err\033[0m"; + outtemp=1 + output=1 + fi + if [ $outtemp = "0" ]; then + echo "[PASS:] Source parser test: .scop OK"; + rm -f $i.test + fi + rm -f /tmp/clanout + echo "[TEST:] .SCoP parser test:== $i.scop =="; + $top_builddir/source/clan -inputscop $i.scop > $i.parsetest + z=`diff --ignore-matching-lines='generated by ' $i.parsetest $i.scop` + if ! [ -z "$z" ]; then + echo -e "\033[31m[FAIL:] .SCoP parser test: $i\033[0m"; + outtemp=1 + output=1 + else + echo "[PASS:] .SCoP parser test: .scop re-OK"; + rm -f $i.parsetest + fi +done +if [ $output = "1" ]; then + echo -e "\033[31m[FAIL:] $1\033[0m"; +else + echo "[PASS:] $1 ($nb_tests + $nb_tests tests)"; +fi +exit $output diff --git a/clan/tests/gauss.c b/clan/tests/gauss.c new file mode 100644 index 0000000..2f131d4 --- /dev/null +++ b/clan/tests/gauss.c @@ -0,0 +1,21 @@ +int n; + +void main(void) +{ + int i,j,k,l; + double **a,s; + +#pragma scop + for(k = 1; k <= n; k++) + { + s = 1/a[k][k]; + + for(l = k+1; l <= n; l++) + a[l][k] = a[l][k]*s; + + for(j = k+1; j <= n+1; j++) + for(i = k+1; i <= n; i++) + a[i][j] = a[i][j] - a[k][j] * a[i][k]; + } +#pragma endscop +} diff --git a/clan/tests/gauss.c.scop b/clan/tests/gauss.c.scop new file mode 100644 index 0000000..a70f22a --- /dev/null +++ b/clan/tests/gauss.c.scop @@ -0,0 +1,180 @@ +# +# <| +# A +# /.\ +# <| [""M# +# A | # Clan McCloog Castle +# /.\ [""M# [File generated by Clan 0.5.0 64 bits] +# [""M# | # U"U#U +# | # | # \ .:/ +# | # | #___| # +# | "--' .-" +# |"-"-"-"-"-#-#-## +# | # ## ###### +# \ .::::'/ +# \ ::::'/ +# :8a| # # ## +# ::88a ### +# ::::888a 8a ##::. +# ::::::888a88a[]:::: +# :::::::::SUNDOGa8a::::. .. +# :::::8::::888:Y8888:::::::::... +#::':::88::::888::Y88a______________________________________________________ +#:: ::::88a::::88a:Y88a __---__-- __ +#' .: ::Y88a:::::8a:Y88a __----_-- -------_-__ +# :' ::::8P::::::::::88aa. _ _- -- --_ --- __ --- __-- +#.:: :::::::::::::::::::Y88as88a...s88aa. + +SCoP + +# =============================================== Global +# Language +C + +# Context +0 3 + +# Parameter names are provided +1 +# Parameter names +n + +# Number of statements +3 + +# =============================================== Statement 1 +# ---------------------------------------------- 1.1 Domain +# Iteration domain +1 +2 4 + 1 1 0 -1 ## k-1 >= 0 + 1 -1 1 0 ## -k+n >= 0 + +# ---------------------------------------------- 1.2 Scattering +# Scattering function is provided +1 +# Scattering function +3 4 + 0 0 0 0 ## 0 + 0 1 0 0 ## k + 0 0 0 0 ## 0 + +# ---------------------------------------------- 1.3 Access +# Access informations are provided +1 +# Read access informations +2 4 + 2 1 0 0 ## a[k][k] + 0 1 0 0 ## +# Write access informations +1 4 + 1 0 0 0 ## s[0] + +# ---------------------------------------------- 1.4 Body +# Statement body is provided +1 +# Original iterator names +k +# Statement body +s=1/a[k][k]; + + +# =============================================== Statement 2 +# ---------------------------------------------- 2.1 Domain +# Iteration domain +1 +4 5 + 1 1 0 0 -1 ## k-1 >= 0 + 1 -1 0 1 0 ## -k+n >= 0 + 1 -1 1 0 -1 ## -k+l-1 >= 0 + 1 0 -1 1 0 ## -l+n >= 0 + +# ---------------------------------------------- 2.2 Scattering +# Scattering function is provided +1 +# Scattering function +5 5 + 0 0 0 0 0 ## 0 + 0 1 0 0 0 ## k + 0 0 0 0 1 ## 1 + 0 0 1 0 0 ## l + 0 0 0 0 0 ## 0 + +# ---------------------------------------------- 2.3 Access +# Access informations are provided +1 +# Read access informations +3 5 + 2 0 1 0 0 ## a[l][k] + 0 1 0 0 0 ## + 1 0 0 0 0 ## s[0] +# Write access informations +2 5 + 2 0 1 0 0 ## a[l][k] + 0 1 0 0 0 ## + +# ---------------------------------------------- 2.4 Body +# Statement body is provided +1 +# Original iterator names +k l +# Statement body +a[l][k]=a[l][k]*s; + + +# =============================================== Statement 3 +# ---------------------------------------------- 3.1 Domain +# Iteration domain +1 +6 6 + 1 1 0 0 0 -1 ## k-1 >= 0 + 1 -1 0 0 1 0 ## -k+n >= 0 + 1 -1 1 0 0 -1 ## -k+j-1 >= 0 + 1 0 -1 0 1 1 ## -j+n+1 >= 0 + 1 -1 0 1 0 -1 ## -k+i-1 >= 0 + 1 0 0 -1 1 0 ## -i+n >= 0 + +# ---------------------------------------------- 3.2 Scattering +# Scattering function is provided +1 +# Scattering function +7 6 + 0 0 0 0 0 0 ## 0 + 0 1 0 0 0 0 ## k + 0 0 0 0 0 2 ## 2 + 0 0 1 0 0 0 ## j + 0 0 0 0 0 0 ## 0 + 0 0 0 1 0 0 ## i + 0 0 0 0 0 0 ## 0 + +# ---------------------------------------------- 3.3 Access +# Access informations are provided +1 +# Read access informations +6 6 + 2 0 0 1 0 0 ## a[i][j] + 0 0 1 0 0 0 ## + 2 1 0 0 0 0 ## a[k][j] + 0 0 1 0 0 0 ## + 2 0 0 1 0 0 ## a[i][k] + 0 1 0 0 0 0 ## +# Write access informations +2 6 + 2 0 0 1 0 0 ## a[i][j] + 0 0 1 0 0 0 ## + +# ---------------------------------------------- 3.4 Body +# Statement body is provided +1 +# Original iterator names +k j i +# Statement body +a[i][j]=a[i][j]-a[k][j]*a[i][k]; + + +# =============================================== Options + +2 +1 s +2 a + diff --git a/clan/tests/gemver.c b/clan/tests/gemver.c new file mode 100644 index 0000000..da32b4b --- /dev/null +++ b/clan/tests/gemver.c @@ -0,0 +1,28 @@ +#include +#define n 100 + +int main() +{ int i=0, j=0, N=n, alpha, beta; + float A[n][n], u1[n], u2[n], v1[n], v2[n], w[n], x[n], y[n], z[n]; + + /* GEMVER kernel */ +#pragma scop + for (i=0; i= 0 + 1 -1 0 1 -1 ## -i+N-1 >= 0 + 1 0 1 0 0 ## j >= 0 + 1 0 -1 1 -1 ## -j+N-1 >= 0 + +# ---------------------------------------------- 1.2 Scattering +# Scattering function is provided +1 +# Scattering function +5 5 + 0 0 0 0 0 ## 0 + 0 1 0 0 0 ## i + 0 0 0 0 0 ## 0 + 0 0 1 0 0 ## j + 0 0 0 0 0 ## 0 + +# ---------------------------------------------- 1.3 Access +# Access informations are provided +1 +# Read access informations +6 5 + 1 1 0 0 0 ## A[i][j] + 0 0 1 0 0 ## + 2 1 0 0 0 ## u1[i] + 3 0 1 0 0 ## v1[j] + 4 1 0 0 0 ## u2[i] + 5 0 1 0 0 ## v2[j] +# Write access informations +2 5 + 1 1 0 0 0 ## A[i][j] + 0 0 1 0 0 ## + +# ---------------------------------------------- 1.4 Body +# Statement body is provided +1 +# Original iterator names +i j +# Statement body +A[i][j]=A[i][j]+u1[i]*v1[j]+u2[i]*v2[j]; + + +# =============================================== Statement 2 +# ---------------------------------------------- 2.1 Domain +# Iteration domain +1 +4 5 + 1 1 0 0 0 ## i >= 0 + 1 -1 0 1 -1 ## -i+N-1 >= 0 + 1 0 1 0 0 ## j >= 0 + 1 0 -1 1 -1 ## -j+N-1 >= 0 + +# ---------------------------------------------- 2.2 Scattering +# Scattering function is provided +1 +# Scattering function +5 5 + 0 0 0 0 1 ## 1 + 0 1 0 0 0 ## i + 0 0 0 0 0 ## 0 + 0 0 1 0 0 ## j + 0 0 0 0 0 ## 0 + +# ---------------------------------------------- 2.3 Access +# Access informations are provided +1 +# Read access informations +5 5 + 6 1 0 0 0 ## x[i] + 7 0 0 0 0 ## beta[0] + 1 1 0 0 0 ## A[i][j] + 0 0 1 0 0 ## + 8 0 1 0 0 ## y[j] +# Write access informations +1 5 + 6 1 0 0 0 ## x[i] + +# ---------------------------------------------- 2.4 Body +# Statement body is provided +1 +# Original iterator names +i j +# Statement body +x[i]=x[i]+beta*A[i][j]*y[j]; + + +# =============================================== Statement 3 +# ---------------------------------------------- 3.1 Domain +# Iteration domain +1 +2 4 + 1 1 0 0 ## i >= 0 + 1 -1 1 -1 ## -i+N-1 >= 0 + +# ---------------------------------------------- 3.2 Scattering +# Scattering function is provided +1 +# Scattering function +3 4 + 0 0 0 2 ## 2 + 0 1 0 0 ## i + 0 0 0 0 ## 0 + +# ---------------------------------------------- 3.3 Access +# Access informations are provided +1 +# Read access informations +2 4 + 6 1 0 0 ## x[i] + 9 1 0 0 ## z[i] +# Write access informations +1 4 + 6 1 0 0 ## x[i] + +# ---------------------------------------------- 3.4 Body +# Statement body is provided +1 +# Original iterator names +i +# Statement body +x[i]=x[i]+z[i]; + + +# =============================================== Statement 4 +# ---------------------------------------------- 4.1 Domain +# Iteration domain +1 +4 5 + 1 1 0 0 0 ## i >= 0 + 1 -1 0 1 -1 ## -i+N-1 >= 0 + 1 0 1 0 0 ## j >= 0 + 1 0 -1 1 -1 ## -j+N-1 >= 0 + +# ---------------------------------------------- 4.2 Scattering +# Scattering function is provided +1 +# Scattering function +5 5 + 0 0 0 0 3 ## 3 + 0 1 0 0 0 ## i + 0 0 0 0 0 ## 0 + 0 0 1 0 0 ## j + 0 0 0 0 0 ## 0 + +# ---------------------------------------------- 4.3 Access +# Access informations are provided +1 +# Read access informations +5 5 + 10 1 0 0 0 ## w[i] + 11 0 0 0 0 ## alpha[0] + 1 1 0 0 0 ## A[i][j] + 0 0 1 0 0 ## + 6 0 1 0 0 ## x[j] +# Write access informations +1 5 + 10 1 0 0 0 ## w[i] + +# ---------------------------------------------- 4.4 Body +# Statement body is provided +1 +# Original iterator names +i j +# Statement body +w[i]=w[i]+alpha*A[i][j]*x[j]; + + +# =============================================== Options + +11 +1 A +2 u1 +3 v1 +4 u2 +5 v2 +6 x +7 beta +8 y +9 z +10 w +11 alpha + diff --git a/clan/tests/iir_4_64.c b/clan/tests/iir_4_64.c new file mode 100644 index 0000000..b8bfe4d --- /dev/null +++ b/clan/tests/iir_4_64.c @@ -0,0 +1,83 @@ +/* 4-cascaded IIR biquad filter processing 64 points */ +/* Modified to use arrays - SMP */ + +//#include "traps.h" + +#define NPOINTS 64 +#define NSECTIONS 4 + +float input[NPOINTS]; +float output[NPOINTS]; +float coefficient[NSECTIONS][NSECTIONS][NSECTIONS]; +float internal_state[8][NSECTIONS][2]; + +void iir(float input[NPOINTS], float output[NPOINTS], + float coefficient[NSECTIONS][NSECTIONS][NSECTIONS], + float internal_state[8][NSECTIONS][2]); + +main() +{ + int i; + + float *pcoef = coefficient[0][0]; + float *pint = internal_state[0][0]; + + for(i=0;i= 0 + 1 -1 0 1 0 0 -1 ## -j+NSECTIONS-1 >= 0 + +# ---------------------------------------------- 2.2 Scattering +# Scattering function is provided +1 +# Scattering function +3 7 + 0 0 0 0 0 0 1 ## 1 + 0 1 0 0 0 0 0 ## j + 0 0 0 0 0 0 0 ## 0 + +# ---------------------------------------------- 2.3 Access +# Access informations are provided +1 +# Read access informations +3 7 + 4 0 0 0 1 0 0 ## internal_state[imod8][j][0] + 0 1 0 0 0 0 0 ## + 0 0 0 0 0 0 0 ## +# Write access informations +1 7 + 3 0 0 0 0 0 0 ## state_2[0] + +# ---------------------------------------------- 2.4 Body +# Statement body is provided +1 +# Original iterator names +j +# Statement body +state_2=internal_state[imod8][j][0]; + + +# =============================================== Statement 3 +# ---------------------------------------------- 3.1 Domain +# Iteration domain +1 +2 7 + 1 1 0 0 0 0 0 ## j >= 0 + 1 -1 0 1 0 0 -1 ## -j+NSECTIONS-1 >= 0 + +# ---------------------------------------------- 3.2 Scattering +# Scattering function is provided +1 +# Scattering function +3 7 + 0 0 0 0 0 0 1 ## 1 + 0 1 0 0 0 0 0 ## j + 0 0 0 0 0 0 1 ## 1 + +# ---------------------------------------------- 3.3 Access +# Access informations are provided +1 +# Read access informations +3 7 + 4 0 0 0 1 0 0 ## internal_state[imod8][j][1] + 0 1 0 0 0 0 0 ## + 0 0 0 0 0 0 1 ## +# Write access informations +1 7 + 5 0 0 0 0 0 0 ## state_1[0] + +# ---------------------------------------------- 3.4 Body +# Statement body is provided +1 +# Original iterator names +j +# Statement body +state_1=internal_state[imod8][j][1]; + + +# =============================================== Statement 4 +# ---------------------------------------------- 4.1 Domain +# Iteration domain +1 +2 7 + 1 1 0 0 0 0 0 ## j >= 0 + 1 -1 0 1 0 0 -1 ## -j+NSECTIONS-1 >= 0 + +# ---------------------------------------------- 4.2 Scattering +# Scattering function is provided +1 +# Scattering function +3 7 + 0 0 0 0 0 0 1 ## 1 + 0 1 0 0 0 0 0 ## j + 0 0 0 0 0 0 2 ## 2 + +# ---------------------------------------------- 4.3 Access +# Access informations are provided +1 +# Read access informations +13 7 + 1 0 0 0 0 0 0 ## sum[0] + 4 0 0 0 1 0 0 ## internal_state[imod8][j][0] + 0 1 0 0 0 0 0 ## + 0 0 0 0 0 0 0 ## + 6 0 0 0 0 1 0 ## coefficient[imodNSECTIONS][j][0] + 0 1 0 0 0 0 0 ## + 0 0 0 0 0 0 0 ## + 4 0 0 0 1 0 0 ## internal_state[imod8][j][1] + 0 1 0 0 0 0 0 ## + 0 0 0 0 0 0 1 ## + 6 0 0 0 0 1 0 ## coefficient[imodNSECTIONS][j][1] + 0 1 0 0 0 0 0 ## + 0 0 0 0 0 0 1 ## +# Write access informations +1 7 + 1 0 0 0 0 0 0 ## sum[0] + +# ---------------------------------------------- 4.4 Body +# Statement body is provided +1 +# Original iterator names +j +# Statement body +sum-=internal_state[imod8][j][0]*coefficient[imodNSECTIONS][j][0]+internal_state[imod8][j][1]*coefficient[imodNSECTIONS][j][1]; + + +# =============================================== Statement 5 +# ---------------------------------------------- 5.1 Domain +# Iteration domain +1 +2 7 + 1 1 0 0 0 0 0 ## j >= 0 + 1 -1 0 1 0 0 -1 ## -j+NSECTIONS-1 >= 0 + +# ---------------------------------------------- 5.2 Scattering +# Scattering function is provided +1 +# Scattering function +3 7 + 0 0 0 0 0 0 1 ## 1 + 0 1 0 0 0 0 0 ## j + 0 0 0 0 0 0 3 ## 3 + +# ---------------------------------------------- 5.3 Access +# Access informations are provided +1 +# Read access informations +3 7 + 4 0 0 0 1 0 0 ## internal_state[imod8][j][1] + 0 1 0 0 0 0 0 ## + 0 0 0 0 0 0 1 ## +# Write access informations +3 7 + 4 0 0 0 1 0 0 ## internal_state[imod8][j][0] + 0 1 0 0 0 0 0 ## + 0 0 0 0 0 0 0 ## + +# ---------------------------------------------- 5.4 Body +# Statement body is provided +1 +# Original iterator names +j +# Statement body +internal_state[imod8][j][0]=internal_state[imod8][j][1]; + + +# =============================================== Statement 6 +# ---------------------------------------------- 6.1 Domain +# Iteration domain +1 +2 7 + 1 1 0 0 0 0 0 ## j >= 0 + 1 -1 0 1 0 0 -1 ## -j+NSECTIONS-1 >= 0 + +# ---------------------------------------------- 6.2 Scattering +# Scattering function is provided +1 +# Scattering function +3 7 + 0 0 0 0 0 0 1 ## 1 + 0 1 0 0 0 0 0 ## j + 0 0 0 0 0 0 4 ## 4 + +# ---------------------------------------------- 6.3 Access +# Access informations are provided +1 +# Read access informations +1 7 + 1 0 0 0 0 0 0 ## sum[0] +# Write access informations +3 7 + 4 0 0 0 1 0 0 ## internal_state[imod8][j][1] + 0 1 0 0 0 0 0 ## + 0 0 0 0 0 0 1 ## + +# ---------------------------------------------- 6.4 Body +# Statement body is provided +1 +# Original iterator names +j +# Statement body +internal_state[imod8][j][1]=sum; + + +# =============================================== Statement 7 +# ---------------------------------------------- 7.1 Domain +# Iteration domain +1 +2 7 + 1 1 0 0 0 0 0 ## j >= 0 + 1 -1 0 1 0 0 -1 ## -j+NSECTIONS-1 >= 0 + +# ---------------------------------------------- 7.2 Scattering +# Scattering function is provided +1 +# Scattering function +3 7 + 0 0 0 0 0 0 1 ## 1 + 0 1 0 0 0 0 0 ## j + 0 0 0 0 0 0 5 ## 5 + +# ---------------------------------------------- 7.3 Access +# Access informations are provided +1 +# Read access informations +9 7 + 1 0 0 0 0 0 0 ## sum[0] + 3 0 0 0 0 0 0 ## state_2[0] + 6 0 0 0 0 1 0 ## coefficient[imodNSECTIONS][j][2] + 0 1 0 0 0 0 0 ## + 0 0 0 0 0 0 2 ## + 5 0 0 0 0 0 0 ## state_1[0] + 6 0 0 0 0 1 0 ## coefficient[imodNSECTIONS][j][3] + 0 1 0 0 0 0 0 ## + 0 0 0 0 0 0 3 ## +# Write access informations +1 7 + 1 0 0 0 0 0 0 ## sum[0] + +# ---------------------------------------------- 7.4 Body +# Statement body is provided +1 +# Original iterator names +j +# Statement body +sum+=state_2*coefficient[imodNSECTIONS][j][2]+state_1*coefficient[imodNSECTIONS][j][3]; + + +# =============================================== Statement 8 +# ---------------------------------------------- 8.1 Domain +# Iteration domain +1 +1 7 + 0 1 0 0 0 0 0 ## fakeiter == 0 + +# ---------------------------------------------- 8.2 Scattering +# Scattering function is provided +1 +# Scattering function +3 7 + 0 0 0 0 0 0 2 ## 2 + 0 1 0 0 0 0 0 ## fakeiter + 0 0 0 0 0 0 6 ## 6 + +# ---------------------------------------------- 8.3 Access +# Access informations are provided +1 +# Read access informations +1 7 + 1 0 0 0 0 0 0 ## sum[0] +# Write access informations +1 7 + 7 0 1 0 0 0 0 ## output[i] + +# ---------------------------------------------- 8.4 Body +# Statement body is provided +1 +# Original iterator names +fakeiter +# Statement body +output[i]=sum; + + +# =============================================== Options + +7 +1 sum +2 input +3 state_2 +4 internal_state +5 state_1 +6 coefficient +7 output + diff --git a/clan/tests/matmul.c b/clan/tests/matmul.c new file mode 100644 index 0000000..4e91c1e --- /dev/null +++ b/clan/tests/matmul.c @@ -0,0 +1,40 @@ +/* matmul.c 128*128 matrix multiply */ +#include +#define N 128 + +int main() +{ + int i,j,k; + float a[N][N], b[N][N], c[N][N]; + + /* We read matrix a */ + for(i=0; i= 0 + 1 -1 0 1 -1 ## -i+N-1 >= 0 + 1 0 1 0 0 ## j >= 0 + 1 0 -1 1 -1 ## -j+N-1 >= 0 + +# ---------------------------------------------- 1.2 Scattering +# Scattering function is provided +1 +# Scattering function +5 5 + 0 0 0 0 0 ## 0 + 0 1 0 0 0 ## i + 0 0 0 0 0 ## 0 + 0 0 1 0 0 ## j + 0 0 0 0 0 ## 0 + +# ---------------------------------------------- 1.3 Access +# Access informations are provided +1 +# Read access informations +0 5 +# Write access informations +2 5 + 1 1 0 0 0 ## c[i][j] + 0 0 1 0 0 ## + +# ---------------------------------------------- 1.4 Body +# Statement body is provided +1 +# Original iterator names +i j +# Statement body +c[i][j]=0.0; + + +# =============================================== Statement 2 +# ---------------------------------------------- 2.1 Domain +# Iteration domain +1 +6 6 + 1 1 0 0 0 0 ## i >= 0 + 1 -1 0 0 1 -1 ## -i+N-1 >= 0 + 1 0 1 0 0 0 ## j >= 0 + 1 0 -1 0 1 -1 ## -j+N-1 >= 0 + 1 0 0 1 0 0 ## k >= 0 + 1 0 0 -1 1 -1 ## -k+N-1 >= 0 + +# ---------------------------------------------- 2.2 Scattering +# Scattering function is provided +1 +# Scattering function +7 6 + 0 0 0 0 0 0 ## 0 + 0 1 0 0 0 0 ## i + 0 0 0 0 0 0 ## 0 + 0 0 1 0 0 0 ## j + 0 0 0 0 0 1 ## 1 + 0 0 0 1 0 0 ## k + 0 0 0 0 0 0 ## 0 + +# ---------------------------------------------- 2.3 Access +# Access informations are provided +1 +# Read access informations +6 6 + 1 1 0 0 0 0 ## c[i][j] + 0 0 1 0 0 0 ## + 2 1 0 0 0 0 ## a[i][k] + 0 0 0 1 0 0 ## + 3 0 0 1 0 0 ## b[k][j] + 0 0 1 0 0 0 ## +# Write access informations +2 6 + 1 1 0 0 0 0 ## c[i][j] + 0 0 1 0 0 0 ## + +# ---------------------------------------------- 2.4 Body +# Statement body is provided +1 +# Original iterator names +i j k +# Statement body +c[i][j]=c[i][j]+a[i][k]*b[k][j]; + + +# =============================================== Options + +3 +1 c +2 a +3 b + diff --git a/clan/tests/swim.c b/clan/tests/swim.c new file mode 100644 index 0000000..730cc7f --- /dev/null +++ b/clan/tests/swim.c @@ -0,0 +1,153 @@ +#include +#include +#include + +#include + +#include "decls.h" +#include "util.h" + +double t_start, t_end; + +main () +{ + int t, i, j; + int N3 = P_N3 ; + int M = P_M ; + int N = P_N ; + int ALPHA = P_ALPHA ; + int DX = P_DX ; + int DY = P_DY ; + int TDT = P_TDT ; + int DT = P_DT ; + + init(); + +#ifdef PERFCTR + PERF_INIT; +#endif + + IF_TIME(t_start = rtclock()); + + + /* pluto start (M,N,N3) */ +#pragma scop + + for (t=0; t= 0 + 1 -1 1 0 0 -1 ## -t+N3-1 >= 0 + +# ---------------------------------------------- 1.2 Scattering +# Scattering function is provided +1 +# Scattering function +3 6 + 0 0 0 0 0 0 ## 0 + 0 1 0 0 0 0 ## t + 0 0 0 0 0 0 ## 0 + +# ---------------------------------------------- 1.3 Access +# Access informations are provided +1 +# Read access informations +1 6 + 2 0 0 0 0 0 ## DX[0] +# Write access informations +1 6 + 1 0 0 0 0 0 ## FSDX[0] + +# ---------------------------------------------- 1.4 Body +# Statement body is provided +1 +# Original iterator names +t +# Statement body +FSDX=4/DX; + + +# =============================================== Statement 2 +# ---------------------------------------------- 2.1 Domain +# Iteration domain +1 +2 6 + 1 1 0 0 0 0 ## t >= 0 + 1 -1 1 0 0 -1 ## -t+N3-1 >= 0 + +# ---------------------------------------------- 2.2 Scattering +# Scattering function is provided +1 +# Scattering function +3 6 + 0 0 0 0 0 0 ## 0 + 0 1 0 0 0 0 ## t + 0 0 0 0 0 1 ## 1 + +# ---------------------------------------------- 2.3 Access +# Access informations are provided +1 +# Read access informations +1 6 + 4 0 0 0 0 0 ## DY[0] +# Write access informations +1 6 + 3 0 0 0 0 0 ## FSDY[0] + +# ---------------------------------------------- 2.4 Body +# Statement body is provided +1 +# Original iterator names +t +# Statement body +FSDY=4/DY; + + +# =============================================== Statement 3 +# ---------------------------------------------- 3.1 Domain +# Iteration domain +1 +6 8 + 1 1 0 0 0 0 0 0 ## t >= 0 + 1 -1 0 0 1 0 0 -1 ## -t+N3-1 >= 0 + 1 0 1 0 0 0 0 0 ## i >= 0 + 1 0 -1 0 0 1 0 -1 ## -i+M-1 >= 0 + 1 0 0 1 0 0 0 0 ## j >= 0 + 1 0 0 -1 0 0 1 -1 ## -j+N-1 >= 0 + +# ---------------------------------------------- 3.2 Scattering +# Scattering function is provided +1 +# Scattering function +7 8 + 0 0 0 0 0 0 0 0 ## 0 + 0 1 0 0 0 0 0 0 ## t + 0 0 0 0 0 0 0 2 ## 2 + 0 0 1 0 0 0 0 0 ## i + 0 0 0 0 0 0 0 0 ## 0 + 0 0 0 1 0 0 0 0 ## j + 0 0 0 0 0 0 0 0 ## 0 + +# ---------------------------------------------- 3.3 Access +# Access informations are provided +1 +# Read access informations +6 8 + 6 0 1 0 0 0 0 1 ## P[i+1][j] + 0 0 0 1 0 0 0 0 ## + 6 0 1 0 0 0 0 0 ## P[i][j] + 0 0 0 1 0 0 0 0 ## + 7 0 1 0 0 0 0 1 ## U[i+1][j] + 0 0 0 1 0 0 0 0 ## +# Write access informations +2 8 + 5 0 1 0 0 0 0 1 ## CU[i+1][j] + 0 0 0 1 0 0 0 0 ## + +# ---------------------------------------------- 3.4 Body +# Statement body is provided +1 +# Original iterator names +t i j +# Statement body +CU[i+1][j]=0.5*(P[i+1][j]+P[i][j])*U[i+1][j]; + + +# =============================================== Statement 4 +# ---------------------------------------------- 4.1 Domain +# Iteration domain +1 +6 8 + 1 1 0 0 0 0 0 0 ## t >= 0 + 1 -1 0 0 1 0 0 -1 ## -t+N3-1 >= 0 + 1 0 1 0 0 0 0 0 ## i >= 0 + 1 0 -1 0 0 1 0 -1 ## -i+M-1 >= 0 + 1 0 0 1 0 0 0 0 ## j >= 0 + 1 0 0 -1 0 0 1 -1 ## -j+N-1 >= 0 + +# ---------------------------------------------- 4.2 Scattering +# Scattering function is provided +1 +# Scattering function +7 8 + 0 0 0 0 0 0 0 0 ## 0 + 0 1 0 0 0 0 0 0 ## t + 0 0 0 0 0 0 0 2 ## 2 + 0 0 1 0 0 0 0 0 ## i + 0 0 0 0 0 0 0 0 ## 0 + 0 0 0 1 0 0 0 0 ## j + 0 0 0 0 0 0 0 1 ## 1 + +# ---------------------------------------------- 4.3 Access +# Access informations are provided +1 +# Read access informations +6 8 + 6 0 1 0 0 0 0 0 ## P[i][j+1] + 0 0 0 1 0 0 0 1 ## + 6 0 1 0 0 0 0 0 ## P[i][j] + 0 0 0 1 0 0 0 0 ## + 9 0 1 0 0 0 0 0 ## V[i][j+1] + 0 0 0 1 0 0 0 1 ## +# Write access informations +2 8 + 8 0 1 0 0 0 0 0 ## CV[i][j+1] + 0 0 0 1 0 0 0 1 ## + +# ---------------------------------------------- 4.4 Body +# Statement body is provided +1 +# Original iterator names +t i j +# Statement body +CV[i][j+1]=0.5*(P[i][j+1]+P[i][j])*V[i][j+1]; + + +# =============================================== Statement 5 +# ---------------------------------------------- 5.1 Domain +# Iteration domain +1 +6 8 + 1 1 0 0 0 0 0 0 ## t >= 0 + 1 -1 0 0 1 0 0 -1 ## -t+N3-1 >= 0 + 1 0 1 0 0 0 0 0 ## i >= 0 + 1 0 -1 0 0 1 0 -1 ## -i+M-1 >= 0 + 1 0 0 1 0 0 0 0 ## j >= 0 + 1 0 0 -1 0 0 1 -1 ## -j+N-1 >= 0 + +# ---------------------------------------------- 5.2 Scattering +# Scattering function is provided +1 +# Scattering function +7 8 + 0 0 0 0 0 0 0 0 ## 0 + 0 1 0 0 0 0 0 0 ## t + 0 0 0 0 0 0 0 2 ## 2 + 0 0 1 0 0 0 0 0 ## i + 0 0 0 0 0 0 0 0 ## 0 + 0 0 0 1 0 0 0 0 ## j + 0 0 0 0 0 0 0 2 ## 2 + +# ---------------------------------------------- 5.3 Access +# Access informations are provided +1 +# Read access informations +18 8 + 1 0 0 0 0 0 0 0 ## FSDX[0] + 9 0 1 0 0 0 0 1 ## V[i+1][j+1] + 0 0 0 1 0 0 0 1 ## + 9 0 1 0 0 0 0 0 ## V[i][j+1] + 0 0 0 1 0 0 0 1 ## + 3 0 0 0 0 0 0 0 ## FSDY[0] + 7 0 1 0 0 0 0 1 ## U[i+1][j+1] + 0 0 0 1 0 0 0 1 ## + 7 0 1 0 0 0 0 1 ## U[i+1][j] + 0 0 0 1 0 0 0 0 ## + 6 0 1 0 0 0 0 0 ## P[i][j] + 0 0 0 1 0 0 0 0 ## + 6 0 1 0 0 0 0 1 ## P[i+1][j] + 0 0 0 1 0 0 0 0 ## + 6 0 1 0 0 0 0 1 ## P[i+1][j+1] + 0 0 0 1 0 0 0 1 ## + 6 0 1 0 0 0 0 0 ## P[i][j+1] + 0 0 0 1 0 0 0 1 ## +# Write access informations +2 8 + 10 0 1 0 0 0 0 1 ## Z[i+1][j+1] + 0 0 0 1 0 0 0 1 ## + +# ---------------------------------------------- 5.4 Body +# Statement body is provided +1 +# Original iterator names +t i j +# Statement body +Z[i+1][j+1]=(FSDX*(V[i+1][j+1]-V[i][j+1])-FSDY*(U[i+1][j+1]-U[i+1][j]))/(P[i][j]+P[i+1][j]+P[i+1][j+1]+P[i][j+1]); + + +# =============================================== Statement 6 +# ---------------------------------------------- 6.1 Domain +# Iteration domain +1 +6 8 + 1 1 0 0 0 0 0 0 ## t >= 0 + 1 -1 0 0 1 0 0 -1 ## -t+N3-1 >= 0 + 1 0 1 0 0 0 0 0 ## i >= 0 + 1 0 -1 0 0 1 0 -1 ## -i+M-1 >= 0 + 1 0 0 1 0 0 0 0 ## j >= 0 + 1 0 0 -1 0 0 1 -1 ## -j+N-1 >= 0 + +# ---------------------------------------------- 6.2 Scattering +# Scattering function is provided +1 +# Scattering function +7 8 + 0 0 0 0 0 0 0 0 ## 0 + 0 1 0 0 0 0 0 0 ## t + 0 0 0 0 0 0 0 2 ## 2 + 0 0 1 0 0 0 0 0 ## i + 0 0 0 0 0 0 0 0 ## 0 + 0 0 0 1 0 0 0 0 ## j + 0 0 0 0 0 0 0 3 ## 3 + +# ---------------------------------------------- 6.3 Access +# Access informations are provided +1 +# Read access informations +18 8 + 6 0 1 0 0 0 0 0 ## P[i][j] + 0 0 0 1 0 0 0 0 ## + 7 0 1 0 0 0 0 1 ## U[i+1][j] + 0 0 0 1 0 0 0 0 ## + 7 0 1 0 0 0 0 1 ## U[i+1][j] + 0 0 0 1 0 0 0 0 ## + 7 0 1 0 0 0 0 0 ## U[i][j] + 0 0 0 1 0 0 0 0 ## + 7 0 1 0 0 0 0 0 ## U[i][j] + 0 0 0 1 0 0 0 0 ## + 9 0 1 0 0 0 0 0 ## V[i][j+1] + 0 0 0 1 0 0 0 1 ## + 9 0 1 0 0 0 0 0 ## V[i][j+1] + 0 0 0 1 0 0 0 1 ## + 9 0 1 0 0 0 0 0 ## V[i][j] + 0 0 0 1 0 0 0 0 ## + 9 0 1 0 0 0 0 0 ## V[i][j] + 0 0 0 1 0 0 0 0 ## +# Write access informations +2 8 + 11 0 1 0 0 0 0 0 ## H[i][j] + 0 0 0 1 0 0 0 0 ## + +# ---------------------------------------------- 6.4 Body +# Statement body is provided +1 +# Original iterator names +t i j +# Statement body +H[i][j]=P[i][j]+0.25*(U[i+1][j]*U[i+1][j]+U[i][j]*U[i][j]+V[i][j+1]*V[i][j+1]+V[i][j]*V[i][j]); + + +# =============================================== Statement 7 +# ---------------------------------------------- 7.1 Domain +# Iteration domain +1 +4 7 + 1 1 0 0 0 0 0 ## t >= 0 + 1 -1 0 1 0 0 -1 ## -t+N3-1 >= 0 + 1 0 1 0 0 0 0 ## j >= 0 + 1 0 -1 0 0 1 -1 ## -j+N-1 >= 0 + +# ---------------------------------------------- 7.2 Scattering +# Scattering function is provided +1 +# Scattering function +5 7 + 0 0 0 0 0 0 0 ## 0 + 0 1 0 0 0 0 0 ## t + 0 0 0 0 0 0 3 ## 3 + 0 0 1 0 0 0 0 ## j + 0 0 0 0 0 0 0 ## 0 + +# ---------------------------------------------- 7.3 Access +# Access informations are provided +1 +# Read access informations +2 7 + 5 0 0 0 1 0 1 ## CU[M+1][j] + 0 0 1 0 0 0 0 ## +# Write access informations +2 7 + 5 0 0 0 0 0 0 ## CU[0][j] + 0 0 1 0 0 0 0 ## + +# ---------------------------------------------- 7.4 Body +# Statement body is provided +1 +# Original iterator names +t j +# Statement body +CU[0][j]=CU[M+1][j]; + + +# =============================================== Statement 8 +# ---------------------------------------------- 8.1 Domain +# Iteration domain +1 +4 7 + 1 1 0 0 0 0 0 ## t >= 0 + 1 -1 0 1 0 0 -1 ## -t+N3-1 >= 0 + 1 0 1 0 0 0 0 ## j >= 0 + 1 0 -1 0 0 1 -1 ## -j+N-1 >= 0 + +# ---------------------------------------------- 8.2 Scattering +# Scattering function is provided +1 +# Scattering function +5 7 + 0 0 0 0 0 0 0 ## 0 + 0 1 0 0 0 0 0 ## t + 0 0 0 0 0 0 3 ## 3 + 0 0 1 0 0 0 0 ## j + 0 0 0 0 0 0 1 ## 1 + +# ---------------------------------------------- 8.3 Access +# Access informations are provided +1 +# Read access informations +2 7 + 8 0 0 0 0 0 0 ## CV[0][j+1] + 0 0 1 0 0 0 1 ## +# Write access informations +2 7 + 8 0 0 0 1 0 0 ## CV[M][j+1] + 0 0 1 0 0 0 1 ## + +# ---------------------------------------------- 8.4 Body +# Statement body is provided +1 +# Original iterator names +t j +# Statement body +CV[M][j+1]=CV[0][j+1]; + + +# =============================================== Statement 9 +# ---------------------------------------------- 9.1 Domain +# Iteration domain +1 +4 7 + 1 1 0 0 0 0 0 ## t >= 0 + 1 -1 0 1 0 0 -1 ## -t+N3-1 >= 0 + 1 0 1 0 0 0 0 ## j >= 0 + 1 0 -1 0 0 1 -1 ## -j+N-1 >= 0 + +# ---------------------------------------------- 9.2 Scattering +# Scattering function is provided +1 +# Scattering function +5 7 + 0 0 0 0 0 0 0 ## 0 + 0 1 0 0 0 0 0 ## t + 0 0 0 0 0 0 3 ## 3 + 0 0 1 0 0 0 0 ## j + 0 0 0 0 0 0 2 ## 2 + +# ---------------------------------------------- 9.3 Access +# Access informations are provided +1 +# Read access informations +2 7 + 10 0 0 0 1 0 0 ## Z[M][j+1] + 0 0 1 0 0 0 1 ## +# Write access informations +2 7 + 10 0 0 0 0 0 0 ## Z[0][j+1] + 0 0 1 0 0 0 1 ## + +# ---------------------------------------------- 9.4 Body +# Statement body is provided +1 +# Original iterator names +t j +# Statement body +Z[0][j+1]=Z[M][j+1]; + + +# =============================================== Statement 10 +# ---------------------------------------------- 10.1 Domain +# Iteration domain +1 +4 7 + 1 1 0 0 0 0 0 ## t >= 0 + 1 -1 0 1 0 0 -1 ## -t+N3-1 >= 0 + 1 0 1 0 0 0 0 ## j >= 0 + 1 0 -1 0 0 1 -1 ## -j+N-1 >= 0 + +# ---------------------------------------------- 10.2 Scattering +# Scattering function is provided +1 +# Scattering function +5 7 + 0 0 0 0 0 0 0 ## 0 + 0 1 0 0 0 0 0 ## t + 0 0 0 0 0 0 3 ## 3 + 0 0 1 0 0 0 0 ## j + 0 0 0 0 0 0 3 ## 3 + +# ---------------------------------------------- 10.3 Access +# Access informations are provided +1 +# Read access informations +2 7 + 11 0 0 0 0 0 0 ## H[0][j] + 0 0 1 0 0 0 0 ## +# Write access informations +2 7 + 11 0 0 0 1 0 0 ## H[M][j] + 0 0 1 0 0 0 0 ## + +# ---------------------------------------------- 10.4 Body +# Statement body is provided +1 +# Original iterator names +t j +# Statement body +H[M][j]=H[0][j]; + + +# =============================================== Statement 11 +# ---------------------------------------------- 11.1 Domain +# Iteration domain +1 +4 7 + 1 1 0 0 0 0 0 ## t >= 0 + 1 -1 0 1 0 0 -1 ## -t+N3-1 >= 0 + 1 0 1 0 0 0 0 ## i >= 0 + 1 0 -1 0 1 0 -1 ## -i+M-1 >= 0 + +# ---------------------------------------------- 11.2 Scattering +# Scattering function is provided +1 +# Scattering function +5 7 + 0 0 0 0 0 0 0 ## 0 + 0 1 0 0 0 0 0 ## t + 0 0 0 0 0 0 4 ## 4 + 0 0 1 0 0 0 0 ## i + 0 0 0 0 0 0 0 ## 0 + +# ---------------------------------------------- 11.3 Access +# Access informations are provided +1 +# Read access informations +2 7 + 5 0 1 0 0 0 1 ## CU[i+1][0] + 0 0 0 0 0 0 0 ## +# Write access informations +2 7 + 5 0 1 0 0 0 1 ## CU[i+1][N] + 0 0 0 0 0 1 0 ## + +# ---------------------------------------------- 11.4 Body +# Statement body is provided +1 +# Original iterator names +t i +# Statement body +CU[i+1][N]=CU[i+1][0]; + + +# =============================================== Statement 12 +# ---------------------------------------------- 12.1 Domain +# Iteration domain +1 +4 7 + 1 1 0 0 0 0 0 ## t >= 0 + 1 -1 0 1 0 0 -1 ## -t+N3-1 >= 0 + 1 0 1 0 0 0 0 ## i >= 0 + 1 0 -1 0 1 0 -1 ## -i+M-1 >= 0 + +# ---------------------------------------------- 12.2 Scattering +# Scattering function is provided +1 +# Scattering function +5 7 + 0 0 0 0 0 0 0 ## 0 + 0 1 0 0 0 0 0 ## t + 0 0 0 0 0 0 4 ## 4 + 0 0 1 0 0 0 0 ## i + 0 0 0 0 0 0 1 ## 1 + +# ---------------------------------------------- 12.3 Access +# Access informations are provided +1 +# Read access informations +2 7 + 8 0 1 0 0 0 0 ## CV[i][N] + 0 0 0 0 0 1 0 ## +# Write access informations +2 7 + 8 0 1 0 0 0 0 ## CV[i][0] + 0 0 0 0 0 0 0 ## + +# ---------------------------------------------- 12.4 Body +# Statement body is provided +1 +# Original iterator names +t i +# Statement body +CV[i][0]=CV[i][N]; + + +# =============================================== Statement 13 +# ---------------------------------------------- 13.1 Domain +# Iteration domain +1 +4 7 + 1 1 0 0 0 0 0 ## t >= 0 + 1 -1 0 1 0 0 -1 ## -t+N3-1 >= 0 + 1 0 1 0 0 0 0 ## i >= 0 + 1 0 -1 0 1 0 -1 ## -i+M-1 >= 0 + +# ---------------------------------------------- 13.2 Scattering +# Scattering function is provided +1 +# Scattering function +5 7 + 0 0 0 0 0 0 0 ## 0 + 0 1 0 0 0 0 0 ## t + 0 0 0 0 0 0 4 ## 4 + 0 0 1 0 0 0 0 ## i + 0 0 0 0 0 0 2 ## 2 + +# ---------------------------------------------- 13.3 Access +# Access informations are provided +1 +# Read access informations +2 7 + 10 0 1 0 0 0 1 ## Z[i+1][N] + 0 0 0 0 0 1 0 ## +# Write access informations +2 7 + 10 0 1 0 0 0 1 ## Z[i+1][0] + 0 0 0 0 0 0 0 ## + +# ---------------------------------------------- 13.4 Body +# Statement body is provided +1 +# Original iterator names +t i +# Statement body +Z[i+1][0]=Z[i+1][N]; + + +# =============================================== Statement 14 +# ---------------------------------------------- 14.1 Domain +# Iteration domain +1 +4 7 + 1 1 0 0 0 0 0 ## t >= 0 + 1 -1 0 1 0 0 -1 ## -t+N3-1 >= 0 + 1 0 1 0 0 0 0 ## i >= 0 + 1 0 -1 0 1 0 -1 ## -i+M-1 >= 0 + +# ---------------------------------------------- 14.2 Scattering +# Scattering function is provided +1 +# Scattering function +5 7 + 0 0 0 0 0 0 0 ## 0 + 0 1 0 0 0 0 0 ## t + 0 0 0 0 0 0 4 ## 4 + 0 0 1 0 0 0 0 ## i + 0 0 0 0 0 0 3 ## 3 + +# ---------------------------------------------- 14.3 Access +# Access informations are provided +1 +# Read access informations +2 7 + 11 0 1 0 0 0 0 ## H[i][0] + 0 0 0 0 0 0 0 ## +# Write access informations +2 7 + 11 0 1 0 0 0 0 ## H[i][N] + 0 0 0 0 0 1 0 ## + +# ---------------------------------------------- 14.4 Body +# Statement body is provided +1 +# Original iterator names +t i +# Statement body +H[i][N]=H[i][0]; + + +# =============================================== Statement 15 +# ---------------------------------------------- 15.1 Domain +# Iteration domain +1 +2 6 + 1 1 0 0 0 0 ## t >= 0 + 1 -1 1 0 0 -1 ## -t+N3-1 >= 0 + +# ---------------------------------------------- 15.2 Scattering +# Scattering function is provided +1 +# Scattering function +3 6 + 0 0 0 0 0 0 ## 0 + 0 1 0 0 0 0 ## t + 0 0 0 0 0 5 ## 5 + +# ---------------------------------------------- 15.3 Access +# Access informations are provided +1 +# Read access informations +2 6 + 5 0 0 1 0 0 ## CU[M][0] + 0 0 0 0 0 0 ## +# Write access informations +2 6 + 5 0 0 0 0 0 ## CU[0][N] + 0 0 0 0 1 0 ## + +# ---------------------------------------------- 15.4 Body +# Statement body is provided +1 +# Original iterator names +t +# Statement body +CU[0][N]=CU[M][0]; + + +# =============================================== Statement 16 +# ---------------------------------------------- 16.1 Domain +# Iteration domain +1 +2 6 + 1 1 0 0 0 0 ## t >= 0 + 1 -1 1 0 0 -1 ## -t+N3-1 >= 0 + +# ---------------------------------------------- 16.2 Scattering +# Scattering function is provided +1 +# Scattering function +3 6 + 0 0 0 0 0 0 ## 0 + 0 1 0 0 0 0 ## t + 0 0 0 0 0 6 ## 6 + +# ---------------------------------------------- 16.3 Access +# Access informations are provided +1 +# Read access informations +2 6 + 8 0 0 0 0 0 ## CV[0][N] + 0 0 0 0 1 0 ## +# Write access informations +2 6 + 8 0 0 1 0 0 ## CV[M][0] + 0 0 0 0 0 0 ## + +# ---------------------------------------------- 16.4 Body +# Statement body is provided +1 +# Original iterator names +t +# Statement body +CV[M][0]=CV[0][N]; + + +# =============================================== Statement 17 +# ---------------------------------------------- 17.1 Domain +# Iteration domain +1 +2 6 + 1 1 0 0 0 0 ## t >= 0 + 1 -1 1 0 0 -1 ## -t+N3-1 >= 0 + +# ---------------------------------------------- 17.2 Scattering +# Scattering function is provided +1 +# Scattering function +3 6 + 0 0 0 0 0 0 ## 0 + 0 1 0 0 0 0 ## t + 0 0 0 0 0 7 ## 7 + +# ---------------------------------------------- 17.3 Access +# Access informations are provided +1 +# Read access informations +2 6 + 10 0 0 1 0 0 ## Z[M][N] + 0 0 0 0 1 0 ## +# Write access informations +2 6 + 10 0 0 0 0 0 ## Z[0][0] + 0 0 0 0 0 0 ## + +# ---------------------------------------------- 17.4 Body +# Statement body is provided +1 +# Original iterator names +t +# Statement body +Z[0][0]=Z[M][N]; + + +# =============================================== Statement 18 +# ---------------------------------------------- 18.1 Domain +# Iteration domain +1 +2 6 + 1 1 0 0 0 0 ## t >= 0 + 1 -1 1 0 0 -1 ## -t+N3-1 >= 0 + +# ---------------------------------------------- 18.2 Scattering +# Scattering function is provided +1 +# Scattering function +3 6 + 0 0 0 0 0 0 ## 0 + 0 1 0 0 0 0 ## t + 0 0 0 0 0 8 ## 8 + +# ---------------------------------------------- 18.3 Access +# Access informations are provided +1 +# Read access informations +2 6 + 11 0 0 0 0 0 ## H[0][0] + 0 0 0 0 0 0 ## +# Write access informations +2 6 + 11 0 0 1 0 0 ## H[M][N] + 0 0 0 0 1 0 ## + +# ---------------------------------------------- 18.4 Body +# Statement body is provided +1 +# Original iterator names +t +# Statement body +H[M][N]=H[0][0]; + + +# =============================================== Statement 19 +# ---------------------------------------------- 19.1 Domain +# Iteration domain +1 +2 6 + 1 1 0 0 0 0 ## t >= 0 + 1 -1 1 0 0 -1 ## -t+N3-1 >= 0 + +# ---------------------------------------------- 19.2 Scattering +# Scattering function is provided +1 +# Scattering function +3 6 + 0 0 0 0 0 0 ## 0 + 0 1 0 0 0 0 ## t + 0 0 0 0 0 9 ## 9 + +# ---------------------------------------------- 19.3 Access +# Access informations are provided +1 +# Read access informations +1 6 + 13 0 0 0 0 0 ## TDT[0] +# Write access informations +1 6 + 12 0 0 0 0 0 ## TDTS8[0] + +# ---------------------------------------------- 19.4 Body +# Statement body is provided +1 +# Original iterator names +t +# Statement body +TDTS8=TDT/8; + + +# =============================================== Statement 20 +# ---------------------------------------------- 20.1 Domain +# Iteration domain +1 +2 6 + 1 1 0 0 0 0 ## t >= 0 + 1 -1 1 0 0 -1 ## -t+N3-1 >= 0 + +# ---------------------------------------------- 20.2 Scattering +# Scattering function is provided +1 +# Scattering function +3 6 + 0 0 0 0 0 0 ## 0 + 0 1 0 0 0 0 ## t + 0 0 0 0 0 10 ## 10 + +# ---------------------------------------------- 20.3 Access +# Access informations are provided +1 +# Read access informations +2 6 + 13 0 0 0 0 0 ## TDT[0] + 2 0 0 0 0 0 ## DX[0] +# Write access informations +1 6 + 14 0 0 0 0 0 ## TDTSDX[0] + +# ---------------------------------------------- 20.4 Body +# Statement body is provided +1 +# Original iterator names +t +# Statement body +TDTSDX=TDT/DX; + + +# =============================================== Statement 21 +# ---------------------------------------------- 21.1 Domain +# Iteration domain +1 +2 6 + 1 1 0 0 0 0 ## t >= 0 + 1 -1 1 0 0 -1 ## -t+N3-1 >= 0 + +# ---------------------------------------------- 21.2 Scattering +# Scattering function is provided +1 +# Scattering function +3 6 + 0 0 0 0 0 0 ## 0 + 0 1 0 0 0 0 ## t + 0 0 0 0 0 11 ## 11 + +# ---------------------------------------------- 21.3 Access +# Access informations are provided +1 +# Read access informations +2 6 + 13 0 0 0 0 0 ## TDT[0] + 4 0 0 0 0 0 ## DY[0] +# Write access informations +1 6 + 15 0 0 0 0 0 ## TDTSDY[0] + +# ---------------------------------------------- 21.4 Body +# Statement body is provided +1 +# Original iterator names +t +# Statement body +TDTSDY=TDT/DY; + + +# =============================================== Statement 22 +# ---------------------------------------------- 22.1 Domain +# Iteration domain +1 +6 8 + 1 1 0 0 0 0 0 0 ## t >= 0 + 1 -1 0 0 1 0 0 -1 ## -t+N3-1 >= 0 + 1 0 1 0 0 0 0 0 ## i >= 0 + 1 0 -1 0 0 1 0 -1 ## -i+M-1 >= 0 + 1 0 0 1 0 0 0 0 ## j >= 0 + 1 0 0 -1 0 0 1 -1 ## -j+N-1 >= 0 + +# ---------------------------------------------- 22.2 Scattering +# Scattering function is provided +1 +# Scattering function +7 8 + 0 0 0 0 0 0 0 0 ## 0 + 0 1 0 0 0 0 0 0 ## t + 0 0 0 0 0 0 0 12 ## 12 + 0 0 1 0 0 0 0 0 ## i + 0 0 0 0 0 0 0 0 ## 0 + 0 0 0 1 0 0 0 0 ## j + 0 0 0 0 0 0 0 0 ## 0 + +# ---------------------------------------------- 22.3 Access +# Access informations are provided +1 +# Read access informations +20 8 + 17 0 1 0 0 0 0 1 ## UOLD[i+1][j] + 0 0 0 1 0 0 0 0 ## + 12 0 0 0 0 0 0 0 ## TDTS8[0] + 10 0 1 0 0 0 0 1 ## Z[i+1][j+1] + 0 0 0 1 0 0 0 1 ## + 10 0 1 0 0 0 0 1 ## Z[i+1][j] + 0 0 0 1 0 0 0 0 ## + 8 0 1 0 0 0 0 1 ## CV[i+1][j+1] + 0 0 0 1 0 0 0 1 ## + 8 0 1 0 0 0 0 0 ## CV[i][j+1] + 0 0 0 1 0 0 0 1 ## + 8 0 1 0 0 0 0 0 ## CV[i][j] + 0 0 0 1 0 0 0 0 ## + 8 0 1 0 0 0 0 1 ## CV[i+1][j] + 0 0 0 1 0 0 0 0 ## + 14 0 0 0 0 0 0 0 ## TDTSDX[0] + 11 0 1 0 0 0 0 1 ## H[i+1][j] + 0 0 0 1 0 0 0 0 ## + 11 0 1 0 0 0 0 0 ## H[i][j] + 0 0 0 1 0 0 0 0 ## +# Write access informations +2 8 + 16 0 1 0 0 0 0 1 ## UNEW[i+1][j] + 0 0 0 1 0 0 0 0 ## + +# ---------------------------------------------- 22.4 Body +# Statement body is provided +1 +# Original iterator names +t i j +# Statement body +UNEW[i+1][j]=UOLD[i+1][j]+TDTS8*(Z[i+1][j+1]+Z[i+1][j])*(CV[i+1][j+1]+CV[i][j+1]+CV[i][j]+CV[i+1][j])-TDTSDX*(H[i+1][j]-H[i][j]); + + +# =============================================== Statement 23 +# ---------------------------------------------- 23.1 Domain +# Iteration domain +1 +6 8 + 1 1 0 0 0 0 0 0 ## t >= 0 + 1 -1 0 0 1 0 0 -1 ## -t+N3-1 >= 0 + 1 0 1 0 0 0 0 0 ## i >= 0 + 1 0 -1 0 0 1 0 -1 ## -i+M-1 >= 0 + 1 0 0 1 0 0 0 0 ## j >= 0 + 1 0 0 -1 0 0 1 -1 ## -j+N-1 >= 0 + +# ---------------------------------------------- 23.2 Scattering +# Scattering function is provided +1 +# Scattering function +7 8 + 0 0 0 0 0 0 0 0 ## 0 + 0 1 0 0 0 0 0 0 ## t + 0 0 0 0 0 0 0 12 ## 12 + 0 0 1 0 0 0 0 0 ## i + 0 0 0 0 0 0 0 0 ## 0 + 0 0 0 1 0 0 0 0 ## j + 0 0 0 0 0 0 0 1 ## 1 + +# ---------------------------------------------- 23.3 Access +# Access informations are provided +1 +# Read access informations +20 8 + 19 0 1 0 0 0 0 0 ## VOLD[i][j+1] + 0 0 0 1 0 0 0 1 ## + 12 0 0 0 0 0 0 0 ## TDTS8[0] + 10 0 1 0 0 0 0 1 ## Z[i+1][j+1] + 0 0 0 1 0 0 0 1 ## + 10 0 1 0 0 0 0 0 ## Z[i][j+1] + 0 0 0 1 0 0 0 1 ## + 5 0 1 0 0 0 0 1 ## CU[i+1][j+1] + 0 0 0 1 0 0 0 1 ## + 5 0 1 0 0 0 0 0 ## CU[i][j+1] + 0 0 0 1 0 0 0 1 ## + 5 0 1 0 0 0 0 0 ## CU[i][j] + 0 0 0 1 0 0 0 0 ## + 5 0 1 0 0 0 0 1 ## CU[i+1][j] + 0 0 0 1 0 0 0 0 ## + 15 0 0 0 0 0 0 0 ## TDTSDY[0] + 11 0 1 0 0 0 0 0 ## H[i][j+1] + 0 0 0 1 0 0 0 1 ## + 11 0 1 0 0 0 0 0 ## H[i][j] + 0 0 0 1 0 0 0 0 ## +# Write access informations +2 8 + 18 0 1 0 0 0 0 0 ## VNEW[i][j+1] + 0 0 0 1 0 0 0 1 ## + +# ---------------------------------------------- 23.4 Body +# Statement body is provided +1 +# Original iterator names +t i j +# Statement body +VNEW[i][j+1]=VOLD[i][j+1]-TDTS8*(Z[i+1][j+1]+Z[i][j+1])*(CU[i+1][j+1]+CU[i][j+1]+CU[i][j]+CU[i+1][j])-TDTSDY*(H[i][j+1]-H[i][j]); + + +# =============================================== Statement 24 +# ---------------------------------------------- 24.1 Domain +# Iteration domain +1 +6 8 + 1 1 0 0 0 0 0 0 ## t >= 0 + 1 -1 0 0 1 0 0 -1 ## -t+N3-1 >= 0 + 1 0 1 0 0 0 0 0 ## i >= 0 + 1 0 -1 0 0 1 0 -1 ## -i+M-1 >= 0 + 1 0 0 1 0 0 0 0 ## j >= 0 + 1 0 0 -1 0 0 1 -1 ## -j+N-1 >= 0 + +# ---------------------------------------------- 24.2 Scattering +# Scattering function is provided +1 +# Scattering function +7 8 + 0 0 0 0 0 0 0 0 ## 0 + 0 1 0 0 0 0 0 0 ## t + 0 0 0 0 0 0 0 12 ## 12 + 0 0 1 0 0 0 0 0 ## i + 0 0 0 0 0 0 0 0 ## 0 + 0 0 0 1 0 0 0 0 ## j + 0 0 0 0 0 0 0 2 ## 2 + +# ---------------------------------------------- 24.3 Access +# Access informations are provided +1 +# Read access informations +12 8 + 21 0 1 0 0 0 0 0 ## POLD[i][j] + 0 0 0 1 0 0 0 0 ## + 14 0 0 0 0 0 0 0 ## TDTSDX[0] + 5 0 1 0 0 0 0 1 ## CU[i+1][j] + 0 0 0 1 0 0 0 0 ## + 5 0 1 0 0 0 0 0 ## CU[i][j] + 0 0 0 1 0 0 0 0 ## + 15 0 0 0 0 0 0 0 ## TDTSDY[0] + 8 0 1 0 0 0 0 0 ## CV[i][j+1] + 0 0 0 1 0 0 0 1 ## + 8 0 1 0 0 0 0 0 ## CV[i][j] + 0 0 0 1 0 0 0 0 ## +# Write access informations +2 8 + 20 0 1 0 0 0 0 0 ## PNEW[i][j] + 0 0 0 1 0 0 0 0 ## + +# ---------------------------------------------- 24.4 Body +# Statement body is provided +1 +# Original iterator names +t i j +# Statement body +PNEW[i][j]=POLD[i][j]-TDTSDX*(CU[i+1][j]-CU[i][j])-TDTSDY*(CV[i][j+1]-CV[i][j]); + + +# =============================================== Statement 25 +# ---------------------------------------------- 25.1 Domain +# Iteration domain +1 +4 7 + 1 1 0 0 0 0 0 ## t >= 0 + 1 -1 0 1 0 0 -1 ## -t+N3-1 >= 0 + 1 0 1 0 0 0 0 ## j >= 0 + 1 0 -1 0 0 1 -1 ## -j+N-1 >= 0 + +# ---------------------------------------------- 25.2 Scattering +# Scattering function is provided +1 +# Scattering function +5 7 + 0 0 0 0 0 0 0 ## 0 + 0 1 0 0 0 0 0 ## t + 0 0 0 0 0 0 13 ## 13 + 0 0 1 0 0 0 0 ## j + 0 0 0 0 0 0 0 ## 0 + +# ---------------------------------------------- 25.3 Access +# Access informations are provided +1 +# Read access informations +2 7 + 16 0 0 0 1 0 0 ## UNEW[M][j] + 0 0 1 0 0 0 0 ## +# Write access informations +2 7 + 16 0 0 0 0 0 0 ## UNEW[0][j] + 0 0 1 0 0 0 0 ## + +# ---------------------------------------------- 25.4 Body +# Statement body is provided +1 +# Original iterator names +t j +# Statement body +UNEW[0][j]=UNEW[M][j]; + + +# =============================================== Statement 26 +# ---------------------------------------------- 26.1 Domain +# Iteration domain +1 +4 7 + 1 1 0 0 0 0 0 ## t >= 0 + 1 -1 0 1 0 0 -1 ## -t+N3-1 >= 0 + 1 0 1 0 0 0 0 ## j >= 0 + 1 0 -1 0 0 1 -1 ## -j+N-1 >= 0 + +# ---------------------------------------------- 26.2 Scattering +# Scattering function is provided +1 +# Scattering function +5 7 + 0 0 0 0 0 0 0 ## 0 + 0 1 0 0 0 0 0 ## t + 0 0 0 0 0 0 13 ## 13 + 0 0 1 0 0 0 0 ## j + 0 0 0 0 0 0 1 ## 1 + +# ---------------------------------------------- 26.3 Access +# Access informations are provided +1 +# Read access informations +2 7 + 18 0 0 0 0 0 0 ## VNEW[0][j+1] + 0 0 1 0 0 0 1 ## +# Write access informations +2 7 + 18 0 0 0 1 0 0 ## VNEW[M][j+1] + 0 0 1 0 0 0 1 ## + +# ---------------------------------------------- 26.4 Body +# Statement body is provided +1 +# Original iterator names +t j +# Statement body +VNEW[M][j+1]=VNEW[0][j+1]; + + +# =============================================== Statement 27 +# ---------------------------------------------- 27.1 Domain +# Iteration domain +1 +4 7 + 1 1 0 0 0 0 0 ## t >= 0 + 1 -1 0 1 0 0 -1 ## -t+N3-1 >= 0 + 1 0 1 0 0 0 0 ## j >= 0 + 1 0 -1 0 0 1 -1 ## -j+N-1 >= 0 + +# ---------------------------------------------- 27.2 Scattering +# Scattering function is provided +1 +# Scattering function +5 7 + 0 0 0 0 0 0 0 ## 0 + 0 1 0 0 0 0 0 ## t + 0 0 0 0 0 0 13 ## 13 + 0 0 1 0 0 0 0 ## j + 0 0 0 0 0 0 2 ## 2 + +# ---------------------------------------------- 27.3 Access +# Access informations are provided +1 +# Read access informations +2 7 + 20 0 0 0 0 0 0 ## PNEW[0][j] + 0 0 1 0 0 0 0 ## +# Write access informations +2 7 + 20 0 0 0 1 0 0 ## PNEW[M][j] + 0 0 1 0 0 0 0 ## + +# ---------------------------------------------- 27.4 Body +# Statement body is provided +1 +# Original iterator names +t j +# Statement body +PNEW[M][j]=PNEW[0][j]; + + +# =============================================== Statement 28 +# ---------------------------------------------- 28.1 Domain +# Iteration domain +1 +4 7 + 1 1 0 0 0 0 0 ## t >= 0 + 1 -1 0 1 0 0 -1 ## -t+N3-1 >= 0 + 1 0 1 0 0 0 0 ## i >= 0 + 1 0 -1 0 1 0 -1 ## -i+M-1 >= 0 + +# ---------------------------------------------- 28.2 Scattering +# Scattering function is provided +1 +# Scattering function +5 7 + 0 0 0 0 0 0 0 ## 0 + 0 1 0 0 0 0 0 ## t + 0 0 0 0 0 0 14 ## 14 + 0 0 1 0 0 0 0 ## i + 0 0 0 0 0 0 0 ## 0 + +# ---------------------------------------------- 28.3 Access +# Access informations are provided +1 +# Read access informations +2 7 + 16 0 1 0 0 0 1 ## UNEW[i+1][0] + 0 0 0 0 0 0 0 ## +# Write access informations +2 7 + 16 0 1 0 0 0 1 ## UNEW[i+1][N] + 0 0 0 0 0 1 0 ## + +# ---------------------------------------------- 28.4 Body +# Statement body is provided +1 +# Original iterator names +t i +# Statement body +UNEW[i+1][N]=UNEW[i+1][0]; + + +# =============================================== Statement 29 +# ---------------------------------------------- 29.1 Domain +# Iteration domain +1 +4 7 + 1 1 0 0 0 0 0 ## t >= 0 + 1 -1 0 1 0 0 -1 ## -t+N3-1 >= 0 + 1 0 1 0 0 0 0 ## i >= 0 + 1 0 -1 0 1 0 -1 ## -i+M-1 >= 0 + +# ---------------------------------------------- 29.2 Scattering +# Scattering function is provided +1 +# Scattering function +5 7 + 0 0 0 0 0 0 0 ## 0 + 0 1 0 0 0 0 0 ## t + 0 0 0 0 0 0 14 ## 14 + 0 0 1 0 0 0 0 ## i + 0 0 0 0 0 0 1 ## 1 + +# ---------------------------------------------- 29.3 Access +# Access informations are provided +1 +# Read access informations +2 7 + 18 0 1 0 0 0 0 ## VNEW[i][N] + 0 0 0 0 0 1 0 ## +# Write access informations +2 7 + 18 0 1 0 0 0 0 ## VNEW[i][0] + 0 0 0 0 0 0 0 ## + +# ---------------------------------------------- 29.4 Body +# Statement body is provided +1 +# Original iterator names +t i +# Statement body +VNEW[i][0]=VNEW[i][N]; + + +# =============================================== Statement 30 +# ---------------------------------------------- 30.1 Domain +# Iteration domain +1 +4 7 + 1 1 0 0 0 0 0 ## t >= 0 + 1 -1 0 1 0 0 -1 ## -t+N3-1 >= 0 + 1 0 1 0 0 0 0 ## i >= 0 + 1 0 -1 0 1 0 -1 ## -i+M-1 >= 0 + +# ---------------------------------------------- 30.2 Scattering +# Scattering function is provided +1 +# Scattering function +5 7 + 0 0 0 0 0 0 0 ## 0 + 0 1 0 0 0 0 0 ## t + 0 0 0 0 0 0 14 ## 14 + 0 0 1 0 0 0 0 ## i + 0 0 0 0 0 0 2 ## 2 + +# ---------------------------------------------- 30.3 Access +# Access informations are provided +1 +# Read access informations +2 7 + 20 0 1 0 0 0 0 ## PNEW[i][0] + 0 0 0 0 0 0 0 ## +# Write access informations +2 7 + 20 0 1 0 0 0 0 ## PNEW[i][N] + 0 0 0 0 0 1 0 ## + +# ---------------------------------------------- 30.4 Body +# Statement body is provided +1 +# Original iterator names +t i +# Statement body +PNEW[i][N]=PNEW[i][0]; + + +# =============================================== Statement 31 +# ---------------------------------------------- 31.1 Domain +# Iteration domain +1 +2 6 + 1 1 0 0 0 0 ## t >= 0 + 1 -1 1 0 0 -1 ## -t+N3-1 >= 0 + +# ---------------------------------------------- 31.2 Scattering +# Scattering function is provided +1 +# Scattering function +3 6 + 0 0 0 0 0 0 ## 0 + 0 1 0 0 0 0 ## t + 0 0 0 0 0 15 ## 15 + +# ---------------------------------------------- 31.3 Access +# Access informations are provided +1 +# Read access informations +2 6 + 16 0 0 1 0 0 ## UNEW[M][0] + 0 0 0 0 0 0 ## +# Write access informations +2 6 + 16 0 0 0 0 0 ## UNEW[0][N] + 0 0 0 0 1 0 ## + +# ---------------------------------------------- 31.4 Body +# Statement body is provided +1 +# Original iterator names +t +# Statement body +UNEW[0][N]=UNEW[M][0]; + + +# =============================================== Statement 32 +# ---------------------------------------------- 32.1 Domain +# Iteration domain +1 +2 6 + 1 1 0 0 0 0 ## t >= 0 + 1 -1 1 0 0 -1 ## -t+N3-1 >= 0 + +# ---------------------------------------------- 32.2 Scattering +# Scattering function is provided +1 +# Scattering function +3 6 + 0 0 0 0 0 0 ## 0 + 0 1 0 0 0 0 ## t + 0 0 0 0 0 16 ## 16 + +# ---------------------------------------------- 32.3 Access +# Access informations are provided +1 +# Read access informations +2 6 + 18 0 0 0 0 0 ## VNEW[0][N] + 0 0 0 0 1 0 ## +# Write access informations +2 6 + 18 0 0 1 0 0 ## VNEW[M][0] + 0 0 0 0 0 0 ## + +# ---------------------------------------------- 32.4 Body +# Statement body is provided +1 +# Original iterator names +t +# Statement body +VNEW[M][0]=VNEW[0][N]; + + +# =============================================== Statement 33 +# ---------------------------------------------- 33.1 Domain +# Iteration domain +1 +2 6 + 1 1 0 0 0 0 ## t >= 0 + 1 -1 1 0 0 -1 ## -t+N3-1 >= 0 + +# ---------------------------------------------- 33.2 Scattering +# Scattering function is provided +1 +# Scattering function +3 6 + 0 0 0 0 0 0 ## 0 + 0 1 0 0 0 0 ## t + 0 0 0 0 0 17 ## 17 + +# ---------------------------------------------- 33.3 Access +# Access informations are provided +1 +# Read access informations +2 6 + 20 0 0 0 0 0 ## PNEW[0][0] + 0 0 0 0 0 0 ## +# Write access informations +2 6 + 20 0 0 1 0 0 ## PNEW[M][N] + 0 0 0 0 1 0 ## + +# ---------------------------------------------- 33.4 Body +# Statement body is provided +1 +# Original iterator names +t +# Statement body +PNEW[M][N]=PNEW[0][0]; + + +# =============================================== Statement 34 +# ---------------------------------------------- 34.1 Domain +# Iteration domain +1 +2 6 + 1 1 0 0 0 0 ## t >= 0 + 1 -1 1 0 0 -1 ## -t+N3-1 >= 0 + +# ---------------------------------------------- 34.2 Scattering +# Scattering function is provided +1 +# Scattering function +3 6 + 0 0 0 0 0 0 ## 0 + 0 1 0 0 0 0 ## t + 0 0 0 0 0 18 ## 18 + +# ---------------------------------------------- 34.3 Access +# Access informations are provided +1 +# Read access informations +2 6 + 22 0 0 0 0 0 ## time[0] + 23 0 0 0 0 0 ## DT[0] +# Write access informations +1 6 + 22 0 0 0 0 0 ## time[0] + +# ---------------------------------------------- 34.4 Body +# Statement body is provided +1 +# Original iterator names +t +# Statement body +time=time+DT; + + +# =============================================== Statement 35 +# ---------------------------------------------- 35.1 Domain +# Iteration domain +1 +6 8 + 1 1 0 0 0 0 0 0 ## t >= 0 + 1 -1 0 0 1 0 0 -1 ## -t+N3-1 >= 0 + 1 0 1 0 0 0 0 0 ## i >= 0 + 1 0 -1 0 0 1 0 -1 ## -i+M-1 >= 0 + 1 0 0 1 0 0 0 0 ## j >= 0 + 1 0 0 -1 0 0 1 -1 ## -j+N-1 >= 0 + +# ---------------------------------------------- 35.2 Scattering +# Scattering function is provided +1 +# Scattering function +7 8 + 0 0 0 0 0 0 0 0 ## 0 + 0 1 0 0 0 0 0 0 ## t + 0 0 0 0 0 0 0 19 ## 19 + 0 0 1 0 0 0 0 0 ## i + 0 0 0 0 0 0 0 0 ## 0 + 0 0 0 1 0 0 0 0 ## j + 0 0 0 0 0 0 0 0 ## 0 + +# ---------------------------------------------- 35.3 Access +# Access informations are provided +1 +# Read access informations +9 8 + 7 0 1 0 0 0 0 0 ## U[i][j] + 0 0 0 1 0 0 0 0 ## + 24 0 0 0 0 0 0 0 ## ALPHA[0] + 16 0 1 0 0 0 0 0 ## UNEW[i][j] + 0 0 0 1 0 0 0 0 ## + 7 0 1 0 0 0 0 0 ## U[i][j] + 0 0 0 1 0 0 0 0 ## + 17 0 1 0 0 0 0 0 ## UOLD[i][j] + 0 0 0 1 0 0 0 0 ## +# Write access informations +2 8 + 17 0 1 0 0 0 0 0 ## UOLD[i][j] + 0 0 0 1 0 0 0 0 ## + +# ---------------------------------------------- 35.4 Body +# Statement body is provided +1 +# Original iterator names +t i j +# Statement body +UOLD[i][j]=U[i][j]+ALPHA*(UNEW[i][j]-2*U[i][j]+UOLD[i][j]); + + +# =============================================== Statement 36 +# ---------------------------------------------- 36.1 Domain +# Iteration domain +1 +6 8 + 1 1 0 0 0 0 0 0 ## t >= 0 + 1 -1 0 0 1 0 0 -1 ## -t+N3-1 >= 0 + 1 0 1 0 0 0 0 0 ## i >= 0 + 1 0 -1 0 0 1 0 -1 ## -i+M-1 >= 0 + 1 0 0 1 0 0 0 0 ## j >= 0 + 1 0 0 -1 0 0 1 -1 ## -j+N-1 >= 0 + +# ---------------------------------------------- 36.2 Scattering +# Scattering function is provided +1 +# Scattering function +7 8 + 0 0 0 0 0 0 0 0 ## 0 + 0 1 0 0 0 0 0 0 ## t + 0 0 0 0 0 0 0 19 ## 19 + 0 0 1 0 0 0 0 0 ## i + 0 0 0 0 0 0 0 0 ## 0 + 0 0 0 1 0 0 0 0 ## j + 0 0 0 0 0 0 0 1 ## 1 + +# ---------------------------------------------- 36.3 Access +# Access informations are provided +1 +# Read access informations +9 8 + 9 0 1 0 0 0 0 0 ## V[i][j] + 0 0 0 1 0 0 0 0 ## + 24 0 0 0 0 0 0 0 ## ALPHA[0] + 18 0 1 0 0 0 0 0 ## VNEW[i][j] + 0 0 0 1 0 0 0 0 ## + 9 0 1 0 0 0 0 0 ## V[i][j] + 0 0 0 1 0 0 0 0 ## + 19 0 1 0 0 0 0 0 ## VOLD[i][j] + 0 0 0 1 0 0 0 0 ## +# Write access informations +2 8 + 19 0 1 0 0 0 0 0 ## VOLD[i][j] + 0 0 0 1 0 0 0 0 ## + +# ---------------------------------------------- 36.4 Body +# Statement body is provided +1 +# Original iterator names +t i j +# Statement body +VOLD[i][j]=V[i][j]+ALPHA*(VNEW[i][j]-2*V[i][j]+VOLD[i][j]); + + +# =============================================== Statement 37 +# ---------------------------------------------- 37.1 Domain +# Iteration domain +1 +6 8 + 1 1 0 0 0 0 0 0 ## t >= 0 + 1 -1 0 0 1 0 0 -1 ## -t+N3-1 >= 0 + 1 0 1 0 0 0 0 0 ## i >= 0 + 1 0 -1 0 0 1 0 -1 ## -i+M-1 >= 0 + 1 0 0 1 0 0 0 0 ## j >= 0 + 1 0 0 -1 0 0 1 -1 ## -j+N-1 >= 0 + +# ---------------------------------------------- 37.2 Scattering +# Scattering function is provided +1 +# Scattering function +7 8 + 0 0 0 0 0 0 0 0 ## 0 + 0 1 0 0 0 0 0 0 ## t + 0 0 0 0 0 0 0 19 ## 19 + 0 0 1 0 0 0 0 0 ## i + 0 0 0 0 0 0 0 0 ## 0 + 0 0 0 1 0 0 0 0 ## j + 0 0 0 0 0 0 0 2 ## 2 + +# ---------------------------------------------- 37.3 Access +# Access informations are provided +1 +# Read access informations +9 8 + 6 0 1 0 0 0 0 0 ## P[i][j] + 0 0 0 1 0 0 0 0 ## + 24 0 0 0 0 0 0 0 ## ALPHA[0] + 20 0 1 0 0 0 0 0 ## PNEW[i][j] + 0 0 0 1 0 0 0 0 ## + 6 0 1 0 0 0 0 0 ## P[i][j] + 0 0 0 1 0 0 0 0 ## + 21 0 1 0 0 0 0 0 ## POLD[i][j] + 0 0 0 1 0 0 0 0 ## +# Write access informations +2 8 + 21 0 1 0 0 0 0 0 ## POLD[i][j] + 0 0 0 1 0 0 0 0 ## + +# ---------------------------------------------- 37.4 Body +# Statement body is provided +1 +# Original iterator names +t i j +# Statement body +POLD[i][j]=P[i][j]+ALPHA*(PNEW[i][j]-2*P[i][j]+POLD[i][j]); + + +# =============================================== Statement 38 +# ---------------------------------------------- 38.1 Domain +# Iteration domain +1 +6 8 + 1 1 0 0 0 0 0 0 ## t >= 0 + 1 -1 0 0 1 0 0 -1 ## -t+N3-1 >= 0 + 1 0 1 0 0 0 0 0 ## i >= 0 + 1 0 -1 0 0 1 0 -1 ## -i+M-1 >= 0 + 1 0 0 1 0 0 0 0 ## j >= 0 + 1 0 0 -1 0 0 1 -1 ## -j+N-1 >= 0 + +# ---------------------------------------------- 38.2 Scattering +# Scattering function is provided +1 +# Scattering function +7 8 + 0 0 0 0 0 0 0 0 ## 0 + 0 1 0 0 0 0 0 0 ## t + 0 0 0 0 0 0 0 19 ## 19 + 0 0 1 0 0 0 0 0 ## i + 0 0 0 0 0 0 0 0 ## 0 + 0 0 0 1 0 0 0 0 ## j + 0 0 0 0 0 0 0 3 ## 3 + +# ---------------------------------------------- 38.3 Access +# Access informations are provided +1 +# Read access informations +2 8 + 16 0 1 0 0 0 0 0 ## UNEW[i][j] + 0 0 0 1 0 0 0 0 ## +# Write access informations +2 8 + 7 0 1 0 0 0 0 0 ## U[i][j] + 0 0 0 1 0 0 0 0 ## + +# ---------------------------------------------- 38.4 Body +# Statement body is provided +1 +# Original iterator names +t i j +# Statement body +U[i][j]=UNEW[i][j]; + + +# =============================================== Statement 39 +# ---------------------------------------------- 39.1 Domain +# Iteration domain +1 +6 8 + 1 1 0 0 0 0 0 0 ## t >= 0 + 1 -1 0 0 1 0 0 -1 ## -t+N3-1 >= 0 + 1 0 1 0 0 0 0 0 ## i >= 0 + 1 0 -1 0 0 1 0 -1 ## -i+M-1 >= 0 + 1 0 0 1 0 0 0 0 ## j >= 0 + 1 0 0 -1 0 0 1 -1 ## -j+N-1 >= 0 + +# ---------------------------------------------- 39.2 Scattering +# Scattering function is provided +1 +# Scattering function +7 8 + 0 0 0 0 0 0 0 0 ## 0 + 0 1 0 0 0 0 0 0 ## t + 0 0 0 0 0 0 0 19 ## 19 + 0 0 1 0 0 0 0 0 ## i + 0 0 0 0 0 0 0 0 ## 0 + 0 0 0 1 0 0 0 0 ## j + 0 0 0 0 0 0 0 4 ## 4 + +# ---------------------------------------------- 39.3 Access +# Access informations are provided +1 +# Read access informations +2 8 + 18 0 1 0 0 0 0 0 ## VNEW[i][j] + 0 0 0 1 0 0 0 0 ## +# Write access informations +2 8 + 9 0 1 0 0 0 0 0 ## V[i][j] + 0 0 0 1 0 0 0 0 ## + +# ---------------------------------------------- 39.4 Body +# Statement body is provided +1 +# Original iterator names +t i j +# Statement body +V[i][j]=VNEW[i][j]; + + +# =============================================== Statement 40 +# ---------------------------------------------- 40.1 Domain +# Iteration domain +1 +6 8 + 1 1 0 0 0 0 0 0 ## t >= 0 + 1 -1 0 0 1 0 0 -1 ## -t+N3-1 >= 0 + 1 0 1 0 0 0 0 0 ## i >= 0 + 1 0 -1 0 0 1 0 -1 ## -i+M-1 >= 0 + 1 0 0 1 0 0 0 0 ## j >= 0 + 1 0 0 -1 0 0 1 -1 ## -j+N-1 >= 0 + +# ---------------------------------------------- 40.2 Scattering +# Scattering function is provided +1 +# Scattering function +7 8 + 0 0 0 0 0 0 0 0 ## 0 + 0 1 0 0 0 0 0 0 ## t + 0 0 0 0 0 0 0 19 ## 19 + 0 0 1 0 0 0 0 0 ## i + 0 0 0 0 0 0 0 0 ## 0 + 0 0 0 1 0 0 0 0 ## j + 0 0 0 0 0 0 0 5 ## 5 + +# ---------------------------------------------- 40.3 Access +# Access informations are provided +1 +# Read access informations +2 8 + 20 0 1 0 0 0 0 0 ## PNEW[i][j] + 0 0 0 1 0 0 0 0 ## +# Write access informations +2 8 + 6 0 1 0 0 0 0 0 ## P[i][j] + 0 0 0 1 0 0 0 0 ## + +# ---------------------------------------------- 40.4 Body +# Statement body is provided +1 +# Original iterator names +t i j +# Statement body +P[i][j]=PNEW[i][j]; + + +# =============================================== Statement 41 +# ---------------------------------------------- 41.1 Domain +# Iteration domain +1 +4 7 + 1 1 0 0 0 0 0 ## t >= 0 + 1 -1 0 1 0 0 -1 ## -t+N3-1 >= 0 + 1 0 1 0 0 0 0 ## j >= 0 + 1 0 -1 0 0 1 -1 ## -j+N-1 >= 0 + +# ---------------------------------------------- 41.2 Scattering +# Scattering function is provided +1 +# Scattering function +5 7 + 0 0 0 0 0 0 0 ## 0 + 0 1 0 0 0 0 0 ## t + 0 0 0 0 0 0 20 ## 20 + 0 0 1 0 0 0 0 ## j + 0 0 0 0 0 0 0 ## 0 + +# ---------------------------------------------- 41.3 Access +# Access informations are provided +1 +# Read access informations +2 7 + 17 0 0 0 0 0 0 ## UOLD[0][j] + 0 0 1 0 0 0 0 ## +# Write access informations +2 7 + 17 0 0 0 1 0 0 ## UOLD[M][j] + 0 0 1 0 0 0 0 ## + +# ---------------------------------------------- 41.4 Body +# Statement body is provided +1 +# Original iterator names +t j +# Statement body +UOLD[M][j]=UOLD[0][j]; + + +# =============================================== Statement 42 +# ---------------------------------------------- 42.1 Domain +# Iteration domain +1 +4 7 + 1 1 0 0 0 0 0 ## t >= 0 + 1 -1 0 1 0 0 -1 ## -t+N3-1 >= 0 + 1 0 1 0 0 0 0 ## j >= 0 + 1 0 -1 0 0 1 -1 ## -j+N-1 >= 0 + +# ---------------------------------------------- 42.2 Scattering +# Scattering function is provided +1 +# Scattering function +5 7 + 0 0 0 0 0 0 0 ## 0 + 0 1 0 0 0 0 0 ## t + 0 0 0 0 0 0 20 ## 20 + 0 0 1 0 0 0 0 ## j + 0 0 0 0 0 0 1 ## 1 + +# ---------------------------------------------- 42.3 Access +# Access informations are provided +1 +# Read access informations +2 7 + 19 0 0 0 0 0 0 ## VOLD[0][j] + 0 0 1 0 0 0 0 ## +# Write access informations +2 7 + 19 0 0 0 1 0 0 ## VOLD[M][j] + 0 0 1 0 0 0 0 ## + +# ---------------------------------------------- 42.4 Body +# Statement body is provided +1 +# Original iterator names +t j +# Statement body +VOLD[M][j]=VOLD[0][j]; + + +# =============================================== Statement 43 +# ---------------------------------------------- 43.1 Domain +# Iteration domain +1 +4 7 + 1 1 0 0 0 0 0 ## t >= 0 + 1 -1 0 1 0 0 -1 ## -t+N3-1 >= 0 + 1 0 1 0 0 0 0 ## j >= 0 + 1 0 -1 0 0 1 -1 ## -j+N-1 >= 0 + +# ---------------------------------------------- 43.2 Scattering +# Scattering function is provided +1 +# Scattering function +5 7 + 0 0 0 0 0 0 0 ## 0 + 0 1 0 0 0 0 0 ## t + 0 0 0 0 0 0 20 ## 20 + 0 0 1 0 0 0 0 ## j + 0 0 0 0 0 0 2 ## 2 + +# ---------------------------------------------- 43.3 Access +# Access informations are provided +1 +# Read access informations +2 7 + 21 0 0 0 0 0 0 ## POLD[0][j] + 0 0 1 0 0 0 0 ## +# Write access informations +2 7 + 21 0 0 0 1 0 0 ## POLD[M][j] + 0 0 1 0 0 0 0 ## + +# ---------------------------------------------- 43.4 Body +# Statement body is provided +1 +# Original iterator names +t j +# Statement body +POLD[M][j]=POLD[0][j]; + + +# =============================================== Statement 44 +# ---------------------------------------------- 44.1 Domain +# Iteration domain +1 +4 7 + 1 1 0 0 0 0 0 ## t >= 0 + 1 -1 0 1 0 0 -1 ## -t+N3-1 >= 0 + 1 0 1 0 0 0 0 ## j >= 0 + 1 0 -1 0 0 1 -1 ## -j+N-1 >= 0 + +# ---------------------------------------------- 44.2 Scattering +# Scattering function is provided +1 +# Scattering function +5 7 + 0 0 0 0 0 0 0 ## 0 + 0 1 0 0 0 0 0 ## t + 0 0 0 0 0 0 20 ## 20 + 0 0 1 0 0 0 0 ## j + 0 0 0 0 0 0 3 ## 3 + +# ---------------------------------------------- 44.3 Access +# Access informations are provided +1 +# Read access informations +2 7 + 7 0 0 0 0 0 0 ## U[0][j] + 0 0 1 0 0 0 0 ## +# Write access informations +2 7 + 7 0 0 0 1 0 0 ## U[M][j] + 0 0 1 0 0 0 0 ## + +# ---------------------------------------------- 44.4 Body +# Statement body is provided +1 +# Original iterator names +t j +# Statement body +U[M][j]=U[0][j]; + + +# =============================================== Statement 45 +# ---------------------------------------------- 45.1 Domain +# Iteration domain +1 +4 7 + 1 1 0 0 0 0 0 ## t >= 0 + 1 -1 0 1 0 0 -1 ## -t+N3-1 >= 0 + 1 0 1 0 0 0 0 ## j >= 0 + 1 0 -1 0 0 1 -1 ## -j+N-1 >= 0 + +# ---------------------------------------------- 45.2 Scattering +# Scattering function is provided +1 +# Scattering function +5 7 + 0 0 0 0 0 0 0 ## 0 + 0 1 0 0 0 0 0 ## t + 0 0 0 0 0 0 20 ## 20 + 0 0 1 0 0 0 0 ## j + 0 0 0 0 0 0 4 ## 4 + +# ---------------------------------------------- 45.3 Access +# Access informations are provided +1 +# Read access informations +2 7 + 9 0 0 0 0 0 0 ## V[0][j] + 0 0 1 0 0 0 0 ## +# Write access informations +2 7 + 9 0 0 0 1 0 0 ## V[M][j] + 0 0 1 0 0 0 0 ## + +# ---------------------------------------------- 45.4 Body +# Statement body is provided +1 +# Original iterator names +t j +# Statement body +V[M][j]=V[0][j]; + + +# =============================================== Statement 46 +# ---------------------------------------------- 46.1 Domain +# Iteration domain +1 +4 7 + 1 1 0 0 0 0 0 ## t >= 0 + 1 -1 0 1 0 0 -1 ## -t+N3-1 >= 0 + 1 0 1 0 0 0 0 ## j >= 0 + 1 0 -1 0 0 1 -1 ## -j+N-1 >= 0 + +# ---------------------------------------------- 46.2 Scattering +# Scattering function is provided +1 +# Scattering function +5 7 + 0 0 0 0 0 0 0 ## 0 + 0 1 0 0 0 0 0 ## t + 0 0 0 0 0 0 20 ## 20 + 0 0 1 0 0 0 0 ## j + 0 0 0 0 0 0 5 ## 5 + +# ---------------------------------------------- 46.3 Access +# Access informations are provided +1 +# Read access informations +2 7 + 6 0 0 0 0 0 0 ## P[0][j] + 0 0 1 0 0 0 0 ## +# Write access informations +2 7 + 6 0 0 0 1 0 0 ## P[M][j] + 0 0 1 0 0 0 0 ## + +# ---------------------------------------------- 46.4 Body +# Statement body is provided +1 +# Original iterator names +t j +# Statement body +P[M][j]=P[0][j]; + + +# =============================================== Statement 47 +# ---------------------------------------------- 47.1 Domain +# Iteration domain +1 +4 7 + 1 1 0 0 0 0 0 ## t >= 0 + 1 -1 0 1 0 0 -1 ## -t+N3-1 >= 0 + 1 0 1 0 0 0 0 ## i >= 0 + 1 0 -1 0 1 0 -1 ## -i+M-1 >= 0 + +# ---------------------------------------------- 47.2 Scattering +# Scattering function is provided +1 +# Scattering function +5 7 + 0 0 0 0 0 0 0 ## 0 + 0 1 0 0 0 0 0 ## t + 0 0 0 0 0 0 21 ## 21 + 0 0 1 0 0 0 0 ## i + 0 0 0 0 0 0 0 ## 0 + +# ---------------------------------------------- 47.3 Access +# Access informations are provided +1 +# Read access informations +2 7 + 17 0 1 0 0 0 0 ## UOLD[i][0] + 0 0 0 0 0 0 0 ## +# Write access informations +2 7 + 17 0 1 0 0 0 0 ## UOLD[i][N] + 0 0 0 0 0 1 0 ## + +# ---------------------------------------------- 47.4 Body +# Statement body is provided +1 +# Original iterator names +t i +# Statement body +UOLD[i][N]=UOLD[i][0]; + + +# =============================================== Statement 48 +# ---------------------------------------------- 48.1 Domain +# Iteration domain +1 +4 7 + 1 1 0 0 0 0 0 ## t >= 0 + 1 -1 0 1 0 0 -1 ## -t+N3-1 >= 0 + 1 0 1 0 0 0 0 ## i >= 0 + 1 0 -1 0 1 0 -1 ## -i+M-1 >= 0 + +# ---------------------------------------------- 48.2 Scattering +# Scattering function is provided +1 +# Scattering function +5 7 + 0 0 0 0 0 0 0 ## 0 + 0 1 0 0 0 0 0 ## t + 0 0 0 0 0 0 21 ## 21 + 0 0 1 0 0 0 0 ## i + 0 0 0 0 0 0 1 ## 1 + +# ---------------------------------------------- 48.3 Access +# Access informations are provided +1 +# Read access informations +2 7 + 19 0 1 0 0 0 0 ## VOLD[i][0] + 0 0 0 0 0 0 0 ## +# Write access informations +2 7 + 19 0 1 0 0 0 0 ## VOLD[i][N] + 0 0 0 0 0 1 0 ## + +# ---------------------------------------------- 48.4 Body +# Statement body is provided +1 +# Original iterator names +t i +# Statement body +VOLD[i][N]=VOLD[i][0]; + + +# =============================================== Statement 49 +# ---------------------------------------------- 49.1 Domain +# Iteration domain +1 +4 7 + 1 1 0 0 0 0 0 ## t >= 0 + 1 -1 0 1 0 0 -1 ## -t+N3-1 >= 0 + 1 0 1 0 0 0 0 ## i >= 0 + 1 0 -1 0 1 0 -1 ## -i+M-1 >= 0 + +# ---------------------------------------------- 49.2 Scattering +# Scattering function is provided +1 +# Scattering function +5 7 + 0 0 0 0 0 0 0 ## 0 + 0 1 0 0 0 0 0 ## t + 0 0 0 0 0 0 21 ## 21 + 0 0 1 0 0 0 0 ## i + 0 0 0 0 0 0 2 ## 2 + +# ---------------------------------------------- 49.3 Access +# Access informations are provided +1 +# Read access informations +2 7 + 21 0 1 0 0 0 0 ## POLD[i][0] + 0 0 0 0 0 0 0 ## +# Write access informations +2 7 + 21 0 1 0 0 0 0 ## POLD[i][N] + 0 0 0 0 0 1 0 ## + +# ---------------------------------------------- 49.4 Body +# Statement body is provided +1 +# Original iterator names +t i +# Statement body +POLD[i][N]=POLD[i][0]; + + +# =============================================== Statement 50 +# ---------------------------------------------- 50.1 Domain +# Iteration domain +1 +4 7 + 1 1 0 0 0 0 0 ## t >= 0 + 1 -1 0 1 0 0 -1 ## -t+N3-1 >= 0 + 1 0 1 0 0 0 0 ## i >= 0 + 1 0 -1 0 1 0 -1 ## -i+M-1 >= 0 + +# ---------------------------------------------- 50.2 Scattering +# Scattering function is provided +1 +# Scattering function +5 7 + 0 0 0 0 0 0 0 ## 0 + 0 1 0 0 0 0 0 ## t + 0 0 0 0 0 0 21 ## 21 + 0 0 1 0 0 0 0 ## i + 0 0 0 0 0 0 3 ## 3 + +# ---------------------------------------------- 50.3 Access +# Access informations are provided +1 +# Read access informations +2 7 + 7 0 1 0 0 0 0 ## U[i][0] + 0 0 0 0 0 0 0 ## +# Write access informations +2 7 + 7 0 1 0 0 0 0 ## U[i][N] + 0 0 0 0 0 1 0 ## + +# ---------------------------------------------- 50.4 Body +# Statement body is provided +1 +# Original iterator names +t i +# Statement body +U[i][N]=U[i][0]; + + +# =============================================== Statement 51 +# ---------------------------------------------- 51.1 Domain +# Iteration domain +1 +4 7 + 1 1 0 0 0 0 0 ## t >= 0 + 1 -1 0 1 0 0 -1 ## -t+N3-1 >= 0 + 1 0 1 0 0 0 0 ## i >= 0 + 1 0 -1 0 1 0 -1 ## -i+M-1 >= 0 + +# ---------------------------------------------- 51.2 Scattering +# Scattering function is provided +1 +# Scattering function +5 7 + 0 0 0 0 0 0 0 ## 0 + 0 1 0 0 0 0 0 ## t + 0 0 0 0 0 0 21 ## 21 + 0 0 1 0 0 0 0 ## i + 0 0 0 0 0 0 4 ## 4 + +# ---------------------------------------------- 51.3 Access +# Access informations are provided +1 +# Read access informations +2 7 + 9 0 1 0 0 0 0 ## V[i][0] + 0 0 0 0 0 0 0 ## +# Write access informations +2 7 + 9 0 1 0 0 0 0 ## V[i][N] + 0 0 0 0 0 1 0 ## + +# ---------------------------------------------- 51.4 Body +# Statement body is provided +1 +# Original iterator names +t i +# Statement body +V[i][N]=V[i][0]; + + +# =============================================== Statement 52 +# ---------------------------------------------- 52.1 Domain +# Iteration domain +1 +4 7 + 1 1 0 0 0 0 0 ## t >= 0 + 1 -1 0 1 0 0 -1 ## -t+N3-1 >= 0 + 1 0 1 0 0 0 0 ## i >= 0 + 1 0 -1 0 1 0 -1 ## -i+M-1 >= 0 + +# ---------------------------------------------- 52.2 Scattering +# Scattering function is provided +1 +# Scattering function +5 7 + 0 0 0 0 0 0 0 ## 0 + 0 1 0 0 0 0 0 ## t + 0 0 0 0 0 0 21 ## 21 + 0 0 1 0 0 0 0 ## i + 0 0 0 0 0 0 5 ## 5 + +# ---------------------------------------------- 52.3 Access +# Access informations are provided +1 +# Read access informations +2 7 + 6 0 1 0 0 0 0 ## P[i][0] + 0 0 0 0 0 0 0 ## +# Write access informations +2 7 + 6 0 1 0 0 0 0 ## P[i][N] + 0 0 0 0 0 1 0 ## + +# ---------------------------------------------- 52.4 Body +# Statement body is provided +1 +# Original iterator names +t i +# Statement body +P[i][N]=P[i][0]; + + +# =============================================== Statement 53 +# ---------------------------------------------- 53.1 Domain +# Iteration domain +1 +2 6 + 1 1 0 0 0 0 ## t >= 0 + 1 -1 1 0 0 -1 ## -t+N3-1 >= 0 + +# ---------------------------------------------- 53.2 Scattering +# Scattering function is provided +1 +# Scattering function +3 6 + 0 0 0 0 0 0 ## 0 + 0 1 0 0 0 0 ## t + 0 0 0 0 0 22 ## 22 + +# ---------------------------------------------- 53.3 Access +# Access informations are provided +1 +# Read access informations +2 6 + 17 0 0 0 0 0 ## UOLD[0][0] + 0 0 0 0 0 0 ## +# Write access informations +2 6 + 17 0 0 1 0 0 ## UOLD[M][N] + 0 0 0 0 1 0 ## + +# ---------------------------------------------- 53.4 Body +# Statement body is provided +1 +# Original iterator names +t +# Statement body +UOLD[M][N]=UOLD[0][0]; + + +# =============================================== Statement 54 +# ---------------------------------------------- 54.1 Domain +# Iteration domain +1 +2 6 + 1 1 0 0 0 0 ## t >= 0 + 1 -1 1 0 0 -1 ## -t+N3-1 >= 0 + +# ---------------------------------------------- 54.2 Scattering +# Scattering function is provided +1 +# Scattering function +3 6 + 0 0 0 0 0 0 ## 0 + 0 1 0 0 0 0 ## t + 0 0 0 0 0 23 ## 23 + +# ---------------------------------------------- 54.3 Access +# Access informations are provided +1 +# Read access informations +2 6 + 19 0 0 0 0 0 ## VOLD[0][0] + 0 0 0 0 0 0 ## +# Write access informations +2 6 + 19 0 0 1 0 0 ## VOLD[M][N] + 0 0 0 0 1 0 ## + +# ---------------------------------------------- 54.4 Body +# Statement body is provided +1 +# Original iterator names +t +# Statement body +VOLD[M][N]=VOLD[0][0]; + + +# =============================================== Statement 55 +# ---------------------------------------------- 55.1 Domain +# Iteration domain +1 +2 6 + 1 1 0 0 0 0 ## t >= 0 + 1 -1 1 0 0 -1 ## -t+N3-1 >= 0 + +# ---------------------------------------------- 55.2 Scattering +# Scattering function is provided +1 +# Scattering function +3 6 + 0 0 0 0 0 0 ## 0 + 0 1 0 0 0 0 ## t + 0 0 0 0 0 24 ## 24 + +# ---------------------------------------------- 55.3 Access +# Access informations are provided +1 +# Read access informations +2 6 + 21 0 0 0 0 0 ## POLD[0][0] + 0 0 0 0 0 0 ## +# Write access informations +2 6 + 21 0 0 1 0 0 ## POLD[M][N] + 0 0 0 0 1 0 ## + +# ---------------------------------------------- 55.4 Body +# Statement body is provided +1 +# Original iterator names +t +# Statement body +POLD[M][N]=POLD[0][0]; + + +# =============================================== Statement 56 +# ---------------------------------------------- 56.1 Domain +# Iteration domain +1 +2 6 + 1 1 0 0 0 0 ## t >= 0 + 1 -1 1 0 0 -1 ## -t+N3-1 >= 0 + +# ---------------------------------------------- 56.2 Scattering +# Scattering function is provided +1 +# Scattering function +3 6 + 0 0 0 0 0 0 ## 0 + 0 1 0 0 0 0 ## t + 0 0 0 0 0 25 ## 25 + +# ---------------------------------------------- 56.3 Access +# Access informations are provided +1 +# Read access informations +2 6 + 7 0 0 0 0 0 ## U[0][0] + 0 0 0 0 0 0 ## +# Write access informations +2 6 + 7 0 0 1 0 0 ## U[M][N] + 0 0 0 0 1 0 ## + +# ---------------------------------------------- 56.4 Body +# Statement body is provided +1 +# Original iterator names +t +# Statement body +U[M][N]=U[0][0]; + + +# =============================================== Statement 57 +# ---------------------------------------------- 57.1 Domain +# Iteration domain +1 +2 6 + 1 1 0 0 0 0 ## t >= 0 + 1 -1 1 0 0 -1 ## -t+N3-1 >= 0 + +# ---------------------------------------------- 57.2 Scattering +# Scattering function is provided +1 +# Scattering function +3 6 + 0 0 0 0 0 0 ## 0 + 0 1 0 0 0 0 ## t + 0 0 0 0 0 26 ## 26 + +# ---------------------------------------------- 57.3 Access +# Access informations are provided +1 +# Read access informations +2 6 + 9 0 0 0 0 0 ## V[0][0] + 0 0 0 0 0 0 ## +# Write access informations +2 6 + 9 0 0 1 0 0 ## V[M][N] + 0 0 0 0 1 0 ## + +# ---------------------------------------------- 57.4 Body +# Statement body is provided +1 +# Original iterator names +t +# Statement body +V[M][N]=V[0][0]; + + +# =============================================== Statement 58 +# ---------------------------------------------- 58.1 Domain +# Iteration domain +1 +2 6 + 1 1 0 0 0 0 ## t >= 0 + 1 -1 1 0 0 -1 ## -t+N3-1 >= 0 + +# ---------------------------------------------- 58.2 Scattering +# Scattering function is provided +1 +# Scattering function +3 6 + 0 0 0 0 0 0 ## 0 + 0 1 0 0 0 0 ## t + 0 0 0 0 0 27 ## 27 + +# ---------------------------------------------- 58.3 Access +# Access informations are provided +1 +# Read access informations +2 6 + 6 0 0 0 0 0 ## P[0][0] + 0 0 0 0 0 0 ## +# Write access informations +2 6 + 6 0 0 1 0 0 ## P[M][N] + 0 0 0 0 1 0 ## + +# ---------------------------------------------- 58.4 Body +# Statement body is provided +1 +# Original iterator names +t +# Statement body +P[M][N]=P[0][0]; + + +# =============================================== Options + +24 +1 FSDX +2 DX +3 FSDY +4 DY +5 CU +6 P +7 U +8 CV +9 V +10 Z +11 H +12 TDTS8 +13 TDT +14 TDTSDX +15 TDTSDY +16 UNEW +17 UOLD +18 VNEW +19 VOLD +20 PNEW +21 POLD +22 time +23 DT +24 ALPHA + diff --git a/clan/tests/unitary/assigniter.c b/clan/tests/unitary/assigniter.c new file mode 100644 index 0000000..12e4434 --- /dev/null +++ b/clan/tests/unitary/assigniter.c @@ -0,0 +1,5 @@ +#pragma scop +for (i = 0; i < N; ++i) + for (j = 0; j < N; ++j) + A[i] = i * j; +#pragma endscop diff --git a/clan/tests/unitary/assigniter.c.scop b/clan/tests/unitary/assigniter.c.scop new file mode 100644 index 0000000..69e0888 --- /dev/null +++ b/clan/tests/unitary/assigniter.c.scop @@ -0,0 +1,88 @@ +# +# <| +# A +# /.\ +# <| [""M# +# A | # Clan McCloog Castle +# /.\ [""M# [File generated by ScopLib 0.1.0 64 bits] +# [""M# | # U"U#U +# | # | # \ .:/ +# | # | #___| # +# | "--' .-" +# |"-"-"-"-"-#-#-## +# | # ## ###### +# \ .::::'/ +# \ ::::'/ +# :8a| # # ## +# ::88a ### +# ::::888a 8a ##::. +# ::::::888a88a[]:::: +# :::::::::SUNDOGa8a::::. .. +# :::::8::::888:Y8888:::::::::... +#::':::88::::888::Y88a______________________________________________________ +#:: ::::88a::::88a:Y88a __---__-- __ +#' .: ::Y88a:::::8a:Y88a __----_-- -------_-__ +# :' ::::8P::::::::::88aa. _ _- -- --_ --- __ --- __-- +#.:: :::::::::::::::::::Y88as88a...s88aa. + +SCoP + +# =============================================== Global +# Language +C + +# Context +0 3 + +# Parameter names are provided +1 +# Parameter names +N + +# Number of statements +1 + +# =============================================== Statement 1 +# ---------------------------------------------- 1.1 Domain +# Iteration domain +1 +4 5 + 1 1 0 0 0 ## i >= 0 + 1 -1 0 1 -1 ## -i+N-1 >= 0 + 1 0 1 0 0 ## j >= 0 + 1 0 -1 1 -1 ## -j+N-1 >= 0 + +# ---------------------------------------------- 1.2 Scattering +# Scattering function is provided +1 +# Scattering function +5 5 + 0 0 0 0 0 ## 0 + 0 1 0 0 0 ## i + 0 0 0 0 0 ## 0 + 0 0 1 0 0 ## j + 0 0 0 0 0 ## 0 + +# ---------------------------------------------- 1.3 Access +# Access informations are provided +1 +# Read access informations +0 5 +# Write access informations +1 5 + 1 1 0 0 0 ## A[i] + +# ---------------------------------------------- 1.4 Body +# Statement body is provided +1 +# Original iterator names +i j +# Statement body +A[i]=i*j; + + +# =============================================== Options + +1 +1 A + diff --git a/clan/tests/unitary/assigniter2.c b/clan/tests/unitary/assigniter2.c new file mode 100644 index 0000000..5eee635 --- /dev/null +++ b/clan/tests/unitary/assigniter2.c @@ -0,0 +1,5 @@ +#pragma scop +for (i = 0; i < N; ++i) + for (j = 0; j < N; ++j) + A[i][j] = (i * j) / N; +#pragma endscop diff --git a/clan/tests/unitary/assigniter2.c.scop b/clan/tests/unitary/assigniter2.c.scop new file mode 100644 index 0000000..72e295f --- /dev/null +++ b/clan/tests/unitary/assigniter2.c.scop @@ -0,0 +1,89 @@ +# +# <| +# A +# /.\ +# <| [""M# +# A | # Clan McCloog Castle +# /.\ [""M# [File generated by ScopLib 0.1.0 64 bits] +# [""M# | # U"U#U +# | # | # \ .:/ +# | # | #___| # +# | "--' .-" +# |"-"-"-"-"-#-#-## +# | # ## ###### +# \ .::::'/ +# \ ::::'/ +# :8a| # # ## +# ::88a ### +# ::::888a 8a ##::. +# ::::::888a88a[]:::: +# :::::::::SUNDOGa8a::::. .. +# :::::8::::888:Y8888:::::::::... +#::':::88::::888::Y88a______________________________________________________ +#:: ::::88a::::88a:Y88a __---__-- __ +#' .: ::Y88a:::::8a:Y88a __----_-- -------_-__ +# :' ::::8P::::::::::88aa. _ _- -- --_ --- __ --- __-- +#.:: :::::::::::::::::::Y88as88a...s88aa. + +SCoP + +# =============================================== Global +# Language +C + +# Context +0 3 + +# Parameter names are provided +1 +# Parameter names +N + +# Number of statements +1 + +# =============================================== Statement 1 +# ---------------------------------------------- 1.1 Domain +# Iteration domain +1 +4 5 + 1 1 0 0 0 ## i >= 0 + 1 -1 0 1 -1 ## -i+N-1 >= 0 + 1 0 1 0 0 ## j >= 0 + 1 0 -1 1 -1 ## -j+N-1 >= 0 + +# ---------------------------------------------- 1.2 Scattering +# Scattering function is provided +1 +# Scattering function +5 5 + 0 0 0 0 0 ## 0 + 0 1 0 0 0 ## i + 0 0 0 0 0 ## 0 + 0 0 1 0 0 ## j + 0 0 0 0 0 ## 0 + +# ---------------------------------------------- 1.3 Access +# Access informations are provided +1 +# Read access informations +0 5 +# Write access informations +2 5 + 1 1 0 0 0 ## A[i][j] + 0 0 1 0 0 ## + +# ---------------------------------------------- 1.4 Body +# Statement body is provided +1 +# Original iterator names +i j +# Statement body +A[i][j]=(i*j)/N; + + +# =============================================== Options + +1 +1 A + diff --git a/clan/tests/unitary/basicnest.c b/clan/tests/unitary/basicnest.c new file mode 100644 index 0000000..ac58aaa --- /dev/null +++ b/clan/tests/unitary/basicnest.c @@ -0,0 +1,7 @@ +#pragma scop +for (i = 0; i < n; ++i) + for (j = 0; j < 2; ++j) + a; +for (i = 0; i < n; ++i) + c; +#pragma endscop diff --git a/clan/tests/unitary/basicnest.c.scop b/clan/tests/unitary/basicnest.c.scop new file mode 100644 index 0000000..e783af4 --- /dev/null +++ b/clan/tests/unitary/basicnest.c.scop @@ -0,0 +1,124 @@ +# +# <| +# A +# /.\ +# <| [""M# +# A | # Clan McCloog Castle +# /.\ [""M# [File generated by Clan 0.5.0 64 bits] +# [""M# | # U"U#U +# | # | # \ .:/ +# | # | #___| # +# | "--' .-" +# |"-"-"-"-"-#-#-## +# | # ## ###### +# \ .::::'/ +# \ ::::'/ +# :8a| # # ## +# ::88a ### +# ::::888a 8a ##::. +# ::::::888a88a[]:::: +# :::::::::SUNDOGa8a::::. .. +# :::::8::::888:Y8888:::::::::... +#::':::88::::888::Y88a______________________________________________________ +#:: ::::88a::::88a:Y88a __---__-- __ +#' .: ::Y88a:::::8a:Y88a __----_-- -------_-__ +# :' ::::8P::::::::::88aa. _ _- -- --_ --- __ --- __-- +#.:: :::::::::::::::::::Y88as88a...s88aa. + +SCoP + +# =============================================== Global +# Language +C + +# Context +0 3 + +# Parameter names are provided +1 +# Parameter names +n + +# Number of statements +2 + +# =============================================== Statement 1 +# ---------------------------------------------- 1.1 Domain +# Iteration domain +1 +4 5 + 1 1 0 0 0 ## i >= 0 + 1 -1 0 1 -1 ## -i+n-1 >= 0 + 1 0 1 0 0 ## j >= 0 + 1 0 -1 0 1 ## -j+1 >= 0 + +# ---------------------------------------------- 1.2 Scattering +# Scattering function is provided +1 +# Scattering function +5 5 + 0 0 0 0 0 ## 0 + 0 1 0 0 0 ## i + 0 0 0 0 0 ## 0 + 0 0 1 0 0 ## j + 0 0 0 0 0 ## 0 + +# ---------------------------------------------- 1.3 Access +# Access informations are provided +1 +# Read access informations +1 5 + 1 0 0 0 0 ## a[0] +# Write access informations +0 5 + +# ---------------------------------------------- 1.4 Body +# Statement body is provided +1 +# Original iterator names +i j +# Statement body +a; + + +# =============================================== Statement 2 +# ---------------------------------------------- 2.1 Domain +# Iteration domain +1 +2 4 + 1 1 0 0 ## i >= 0 + 1 -1 1 -1 ## -i+n-1 >= 0 + +# ---------------------------------------------- 2.2 Scattering +# Scattering function is provided +1 +# Scattering function +3 4 + 0 0 0 1 ## 1 + 0 1 0 0 ## i + 0 0 0 0 ## 0 + +# ---------------------------------------------- 2.3 Access +# Access informations are provided +1 +# Read access informations +1 4 + 2 0 0 0 ## c[0] +# Write access informations +0 4 + +# ---------------------------------------------- 2.4 Body +# Statement body is provided +1 +# Original iterator names +i +# Statement body +c; + + +# =============================================== Options + +2 +1 a +2 c + diff --git a/clan/tests/unitary/binop.c b/clan/tests/unitary/binop.c new file mode 100644 index 0000000..1f23b68 --- /dev/null +++ b/clan/tests/unitary/binop.c @@ -0,0 +1,5 @@ +#pragma scop +a += b; +--a; +b++; +#pragma endscop diff --git a/clan/tests/unitary/binop.c.scop b/clan/tests/unitary/binop.c.scop new file mode 100644 index 0000000..2643368 --- /dev/null +++ b/clan/tests/unitary/binop.c.scop @@ -0,0 +1,154 @@ +# +# <| +# A +# /.\ +# <| [""M# +# A | # Clan McCloog Castle +# /.\ [""M# [File generated by Clan 0.5.0 64 bits] +# [""M# | # U"U#U +# | # | # \ .:/ +# | # | #___| # +# | "--' .-" +# |"-"-"-"-"-#-#-## +# | # ## ###### +# \ .::::'/ +# \ ::::'/ +# :8a| # # ## +# ::88a ### +# ::::888a 8a ##::. +# ::::::888a88a[]:::: +# :::::::::SUNDOGa8a::::. .. +# :::::8::::888:Y8888:::::::::... +#::':::88::::888::Y88a______________________________________________________ +#:: ::::88a::::88a:Y88a __---__-- __ +#' .: ::Y88a:::::8a:Y88a __----_-- -------_-__ +# :' ::::8P::::::::::88aa. _ _- -- --_ --- __ --- __-- +#.:: :::::::::::::::::::Y88as88a...s88aa. + +SCoP + +# =============================================== Global +# Language +C + +# Context +0 2 + +# Parameter names are not provided +0 + +# Number of statements +3 + +# =============================================== Statement 1 +# ---------------------------------------------- 1.1 Domain +# Iteration domain +1 +1 3 + 0 1 0 ## fakeiter == 0 + +# ---------------------------------------------- 1.2 Scattering +# Scattering function is provided +1 +# Scattering function +3 3 + 0 0 0 ## 0 + 0 1 0 ## fakeiter + 0 0 0 ## 0 + +# ---------------------------------------------- 1.3 Access +# Access informations are provided +1 +# Read access informations +2 3 + 1 0 0 ## a[0] + 2 0 0 ## b[0] +# Write access informations +1 3 + 1 0 0 ## a[0] + +# ---------------------------------------------- 1.4 Body +# Statement body is provided +1 +# Original iterator names +fakeiter +# Statement body +a+=b; + + +# =============================================== Statement 2 +# ---------------------------------------------- 2.1 Domain +# Iteration domain +1 +1 3 + 0 1 0 ## fakeiter == 0 + +# ---------------------------------------------- 2.2 Scattering +# Scattering function is provided +1 +# Scattering function +3 3 + 0 0 1 ## 1 + 0 1 0 ## fakeiter + 0 0 0 ## 0 + +# ---------------------------------------------- 2.3 Access +# Access informations are provided +1 +# Read access informations +1 3 + 1 0 0 ## a[0] +# Write access informations +1 3 + 1 0 0 ## a[0] + +# ---------------------------------------------- 2.4 Body +# Statement body is provided +1 +# Original iterator names +fakeiter +# Statement body +--a; + + +# =============================================== Statement 3 +# ---------------------------------------------- 3.1 Domain +# Iteration domain +1 +1 3 + 0 1 0 ## fakeiter == 0 + +# ---------------------------------------------- 3.2 Scattering +# Scattering function is provided +1 +# Scattering function +3 3 + 0 0 2 ## 2 + 0 1 0 ## fakeiter + 0 0 0 ## 0 + +# ---------------------------------------------- 3.3 Access +# Access informations are provided +1 +# Read access informations +1 3 + 2 0 0 ## b[0] +# Write access informations +1 3 + 2 0 0 ## b[0] + +# ---------------------------------------------- 3.4 Body +# Statement body is provided +1 +# Original iterator names +fakeiter +# Statement body +b++; + + +# =============================================== Options + +2 +1 a +2 b + diff --git a/clan/tests/unitary/classicloop.c b/clan/tests/unitary/classicloop.c new file mode 100644 index 0000000..7e7c163 --- /dev/null +++ b/clan/tests/unitary/classicloop.c @@ -0,0 +1,4 @@ +#pragma scop +for (i = 0; i < n; ++i) + a = 0; +#pragma endscop diff --git a/clan/tests/unitary/classicloop.c.scop b/clan/tests/unitary/classicloop.c.scop new file mode 100644 index 0000000..b2da01d --- /dev/null +++ b/clan/tests/unitary/classicloop.c.scop @@ -0,0 +1,84 @@ +# +# <| +# A +# /.\ +# <| [""M# +# A | # Clan McCloog Castle +# /.\ [""M# [File generated by Clan 0.5.0 64 bits] +# [""M# | # U"U#U +# | # | # \ .:/ +# | # | #___| # +# | "--' .-" +# |"-"-"-"-"-#-#-## +# | # ## ###### +# \ .::::'/ +# \ ::::'/ +# :8a| # # ## +# ::88a ### +# ::::888a 8a ##::. +# ::::::888a88a[]:::: +# :::::::::SUNDOGa8a::::. .. +# :::::8::::888:Y8888:::::::::... +#::':::88::::888::Y88a______________________________________________________ +#:: ::::88a::::88a:Y88a __---__-- __ +#' .: ::Y88a:::::8a:Y88a __----_-- -------_-__ +# :' ::::8P::::::::::88aa. _ _- -- --_ --- __ --- __-- +#.:: :::::::::::::::::::Y88as88a...s88aa. + +SCoP + +# =============================================== Global +# Language +C + +# Context +0 3 + +# Parameter names are provided +1 +# Parameter names +n + +# Number of statements +1 + +# =============================================== Statement 1 +# ---------------------------------------------- 1.1 Domain +# Iteration domain +1 +2 4 + 1 1 0 0 ## i >= 0 + 1 -1 1 -1 ## -i+n-1 >= 0 + +# ---------------------------------------------- 1.2 Scattering +# Scattering function is provided +1 +# Scattering function +3 4 + 0 0 0 0 ## 0 + 0 1 0 0 ## i + 0 0 0 0 ## 0 + +# ---------------------------------------------- 1.3 Access +# Access informations are provided +1 +# Read access informations +0 4 +# Write access informations +1 4 + 1 0 0 0 ## a[0] + +# ---------------------------------------------- 1.4 Body +# Statement body is provided +1 +# Original iterator names +i +# Statement body +a=0; + + +# =============================================== Options + +1 +1 a + diff --git a/clan/tests/unitary/comments.c b/clan/tests/unitary/comments.c new file mode 100644 index 0000000..28247d8 --- /dev/null +++ b/clan/tests/unitary/comments.c @@ -0,0 +1,7 @@ +#pragma scop +/* A comment in the scop. */ + for (i=1;i<=n;i++) + // A C++ comment. + c[i] = 0; +/* Another comment in the scop. */ +#pragma endscop diff --git a/clan/tests/unitary/comments.c.scop b/clan/tests/unitary/comments.c.scop new file mode 100644 index 0000000..05e4c6d --- /dev/null +++ b/clan/tests/unitary/comments.c.scop @@ -0,0 +1,84 @@ +# +# <| +# A +# /.\ +# <| [""M# +# A | # Clan McCloog Castle +# /.\ [""M# [File generated by Clan 0.5.0 64 bits] +# [""M# | # U"U#U +# | # | # \ .:/ +# | # | #___| # +# | "--' .-" +# |"-"-"-"-"-#-#-## +# | # ## ###### +# \ .::::'/ +# \ ::::'/ +# :8a| # # ## +# ::88a ### +# ::::888a 8a ##::. +# ::::::888a88a[]:::: +# :::::::::SUNDOGa8a::::. .. +# :::::8::::888:Y8888:::::::::... +#::':::88::::888::Y88a______________________________________________________ +#:: ::::88a::::88a:Y88a __---__-- __ +#' .: ::Y88a:::::8a:Y88a __----_-- -------_-__ +# :' ::::8P::::::::::88aa. _ _- -- --_ --- __ --- __-- +#.:: :::::::::::::::::::Y88as88a...s88aa. + +SCoP + +# =============================================== Global +# Language +C + +# Context +0 3 + +# Parameter names are provided +1 +# Parameter names +n + +# Number of statements +1 + +# =============================================== Statement 1 +# ---------------------------------------------- 1.1 Domain +# Iteration domain +1 +2 4 + 1 1 0 -1 ## i-1 >= 0 + 1 -1 1 0 ## -i+n >= 0 + +# ---------------------------------------------- 1.2 Scattering +# Scattering function is provided +1 +# Scattering function +3 4 + 0 0 0 0 ## 0 + 0 1 0 0 ## i + 0 0 0 0 ## 0 + +# ---------------------------------------------- 1.3 Access +# Access informations are provided +1 +# Read access informations +0 4 +# Write access informations +1 4 + 1 1 0 0 ## c[i] + +# ---------------------------------------------- 1.4 Body +# Statement body is provided +1 +# Original iterator names +i +# Statement body +c[i]=0; + + +# =============================================== Options + +1 +1 c + diff --git a/clan/tests/unitary/complexcond.c b/clan/tests/unitary/complexcond.c new file mode 100644 index 0000000..b58a3b3 --- /dev/null +++ b/clan/tests/unitary/complexcond.c @@ -0,0 +1,14 @@ +#pragma scop +for (i = 0; i < n; ++i) + { + if (i > 1) + a = 0; + b = 0; + if (i > 2) + { + if (i < n - 1) + c = 0; + d = 0; + } + } +#pragma endscop diff --git a/clan/tests/unitary/complexcond.c.scop b/clan/tests/unitary/complexcond.c.scop new file mode 100644 index 0000000..4519ec0 --- /dev/null +++ b/clan/tests/unitary/complexcond.c.scop @@ -0,0 +1,196 @@ +# +# <| +# A +# /.\ +# <| [""M# +# A | # Clan McCloog Castle +# /.\ [""M# [File generated by Clan 0.5.0 64 bits] +# [""M# | # U"U#U +# | # | # \ .:/ +# | # | #___| # +# | "--' .-" +# |"-"-"-"-"-#-#-## +# | # ## ###### +# \ .::::'/ +# \ ::::'/ +# :8a| # # ## +# ::88a ### +# ::::888a 8a ##::. +# ::::::888a88a[]:::: +# :::::::::SUNDOGa8a::::. .. +# :::::8::::888:Y8888:::::::::... +#::':::88::::888::Y88a______________________________________________________ +#:: ::::88a::::88a:Y88a __---__-- __ +#' .: ::Y88a:::::8a:Y88a __----_-- -------_-__ +# :' ::::8P::::::::::88aa. _ _- -- --_ --- __ --- __-- +#.:: :::::::::::::::::::Y88as88a...s88aa. + +SCoP + +# =============================================== Global +# Language +C + +# Context +0 3 + +# Parameter names are provided +1 +# Parameter names +n + +# Number of statements +4 + +# =============================================== Statement 1 +# ---------------------------------------------- 1.1 Domain +# Iteration domain +1 +3 4 + 1 1 0 0 ## i >= 0 + 1 -1 1 -1 ## -i+n-1 >= 0 + 1 1 0 -2 ## i-2 >= 0 + +# ---------------------------------------------- 1.2 Scattering +# Scattering function is provided +1 +# Scattering function +3 4 + 0 0 0 0 ## 0 + 0 1 0 0 ## i + 0 0 0 0 ## 0 + +# ---------------------------------------------- 1.3 Access +# Access informations are provided +1 +# Read access informations +0 4 +# Write access informations +1 4 + 1 0 0 0 ## a[0] + +# ---------------------------------------------- 1.4 Body +# Statement body is provided +1 +# Original iterator names +i +# Statement body +a=0; + + +# =============================================== Statement 2 +# ---------------------------------------------- 2.1 Domain +# Iteration domain +1 +2 4 + 1 1 0 0 ## i >= 0 + 1 -1 1 -1 ## -i+n-1 >= 0 + +# ---------------------------------------------- 2.2 Scattering +# Scattering function is provided +1 +# Scattering function +3 4 + 0 0 0 0 ## 0 + 0 1 0 0 ## i + 0 0 0 1 ## 1 + +# ---------------------------------------------- 2.3 Access +# Access informations are provided +1 +# Read access informations +0 4 +# Write access informations +1 4 + 2 0 0 0 ## b[0] + +# ---------------------------------------------- 2.4 Body +# Statement body is provided +1 +# Original iterator names +i +# Statement body +b=0; + + +# =============================================== Statement 3 +# ---------------------------------------------- 3.1 Domain +# Iteration domain +1 +4 4 + 1 1 0 0 ## i >= 0 + 1 -1 1 -1 ## -i+n-1 >= 0 + 1 1 0 -3 ## i-3 >= 0 + 1 -1 1 -2 ## -i+n-2 >= 0 + +# ---------------------------------------------- 3.2 Scattering +# Scattering function is provided +1 +# Scattering function +3 4 + 0 0 0 0 ## 0 + 0 1 0 0 ## i + 0 0 0 2 ## 2 + +# ---------------------------------------------- 3.3 Access +# Access informations are provided +1 +# Read access informations +0 4 +# Write access informations +1 4 + 3 0 0 0 ## c[0] + +# ---------------------------------------------- 3.4 Body +# Statement body is provided +1 +# Original iterator names +i +# Statement body +c=0; + + +# =============================================== Statement 4 +# ---------------------------------------------- 4.1 Domain +# Iteration domain +1 +3 4 + 1 1 0 0 ## i >= 0 + 1 -1 1 -1 ## -i+n-1 >= 0 + 1 1 0 -3 ## i-3 >= 0 + +# ---------------------------------------------- 4.2 Scattering +# Scattering function is provided +1 +# Scattering function +3 4 + 0 0 0 0 ## 0 + 0 1 0 0 ## i + 0 0 0 3 ## 3 + +# ---------------------------------------------- 4.3 Access +# Access informations are provided +1 +# Read access informations +0 4 +# Write access informations +1 4 + 4 0 0 0 ## d[0] + +# ---------------------------------------------- 4.4 Body +# Statement body is provided +1 +# Original iterator names +i +# Statement body +d=0; + + +# =============================================== Options + +4 +1 a +2 b +3 c +4 d + diff --git a/clan/tests/unitary/complexop.c b/clan/tests/unitary/complexop.c new file mode 100644 index 0000000..ad207cb --- /dev/null +++ b/clan/tests/unitary/complexop.c @@ -0,0 +1,3 @@ +#pragma scop +a ^= (b | (c + 2)) % 2 - !(a[n]/2); +#pragma endscop diff --git a/clan/tests/unitary/complexop.c.scop b/clan/tests/unitary/complexop.c.scop new file mode 100644 index 0000000..a4476c9 --- /dev/null +++ b/clan/tests/unitary/complexop.c.scop @@ -0,0 +1,89 @@ +# +# <| +# A +# /.\ +# <| [""M# +# A | # Clan McCloog Castle +# /.\ [""M# [File generated by Clan 0.5.0 64 bits] +# [""M# | # U"U#U +# | # | # \ .:/ +# | # | #___| # +# | "--' .-" +# |"-"-"-"-"-#-#-## +# | # ## ###### +# \ .::::'/ +# \ ::::'/ +# :8a| # # ## +# ::88a ### +# ::::888a 8a ##::. +# ::::::888a88a[]:::: +# :::::::::SUNDOGa8a::::. .. +# :::::8::::888:Y8888:::::::::... +#::':::88::::888::Y88a______________________________________________________ +#:: ::::88a::::88a:Y88a __---__-- __ +#' .: ::Y88a:::::8a:Y88a __----_-- -------_-__ +# :' ::::8P::::::::::88aa. _ _- -- --_ --- __ --- __-- +#.:: :::::::::::::::::::Y88as88a...s88aa. + +SCoP + +# =============================================== Global +# Language +C + +# Context +0 3 + +# Parameter names are provided +1 +# Parameter names +n + +# Number of statements +1 + +# =============================================== Statement 1 +# ---------------------------------------------- 1.1 Domain +# Iteration domain +1 +1 4 + 0 1 0 0 ## fakeiter == 0 + +# ---------------------------------------------- 1.2 Scattering +# Scattering function is provided +1 +# Scattering function +3 4 + 0 0 0 0 ## 0 + 0 1 0 0 ## fakeiter + 0 0 0 0 ## 0 + +# ---------------------------------------------- 1.3 Access +# Access informations are provided +1 +# Read access informations +4 4 + 1 0 0 0 ## a[0] + 2 0 0 0 ## b[0] + 3 0 0 0 ## c[0] + 1 0 1 0 ## a[n] +# Write access informations +1 4 + 1 0 0 0 ## a[0] + +# ---------------------------------------------- 1.4 Body +# Statement body is provided +1 +# Original iterator names +fakeiter +# Statement body +a^=(b|(c+2))%2-!(a[n]/2); + + +# =============================================== Options + +3 +1 a +2 b +3 c + diff --git a/clan/tests/unitary/complexprog.c b/clan/tests/unitary/complexprog.c new file mode 100644 index 0000000..92fbc0c --- /dev/null +++ b/clan/tests/unitary/complexprog.c @@ -0,0 +1,10 @@ +#pragma scop +if (M > N) + for (i = max(2, N); i < M; i = i + 1) + { + a[i] = pow(b,c); + c = c + 1; + } +if (M == N) + a[0] = c; +#pragma endscop diff --git a/clan/tests/unitary/complexprog.c.scop b/clan/tests/unitary/complexprog.c.scop new file mode 100644 index 0000000..53b2026 --- /dev/null +++ b/clan/tests/unitary/complexprog.c.scop @@ -0,0 +1,164 @@ +# +# <| +# A +# /.\ +# <| [""M# +# A | # Clan McCloog Castle +# /.\ [""M# [File generated by Clan 0.5.0 64 bits] +# [""M# | # U"U#U +# | # | # \ .:/ +# | # | #___| # +# | "--' .-" +# |"-"-"-"-"-#-#-## +# | # ## ###### +# \ .::::'/ +# \ ::::'/ +# :8a| # # ## +# ::88a ### +# ::::888a 8a ##::. +# ::::::888a88a[]:::: +# :::::::::SUNDOGa8a::::. .. +# :::::8::::888:Y8888:::::::::... +#::':::88::::888::Y88a______________________________________________________ +#:: ::::88a::::88a:Y88a __---__-- __ +#' .: ::Y88a:::::8a:Y88a __----_-- -------_-__ +# :' ::::8P::::::::::88aa. _ _- -- --_ --- __ --- __-- +#.:: :::::::::::::::::::Y88as88a...s88aa. + +SCoP + +# =============================================== Global +# Language +C + +# Context +0 4 + +# Parameter names are provided +1 +# Parameter names +M N + +# Number of statements +3 + +# =============================================== Statement 1 +# ---------------------------------------------- 1.1 Domain +# Iteration domain +1 +4 5 + 1 0 1 -1 -1 ## M-N-1 >= 0 + 1 1 0 0 -2 ## i-2 >= 0 + 1 1 0 -1 0 ## i-N >= 0 + 1 -1 1 0 -1 ## -i+M-1 >= 0 + +# ---------------------------------------------- 1.2 Scattering +# Scattering function is provided +1 +# Scattering function +3 5 + 0 0 0 0 0 ## 0 + 0 1 0 0 0 ## i + 0 0 0 0 0 ## 0 + +# ---------------------------------------------- 1.3 Access +# Access informations are provided +1 +# Read access informations +2 5 + 2 0 0 0 0 ## b[0] + 3 0 0 0 0 ## c[0] +# Write access informations +1 5 + 1 1 0 0 0 ## a[i] + +# ---------------------------------------------- 1.4 Body +# Statement body is provided +1 +# Original iterator names +i +# Statement body +a[i]=pow(b,c); + + +# =============================================== Statement 2 +# ---------------------------------------------- 2.1 Domain +# Iteration domain +1 +4 5 + 1 0 1 -1 -1 ## M-N-1 >= 0 + 1 1 0 0 -2 ## i-2 >= 0 + 1 1 0 -1 0 ## i-N >= 0 + 1 -1 1 0 -1 ## -i+M-1 >= 0 + +# ---------------------------------------------- 2.2 Scattering +# Scattering function is provided +1 +# Scattering function +3 5 + 0 0 0 0 0 ## 0 + 0 1 0 0 0 ## i + 0 0 0 0 1 ## 1 + +# ---------------------------------------------- 2.3 Access +# Access informations are provided +1 +# Read access informations +1 5 + 3 0 0 0 0 ## c[0] +# Write access informations +1 5 + 3 0 0 0 0 ## c[0] + +# ---------------------------------------------- 2.4 Body +# Statement body is provided +1 +# Original iterator names +i +# Statement body +c=c+1; + + +# =============================================== Statement 3 +# ---------------------------------------------- 3.1 Domain +# Iteration domain +1 +2 5 + 0 0 1 -1 0 ## M-N == 0 + 0 1 0 0 0 ## fakeiter == 0 + +# ---------------------------------------------- 3.2 Scattering +# Scattering function is provided +1 +# Scattering function +3 5 + 0 0 0 0 1 ## 1 + 0 1 0 0 0 ## fakeiter + 0 0 0 0 2 ## 2 + +# ---------------------------------------------- 3.3 Access +# Access informations are provided +1 +# Read access informations +1 5 + 3 0 0 0 0 ## c[0] +# Write access informations +1 5 + 1 0 0 0 0 ## a[0] + +# ---------------------------------------------- 3.4 Body +# Statement body is provided +1 +# Original iterator names +fakeiter +# Statement body +a[0]=c; + + +# =============================================== Options + +3 +1 a +2 b +3 c + diff --git a/clan/tests/unitary/empty.c b/clan/tests/unitary/empty.c new file mode 100644 index 0000000..f76a986 --- /dev/null +++ b/clan/tests/unitary/empty.c @@ -0,0 +1,2 @@ +#pragma scop +#pragma endscop diff --git a/clan/tests/unitary/empty.c.scop b/clan/tests/unitary/empty.c.scop new file mode 100644 index 0000000..03e91e1 --- /dev/null +++ b/clan/tests/unitary/empty.c.scop @@ -0,0 +1,46 @@ +# +# <| +# A +# /.\ +# <| [""M# +# A | # Clan McCloog Castle +# /.\ [""M# [File generated by Clan 0.5.0 64 bits] +# [""M# | # U"U#U +# | # | # \ .:/ +# | # | #___| # +# | "--' .-" +# |"-"-"-"-"-#-#-## +# | # ## ###### +# \ .::::'/ +# \ ::::'/ +# :8a| # # ## +# ::88a ### +# ::::888a 8a ##::. +# ::::::888a88a[]:::: +# :::::::::SUNDOGa8a::::. .. +# :::::8::::888:Y8888:::::::::... +#::':::88::::888::Y88a______________________________________________________ +#:: ::::88a::::88a:Y88a __---__-- __ +#' .: ::Y88a:::::8a:Y88a __----_-- -------_-__ +# :' ::::8P::::::::::88aa. _ _- -- --_ --- __ --- __-- +#.:: :::::::::::::::::::Y88as88a...s88aa. + +SCoP + +# =============================================== Global +# Language +C + +# Context +0 2 + +# Parameter names are not provided +0 + +# Number of statements +0 + +# =============================================== Options + +0 + diff --git a/clan/tests/unitary/field.c b/clan/tests/unitary/field.c new file mode 100644 index 0000000..5454603 --- /dev/null +++ b/clan/tests/unitary/field.c @@ -0,0 +1,6 @@ +#pragma scop +for (i = 0; i < N; ++i) { + a.b = c; +} +c.d = a.b; +#pragma endscop diff --git a/clan/tests/unitary/field.c.scop b/clan/tests/unitary/field.c.scop new file mode 100644 index 0000000..341c395 --- /dev/null +++ b/clan/tests/unitary/field.c.scop @@ -0,0 +1,122 @@ +# +# <| +# A +# /.\ +# <| [""M# +# A | # Clan McCloog Castle +# /.\ [""M# [File generated by ScopLib 0.1.0 64 bits] +# [""M# | # U"U#U +# | # | # \ .:/ +# | # | #___| # +# | "--' .-" +# |"-"-"-"-"-#-#-## +# | # ## ###### +# \ .::::'/ +# \ ::::'/ +# :8a| # # ## +# ::88a ### +# ::::888a 8a ##::. +# ::::::888a88a[]:::: +# :::::::::SUNDOGa8a::::. .. +# :::::8::::888:Y8888:::::::::... +#::':::88::::888::Y88a______________________________________________________ +#:: ::::88a::::88a:Y88a __---__-- __ +#' .: ::Y88a:::::8a:Y88a __----_-- -------_-__ +# :' ::::8P::::::::::88aa. _ _- -- --_ --- __ --- __-- +#.:: :::::::::::::::::::Y88as88a...s88aa. + +SCoP + +# =============================================== Global +# Language +C + +# Context +0 3 + +# Parameter names are provided +1 +# Parameter names +N + +# Number of statements +2 + +# =============================================== Statement 1 +# ---------------------------------------------- 1.1 Domain +# Iteration domain +1 +2 4 + 1 1 0 0 ## i >= 0 + 1 -1 1 -1 ## -i+N-1 >= 0 + +# ---------------------------------------------- 1.2 Scattering +# Scattering function is provided +1 +# Scattering function +3 4 + 0 0 0 0 ## 0 + 0 1 0 0 ## i + 0 0 0 0 ## 0 + +# ---------------------------------------------- 1.3 Access +# Access informations are provided +1 +# Read access informations +1 4 + 2 0 0 0 ## c[0] +# Write access informations +1 4 + 1 0 0 0 ## a.b[0] + +# ---------------------------------------------- 1.4 Body +# Statement body is provided +1 +# Original iterator names +i +# Statement body +a.b=c; + + +# =============================================== Statement 2 +# ---------------------------------------------- 2.1 Domain +# Iteration domain +1 +1 4 + 0 1 0 0 ## fakeiter == 0 + +# ---------------------------------------------- 2.2 Scattering +# Scattering function is provided +1 +# Scattering function +3 4 + 0 0 0 1 ## 1 + 0 1 0 0 ## fakeiter + 0 0 0 1 ## 1 + +# ---------------------------------------------- 2.3 Access +# Access informations are provided +1 +# Read access informations +1 4 + 1 0 0 0 ## a.b[0] +# Write access informations +1 4 + 3 0 0 0 ## c.d[0] + +# ---------------------------------------------- 2.4 Body +# Statement body is provided +1 +# Original iterator names +fakeiter +# Statement body +c.d=a.b; + + +# =============================================== Options + +3 +1 a.b +2 c +3 c.d + diff --git a/clan/tests/unitary/float.c b/clan/tests/unitary/float.c new file mode 100644 index 0000000..dbd7b4d --- /dev/null +++ b/clan/tests/unitary/float.c @@ -0,0 +1,6 @@ +#pragma scop +a = 0.6f; +b = 120.7234234d; +c = 4.0; +d = 5; +#pragma endscop diff --git a/clan/tests/unitary/float.c.scop b/clan/tests/unitary/float.c.scop new file mode 100644 index 0000000..88b043d --- /dev/null +++ b/clan/tests/unitary/float.c.scop @@ -0,0 +1,186 @@ +# +# <| +# A +# /.\ +# <| [""M# +# A | # Clan McCloog Castle +# /.\ [""M# [File generated by ScopLib 0.2.0 64 bits] +# [""M# | # U"U#U +# | # | # \ .:/ +# | # | #___| # +# | "--' .-" +# |"-"-"-"-"-#-#-## +# | # ## ###### +# \ .::::'/ +# \ ::::'/ +# :8a| # # ## +# ::88a ### +# ::::888a 8a ##::. +# ::::::888a88a[]:::: +# :::::::::SUNDOGa8a::::. .. +# :::::8::::888:Y8888:::::::::... +#::':::88::::888::Y88a______________________________________________________ +#:: ::::88a::::88a:Y88a __---__-- __ +#' .: ::Y88a:::::8a:Y88a __----_-- -------_-__ +# :' ::::8P::::::::::88aa. _ _- -- --_ --- __ --- __-- +#.:: :::::::::::::::::::Y88as88a...s88aa. + +SCoP + +# =============================================== Global +# Language +C + +# Context +0 2 + +# Parameter names are not provided +0 + +# Number of statements +4 + +# =============================================== Statement 1 +# ---------------------------------------------- 1.1 Domain +# Iteration domain +1 +1 3 + 0 1 0 ## fakeiter == 0 + +# ---------------------------------------------- 1.2 Scattering +# Scattering function is provided +1 +# Scattering function +3 3 + 0 0 0 ## 0 + 0 1 0 ## fakeiter + 0 0 0 ## 0 + +# ---------------------------------------------- 1.3 Access +# Access informations are provided +1 +# Read access informations +0 3 +# Write access informations +1 3 + 1 0 0 ## a[0] + +# ---------------------------------------------- 1.4 Body +# Statement body is provided +1 +# Original iterator names +fakeiter +# Statement body +a=0.6f; + + +# =============================================== Statement 2 +# ---------------------------------------------- 2.1 Domain +# Iteration domain +1 +1 3 + 0 1 0 ## fakeiter == 0 + +# ---------------------------------------------- 2.2 Scattering +# Scattering function is provided +1 +# Scattering function +3 3 + 0 0 1 ## 1 + 0 1 0 ## fakeiter + 0 0 0 ## 0 + +# ---------------------------------------------- 2.3 Access +# Access informations are provided +1 +# Read access informations +0 3 +# Write access informations +1 3 + 2 0 0 ## b[0] + +# ---------------------------------------------- 2.4 Body +# Statement body is provided +1 +# Original iterator names +fakeiter +# Statement body +b=120.7234234d; + + +# =============================================== Statement 3 +# ---------------------------------------------- 3.1 Domain +# Iteration domain +1 +1 3 + 0 1 0 ## fakeiter == 0 + +# ---------------------------------------------- 3.2 Scattering +# Scattering function is provided +1 +# Scattering function +3 3 + 0 0 2 ## 2 + 0 1 0 ## fakeiter + 0 0 0 ## 0 + +# ---------------------------------------------- 3.3 Access +# Access informations are provided +1 +# Read access informations +0 3 +# Write access informations +1 3 + 3 0 0 ## c[0] + +# ---------------------------------------------- 3.4 Body +# Statement body is provided +1 +# Original iterator names +fakeiter +# Statement body +c=4.0; + + +# =============================================== Statement 4 +# ---------------------------------------------- 4.1 Domain +# Iteration domain +1 +1 3 + 0 1 0 ## fakeiter == 0 + +# ---------------------------------------------- 4.2 Scattering +# Scattering function is provided +1 +# Scattering function +3 3 + 0 0 3 ## 3 + 0 1 0 ## fakeiter + 0 0 0 ## 0 + +# ---------------------------------------------- 4.3 Access +# Access informations are provided +1 +# Read access informations +0 3 +# Write access informations +1 3 + 4 0 0 ## d[0] + +# ---------------------------------------------- 4.4 Body +# Statement body is provided +1 +# Original iterator names +fakeiter +# Statement body +d=5; + + +# =============================================== Options + +4 +1 a +2 b +3 c +4 d + diff --git a/clan/tests/unitary/functioncall.c b/clan/tests/unitary/functioncall.c new file mode 100644 index 0000000..4447c37 --- /dev/null +++ b/clan/tests/unitary/functioncall.c @@ -0,0 +1,4 @@ +#pragma scop +for (i = 0; i < n; ++i) + printf (a[i+1],b[n]); +#pragma endscop diff --git a/clan/tests/unitary/functioncall.c.scop b/clan/tests/unitary/functioncall.c.scop new file mode 100644 index 0000000..e3c5f69 --- /dev/null +++ b/clan/tests/unitary/functioncall.c.scop @@ -0,0 +1,86 @@ +# +# <| +# A +# /.\ +# <| [""M# +# A | # Clan McCloog Castle +# /.\ [""M# [File generated by Clan 0.5.0 64 bits] +# [""M# | # U"U#U +# | # | # \ .:/ +# | # | #___| # +# | "--' .-" +# |"-"-"-"-"-#-#-## +# | # ## ###### +# \ .::::'/ +# \ ::::'/ +# :8a| # # ## +# ::88a ### +# ::::888a 8a ##::. +# ::::::888a88a[]:::: +# :::::::::SUNDOGa8a::::. .. +# :::::8::::888:Y8888:::::::::... +#::':::88::::888::Y88a______________________________________________________ +#:: ::::88a::::88a:Y88a __---__-- __ +#' .: ::Y88a:::::8a:Y88a __----_-- -------_-__ +# :' ::::8P::::::::::88aa. _ _- -- --_ --- __ --- __-- +#.:: :::::::::::::::::::Y88as88a...s88aa. + +SCoP + +# =============================================== Global +# Language +C + +# Context +0 3 + +# Parameter names are provided +1 +# Parameter names +n + +# Number of statements +1 + +# =============================================== Statement 1 +# ---------------------------------------------- 1.1 Domain +# Iteration domain +1 +2 4 + 1 1 0 0 ## i >= 0 + 1 -1 1 -1 ## -i+n-1 >= 0 + +# ---------------------------------------------- 1.2 Scattering +# Scattering function is provided +1 +# Scattering function +3 4 + 0 0 0 0 ## 0 + 0 1 0 0 ## i + 0 0 0 0 ## 0 + +# ---------------------------------------------- 1.3 Access +# Access informations are provided +1 +# Read access informations +2 4 + 1 1 0 1 ## a[i+1] + 2 0 1 0 ## b[n] +# Write access informations +0 4 + +# ---------------------------------------------- 1.4 Body +# Statement body is provided +1 +# Original iterator names +i +# Statement body +printf(a[i+1],b[n]); + + +# =============================================== Options + +2 +1 a +2 b + diff --git a/clan/tests/unitary/functioncall2.c b/clan/tests/unitary/functioncall2.c new file mode 100644 index 0000000..99bb13c --- /dev/null +++ b/clan/tests/unitary/functioncall2.c @@ -0,0 +1,4 @@ +#pragma scop +for (i = 0; i < n; ++i) + ntaps_filter_ffd (&lp_21_conf, 1, &fm_qd_buffer[i], &band_21[i]); +#pragma endscop diff --git a/clan/tests/unitary/functioncall2.c.scop b/clan/tests/unitary/functioncall2.c.scop new file mode 100644 index 0000000..a90c030 --- /dev/null +++ b/clan/tests/unitary/functioncall2.c.scop @@ -0,0 +1,88 @@ +# +# <| +# A +# /.\ +# <| [""M# +# A | # Clan McCloog Castle +# /.\ [""M# [File generated by ScopLib 0.1.0 64 bits] +# [""M# | # U"U#U +# | # | # \ .:/ +# | # | #___| # +# | "--' .-" +# |"-"-"-"-"-#-#-## +# | # ## ###### +# \ .::::'/ +# \ ::::'/ +# :8a| # # ## +# ::88a ### +# ::::888a 8a ##::. +# ::::::888a88a[]:::: +# :::::::::SUNDOGa8a::::. .. +# :::::8::::888:Y8888:::::::::... +#::':::88::::888::Y88a______________________________________________________ +#:: ::::88a::::88a:Y88a __---__-- __ +#' .: ::Y88a:::::8a:Y88a __----_-- -------_-__ +# :' ::::8P::::::::::88aa. _ _- -- --_ --- __ --- __-- +#.:: :::::::::::::::::::Y88as88a...s88aa. + +SCoP + +# =============================================== Global +# Language +C + +# Context +0 3 + +# Parameter names are provided +1 +# Parameter names +n + +# Number of statements +1 + +# =============================================== Statement 1 +# ---------------------------------------------- 1.1 Domain +# Iteration domain +1 +2 4 + 1 1 0 0 ## i >= 0 + 1 -1 1 -1 ## -i+n-1 >= 0 + +# ---------------------------------------------- 1.2 Scattering +# Scattering function is provided +1 +# Scattering function +3 4 + 0 0 0 0 ## 0 + 0 1 0 0 ## i + 0 0 0 0 ## 0 + +# ---------------------------------------------- 1.3 Access +# Access informations are provided +1 +# Read access informations +3 4 + 1 0 0 0 ## lp_21_conf[0] + 2 1 0 0 ## fm_qd_buffer[i] + 3 1 0 0 ## band_21[i] +# Write access informations +0 4 + +# ---------------------------------------------- 1.4 Body +# Statement body is provided +1 +# Original iterator names +i +# Statement body +ntaps_filter_ffd(&lp_21_conf,1,&fm_qd_buffer[i],&band_21[i]); + + +# =============================================== Options + +3 +1 lp_21_conf +2 fm_qd_buffer +3 band_21 + diff --git a/clan/tests/unitary/increment.c b/clan/tests/unitary/increment.c new file mode 100644 index 0000000..a588b84 --- /dev/null +++ b/clan/tests/unitary/increment.c @@ -0,0 +1,4 @@ +#pragma scop +for (i = 0; i < n; i = i + 1) + a = 0; +#pragma endscop diff --git a/clan/tests/unitary/increment.c.scop b/clan/tests/unitary/increment.c.scop new file mode 100644 index 0000000..b2da01d --- /dev/null +++ b/clan/tests/unitary/increment.c.scop @@ -0,0 +1,84 @@ +# +# <| +# A +# /.\ +# <| [""M# +# A | # Clan McCloog Castle +# /.\ [""M# [File generated by Clan 0.5.0 64 bits] +# [""M# | # U"U#U +# | # | # \ .:/ +# | # | #___| # +# | "--' .-" +# |"-"-"-"-"-#-#-## +# | # ## ###### +# \ .::::'/ +# \ ::::'/ +# :8a| # # ## +# ::88a ### +# ::::888a 8a ##::. +# ::::::888a88a[]:::: +# :::::::::SUNDOGa8a::::. .. +# :::::8::::888:Y8888:::::::::... +#::':::88::::888::Y88a______________________________________________________ +#:: ::::88a::::88a:Y88a __---__-- __ +#' .: ::Y88a:::::8a:Y88a __----_-- -------_-__ +# :' ::::8P::::::::::88aa. _ _- -- --_ --- __ --- __-- +#.:: :::::::::::::::::::Y88as88a...s88aa. + +SCoP + +# =============================================== Global +# Language +C + +# Context +0 3 + +# Parameter names are provided +1 +# Parameter names +n + +# Number of statements +1 + +# =============================================== Statement 1 +# ---------------------------------------------- 1.1 Domain +# Iteration domain +1 +2 4 + 1 1 0 0 ## i >= 0 + 1 -1 1 -1 ## -i+n-1 >= 0 + +# ---------------------------------------------- 1.2 Scattering +# Scattering function is provided +1 +# Scattering function +3 4 + 0 0 0 0 ## 0 + 0 1 0 0 ## i + 0 0 0 0 ## 0 + +# ---------------------------------------------- 1.3 Access +# Access informations are provided +1 +# Read access informations +0 4 +# Write access informations +1 4 + 1 0 0 0 ## a[0] + +# ---------------------------------------------- 1.4 Body +# Statement body is provided +1 +# Original iterator names +i +# Statement body +a=0; + + +# =============================================== Options + +1 +1 a + diff --git a/clan/tests/unitary/intaddit.c b/clan/tests/unitary/intaddit.c new file mode 100644 index 0000000..3316cef --- /dev/null +++ b/clan/tests/unitary/intaddit.c @@ -0,0 +1,7 @@ +#pragma scop + for (i=2; i= 0 + 1 -1 0 1 -2 ## -i+N-2 >= 0 + 1 0 1 0 -2 ## j-2 >= 0 + 1 0 -1 1 -2 ## -j+N-2 >= 0 + +# ---------------------------------------------- 1.2 Scattering +# Scattering function is provided +1 +# Scattering function +5 5 + 0 0 0 0 0 ## 0 + 0 1 0 0 0 ## i + 0 0 0 0 0 ## 0 + 0 0 1 0 0 ## j + 0 0 0 0 0 ## 0 + +# ---------------------------------------------- 1.3 Access +# Access informations are provided +1 +# Read access informations +6 5 + 2 1 0 0 0 ## a[i][j] + 0 0 1 0 0 ## + 2 1 0 0 0 ## a[i][j-1] + 0 0 1 0 -1 ## + 2 1 0 0 0 ## a[i][2] + 0 0 0 0 2 ## +# Write access informations +2 5 + 1 1 0 0 0 ## b[i][j] + 0 0 1 0 0 ## + +# ---------------------------------------------- 1.4 Body +# Statement body is provided +1 +# Original iterator names +i j +# Statement body +b[i][j]=0.2*(a[i][j]+a[i][j-1]+a[i][1+1]); + + +# =============================================== Options + +2 +1 b +2 a + diff --git a/clan/tests/unitary/maxloopcomplex.c b/clan/tests/unitary/maxloopcomplex.c new file mode 100644 index 0000000..4af25a4 --- /dev/null +++ b/clan/tests/unitary/maxloopcomplex.c @@ -0,0 +1,4 @@ +#pragma scop +for (i = max(max(m,n),max(p,q)); i < n; ++i) + a = 0; +#pragma endscop diff --git a/clan/tests/unitary/maxloopcomplex.c.scop b/clan/tests/unitary/maxloopcomplex.c.scop new file mode 100644 index 0000000..65bb286 --- /dev/null +++ b/clan/tests/unitary/maxloopcomplex.c.scop @@ -0,0 +1,87 @@ +# +# <| +# A +# /.\ +# <| [""M# +# A | # Clan McCloog Castle +# /.\ [""M# [File generated by Clan 0.5.0 64 bits] +# [""M# | # U"U#U +# | # | # \ .:/ +# | # | #___| # +# | "--' .-" +# |"-"-"-"-"-#-#-## +# | # ## ###### +# \ .::::'/ +# \ ::::'/ +# :8a| # # ## +# ::88a ### +# ::::888a 8a ##::. +# ::::::888a88a[]:::: +# :::::::::SUNDOGa8a::::. .. +# :::::8::::888:Y8888:::::::::... +#::':::88::::888::Y88a______________________________________________________ +#:: ::::88a::::88a:Y88a __---__-- __ +#' .: ::Y88a:::::8a:Y88a __----_-- -------_-__ +# :' ::::8P::::::::::88aa. _ _- -- --_ --- __ --- __-- +#.:: :::::::::::::::::::Y88as88a...s88aa. + +SCoP + +# =============================================== Global +# Language +C + +# Context +0 6 + +# Parameter names are provided +1 +# Parameter names +m n p q + +# Number of statements +1 + +# =============================================== Statement 1 +# ---------------------------------------------- 1.1 Domain +# Iteration domain +1 +5 7 + 1 1 -1 0 0 0 0 ## i-m >= 0 + 1 1 0 -1 0 0 0 ## i-n >= 0 + 1 1 0 0 -1 0 0 ## i-p >= 0 + 1 1 0 0 0 -1 0 ## i-q >= 0 + 1 -1 0 1 0 0 -1 ## -i+n-1 >= 0 + +# ---------------------------------------------- 1.2 Scattering +# Scattering function is provided +1 +# Scattering function +3 7 + 0 0 0 0 0 0 0 ## 0 + 0 1 0 0 0 0 0 ## i + 0 0 0 0 0 0 0 ## 0 + +# ---------------------------------------------- 1.3 Access +# Access informations are provided +1 +# Read access informations +0 7 +# Write access informations +1 7 + 1 0 0 0 0 0 0 ## a[0] + +# ---------------------------------------------- 1.4 Body +# Statement body is provided +1 +# Original iterator names +i +# Statement body +a=0; + + +# =============================================== Options + +1 +1 a + diff --git a/clan/tests/unitary/maxloopsimple.c b/clan/tests/unitary/maxloopsimple.c new file mode 100644 index 0000000..d4edb3c --- /dev/null +++ b/clan/tests/unitary/maxloopsimple.c @@ -0,0 +1,4 @@ +#pragma scop +for (i = max(m,n); i < n; ++i) + a = 0; +#pragma endscop diff --git a/clan/tests/unitary/maxloopsimple.c.scop b/clan/tests/unitary/maxloopsimple.c.scop new file mode 100644 index 0000000..a0f3c3c --- /dev/null +++ b/clan/tests/unitary/maxloopsimple.c.scop @@ -0,0 +1,85 @@ +# +# <| +# A +# /.\ +# <| [""M# +# A | # Clan McCloog Castle +# /.\ [""M# [File generated by Clan 0.5.0 64 bits] +# [""M# | # U"U#U +# | # | # \ .:/ +# | # | #___| # +# | "--' .-" +# |"-"-"-"-"-#-#-## +# | # ## ###### +# \ .::::'/ +# \ ::::'/ +# :8a| # # ## +# ::88a ### +# ::::888a 8a ##::. +# ::::::888a88a[]:::: +# :::::::::SUNDOGa8a::::. .. +# :::::8::::888:Y8888:::::::::... +#::':::88::::888::Y88a______________________________________________________ +#:: ::::88a::::88a:Y88a __---__-- __ +#' .: ::Y88a:::::8a:Y88a __----_-- -------_-__ +# :' ::::8P::::::::::88aa. _ _- -- --_ --- __ --- __-- +#.:: :::::::::::::::::::Y88as88a...s88aa. + +SCoP + +# =============================================== Global +# Language +C + +# Context +0 4 + +# Parameter names are provided +1 +# Parameter names +m n + +# Number of statements +1 + +# =============================================== Statement 1 +# ---------------------------------------------- 1.1 Domain +# Iteration domain +1 +3 5 + 1 1 -1 0 0 ## i-m >= 0 + 1 1 0 -1 0 ## i-n >= 0 + 1 -1 0 1 -1 ## -i+n-1 >= 0 + +# ---------------------------------------------- 1.2 Scattering +# Scattering function is provided +1 +# Scattering function +3 5 + 0 0 0 0 0 ## 0 + 0 1 0 0 0 ## i + 0 0 0 0 0 ## 0 + +# ---------------------------------------------- 1.3 Access +# Access informations are provided +1 +# Read access informations +0 5 +# Write access informations +1 5 + 1 0 0 0 0 ## a[0] + +# ---------------------------------------------- 1.4 Body +# Statement body is provided +1 +# Original iterator names +i +# Statement body +a=0; + + +# =============================================== Options + +1 +1 a + diff --git a/clan/tests/unitary/minloopcomplex.c b/clan/tests/unitary/minloopcomplex.c new file mode 100644 index 0000000..1c5aed2 --- /dev/null +++ b/clan/tests/unitary/minloopcomplex.c @@ -0,0 +1,4 @@ +#pragma scop +for (i = 0; i < min(min(m,q),min(n,min(p,o))); ++i) + a = 0; +#pragma endscop diff --git a/clan/tests/unitary/minloopcomplex.c.scop b/clan/tests/unitary/minloopcomplex.c.scop new file mode 100644 index 0000000..83bb2b8 --- /dev/null +++ b/clan/tests/unitary/minloopcomplex.c.scop @@ -0,0 +1,88 @@ +# +# <| +# A +# /.\ +# <| [""M# +# A | # Clan McCloog Castle +# /.\ [""M# [File generated by Clan 0.5.0 64 bits] +# [""M# | # U"U#U +# | # | # \ .:/ +# | # | #___| # +# | "--' .-" +# |"-"-"-"-"-#-#-## +# | # ## ###### +# \ .::::'/ +# \ ::::'/ +# :8a| # # ## +# ::88a ### +# ::::888a 8a ##::. +# ::::::888a88a[]:::: +# :::::::::SUNDOGa8a::::. .. +# :::::8::::888:Y8888:::::::::... +#::':::88::::888::Y88a______________________________________________________ +#:: ::::88a::::88a:Y88a __---__-- __ +#' .: ::Y88a:::::8a:Y88a __----_-- -------_-__ +# :' ::::8P::::::::::88aa. _ _- -- --_ --- __ --- __-- +#.:: :::::::::::::::::::Y88as88a...s88aa. + +SCoP + +# =============================================== Global +# Language +C + +# Context +0 7 + +# Parameter names are provided +1 +# Parameter names +m q n p o + +# Number of statements +1 + +# =============================================== Statement 1 +# ---------------------------------------------- 1.1 Domain +# Iteration domain +1 +6 8 + 1 1 0 0 0 0 0 0 ## i >= 0 + 1 -1 1 0 0 0 0 -1 ## -i+m-1 >= 0 + 1 -1 0 1 0 0 0 -1 ## -i+q-1 >= 0 + 1 -1 0 0 1 0 0 -1 ## -i+n-1 >= 0 + 1 -1 0 0 0 1 0 -1 ## -i+p-1 >= 0 + 1 -1 0 0 0 0 1 -1 ## -i+o-1 >= 0 + +# ---------------------------------------------- 1.2 Scattering +# Scattering function is provided +1 +# Scattering function +3 8 + 0 0 0 0 0 0 0 0 ## 0 + 0 1 0 0 0 0 0 0 ## i + 0 0 0 0 0 0 0 0 ## 0 + +# ---------------------------------------------- 1.3 Access +# Access informations are provided +1 +# Read access informations +0 8 +# Write access informations +1 8 + 1 0 0 0 0 0 0 0 ## a[0] + +# ---------------------------------------------- 1.4 Body +# Statement body is provided +1 +# Original iterator names +i +# Statement body +a=0; + + +# =============================================== Options + +1 +1 a + diff --git a/clan/tests/unitary/minloopsimple.c b/clan/tests/unitary/minloopsimple.c new file mode 100644 index 0000000..00768a1 --- /dev/null +++ b/clan/tests/unitary/minloopsimple.c @@ -0,0 +1,4 @@ +#pragma scop +for (i = 0; i < min(m,n); ++i) + a = 0; +#pragma endscop diff --git a/clan/tests/unitary/minloopsimple.c.scop b/clan/tests/unitary/minloopsimple.c.scop new file mode 100644 index 0000000..f45c8c5 --- /dev/null +++ b/clan/tests/unitary/minloopsimple.c.scop @@ -0,0 +1,85 @@ +# +# <| +# A +# /.\ +# <| [""M# +# A | # Clan McCloog Castle +# /.\ [""M# [File generated by Clan 0.5.0 64 bits] +# [""M# | # U"U#U +# | # | # \ .:/ +# | # | #___| # +# | "--' .-" +# |"-"-"-"-"-#-#-## +# | # ## ###### +# \ .::::'/ +# \ ::::'/ +# :8a| # # ## +# ::88a ### +# ::::888a 8a ##::. +# ::::::888a88a[]:::: +# :::::::::SUNDOGa8a::::. .. +# :::::8::::888:Y8888:::::::::... +#::':::88::::888::Y88a______________________________________________________ +#:: ::::88a::::88a:Y88a __---__-- __ +#' .: ::Y88a:::::8a:Y88a __----_-- -------_-__ +# :' ::::8P::::::::::88aa. _ _- -- --_ --- __ --- __-- +#.:: :::::::::::::::::::Y88as88a...s88aa. + +SCoP + +# =============================================== Global +# Language +C + +# Context +0 4 + +# Parameter names are provided +1 +# Parameter names +m n + +# Number of statements +1 + +# =============================================== Statement 1 +# ---------------------------------------------- 1.1 Domain +# Iteration domain +1 +3 5 + 1 1 0 0 0 ## i >= 0 + 1 -1 1 0 -1 ## -i+m-1 >= 0 + 1 -1 0 1 -1 ## -i+n-1 >= 0 + +# ---------------------------------------------- 1.2 Scattering +# Scattering function is provided +1 +# Scattering function +3 5 + 0 0 0 0 0 ## 0 + 0 1 0 0 0 ## i + 0 0 0 0 0 ## 0 + +# ---------------------------------------------- 1.3 Access +# Access informations are provided +1 +# Read access informations +0 5 +# Write access informations +1 5 + 1 0 0 0 0 ## a[0] + +# ---------------------------------------------- 1.4 Body +# Statement body is provided +1 +# Original iterator names +i +# Statement body +a=0; + + +# =============================================== Options + +1 +1 a + diff --git a/clan/tests/unitary/minmax.c b/clan/tests/unitary/minmax.c new file mode 100644 index 0000000..de2afea --- /dev/null +++ b/clan/tests/unitary/minmax.c @@ -0,0 +1,5 @@ +#pragma scop +for (i = max(0,n); i < min(min(m,n),p); ++i) + for (j = max(i,n); j <= min(m,n); ++j) + a = 0; +#pragma endscop diff --git a/clan/tests/unitary/minmax.c.scop b/clan/tests/unitary/minmax.c.scop new file mode 100644 index 0000000..2d9a7f0 --- /dev/null +++ b/clan/tests/unitary/minmax.c.scop @@ -0,0 +1,93 @@ +# +# <| +# A +# /.\ +# <| [""M# +# A | # Clan McCloog Castle +# /.\ [""M# [File generated by Clan 0.5.0 64 bits] +# [""M# | # U"U#U +# | # | # \ .:/ +# | # | #___| # +# | "--' .-" +# |"-"-"-"-"-#-#-## +# | # ## ###### +# \ .::::'/ +# \ ::::'/ +# :8a| # # ## +# ::88a ### +# ::::888a 8a ##::. +# ::::::888a88a[]:::: +# :::::::::SUNDOGa8a::::. .. +# :::::8::::888:Y8888:::::::::... +#::':::88::::888::Y88a______________________________________________________ +#:: ::::88a::::88a:Y88a __---__-- __ +#' .: ::Y88a:::::8a:Y88a __----_-- -------_-__ +# :' ::::8P::::::::::88aa. _ _- -- --_ --- __ --- __-- +#.:: :::::::::::::::::::Y88as88a...s88aa. + +SCoP + +# =============================================== Global +# Language +C + +# Context +0 5 + +# Parameter names are provided +1 +# Parameter names +n m p + +# Number of statements +1 + +# =============================================== Statement 1 +# ---------------------------------------------- 1.1 Domain +# Iteration domain +1 +9 7 + 1 1 0 0 0 0 0 ## i >= 0 + 1 1 0 -1 0 0 0 ## i-n >= 0 + 1 -1 0 0 1 0 -1 ## -i+m-1 >= 0 + 1 -1 0 1 0 0 -1 ## -i+n-1 >= 0 + 1 -1 0 0 0 1 -1 ## -i+p-1 >= 0 + 1 -1 1 0 0 0 0 ## -i+j >= 0 + 1 0 1 -1 0 0 0 ## j-n >= 0 + 1 0 -1 0 1 0 0 ## -j+m >= 0 + 1 0 -1 1 0 0 0 ## -j+n >= 0 + +# ---------------------------------------------- 1.2 Scattering +# Scattering function is provided +1 +# Scattering function +5 7 + 0 0 0 0 0 0 0 ## 0 + 0 1 0 0 0 0 0 ## i + 0 0 0 0 0 0 0 ## 0 + 0 0 1 0 0 0 0 ## j + 0 0 0 0 0 0 0 ## 0 + +# ---------------------------------------------- 1.3 Access +# Access informations are provided +1 +# Read access informations +0 7 +# Write access informations +1 7 + 1 0 0 0 0 0 0 ## a[0] + +# ---------------------------------------------- 1.4 Body +# Statement body is provided +1 +# Original iterator names +i j +# Statement body +a=0; + + +# =============================================== Options + +1 +1 a + diff --git a/clan/tests/unitary/multiparenthcond.c b/clan/tests/unitary/multiparenthcond.c new file mode 100644 index 0000000..adbbeb1 --- /dev/null +++ b/clan/tests/unitary/multiparenthcond.c @@ -0,0 +1,4 @@ +#pragma scop +if (((M) > (N+1))) + a; +#pragma endscop diff --git a/clan/tests/unitary/multiparenthcond.c.scop b/clan/tests/unitary/multiparenthcond.c.scop new file mode 100644 index 0000000..7ba0fc9 --- /dev/null +++ b/clan/tests/unitary/multiparenthcond.c.scop @@ -0,0 +1,84 @@ +# +# <| +# A +# /.\ +# <| [""M# +# A | # Clan McCloog Castle +# /.\ [""M# [File generated by Clan 0.5.0 64 bits] +# [""M# | # U"U#U +# | # | # \ .:/ +# | # | #___| # +# | "--' .-" +# |"-"-"-"-"-#-#-## +# | # ## ###### +# \ .::::'/ +# \ ::::'/ +# :8a| # # ## +# ::88a ### +# ::::888a 8a ##::. +# ::::::888a88a[]:::: +# :::::::::SUNDOGa8a::::. .. +# :::::8::::888:Y8888:::::::::... +#::':::88::::888::Y88a______________________________________________________ +#:: ::::88a::::88a:Y88a __---__-- __ +#' .: ::Y88a:::::8a:Y88a __----_-- -------_-__ +# :' ::::8P::::::::::88aa. _ _- -- --_ --- __ --- __-- +#.:: :::::::::::::::::::Y88as88a...s88aa. + +SCoP + +# =============================================== Global +# Language +C + +# Context +0 4 + +# Parameter names are provided +1 +# Parameter names +M N + +# Number of statements +1 + +# =============================================== Statement 1 +# ---------------------------------------------- 1.1 Domain +# Iteration domain +1 +2 5 + 1 0 1 -1 -2 ## M-N-2 >= 0 + 0 1 0 0 0 ## fakeiter == 0 + +# ---------------------------------------------- 1.2 Scattering +# Scattering function is provided +1 +# Scattering function +3 5 + 0 0 0 0 0 ## 0 + 0 1 0 0 0 ## fakeiter + 0 0 0 0 0 ## 0 + +# ---------------------------------------------- 1.3 Access +# Access informations are provided +1 +# Read access informations +1 5 + 1 0 0 0 0 ## a[0] +# Write access informations +0 5 + +# ---------------------------------------------- 1.4 Body +# Statement body is provided +1 +# Original iterator names +fakeiter +# Statement body +a; + + +# =============================================== Options + +1 +1 a + diff --git a/clan/tests/unitary/negassign.c b/clan/tests/unitary/negassign.c new file mode 100644 index 0000000..af82744 --- /dev/null +++ b/clan/tests/unitary/negassign.c @@ -0,0 +1,6 @@ +#pragma scop +for (k=1; k < N; k++) + { + alpha = -sum; + } +#pragma endscop diff --git a/clan/tests/unitary/negassign.c.scop b/clan/tests/unitary/negassign.c.scop new file mode 100644 index 0000000..ab9d35f --- /dev/null +++ b/clan/tests/unitary/negassign.c.scop @@ -0,0 +1,86 @@ +# +# <| +# A +# /.\ +# <| [""M# +# A | # Clan McCloog Castle +# /.\ [""M# [File generated by Clan 0.5.0 64 bits] +# [""M# | # U"U#U +# | # | # \ .:/ +# | # | #___| # +# | "--' .-" +# |"-"-"-"-"-#-#-## +# | # ## ###### +# \ .::::'/ +# \ ::::'/ +# :8a| # # ## +# ::88a ### +# ::::888a 8a ##::. +# ::::::888a88a[]:::: +# :::::::::SUNDOGa8a::::. .. +# :::::8::::888:Y8888:::::::::... +#::':::88::::888::Y88a______________________________________________________ +#:: ::::88a::::88a:Y88a __---__-- __ +#' .: ::Y88a:::::8a:Y88a __----_-- -------_-__ +# :' ::::8P::::::::::88aa. _ _- -- --_ --- __ --- __-- +#.:: :::::::::::::::::::Y88as88a...s88aa. + +SCoP + +# =============================================== Global +# Language +C + +# Context +0 3 + +# Parameter names are provided +1 +# Parameter names +N + +# Number of statements +1 + +# =============================================== Statement 1 +# ---------------------------------------------- 1.1 Domain +# Iteration domain +1 +2 4 + 1 1 0 -1 ## k-1 >= 0 + 1 -1 1 -1 ## -k+N-1 >= 0 + +# ---------------------------------------------- 1.2 Scattering +# Scattering function is provided +1 +# Scattering function +3 4 + 0 0 0 0 ## 0 + 0 1 0 0 ## k + 0 0 0 0 ## 0 + +# ---------------------------------------------- 1.3 Access +# Access informations are provided +1 +# Read access informations +1 4 + 2 0 0 0 ## sum[0] +# Write access informations +1 4 + 1 0 0 0 ## alpha[0] + +# ---------------------------------------------- 1.4 Body +# Statement body is provided +1 +# Original iterator names +k +# Statement body +alpha=-sum; + + +# =============================================== Options + +2 +1 alpha +2 sum + diff --git a/clan/tests/unitary/nestedcurly.c b/clan/tests/unitary/nestedcurly.c new file mode 100644 index 0000000..bb5e3db --- /dev/null +++ b/clan/tests/unitary/nestedcurly.c @@ -0,0 +1,13 @@ +#pragma scop +{ + for (i = 0; i < N; ++i) { + { + for (j = 0; j < N; ++j) { + { + A[i][j] = 0; + } + } + } + } +} +#pragma endscop diff --git a/clan/tests/unitary/nestedcurly.c.scop b/clan/tests/unitary/nestedcurly.c.scop new file mode 100644 index 0000000..b28fc95 --- /dev/null +++ b/clan/tests/unitary/nestedcurly.c.scop @@ -0,0 +1,89 @@ +# +# <| +# A +# /.\ +# <| [""M# +# A | # Clan McCloog Castle +# /.\ [""M# [File generated by ScopLib 0.1.0 64 bits] +# [""M# | # U"U#U +# | # | # \ .:/ +# | # | #___| # +# | "--' .-" +# |"-"-"-"-"-#-#-## +# | # ## ###### +# \ .::::'/ +# \ ::::'/ +# :8a| # # ## +# ::88a ### +# ::::888a 8a ##::. +# ::::::888a88a[]:::: +# :::::::::SUNDOGa8a::::. .. +# :::::8::::888:Y8888:::::::::... +#::':::88::::888::Y88a______________________________________________________ +#:: ::::88a::::88a:Y88a __---__-- __ +#' .: ::Y88a:::::8a:Y88a __----_-- -------_-__ +# :' ::::8P::::::::::88aa. _ _- -- --_ --- __ --- __-- +#.:: :::::::::::::::::::Y88as88a...s88aa. + +SCoP + +# =============================================== Global +# Language +C + +# Context +0 3 + +# Parameter names are provided +1 +# Parameter names +N + +# Number of statements +1 + +# =============================================== Statement 1 +# ---------------------------------------------- 1.1 Domain +# Iteration domain +1 +4 5 + 1 1 0 0 0 ## i >= 0 + 1 -1 0 1 -1 ## -i+N-1 >= 0 + 1 0 1 0 0 ## j >= 0 + 1 0 -1 1 -1 ## -j+N-1 >= 0 + +# ---------------------------------------------- 1.2 Scattering +# Scattering function is provided +1 +# Scattering function +5 5 + 0 0 0 0 0 ## 0 + 0 1 0 0 0 ## i + 0 0 0 0 0 ## 0 + 0 0 1 0 0 ## j + 0 0 0 0 0 ## 0 + +# ---------------------------------------------- 1.3 Access +# Access informations are provided +1 +# Read access informations +0 5 +# Write access informations +2 5 + 1 1 0 0 0 ## A[i][j] + 0 0 1 0 0 ## + +# ---------------------------------------------- 1.4 Body +# Statement body is provided +1 +# Original iterator names +i j +# Statement body +A[i][j]=0; + + +# =============================================== Options + +1 +1 A + diff --git a/clan/tests/unitary/noloop.c b/clan/tests/unitary/noloop.c new file mode 100644 index 0000000..04290e4 --- /dev/null +++ b/clan/tests/unitary/noloop.c @@ -0,0 +1,3 @@ +#pragma scop +a; +#pragma endscop diff --git a/clan/tests/unitary/noloop.c.scop b/clan/tests/unitary/noloop.c.scop new file mode 100644 index 0000000..6d600a0 --- /dev/null +++ b/clan/tests/unitary/noloop.c.scop @@ -0,0 +1,81 @@ +# +# <| +# A +# /.\ +# <| [""M# +# A | # Clan McCloog Castle +# /.\ [""M# [File generated by Clan 0.5.0 64 bits] +# [""M# | # U"U#U +# | # | # \ .:/ +# | # | #___| # +# | "--' .-" +# |"-"-"-"-"-#-#-## +# | # ## ###### +# \ .::::'/ +# \ ::::'/ +# :8a| # # ## +# ::88a ### +# ::::888a 8a ##::. +# ::::::888a88a[]:::: +# :::::::::SUNDOGa8a::::. .. +# :::::8::::888:Y8888:::::::::... +#::':::88::::888::Y88a______________________________________________________ +#:: ::::88a::::88a:Y88a __---__-- __ +#' .: ::Y88a:::::8a:Y88a __----_-- -------_-__ +# :' ::::8P::::::::::88aa. _ _- -- --_ --- __ --- __-- +#.:: :::::::::::::::::::Y88as88a...s88aa. + +SCoP + +# =============================================== Global +# Language +C + +# Context +0 2 + +# Parameter names are not provided +0 + +# Number of statements +1 + +# =============================================== Statement 1 +# ---------------------------------------------- 1.1 Domain +# Iteration domain +1 +1 3 + 0 1 0 ## fakeiter == 0 + +# ---------------------------------------------- 1.2 Scattering +# Scattering function is provided +1 +# Scattering function +3 3 + 0 0 0 ## 0 + 0 1 0 ## fakeiter + 0 0 0 ## 0 + +# ---------------------------------------------- 1.3 Access +# Access informations are provided +1 +# Read access informations +1 3 + 1 0 0 ## a[0] +# Write access informations +0 3 + +# ---------------------------------------------- 1.4 Body +# Statement body is provided +1 +# Original iterator names +fakeiter +# Statement body +a; + + +# =============================================== Options + +1 +1 a + diff --git a/clan/tests/unitary/noloop2.c b/clan/tests/unitary/noloop2.c new file mode 100644 index 0000000..b5605b0 --- /dev/null +++ b/clan/tests/unitary/noloop2.c @@ -0,0 +1,4 @@ +#pragma scop +a; +b; +#pragma endscop diff --git a/clan/tests/unitary/noloop2.c.scop b/clan/tests/unitary/noloop2.c.scop new file mode 100644 index 0000000..d54bba6 --- /dev/null +++ b/clan/tests/unitary/noloop2.c.scop @@ -0,0 +1,116 @@ +# +# <| +# A +# /.\ +# <| [""M# +# A | # Clan McCloog Castle +# /.\ [""M# [File generated by Clan 0.5.0 64 bits] +# [""M# | # U"U#U +# | # | # \ .:/ +# | # | #___| # +# | "--' .-" +# |"-"-"-"-"-#-#-## +# | # ## ###### +# \ .::::'/ +# \ ::::'/ +# :8a| # # ## +# ::88a ### +# ::::888a 8a ##::. +# ::::::888a88a[]:::: +# :::::::::SUNDOGa8a::::. .. +# :::::8::::888:Y8888:::::::::... +#::':::88::::888::Y88a______________________________________________________ +#:: ::::88a::::88a:Y88a __---__-- __ +#' .: ::Y88a:::::8a:Y88a __----_-- -------_-__ +# :' ::::8P::::::::::88aa. _ _- -- --_ --- __ --- __-- +#.:: :::::::::::::::::::Y88as88a...s88aa. + +SCoP + +# =============================================== Global +# Language +C + +# Context +0 2 + +# Parameter names are not provided +0 + +# Number of statements +2 + +# =============================================== Statement 1 +# ---------------------------------------------- 1.1 Domain +# Iteration domain +1 +1 3 + 0 1 0 ## fakeiter == 0 + +# ---------------------------------------------- 1.2 Scattering +# Scattering function is provided +1 +# Scattering function +3 3 + 0 0 0 ## 0 + 0 1 0 ## fakeiter + 0 0 0 ## 0 + +# ---------------------------------------------- 1.3 Access +# Access informations are provided +1 +# Read access informations +1 3 + 1 0 0 ## a[0] +# Write access informations +0 3 + +# ---------------------------------------------- 1.4 Body +# Statement body is provided +1 +# Original iterator names +fakeiter +# Statement body +a; + + +# =============================================== Statement 2 +# ---------------------------------------------- 2.1 Domain +# Iteration domain +1 +1 3 + 0 1 0 ## fakeiter == 0 + +# ---------------------------------------------- 2.2 Scattering +# Scattering function is provided +1 +# Scattering function +3 3 + 0 0 1 ## 1 + 0 1 0 ## fakeiter + 0 0 0 ## 0 + +# ---------------------------------------------- 2.3 Access +# Access informations are provided +1 +# Read access informations +1 3 + 2 0 0 ## b[0] +# Write access informations +0 3 + +# ---------------------------------------------- 2.4 Body +# Statement body is provided +1 +# Original iterator names +fakeiter +# Statement body +b; + + +# =============================================== Options + +2 +1 a +2 b + diff --git a/clan/tests/unitary/object.c b/clan/tests/unitary/object.c new file mode 100644 index 0000000..f025c99 --- /dev/null +++ b/clan/tests/unitary/object.c @@ -0,0 +1,9 @@ +#pragma scop +for (i = 0; i < N; ++i) { + a->b = c; +} +c->d = a->b; +toto = a->d(); +// Getter/Setter are not supported, only method calls. +// a->d() = bla bla is NOT ok +#pragma endscop diff --git a/clan/tests/unitary/object.c.scop b/clan/tests/unitary/object.c.scop new file mode 100644 index 0000000..ceeebde --- /dev/null +++ b/clan/tests/unitary/object.c.scop @@ -0,0 +1,157 @@ +# +# <| +# A +# /.\ +# <| [""M# +# A | # Clan McCloog Castle +# /.\ [""M# [File generated by ScopLib 0.1.0 64 bits] +# [""M# | # U"U#U +# | # | # \ .:/ +# | # | #___| # +# | "--' .-" +# |"-"-"-"-"-#-#-## +# | # ## ###### +# \ .::::'/ +# \ ::::'/ +# :8a| # # ## +# ::88a ### +# ::::888a 8a ##::. +# ::::::888a88a[]:::: +# :::::::::SUNDOGa8a::::. .. +# :::::8::::888:Y8888:::::::::... +#::':::88::::888::Y88a______________________________________________________ +#:: ::::88a::::88a:Y88a __---__-- __ +#' .: ::Y88a:::::8a:Y88a __----_-- -------_-__ +# :' ::::8P::::::::::88aa. _ _- -- --_ --- __ --- __-- +#.:: :::::::::::::::::::Y88as88a...s88aa. + +SCoP + +# =============================================== Global +# Language +C + +# Context +0 3 + +# Parameter names are provided +1 +# Parameter names +N + +# Number of statements +3 + +# =============================================== Statement 1 +# ---------------------------------------------- 1.1 Domain +# Iteration domain +1 +2 4 + 1 1 0 0 ## i >= 0 + 1 -1 1 -1 ## -i+N-1 >= 0 + +# ---------------------------------------------- 1.2 Scattering +# Scattering function is provided +1 +# Scattering function +3 4 + 0 0 0 0 ## 0 + 0 1 0 0 ## i + 0 0 0 0 ## 0 + +# ---------------------------------------------- 1.3 Access +# Access informations are provided +1 +# Read access informations +1 4 + 2 0 0 0 ## c[0] +# Write access informations +1 4 + 1 0 0 0 ## a->b[0] + +# ---------------------------------------------- 1.4 Body +# Statement body is provided +1 +# Original iterator names +i +# Statement body +a->b=c; + + +# =============================================== Statement 2 +# ---------------------------------------------- 2.1 Domain +# Iteration domain +1 +1 4 + 0 1 0 0 ## fakeiter == 0 + +# ---------------------------------------------- 2.2 Scattering +# Scattering function is provided +1 +# Scattering function +3 4 + 0 0 0 1 ## 1 + 0 1 0 0 ## fakeiter + 0 0 0 1 ## 1 + +# ---------------------------------------------- 2.3 Access +# Access informations are provided +1 +# Read access informations +1 4 + 1 0 0 0 ## a->b[0] +# Write access informations +1 4 + 3 0 0 0 ## c->d[0] + +# ---------------------------------------------- 2.4 Body +# Statement body is provided +1 +# Original iterator names +fakeiter +# Statement body +c->d=a->b; + + +# =============================================== Statement 3 +# ---------------------------------------------- 3.1 Domain +# Iteration domain +1 +1 4 + 0 1 0 0 ## fakeiter == 0 + +# ---------------------------------------------- 3.2 Scattering +# Scattering function is provided +1 +# Scattering function +3 4 + 0 0 0 2 ## 2 + 0 1 0 0 ## fakeiter + 0 0 0 1 ## 1 + +# ---------------------------------------------- 3.3 Access +# Access informations are provided +1 +# Read access informations +0 4 +# Write access informations +1 4 + 4 0 0 0 ## toto[0] + +# ---------------------------------------------- 3.4 Body +# Statement body is provided +1 +# Original iterator names +fakeiter +# Statement body +toto=a->d(); + + +# =============================================== Options + +4 +1 a->b +2 c +3 c->d +4 toto + diff --git a/clan/tests/unitary/parenthesis.c b/clan/tests/unitary/parenthesis.c new file mode 100644 index 0000000..e3a1198 --- /dev/null +++ b/clan/tests/unitary/parenthesis.c @@ -0,0 +1,4 @@ +#pragma scop +for (i = 0; i < N; ++i) + A[i] = B[2 * (i) + 1]; +#pragma endscop diff --git a/clan/tests/unitary/parenthesis.c.scop b/clan/tests/unitary/parenthesis.c.scop new file mode 100644 index 0000000..cd81313 --- /dev/null +++ b/clan/tests/unitary/parenthesis.c.scop @@ -0,0 +1,86 @@ +# +# <| +# A +# /.\ +# <| [""M# +# A | # Clan McCloog Castle +# /.\ [""M# [File generated by Clan 0.5.0 64 bits] +# [""M# | # U"U#U +# | # | # \ .:/ +# | # | #___| # +# | "--' .-" +# |"-"-"-"-"-#-#-## +# | # ## ###### +# \ .::::'/ +# \ ::::'/ +# :8a| # # ## +# ::88a ### +# ::::888a 8a ##::. +# ::::::888a88a[]:::: +# :::::::::SUNDOGa8a::::. .. +# :::::8::::888:Y8888:::::::::... +#::':::88::::888::Y88a______________________________________________________ +#:: ::::88a::::88a:Y88a __---__-- __ +#' .: ::Y88a:::::8a:Y88a __----_-- -------_-__ +# :' ::::8P::::::::::88aa. _ _- -- --_ --- __ --- __-- +#.:: :::::::::::::::::::Y88as88a...s88aa. + +SCoP + +# =============================================== Global +# Language +C + +# Context +0 3 + +# Parameter names are provided +1 +# Parameter names +N + +# Number of statements +1 + +# =============================================== Statement 1 +# ---------------------------------------------- 1.1 Domain +# Iteration domain +1 +2 4 + 1 1 0 0 ## i >= 0 + 1 -1 1 -1 ## -i+N-1 >= 0 + +# ---------------------------------------------- 1.2 Scattering +# Scattering function is provided +1 +# Scattering function +3 4 + 0 0 0 0 ## 0 + 0 1 0 0 ## i + 0 0 0 0 ## 0 + +# ---------------------------------------------- 1.3 Access +# Access informations are provided +1 +# Read access informations +1 4 + 2 2 0 1 ## B[2*i+1] +# Write access informations +1 4 + 1 1 0 0 ## A[i] + +# ---------------------------------------------- 1.4 Body +# Statement body is provided +1 +# Original iterator names +i +# Statement body +A[i]=B[2*(i)+1]; + + +# =============================================== Options + +2 +1 A +2 B + diff --git a/clan/tests/unitary/redefiter.c b/clan/tests/unitary/redefiter.c new file mode 100644 index 0000000..36be4cd --- /dev/null +++ b/clan/tests/unitary/redefiter.c @@ -0,0 +1,9 @@ +#pragma scop +for (t=0; t= 0 + 1 -1 0 0 1 0 -1 ## -t+N-1 >= 0 + 1 0 1 0 0 0 0 ## i >= 0 + 1 0 -1 0 0 1 -1 ## -i+M-1 >= 0 + 1 0 0 1 0 0 0 ## j >= 0 + 1 0 0 -1 1 0 -1 ## -j+N-1 >= 0 + +# ---------------------------------------------- 1.2 Scattering +# Scattering function is provided +1 +# Scattering function +7 7 + 0 0 0 0 0 0 0 ## 0 + 0 1 0 0 0 0 0 ## t + 0 0 0 0 0 0 0 ## 0 + 0 0 1 0 0 0 0 ## i + 0 0 0 0 0 0 0 ## 0 + 0 0 0 1 0 0 0 ## j + 0 0 0 0 0 0 0 ## 0 + +# ---------------------------------------------- 1.3 Access +# Access informations are provided +1 +# Read access informations +0 7 +# Write access informations +1 7 + 1 0 0 0 0 0 0 ## Ca[0] + +# ---------------------------------------------- 1.4 Body +# Statement body is provided +1 +# Original iterator names +t i j +# Statement body +Ca=0; + + +# =============================================== Statement 2 +# ---------------------------------------------- 2.1 Domain +# Iteration domain +1 +4 6 + 1 1 0 0 0 0 ## t >= 0 + 1 -1 0 1 0 -1 ## -t+N-1 >= 0 + 1 0 1 0 0 0 ## j >= 0 + 1 0 -1 1 0 -1 ## -j+N-1 >= 0 + +# ---------------------------------------------- 2.2 Scattering +# Scattering function is provided +1 +# Scattering function +5 6 + 0 0 0 0 0 0 ## 0 + 0 1 0 0 0 0 ## t + 0 0 0 0 0 1 ## 1 + 0 0 1 0 0 0 ## j + 0 0 0 0 0 0 ## 0 + +# ---------------------------------------------- 2.3 Access +# Access informations are provided +1 +# Read access informations +0 6 +# Write access informations +1 6 + 2 0 0 0 0 0 ## b[0] + +# ---------------------------------------------- 2.4 Body +# Statement body is provided +1 +# Original iterator names +t j +# Statement body +b=0; + + +# =============================================== Options + +2 +1 Ca +2 b + diff --git a/clan/tests/unitary/simplecond.c b/clan/tests/unitary/simplecond.c new file mode 100644 index 0000000..88cd996 --- /dev/null +++ b/clan/tests/unitary/simplecond.c @@ -0,0 +1,5 @@ +#pragma scop +for (i = 0; i < n; ++i) + if (i > 1) + a = 0; +#pragma endscop diff --git a/clan/tests/unitary/simplecond.c.scop b/clan/tests/unitary/simplecond.c.scop new file mode 100644 index 0000000..cd15fad --- /dev/null +++ b/clan/tests/unitary/simplecond.c.scop @@ -0,0 +1,85 @@ +# +# <| +# A +# /.\ +# <| [""M# +# A | # Clan McCloog Castle +# /.\ [""M# [File generated by Clan 0.5.0 64 bits] +# [""M# | # U"U#U +# | # | # \ .:/ +# | # | #___| # +# | "--' .-" +# |"-"-"-"-"-#-#-## +# | # ## ###### +# \ .::::'/ +# \ ::::'/ +# :8a| # # ## +# ::88a ### +# ::::888a 8a ##::. +# ::::::888a88a[]:::: +# :::::::::SUNDOGa8a::::. .. +# :::::8::::888:Y8888:::::::::... +#::':::88::::888::Y88a______________________________________________________ +#:: ::::88a::::88a:Y88a __---__-- __ +#' .: ::Y88a:::::8a:Y88a __----_-- -------_-__ +# :' ::::8P::::::::::88aa. _ _- -- --_ --- __ --- __-- +#.:: :::::::::::::::::::Y88as88a...s88aa. + +SCoP + +# =============================================== Global +# Language +C + +# Context +0 3 + +# Parameter names are provided +1 +# Parameter names +n + +# Number of statements +1 + +# =============================================== Statement 1 +# ---------------------------------------------- 1.1 Domain +# Iteration domain +1 +3 4 + 1 1 0 0 ## i >= 0 + 1 -1 1 -1 ## -i+n-1 >= 0 + 1 1 0 -2 ## i-2 >= 0 + +# ---------------------------------------------- 1.2 Scattering +# Scattering function is provided +1 +# Scattering function +3 4 + 0 0 0 0 ## 0 + 0 1 0 0 ## i + 0 0 0 0 ## 0 + +# ---------------------------------------------- 1.3 Access +# Access informations are provided +1 +# Read access informations +0 4 +# Write access informations +1 4 + 1 0 0 0 ## a[0] + +# ---------------------------------------------- 1.4 Body +# Statement body is provided +1 +# Original iterator names +i +# Statement body +a=0; + + +# =============================================== Options + +1 +1 a + diff --git a/clan/tests/unitary/simpleloop.c b/clan/tests/unitary/simpleloop.c new file mode 100644 index 0000000..7c0047c --- /dev/null +++ b/clan/tests/unitary/simpleloop.c @@ -0,0 +1,4 @@ +#pragma scop +for (i = 0; i < n; ++i) + a; +#pragma endscop diff --git a/clan/tests/unitary/simpleloop.c.scop b/clan/tests/unitary/simpleloop.c.scop new file mode 100644 index 0000000..33b0f2d --- /dev/null +++ b/clan/tests/unitary/simpleloop.c.scop @@ -0,0 +1,84 @@ +# +# <| +# A +# /.\ +# <| [""M# +# A | # Clan McCloog Castle +# /.\ [""M# [File generated by Clan 0.5.0 64 bits] +# [""M# | # U"U#U +# | # | # \ .:/ +# | # | #___| # +# | "--' .-" +# |"-"-"-"-"-#-#-## +# | # ## ###### +# \ .::::'/ +# \ ::::'/ +# :8a| # # ## +# ::88a ### +# ::::888a 8a ##::. +# ::::::888a88a[]:::: +# :::::::::SUNDOGa8a::::. .. +# :::::8::::888:Y8888:::::::::... +#::':::88::::888::Y88a______________________________________________________ +#:: ::::88a::::88a:Y88a __---__-- __ +#' .: ::Y88a:::::8a:Y88a __----_-- -------_-__ +# :' ::::8P::::::::::88aa. _ _- -- --_ --- __ --- __-- +#.:: :::::::::::::::::::Y88as88a...s88aa. + +SCoP + +# =============================================== Global +# Language +C + +# Context +0 3 + +# Parameter names are provided +1 +# Parameter names +n + +# Number of statements +1 + +# =============================================== Statement 1 +# ---------------------------------------------- 1.1 Domain +# Iteration domain +1 +2 4 + 1 1 0 0 ## i >= 0 + 1 -1 1 -1 ## -i+n-1 >= 0 + +# ---------------------------------------------- 1.2 Scattering +# Scattering function is provided +1 +# Scattering function +3 4 + 0 0 0 0 ## 0 + 0 1 0 0 ## i + 0 0 0 0 ## 0 + +# ---------------------------------------------- 1.3 Access +# Access informations are provided +1 +# Read access informations +1 4 + 1 0 0 0 ## a[0] +# Write access informations +0 4 + +# ---------------------------------------------- 1.4 Body +# Statement body is provided +1 +# Original iterator names +i +# Statement body +a; + + +# =============================================== Options + +1 +1 a + diff --git a/clan/tests/unitary/ternary.c b/clan/tests/unitary/ternary.c new file mode 100644 index 0000000..6d23def --- /dev/null +++ b/clan/tests/unitary/ternary.c @@ -0,0 +1,3 @@ +#pragma scop +b = c < d ? a + 1 : 2 * b; +#pragma endscop diff --git a/clan/tests/unitary/ternary.c.scop b/clan/tests/unitary/ternary.c.scop new file mode 100644 index 0000000..22b5e0a --- /dev/null +++ b/clan/tests/unitary/ternary.c.scop @@ -0,0 +1,88 @@ +# +# <| +# A +# /.\ +# <| [""M# +# A | # Clan McCloog Castle +# /.\ [""M# [File generated by Clan 0.5.0 64 bits] +# [""M# | # U"U#U +# | # | # \ .:/ +# | # | #___| # +# | "--' .-" +# |"-"-"-"-"-#-#-## +# | # ## ###### +# \ .::::'/ +# \ ::::'/ +# :8a| # # ## +# ::88a ### +# ::::888a 8a ##::. +# ::::::888a88a[]:::: +# :::::::::SUNDOGa8a::::. .. +# :::::8::::888:Y8888:::::::::... +#::':::88::::888::Y88a______________________________________________________ +#:: ::::88a::::88a:Y88a __---__-- __ +#' .: ::Y88a:::::8a:Y88a __----_-- -------_-__ +# :' ::::8P::::::::::88aa. _ _- -- --_ --- __ --- __-- +#.:: :::::::::::::::::::Y88as88a...s88aa. + +SCoP + +# =============================================== Global +# Language +C + +# Context +0 2 + +# Parameter names are not provided +0 + +# Number of statements +1 + +# =============================================== Statement 1 +# ---------------------------------------------- 1.1 Domain +# Iteration domain +1 +1 3 + 0 1 0 ## fakeiter == 0 + +# ---------------------------------------------- 1.2 Scattering +# Scattering function is provided +1 +# Scattering function +3 3 + 0 0 0 ## 0 + 0 1 0 ## fakeiter + 0 0 0 ## 0 + +# ---------------------------------------------- 1.3 Access +# Access informations are provided +1 +# Read access informations +4 3 + 2 0 0 ## c[0] + 3 0 0 ## d[0] + 4 0 0 ## a[0] + 1 0 0 ## b[0] +# Write access informations +1 3 + 1 0 0 ## b[0] + +# ---------------------------------------------- 1.4 Body +# Statement body is provided +1 +# Original iterator names +fakeiter +# Statement body +b=c +4 +1 b +2 c +3 d +4 a + diff --git a/clan/tests/unitary/twocondincond.c b/clan/tests/unitary/twocondincond.c new file mode 100644 index 0000000..a9104df --- /dev/null +++ b/clan/tests/unitary/twocondincond.c @@ -0,0 +1,8 @@ +#pragma scop +if (M > N && M > Q) + if (Q > P) + a; +b; +if (M > P) + c; +#pragma endscop diff --git a/clan/tests/unitary/twocondincond.c.scop b/clan/tests/unitary/twocondincond.c.scop new file mode 100644 index 0000000..71c9aa9 --- /dev/null +++ b/clan/tests/unitary/twocondincond.c.scop @@ -0,0 +1,157 @@ +# +# <| +# A +# /.\ +# <| [""M# +# A | # Clan McCloog Castle +# /.\ [""M# [File generated by Clan 0.5.0 64 bits] +# [""M# | # U"U#U +# | # | # \ .:/ +# | # | #___| # +# | "--' .-" +# |"-"-"-"-"-#-#-## +# | # ## ###### +# \ .::::'/ +# \ ::::'/ +# :8a| # # ## +# ::88a ### +# ::::888a 8a ##::. +# ::::::888a88a[]:::: +# :::::::::SUNDOGa8a::::. .. +# :::::8::::888:Y8888:::::::::... +#::':::88::::888::Y88a______________________________________________________ +#:: ::::88a::::88a:Y88a __---__-- __ +#' .: ::Y88a:::::8a:Y88a __----_-- -------_-__ +# :' ::::8P::::::::::88aa. _ _- -- --_ --- __ --- __-- +#.:: :::::::::::::::::::Y88as88a...s88aa. + +SCoP + +# =============================================== Global +# Language +C + +# Context +0 6 + +# Parameter names are provided +1 +# Parameter names +M N Q P + +# Number of statements +3 + +# =============================================== Statement 1 +# ---------------------------------------------- 1.1 Domain +# Iteration domain +1 +4 7 + 1 0 1 -1 0 0 -1 ## M-N-1 >= 0 + 1 0 1 0 -1 0 -1 ## M-Q-1 >= 0 + 1 0 0 0 1 -1 -1 ## Q-P-1 >= 0 + 0 1 0 0 0 0 0 ## fakeiter == 0 + +# ---------------------------------------------- 1.2 Scattering +# Scattering function is provided +1 +# Scattering function +3 7 + 0 0 0 0 0 0 0 ## 0 + 0 1 0 0 0 0 0 ## fakeiter + 0 0 0 0 0 0 0 ## 0 + +# ---------------------------------------------- 1.3 Access +# Access informations are provided +1 +# Read access informations +1 7 + 1 0 0 0 0 0 0 ## a[0] +# Write access informations +0 7 + +# ---------------------------------------------- 1.4 Body +# Statement body is provided +1 +# Original iterator names +fakeiter +# Statement body +a; + + +# =============================================== Statement 2 +# ---------------------------------------------- 2.1 Domain +# Iteration domain +1 +1 7 + 0 1 0 0 0 0 0 ## fakeiter == 0 + +# ---------------------------------------------- 2.2 Scattering +# Scattering function is provided +1 +# Scattering function +3 7 + 0 0 0 0 0 0 1 ## 1 + 0 1 0 0 0 0 0 ## fakeiter + 0 0 0 0 0 0 0 ## 0 + +# ---------------------------------------------- 2.3 Access +# Access informations are provided +1 +# Read access informations +1 7 + 2 0 0 0 0 0 0 ## b[0] +# Write access informations +0 7 + +# ---------------------------------------------- 2.4 Body +# Statement body is provided +1 +# Original iterator names +fakeiter +# Statement body +b; + + +# =============================================== Statement 3 +# ---------------------------------------------- 3.1 Domain +# Iteration domain +1 +2 7 + 1 0 1 0 0 -1 -1 ## M-P-1 >= 0 + 0 1 0 0 0 0 0 ## fakeiter == 0 + +# ---------------------------------------------- 3.2 Scattering +# Scattering function is provided +1 +# Scattering function +3 7 + 0 0 0 0 0 0 2 ## 2 + 0 1 0 0 0 0 0 ## fakeiter + 0 0 0 0 0 0 0 ## 0 + +# ---------------------------------------------- 3.3 Access +# Access informations are provided +1 +# Read access informations +1 7 + 3 0 0 0 0 0 0 ## c[0] +# Write access informations +0 7 + +# ---------------------------------------------- 3.4 Body +# Statement body is provided +1 +# Original iterator names +fakeiter +# Statement body +c; + + +# =============================================== Options + +3 +1 a +2 b +3 c + diff --git a/clan/tests/unitary/twoconds.c b/clan/tests/unitary/twoconds.c new file mode 100644 index 0000000..8b3abce --- /dev/null +++ b/clan/tests/unitary/twoconds.c @@ -0,0 +1,6 @@ +#pragma scop +if (M > N) + a; +if (M <= N) + b; +#pragma endscop diff --git a/clan/tests/unitary/twoconds.c.scop b/clan/tests/unitary/twoconds.c.scop new file mode 100644 index 0000000..c7b2ecb --- /dev/null +++ b/clan/tests/unitary/twoconds.c.scop @@ -0,0 +1,120 @@ +# +# <| +# A +# /.\ +# <| [""M# +# A | # Clan McCloog Castle +# /.\ [""M# [File generated by Clan 0.5.0 64 bits] +# [""M# | # U"U#U +# | # | # \ .:/ +# | # | #___| # +# | "--' .-" +# |"-"-"-"-"-#-#-## +# | # ## ###### +# \ .::::'/ +# \ ::::'/ +# :8a| # # ## +# ::88a ### +# ::::888a 8a ##::. +# ::::::888a88a[]:::: +# :::::::::SUNDOGa8a::::. .. +# :::::8::::888:Y8888:::::::::... +#::':::88::::888::Y88a______________________________________________________ +#:: ::::88a::::88a:Y88a __---__-- __ +#' .: ::Y88a:::::8a:Y88a __----_-- -------_-__ +# :' ::::8P::::::::::88aa. _ _- -- --_ --- __ --- __-- +#.:: :::::::::::::::::::Y88as88a...s88aa. + +SCoP + +# =============================================== Global +# Language +C + +# Context +0 4 + +# Parameter names are provided +1 +# Parameter names +M N + +# Number of statements +2 + +# =============================================== Statement 1 +# ---------------------------------------------- 1.1 Domain +# Iteration domain +1 +2 5 + 1 0 1 -1 -1 ## M-N-1 >= 0 + 0 1 0 0 0 ## fakeiter == 0 + +# ---------------------------------------------- 1.2 Scattering +# Scattering function is provided +1 +# Scattering function +3 5 + 0 0 0 0 0 ## 0 + 0 1 0 0 0 ## fakeiter + 0 0 0 0 0 ## 0 + +# ---------------------------------------------- 1.3 Access +# Access informations are provided +1 +# Read access informations +1 5 + 1 0 0 0 0 ## a[0] +# Write access informations +0 5 + +# ---------------------------------------------- 1.4 Body +# Statement body is provided +1 +# Original iterator names +fakeiter +# Statement body +a; + + +# =============================================== Statement 2 +# ---------------------------------------------- 2.1 Domain +# Iteration domain +1 +2 5 + 1 0 -1 1 0 ## -M+N >= 0 + 0 1 0 0 0 ## fakeiter == 0 + +# ---------------------------------------------- 2.2 Scattering +# Scattering function is provided +1 +# Scattering function +3 5 + 0 0 0 0 1 ## 1 + 0 1 0 0 0 ## fakeiter + 0 0 0 0 0 ## 0 + +# ---------------------------------------------- 2.3 Access +# Access informations are provided +1 +# Read access informations +1 5 + 2 0 0 0 0 ## b[0] +# Write access informations +0 5 + +# ---------------------------------------------- 2.4 Body +# Statement body is provided +1 +# Original iterator names +fakeiter +# Statement body +b; + + +# =============================================== Options + +2 +1 a +2 b + diff --git a/clan/tests/unitary/underscore.c b/clan/tests/unitary/underscore.c new file mode 100644 index 0000000..78b261e --- /dev/null +++ b/clan/tests/unitary/underscore.c @@ -0,0 +1,6 @@ +#pragma scop +for(i=0; i= 0 + 1 -1 0 0 1 0 0 -1 ## -i+M-1 >= 0 + 1 0 1 0 0 0 0 0 ## j >= 0 + 1 0 -1 0 0 1 0 -1 ## -j+N-1 >= 0 + 1 0 0 1 0 0 0 0 ## k >= 0 + 1 0 0 -1 0 0 1 -1 ## -k+K-1 >= 0 + +# ---------------------------------------------- 1.2 Scattering +# Scattering function is provided +1 +# Scattering function +7 8 + 0 0 0 0 0 0 0 0 ## 0 + 0 1 0 0 0 0 0 0 ## i + 0 0 0 0 0 0 0 0 ## 0 + 0 0 1 0 0 0 0 0 ## j + 0 0 0 0 0 0 0 0 ## 0 + 0 0 0 1 0 0 0 0 ## k + 0 0 0 0 0 0 0 0 ## 0 + +# ---------------------------------------------- 1.3 Access +# Access informations are provided +1 +# Read access informations +6 8 + 2 1 0 0 0 0 0 0 ## _C_[i][j] + 0 0 1 0 0 0 0 0 ## + 3 1 0 0 0 0 0 0 ## A[i][k] + 0 0 0 1 0 0 0 0 ## + 4 0 0 1 0 0 0 0 ## B[k][j] + 0 0 1 0 0 0 0 0 ## +# Write access informations +2 8 + 1 1 0 0 0 0 0 0 ## C[i][j] + 0 0 1 0 0 0 0 0 ## + +# ---------------------------------------------- 1.4 Body +# Statement body is provided +1 +# Original iterator names +i j k +# Statement body +C[i][j]=_C_[i][j]+A[i][k]*B[k][j]; + + +# =============================================== Options + +4 +1 C +2 _C_ +3 A +4 B + diff --git a/cloog b/cloog new file mode 160000 index 0000000..8c8510d --- /dev/null +++ b/cloog @@ -0,0 +1 @@ +Subproject commit 8c8510df56fb3b2cf310b760831cab2189d97159 diff --git a/configure.ac b/configure.ac new file mode 100644 index 0000000..29fde6e --- /dev/null +++ b/configure.ac @@ -0,0 +1,96 @@ +AC_INIT([ppcg], [0.00]) +AC_CONFIG_AUX_DIR([.]) +AC_CONFIG_MACRO_DIR([m4]) +AM_INIT_AUTOMAKE([foreign]) +m4_ifdef([AM_SILENT_RULES],[AM_SILENT_RULES([yes])]) + +AC_PROG_CC +AC_PROG_LIBTOOL + +AX_SUBMODULE(isl,build|bundled|system,bundled) +AM_CONDITIONAL(BUNDLED_ISL, test $with_isl = bundled) + +AC_SUBST(ISL_CFLAGS) +AC_SUBST(ISL_LIBS) +case "$with_isl" in +bundled) + ISL_CFLAGS="-I\$(top_srcdir)/isl/include -I\$(top_builddir)/isl/include" + ppcg_configure_args="$ppcg_configure_args --with-isl-builddir=../isl" + ;; +build) + ISL_BUILDDIR=`echo @abs_builddir@ | $with_isl_builddir/config.status --file=-` + ppcg_configure_args="$ppcg_configure_args --with-isl-builddir=$ISL_BUILDDIR" + ISL_CFLAGS="-I$isl_srcdir/include -I$ISL_BUILDDIR/include" + ;; +system) + PKG_CHECK_MODULES([ISL], [isl]) +esac + +AX_SUBMODULE(cloog,build|bundled|system,bundled) +AM_CONDITIONAL(BUNDLED_CLOOG, test $with_cloog = bundled) + +AC_SUBST(CLOOG_LDFLAGS) +AC_SUBST(CLOOG_CFLAGS) +AC_SUBST(CLOOG_LIBS) +CLOOG_CFLAGS="-DCLOOG_INT_GMP=1" +case "$with_cloog" in +bundled) + CLOOG_CFLAGS="$CLOOG_CFLAGS -I\$(top_srcdir)/cloog/include -I\$(top_builddir)/cloog/include" + ;; +build) + with_cloog_builddir=`echo @abs_builddir@ | $with_cloog_builddir/config.status --file=-` + CLOOG_CFLAGS="$CLOOG_CFLAGS -I$cloog_srcdir/include -I$with_cloog_builddir/include" + CLOOG_LIBS="$with_cloog_builddir/libcloog-isl.la" + ;; +system) + if test "x$with_cloog_prefix" != "x"; then + CLOOG_CFLAGS="$CLOOG_CFLAGS -I$with_cloog_prefix/include" + fi + if test "x$with_cloog_exec_prefix" != "x"; then + CLOOG_LDFLAGS="-L$with_cloog_exec_prefix/lib" + fi + CLOOG_LIBS="-lcloog-isl" +esac + +AX_SUBMODULE(clan,build|bundled|system,bundled) +AM_CONDITIONAL(BUNDLED_CLAN, test $with_clan = bundled) + +AC_SUBST(CLAN_LDFLAGS) +AC_SUBST(CLAN_CFLAGS) +AC_SUBST(CLAN_LIBS) +CLAN_CFLAGS="-DSCOPLIB_INT_T_IS_LONGLONG" +case "$with_cloog" in +bundled) + CLAN_CFLAGS="$CLAN_CFLAGS -I\$(top_srcdir)/clan/scoplib/scoplib-0.2.0/include -I\$(top_srcdir)/clan/include -I\$(top_builddir)/clan/scoplib/scoplib-0.2.0/include -I\$(top_builddir)/clan/include" + ;; +build) + with_clan_builddir=`echo @abs_builddir@ | $with_clan_builddir/config.status --file=-` + CLAN_CFLAGS="$CLAN_CFLAGS -I$clan_srcdir/scoplib/scoplib-0.2.0/include -I$clan_srcdir/include -I$with_clan_builddir/scoplib/scoplib-0.2.0/include -I$with_clan_builddir/include" + CLAN_LIBS="$with_clan_builddir/source/libclan.la" + ;; +system) + if test "x$with_clan_prefix" != "x"; then + CLAN_CFLAGS="$CLAN_CFLAGS -I$with_clan_prefix/include" + fi + if test "x$with_clan_exec_prefix" != "x"; then + CLAN_LDFLAGS="-L$with_clan_exec_prefix/lib" + fi + CLAN_LIBS="-lclan" +esac + +AC_CONFIG_FILES(Makefile) +if test $with_isl = bundled; then + AC_CONFIG_SUBDIRS(isl) +fi +if test $with_cloog = bundled; then + AC_CONFIG_SUBDIRS(cloog) +fi +if test $with_clan = bundled; then + AC_CONFIG_SUBDIRS(clan) +fi +AC_CONFIG_COMMANDS_POST([ + dnl pass on arguments to subdir configures, but don't + dnl add them to config.status + ac_configure_args="$ac_configure_args $ppcg_configure_args" +]) +AC_OUTPUT diff --git a/cuda.c b/cuda.c new file mode 100644 index 0000000..a96aa7d --- /dev/null +++ b/cuda.c @@ -0,0 +1,4124 @@ +/* + * Copyright 2010-2011 INRIA Saclay + * + * Use of this software is governed by the GNU LGPLv2.1 license + * + * Written by Sven Verdoolaege, INRIA Saclay - Ile-de-France, + * Parc Club Orsay Universite, ZAC des vignes, 4 rue Jacques Monod, + * 91893 Orsay, France + */ + +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include + +#include "cuda.h" +#include "cuda_common.h" +#include "gpucode.h" +#include "schedule.h" +#include "scoplib_isl.h" +#include "ppcg_options.h" + +/* The fields stride, shift and shift_map only contain valid information + * if shift != NULL. + * If so, they express that current index is such that if you add shift, + * then the result is always a multiple of stride. + * shift_map contains the mapping + * + * i -> (i + shift)/stride + */ +struct cuda_array_bound { + isl_int size; + isl_qpolynomial *lb; + + isl_int stride; + isl_qpolynomial *shift; + isl_basic_map *shift_map; +}; + +struct cuda_array_info; + +/* A group of array references in a kernel that should be handled together. + * If private_bound is not NULL, then it is mapped to registers. + * Otherwise, if shared_bound is not NULL, it is mapped to shared memory. + * Otherwise, it is accesses from global memory. + */ +struct cuda_array_ref_group { + /* The references in this group access this array. */ + struct cuda_array_info *array; + /* Position of this group in the list of reference groups of array. */ + int nr; + + /* The following fields are use during the construction of the groups. + * access is the combined access relation relative to the shared + * memory tiling. + * write is set if any access in the group is a write. + */ + isl_map *access; + int write; + + /* For each index, size and offset of piece in shared memory. */ + struct cuda_array_bound *shared_bound; + + /* For each index, size and offset of piece in private memory. */ + struct cuda_array_bound *private_bound; + + /* References in this group; point to elements of a linked list. */ + int n_ref; + struct cuda_stmt_access **refs; +}; + +struct cuda_array_info { + isl_dim *dim; + /* Name of the array. */ + char *name; + /* Number of indices. */ + unsigned n_index; + /* For each index, a bound on the array in that direction. */ + isl_pw_qpolynomial_fold **bound; + /* For each index, bound[i] specialized to the current kernel. */ + isl_pw_qpolynomial_fold **local_bound; + + /* All references to this array; point to elements of a linked list. */ + int n_ref; + struct cuda_stmt_access **refs; + + /* The reference groups associated to this array. */ + int n_group; + struct cuda_array_ref_group **groups; + + /* Last shared memory tile dimension that affects tile of this array. */ + int last_shared; + /* Dimension at which copying to/from shared memory is printed. + * if >= 0, then the value is >= last_shared + * if -1, then the copying is done at the leaf level. + */ + int print_shared_level; +}; + +/* Print the name of the local copy of a given group of array references. + */ +static void print_array_name(FILE *out, struct cuda_array_ref_group *group) +{ + int global = 0; + + if (group->private_bound) + fprintf(out, "private_"); + else if (group->shared_bound) + fprintf(out, "shared_"); + else + global = 1; + fprintf(out, "%s", group->array->name); + if (!global && group->array->n_group > 1) + fprintf(out, "_%d", group->nr); +} + +/* Collect all references to the given array and store pointers to them + * in array->refs. + */ +static void collect_references(struct cuda_gen *gen, + struct cuda_array_info *array) +{ + int i; + int n; + + n = 0; + for (i = 0; i < gen->n_stmts; ++i) { + struct cuda_stmt *stmt = &gen->stmts[i]; + struct cuda_stmt_access *access; + + for (access = stmt->accesses; access; access = access->next) { + const char *name; + name = isl_map_get_tuple_name(access->access, + isl_dim_out); + if (name && !strcmp(array->name, name)) + n++; + } + } + + array->n_ref = n; + array->refs = isl_alloc_array(gen->ctx, struct cuda_stmt_access *, n); + assert(array->refs); + + n = 0; + for (i = 0; i < gen->n_stmts; ++i) { + struct cuda_stmt *stmt = &gen->stmts[i]; + struct cuda_stmt_access *access; + + for (access = stmt->accesses; access; access = access->next) { + const char *name; + name = isl_map_get_tuple_name(access->access, + isl_dim_out); + if (!name || strcmp(array->name, name)) + continue; + + array->refs[n++] = access; + } + } +} + +static struct cuda_array_bound *create_bound_list(isl_ctx *ctx, int n_index) +{ + int i; + struct cuda_array_bound *bound; + + bound = isl_alloc_array(ctx, struct cuda_array_bound, n_index); + assert(bound); + + for (i = 0; i < n_index; ++i) { + isl_int_init(bound[i].size); + bound[i].lb = NULL; + isl_int_init(bound[i].stride); + bound[i].shift = NULL; + bound[i].shift_map = NULL; + } + + return bound; +} + +static void free_bound_list(struct cuda_array_bound *bound, int n_index) +{ + int j; + + if (!bound) + return; + + for (j = 0; j < n_index; ++j) { + isl_int_clear(bound[j].size); + isl_int_clear(bound[j].stride); + isl_qpolynomial_free(bound[j].lb); + isl_qpolynomial_free(bound[j].shift); + isl_basic_map_free(bound[j].shift_map); + } + free(bound); +} + +/* Compute bounds on the host arrays based on the accessed elements + * and collect all references to the array. + */ +static int extract_array_info(__isl_take isl_set *array, void *user) +{ + int i; + struct cuda_gen *gen = (struct cuda_gen *)user; + const char *name; + int n_index; + isl_pw_qpolynomial_fold **bounds; + isl_pw_qpolynomial_fold **local_bounds; + + n_index = isl_set_dim(array, isl_dim_set); + name = isl_set_get_tuple_name(array); + bounds = isl_alloc_array(isl_set_get_ctx(array), + isl_pw_qpolynomial_fold *, n_index); + assert(bounds); + local_bounds = isl_calloc_array(isl_set_get_ctx(array), + isl_pw_qpolynomial_fold *, n_index); + assert(local_bounds); + gen->array[gen->n_array].dim = isl_set_get_dim(array); + gen->array[gen->n_array].name = strdup(name); + gen->array[gen->n_array].n_index = n_index; + gen->array[gen->n_array].bound = bounds; + gen->array[gen->n_array].local_bound = local_bounds; + + for (i = 0; i < n_index; ++i) { + isl_dim *dim; + isl_qpolynomial *qp, *one; + isl_pw_qpolynomial *pwqp; + isl_pw_qpolynomial_fold *pwf; + + dim = isl_set_get_dim(array); + one = isl_qpolynomial_one(isl_dim_copy(dim)); + qp = isl_qpolynomial_var(dim, isl_dim_set, i); + qp = isl_qpolynomial_add(qp, one); + pwqp = isl_pw_qpolynomial_alloc(isl_set_copy(array), qp); + pwf = isl_pw_qpolynomial_bound(pwqp, isl_fold_max, NULL); + pwf = isl_pw_qpolynomial_fold_gist(pwf, + isl_set_copy(gen->context)); + + bounds[i] = pwf; + } + + collect_references(gen, &gen->array[gen->n_array]); + + gen->n_array++; + + isl_set_free(array); + return 0; +} + +void collect_array_info(struct cuda_gen *gen) +{ + isl_union_set *arrays; + + arrays = isl_union_map_range(isl_union_map_copy(gen->read)); + arrays = isl_union_set_union(arrays, + isl_union_map_range(isl_union_map_copy(gen->write))); + arrays = isl_union_set_coalesce(arrays); + + gen->n_array = isl_union_set_n_set(arrays); + gen->array = isl_alloc_array(gen->ctx, + struct cuda_array_info, gen->n_array); + assert(gen->array); + gen->n_array = 0; + isl_union_set_foreach_set(arrays, &extract_array_info, gen); + isl_union_set_free(arrays); +} + +static void free_array_info(struct cuda_gen *gen) +{ + int i, j; + + for (i = 0; i < gen->n_array; ++i) { + int n_index = gen->array[i].n_index; + free(gen->array[i].name); + for (j = 0; j < n_index; ++j) { + isl_pw_qpolynomial_fold_free(gen->array[i].bound[j]); + isl_pw_qpolynomial_fold_free(gen->array[i].local_bound[j]); + } + isl_dim_free(gen->array[i].dim); + free(gen->array[i].bound); + free(gen->array[i].local_bound); + free(gen->array[i].refs); + } + free(gen->array); +} + +static void declare_device_arrays(struct cuda_gen *gen) +{ + int i; + + for (i = 0; i < gen->n_array; ++i) + fprintf(gen->cuda.host_c, "%s *dev_%s;\n", + gen->options->type, gen->array[i].name); +} + +static void print_array_size(struct cuda_gen *gen, FILE *out, + struct cuda_array_info *array) +{ + int i; + isl_printer *prn; + + prn = isl_printer_to_file(gen->ctx, out); + prn = isl_printer_set_output_format(prn, ISL_FORMAT_C); + for (i = 0; i < array->n_index; ++i) { + prn = isl_printer_print_str(prn, "("); + prn = isl_printer_print_pw_qpolynomial_fold(prn, + array->bound[i]); + prn = isl_printer_print_str(prn, ") * "); + } + prn = isl_printer_print_str(prn, "sizeof("); + prn = isl_printer_print_str(prn, gen->options->type); + prn = isl_printer_print_str(prn, ")"); + isl_printer_free(prn); +} + +static void allocate_device_arrays(struct cuda_gen *gen) +{ + int i; + + for (i = 0; i < gen->n_array; ++i) { + fprintf(gen->cuda.host_c, "cudaMalloc(&dev_%s, ", + gen->array[i].name); + print_array_size(gen, gen->cuda.host_c, &gen->array[i]); + fprintf(gen->cuda.host_c, ");\n"); + } +} + +static void free_device_arrays(struct cuda_gen *gen) +{ + int i; + + for (i = 0; i < gen->n_array; ++i) + fprintf(gen->cuda.host_c, "cudaFree(dev_%s);\n", + gen->array[i].name); +} + +static void copy_arrays_to_device(struct cuda_gen *gen) +{ + int i; + + for (i = 0; i < gen->n_array; ++i) { + isl_dim *dim; + isl_set *read_i; + int empty; + + dim = isl_dim_copy(gen->array[i].dim); + read_i = isl_union_set_extract_set(gen->copy_in, dim); + empty = isl_set_fast_is_empty(read_i); + isl_set_free(read_i); + if (empty) + continue; + + fprintf(gen->cuda.host_c, "assert(sizeof(%s) == ", + gen->array[i].name); + print_array_size(gen, gen->cuda.host_c, &gen->array[i]); + fprintf(gen->cuda.host_c, ");\n"); + fprintf(gen->cuda.host_c, "cudaMemcpy(dev_%s, %s, ", + gen->array[i].name, gen->array[i].name); + print_array_size(gen, gen->cuda.host_c, &gen->array[i]); + fprintf(gen->cuda.host_c, ", cudaMemcpyHostToDevice);\n"); + } +} + +static void copy_arrays_from_device(struct cuda_gen *gen) +{ + int i; + isl_union_set *write; + write = isl_union_map_range(isl_union_map_copy(gen->write)); + + for (i = 0; i < gen->n_array; ++i) { + isl_dim *dim; + isl_set *write_i; + int empty; + + dim = isl_dim_copy(gen->array[i].dim); + write_i = isl_union_set_extract_set(write, dim); + empty = isl_set_fast_is_empty(write_i); + isl_set_free(write_i); + if (empty) + continue; + + fprintf(gen->cuda.host_c, "cudaMemcpy(%s, dev_%s, ", + gen->array[i].name, gen->array[i].name); + print_array_size(gen, gen->cuda.host_c, &gen->array[i]); + fprintf(gen->cuda.host_c, ", cudaMemcpyDeviceToHost);\n"); + } + + isl_union_set_free(write); +} + +static void read_sizes_from_file(struct cuda_gen *gen, const char *filename, + int *sizes, int len) +{ + int i; + FILE *file; + + file = fopen(filename, "r"); + if (!file) + return; + + for (i = 0; i < len; ++i) + if (fscanf(file, "%d", &sizes[i]) < 1) + break; + + fclose(file); +} + +static void reverse_list(int *list, int len) +{ + int i; + int t; + + for (i = 0; 2 * i < len; ++i) { + t = list[i]; + list[i] = list[len - 1 - i]; + list[len - 1 - i] = t; + } +} + +/* Read user specified sizes from "tile.sizes", "block.sizes" and "grid.sizes" + * after filling in some potentially useful defaults. + */ +static void read_sizes(struct cuda_gen *gen) +{ + int n; + + gen->tile_size = isl_alloc_array(gen->ctx, int, gen->tile_len); + assert(gen->tile_size); + for (n = 0; n < gen->tile_len; ++n) + gen->tile_size[n] = gen->options->tile_size; + read_sizes_from_file(gen, "tile.sizes", gen->tile_size, gen->tile_len); + + n = gen->n_parallel; + gen->n_block = (n <= 3) ? n : 3; + switch (gen->n_block) { + case 1: + gen->block_dim[0] = 512; + break; + case 2: + gen->block_dim[0] = 32; + gen->block_dim[1] = 16; + break; + default: + gen->block_dim[0] = 32; + gen->block_dim[1] = 4; + gen->block_dim[2] = 4; + break; + } + read_sizes_from_file(gen, "block.sizes", gen->block_dim, gen->n_block); + reverse_list(gen->block_dim, gen->n_block); + + gen->n_grid = (n <= 2) ? n : 2; + switch (gen->n_grid) { + case 1: + gen->grid_dim[0] = 65536; + break; + default: + gen->grid_dim[0] = 256; + gen->grid_dim[1] = 256; + break; + } + read_sizes_from_file(gen, "grid.sizes", gen->grid_dim, gen->n_grid); + reverse_list(gen->grid_dim, gen->n_grid); +} + +static void free_stmts(struct cuda_stmt *stmts, int n) +{ + int i; + + for (i = 0; i < n; ++i) { + struct cuda_stmt_access *access, *next; + + for (access = stmts[i].accesses; access; access = next) { + next = access->next; + isl_map_free(access->access); + free(access); + } + + isl_set_free(stmts[i].domain); + free(stmts[i].text); + } + free(stmts); +} + +void clear_cuda_gen(struct cuda_gen *gen) +{ + free_stmts(gen->stmts, gen->n_stmts); + free_array_info(gen); + isl_set_free(gen->context); + isl_union_set_free(gen->copy_in); + isl_union_map_free(gen->sched); + isl_union_map_free(gen->read); + isl_union_map_free(gen->write); +} + +static void print_reverse_list(FILE *out, int len, int *list) +{ + int i; + + for (i = 0; i < len; ++i) { + if (i) + fprintf(out, ", "); + fprintf(out, "%d", list[len - 1 - i]); + } +} + +static void print_kernel_launch(struct cuda_gen *gen, + __isl_keep isl_union_set *arrays) +{ + int i; + int first = 1; + unsigned nparam; + isl_dim *dim; + + print_indent(gen->code.dst, gen->code.indent); + fprintf(gen->code.dst, "kernel%d <<>> (", + gen->kernel_id, gen->kernel_id, gen->kernel_id); + fprintf(gen->cuda.kernel_c, "__global__ void kernel%d(", + gen->kernel_id); + fprintf(gen->cuda.kernel_h, "__global__ void kernel%d(", + gen->kernel_id); + + for (i = 0; i < gen->n_array; ++i) { + isl_dim *dim; + isl_set *arr; + int empty; + + dim = isl_dim_copy(gen->array[i].dim); + arr = isl_union_set_extract_set(arrays, dim); + empty = isl_set_fast_is_empty(arr); + isl_set_free(arr); + if (empty) + continue; + + if (!first) { + fprintf(gen->code.dst, ", "); + fprintf(gen->cuda.kernel_c, ", "); + fprintf(gen->cuda.kernel_h, ", "); + } + + fprintf(gen->code.dst, "dev_%s", gen->array[i].name); + fprintf(gen->cuda.kernel_c, "%s *%s", + gen->options->type, gen->array[i].name); + fprintf(gen->cuda.kernel_h, "%s *%s", + gen->options->type, gen->array[i].name); + + first = 0; + } + + dim = isl_union_set_get_dim(arrays); + nparam = isl_dim_size(dim, isl_dim_param); + for (i = 0; i < nparam; ++i) { + const char *name = isl_dim_get_name(dim, isl_dim_param, i); + if (!first) { + fprintf(gen->code.dst, ", "); + fprintf(gen->cuda.kernel_c, ", "); + fprintf(gen->cuda.kernel_h, ", "); + } + fprintf(gen->code.dst, "%s", name); + fprintf(gen->cuda.kernel_c, "int %s", name); + fprintf(gen->cuda.kernel_h, "int %s", name); + first = 0; + } + isl_dim_free(dim); + + for (i = 0; i < gen->tile_first; ++i) { + if (!first) { + fprintf(gen->code.dst, ", "); + fprintf(gen->cuda.kernel_c, ", "); + fprintf(gen->cuda.kernel_h, ", "); + } + fprintf(gen->code.dst, "h%d", i); + fprintf(gen->cuda.kernel_c, "int h%d", i); + fprintf(gen->cuda.kernel_h, "int h%d", i); + first = 0; + } + + fprintf(gen->code.dst, ");\n"); + fprintf(gen->cuda.kernel_c, ")\n"); + fprintf(gen->cuda.kernel_h, ");\n"); +} + +/* Construct a map from a domain of dimensionality "len" + * to a domain of dimensionality "len" + "tile_len" that tiles + * the "tile_len" coordinates starting at "first". + * In particular, [s_i] -> [s_i / tile_size[i], s_i % tile_size[i]]. + * "dim" prescribes the parameters. + */ +static __isl_give isl_map *tile(__isl_take isl_dim *dim, int len, + int first, int tile_len, int *tile_size) +{ + int i; + isl_int v; + isl_basic_map *bmap; + isl_constraint *c; + + isl_int_init(v); + + dim = isl_dim_add(dim, isl_dim_in, len); + dim = isl_dim_add(dim, isl_dim_out, len + tile_len); + bmap = isl_basic_map_universe(isl_dim_copy(dim)); + + for (i = 0; i < len - tile_len; ++i) { + int j = i < first ? i : i + tile_len; + int k = i < first ? i : i + 2 * tile_len; + + c = isl_equality_alloc(isl_dim_copy(dim)); + isl_int_set_si(v, -1); + isl_constraint_set_coefficient(c, isl_dim_in, j, v); + isl_int_set_si(v, 1); + isl_constraint_set_coefficient(c, isl_dim_out, k, v); + bmap = isl_basic_map_add_constraint(bmap, c); + } + + for (i = 0; i < tile_len; ++i) { + c = isl_equality_alloc(isl_dim_copy(dim)); + isl_int_set_si(v, -1); + isl_constraint_set_coefficient(c, isl_dim_in, first + i, v); + isl_int_set_si(v, tile_size[i]); + isl_constraint_set_coefficient(c, isl_dim_out, first + i, v); + isl_int_set_si(v, 1); + isl_constraint_set_coefficient(c, isl_dim_out, + first + i + tile_len, v); + bmap = isl_basic_map_add_constraint(bmap, c); + + c = isl_inequality_alloc(isl_dim_copy(dim)); + isl_int_set_si(v, 1); + isl_constraint_set_coefficient(c, isl_dim_out, + first + i + tile_len, v); + bmap = isl_basic_map_add_constraint(bmap, c); + + c = isl_inequality_alloc(isl_dim_copy(dim)); + isl_int_set_si(v, -1); + isl_constraint_set_coefficient(c, isl_dim_out, + first + i + tile_len, v); + isl_int_set_si(v, tile_size[i] - 1); + isl_constraint_set_constant(c, v); + bmap = isl_basic_map_add_constraint(bmap, c); + } + + isl_dim_free(dim); + isl_int_clear(v); + + return isl_map_from_basic_map(bmap); +} + +/* Construct a map from a domain of dimensionality "len" + * to a domain of dimensionality "len" + "wrap_len" that "wraps" + * the "wrap_len" coordinates starting at "first" according to "wrap_size". + * In particular, [s_i] -> [s_i, s_i % wrap_size[i]]. + * To do so, we need extra variables corresponding to [s_i / wrap_size[i]], + * that are projected out at the end. + * "dim" prescribes the parameters. + */ +static __isl_give isl_map *wrap(__isl_take isl_dim *dim, int len, + int first, int wrap_len, int *wrap_size) +{ + int i; + isl_basic_map *bmap; + isl_constraint *c; + + dim = isl_dim_add(dim, isl_dim_in, len); + dim = isl_dim_add(dim, isl_dim_out, len + 2 * wrap_len); + bmap = isl_basic_map_universe(isl_dim_copy(dim)); + + for (i = 0; i < len; ++i) { + int k = i < first + wrap_len ? i : i + 2 * wrap_len; + + c = isl_equality_alloc(isl_dim_copy(dim)); + isl_constraint_set_coefficient_si(c, isl_dim_in, i, -1); + isl_constraint_set_coefficient_si(c, isl_dim_out, k, 1); + bmap = isl_basic_map_add_constraint(bmap, c); + } + + for (i = 0; i < wrap_len; ++i) { + c = isl_equality_alloc(isl_dim_copy(dim)); + isl_constraint_set_coefficient_si(c, isl_dim_out, + first + i, -1); + isl_constraint_set_coefficient_si(c, isl_dim_out, + first + wrap_len + i, 1); + isl_constraint_set_coefficient_si(c, isl_dim_out, + first + 2 * wrap_len + i, wrap_size[i]); + bmap = isl_basic_map_add_constraint(bmap, c); + + c = isl_inequality_alloc(isl_dim_copy(dim)); + isl_constraint_set_coefficient_si(c, isl_dim_out, + first + wrap_len + i, 1); + bmap = isl_basic_map_add_constraint(bmap, c); + + c = isl_inequality_alloc(isl_dim_copy(dim)); + isl_constraint_set_coefficient_si(c, isl_dim_out, + first + wrap_len + i, -1); + isl_constraint_set_constant_si(c, wrap_size[i] - 1); + bmap = isl_basic_map_add_constraint(bmap, c); + } + + isl_dim_free(dim); + + bmap = isl_basic_map_project_out(bmap, isl_dim_out, + first + 2 * wrap_len, wrap_len); + + return isl_map_from_basic_map(bmap); +} + +/* Add "n" parameters named prefix%d. + */ +static __isl_give isl_set *add_params( __isl_take isl_set *set, + int n, const char *prefix) +{ + int i; + unsigned nparam; + char name[20]; + + nparam = isl_set_dim(set, isl_dim_param); + set = isl_set_add_dims(set, isl_dim_param, n); + + for (i = 0; i < n; ++i) { + snprintf(name, sizeof(name), "%s%d", prefix, i); + set = isl_set_set_dim_name(set, isl_dim_param, + nparam + i, name); + } + + return set; +} + +/* Equate the "n" dimensions of "set" starting at "first" to + * freshly created parameters named prefix%d. + */ +static __isl_give isl_set *parametrize(__isl_take isl_set *set, + int first, int n, const char *prefix) +{ + int i; + unsigned nparam; + isl_int v; + isl_dim *dim; + isl_basic_set *bset; + isl_constraint *c; + + nparam = isl_set_dim(set, isl_dim_param); + + set = add_params(set, n, prefix); + + dim = isl_set_get_dim(set); + bset = isl_basic_set_universe(isl_dim_copy(dim)); + + isl_int_init(v); + + for (i = 0; i < n; ++i) { + c = isl_equality_alloc(isl_dim_copy(dim)); + isl_int_set_si(v, -1); + isl_constraint_set_coefficient(c, isl_dim_param, nparam + i, v); + isl_int_set_si(v, 1); + isl_constraint_set_coefficient(c, isl_dim_set, first + i, v); + bset = isl_basic_set_add_constraint(bset, c); + } + + isl_int_clear(v); + isl_dim_free(dim); + + return isl_set_intersect(set, isl_set_from_basic_set(bset)); +} + +static __isl_give isl_set *parametrization(__isl_take isl_dim *dim, + int len, int first, int n, const char *prefix) +{ + isl_set *set; + + dim = isl_dim_add(dim, isl_dim_set, len); + set = isl_set_universe(dim); + + return parametrize(set, first, n, prefix); +} + +/* Tile the B loops over the tile sizes and then tile/wrap + * the T1 loops over the blocks. + */ +static __isl_give isl_union_map *tile_schedule(struct cuda_gen *gen, + __isl_take isl_union_map *sched) +{ + isl_dim *dim; + isl_map *tiling, *block_tiling; + + dim = isl_union_map_get_dim(sched); + tiling = tile(isl_dim_copy(dim), gen->untiled_len, + gen->tile_first, gen->tile_len, gen->tile_size); + + if (gen->options->wrap) + block_tiling = wrap(dim, gen->untiled_len + gen->tile_len, + gen->tile_first, gen->n_grid, gen->grid_dim); + else + block_tiling = tile(dim, gen->untiled_len + gen->tile_len, + gen->tile_first, gen->n_grid, gen->grid_dim); + + gen->tiled_len = gen->untiled_len + gen->tile_len + gen->n_grid; + + tiling = isl_map_apply_range(tiling, block_tiling); + + sched = isl_union_map_apply_range(sched, + isl_union_map_from_map(tiling)); + + gen->shared_len = gen->tile_first + gen->tile_len + gen->n_grid; + + return sched; +} + +static __isl_give isl_union_map *parametrize_tiled_schedule( + struct cuda_gen *gen, __isl_take isl_union_map *sched) +{ + isl_dim *dim; + isl_set *par; + + dim = isl_union_map_get_dim(sched); + par = parametrization(dim, gen->tiled_len, 0, gen->tile_first, "h"); + sched = isl_union_map_intersect_range(sched, + isl_union_set_from_set(par)); + + dim = isl_union_map_get_dim(sched); + par = parametrization(dim, gen->tiled_len, + gen->tile_first + gen->n_grid, gen->n_grid, "b"); + sched = isl_union_map_intersect_range(sched, + isl_union_set_from_set(par)); + + return sched; +} + +/* Tile/wrap the P1 loops over the threads. + */ +static __isl_give isl_union_map *thread_tile_schedule(struct cuda_gen *gen, + __isl_take isl_union_map *sched) +{ + isl_dim *dim; + isl_map *tiling; + isl_set *par; + + dim = isl_union_map_get_dim(sched); + + if (gen->options->wrap) + tiling = wrap(isl_dim_copy(dim), gen->tiled_len, + gen->shared_len, gen->n_block, gen->block_dim); + else + tiling = tile(isl_dim_copy(dim), gen->tiled_len, + gen->shared_len, gen->n_block, gen->block_dim); + gen->thread_tiled_len = gen->tiled_len + gen->n_block; + + sched = isl_union_map_apply_range(sched, + isl_union_map_from_map(tiling)); + + par = parametrization(dim, gen->thread_tiled_len, + gen->tile_first + gen->tile_len + gen->n_grid + gen->n_block, + gen->n_block, "t"); + sched = isl_union_map_intersect_range(sched, + isl_union_set_from_set(par)); + + gen->shared_len = gen->tile_first + gen->tile_len + gen->n_grid; + + return sched; +} + +/* If the user asked for it, scale the shared memory tile loops + * (T1P and T2) of "sched" by gen->tile_size[i]. + * If we are not performing "wrapping", then additionally scale the T1P + * loops by gen->grid_dim[i]. + */ +static __isl_give isl_union_map *scale_tile_loops(struct cuda_gen *gen, + __isl_take isl_union_map *sched) +{ + int i; + isl_dim *dim; + isl_basic_map *scale; + isl_constraint *c; + + if (!gen->options->scale_tile_loops) + return sched; + + dim = isl_union_map_get_dim(sched); + dim = isl_dim_add(dim, isl_dim_in, gen->tiled_len); + dim = isl_dim_add(dim, isl_dim_out, gen->tiled_len); + scale = isl_basic_map_universe(isl_dim_copy(dim)); + + for (i = 0; i < gen->tiled_len; ++i) { + int f = 1; + + if (i >= gen->tile_first && i < gen->tile_first + gen->n_grid) { + f = gen->tile_size[i - gen->tile_first]; + if (!gen->options->wrap) + f *= gen->grid_dim[i - gen->tile_first]; + } else if (i >= gen->tile_first + gen->n_grid && + i < gen->tile_first + gen->n_grid + gen->tile_len) { + f = gen->tile_size[i - (gen->tile_first + gen->n_grid)]; + } + + c = isl_equality_alloc(isl_dim_copy(dim)); + isl_constraint_set_coefficient_si(c, isl_dim_in, i, f); + isl_constraint_set_coefficient_si(c, isl_dim_out, i, -1); + scale = isl_basic_map_add_constraint(scale, c); + } + + isl_dim_free(dim); + + sched = isl_union_map_apply_range(sched, + isl_union_map_from_map(isl_map_from_basic_map(scale))); + + return sched; +} + +/* If we are not performing "wrapping" and if the user asked for it, + * scale the thread tile loops (P1T) of "sched" by gen->block_dim[i]. + */ +static __isl_give isl_union_map *scale_thread_tile_loops(struct cuda_gen *gen, + __isl_take isl_union_map *sched) +{ + int i; + isl_dim *dim; + isl_basic_map *scale; + isl_constraint *c; + + if (gen->options->wrap) + return sched; + if (!gen->options->scale_tile_loops) + return sched; + + dim = isl_union_map_get_dim(sched); + dim = isl_dim_add(dim, isl_dim_in, gen->thread_tiled_len); + dim = isl_dim_add(dim, isl_dim_out, gen->thread_tiled_len); + scale = isl_basic_map_universe(isl_dim_copy(dim)); + + for (i = 0; i < gen->thread_tiled_len; ++i) { + int f = 1; + + if (i >= gen->shared_len && + i < gen->shared_len + gen->n_block) + f = gen->block_dim[i - gen->shared_len]; + + c = isl_equality_alloc(isl_dim_copy(dim)); + isl_constraint_set_coefficient_si(c, isl_dim_in, i, f); + isl_constraint_set_coefficient_si(c, isl_dim_out, i, -1); + scale = isl_basic_map_add_constraint(scale, c); + } + + isl_dim_free(dim); + + sched = isl_union_map_apply_range(sched, + isl_union_map_from_map(isl_map_from_basic_map(scale))); + + return sched; +} + +/* If we are not performing "wrapping" and if the user asked for it, + * scale the "n_tile" loops starting at "first" of "sched" by gen->block_dim[i]. + */ +static __isl_give isl_union_map *scale_access_tile_loops(struct cuda_gen *gen, + __isl_take isl_union_map *sched, int len, int first, int n_tile) +{ + int i; + isl_dim *dim; + isl_basic_map *scale; + isl_constraint *c; + + if (gen->options->wrap) + return sched; + if (!gen->options->scale_tile_loops) + return sched; + + dim = isl_union_map_get_dim(sched); + dim = isl_dim_add(dim, isl_dim_in, len); + dim = isl_dim_add(dim, isl_dim_out, len); + scale = isl_basic_map_universe(isl_dim_copy(dim)); + + for (i = 0; i < len; ++i) { + int f = 1; + + if (i >= first && i < first + n_tile) + f = gen->block_dim[i - first]; + + c = isl_equality_alloc(isl_dim_copy(dim)); + isl_constraint_set_coefficient_si(c, isl_dim_in, i, f); + isl_constraint_set_coefficient_si(c, isl_dim_out, i, -1); + scale = isl_basic_map_add_constraint(scale, c); + } + + isl_dim_free(dim); + + sched = isl_union_map_apply_range(sched, + isl_union_map_from_map(isl_map_from_basic_map(scale))); + + return sched; +} + +/* If print_user_stmt is set, we want to print the statements ourselves, + * instead of relying on the C preprocessor. If so, we need to use + * the stop option so that the domains will be saved on the statement + * nodes. + */ +static void print_cloog_shared_body(struct cuda_gen *gen, + __isl_keep isl_set *context, __isl_keep isl_union_map *sched, int len, + void (*print_user_stmt)(struct gpucode_info *info, + struct clast_user_stmt *s), + int first_unroll) +{ + int i; + CloogOptions *options; + CloogDomain *cloog_context; + CloogUnionDomain *ud; + CloogInput *input; + struct clast_stmt *stmt; + char name[20]; + + sched = isl_union_map_copy(sched); + sched = isl_union_map_align_params(sched, isl_set_get_dim(context)); + + options = cloog_options_malloc(gen->state); + options->language = LANGUAGE_C; + options->strides = 1; + options->sh = 1; + options->f = len; + options->l = -1; + options->override = 1; + options->save_domains = 1; + options->noscalars = 1; + options->first_unroll = first_unroll; + + ud = cloog_union_domain_from_isl_union_map(sched); + for (i = 0; i < len; ++i) { + snprintf(name, sizeof(name), "c%d", i); + ud = cloog_union_domain_set_name(ud, CLOOG_SCAT, i, name); + } + cloog_context = cloog_domain_from_isl_set(isl_set_copy(context)); + input = cloog_input_alloc(cloog_context, ud); + + stmt = cloog_clast_create_from_input(input, options); + + gen->stmt_code.indent = gen->kernel_code.indent; + gen->stmt_code.dst = gen->cuda.kernel_c; + gen->stmt_code.print_user_stmt = print_user_stmt; + gen->stmt_code.print_user_stmt_list = NULL; + gen->stmt_code.print_for_head = NULL; + gen->stmt_code.print_for_foot = NULL; + gen->stmt_code.user = gen; + gpu_print_host_stmt(&gen->stmt_code, stmt); + + cloog_clast_free(stmt); + cloog_options_free(options); +} + +/* Add "len" parameters p[i] called prefix%d, + * with bounds to 0 <= p[i] < size[i]. + */ +__isl_give isl_set *add_bounded_parameters(__isl_take isl_set *set, + int len, int *size, const char *prefix) +{ + int i; + unsigned nparam; + isl_int v; + isl_dim *dim; + isl_basic_set *bset; + isl_constraint *c; + char name[20]; + + nparam = isl_set_dim(set, isl_dim_param); + set = isl_set_add_dims(set, isl_dim_param, len); + + for (i = 0; i < len; ++i) { + snprintf(name, sizeof(name), "%s%d", prefix, i); + set = isl_set_set_dim_name(set, isl_dim_param, + nparam + i, name); + } + + dim = isl_set_get_dim(set); + bset = isl_basic_set_universe(isl_dim_copy(dim)); + + isl_int_init(v); + + for (i = 0; i < len; ++i) { + c = isl_inequality_alloc(isl_dim_copy(dim)); + isl_int_set_si(v, 1); + isl_constraint_set_coefficient(c, isl_dim_param, nparam + i, v); + bset = isl_basic_set_add_constraint(bset, c); + + c = isl_inequality_alloc(isl_dim_copy(dim)); + isl_int_set_si(v, -1); + isl_constraint_set_coefficient(c, isl_dim_param, nparam + i, v); + isl_int_set_si(v, size[i] - 1); + isl_constraint_set_constant(c, v); + bset = isl_basic_set_add_constraint(bset, c); + } + + isl_int_clear(v); + isl_dim_free(dim); + + return isl_set_intersect(set, isl_set_from_basic_set(bset)); +} + +static void print_shared_body(struct cuda_gen *gen, + __isl_keep isl_set *shared_domain, __isl_keep isl_union_map *sched, + int len, void (*print_user_stmt)(struct gpucode_info *info, + struct clast_user_stmt *s), + int first_unroll) +{ + isl_set *context; + + context = isl_set_copy(shared_domain); + context = parametrize(context, 0, gen->shared_len, "g"); + context = isl_set_project_out(context, isl_dim_set, 0, gen->shared_len); + context = add_bounded_parameters(context, + gen->n_block, gen->block_dim, "t"); + + print_cloog_shared_body(gen, context, sched, len, print_user_stmt, + first_unroll); + + isl_set_free(context); +} + +/* Given a tile of an array, construct a map that maps each element + * of the tile to a copy of the tile shifted to the origin + * (based on the lower bounds in group->private_bound or group->shared_bound). + * If any of the indices is strided, then {private,shared}_bound[i].shift_map + * is applied to the index first. + * The domain of the resulting map is "access", + * while the range space is anonymous. + */ +static __isl_give isl_map *shift_access(__isl_take isl_set *access, + struct cuda_array_ref_group *group) +{ + int i; + isl_dim *dim; + isl_basic_set *bset; + isl_basic_map *bmap; + isl_qpolynomial *lb; + isl_basic_set *offset; + isl_basic_map *shift; + isl_basic_map *pre_shift; + isl_map *sched; + const char *name; + struct cuda_array_bound *bounds; + int n_index = group->array->n_index; + + bounds = group->private_bound; + if (!bounds) + bounds = group->shared_bound; + + dim = isl_set_get_dim(access); + dim = isl_dim_drop(dim, isl_dim_set, 0, n_index); + offset = isl_basic_set_universe(dim); + for (i = 0; i < n_index; ++i) { + lb = isl_qpolynomial_copy(bounds[i].lb); + bmap = isl_basic_map_from_qpolynomial(lb); + bset = isl_basic_map_range(bmap); + offset = isl_basic_set_flat_product(offset, bset); + } + offset = isl_basic_set_neg(offset); + + dim = isl_dim_map_from_set(isl_set_get_dim(access)); + shift = isl_basic_map_identity(dim); + shift = isl_basic_map_set_tuple_name(shift, isl_dim_out, NULL); + + bset = isl_basic_set_universe(isl_set_get_dim(access)); + bmap = isl_basic_map_from_domain_and_range(bset, offset); + + shift = isl_basic_map_sum(shift, bmap); + + dim = isl_set_get_dim(access); + dim = isl_dim_drop(dim, isl_dim_set, 0, n_index); + dim = isl_dim_map_from_set(dim); + pre_shift = isl_basic_map_universe(isl_dim_copy(dim)); + dim = isl_dim_add(dim, isl_dim_in, 1); + dim = isl_dim_add(dim, isl_dim_out, 1); + for (i = 0; i < n_index; ++i) { + if (!bounds[i].shift_map) + bmap = isl_basic_map_identity(isl_dim_copy(dim)); + else + bmap = isl_basic_map_copy(bounds[i].shift_map); + pre_shift = isl_basic_map_flat_product(pre_shift, bmap); + } + isl_dim_free(dim); + name = isl_basic_map_get_tuple_name(shift, isl_dim_in); + pre_shift = isl_basic_map_set_tuple_name(pre_shift, isl_dim_in, name); + pre_shift = isl_basic_map_set_tuple_name(pre_shift, isl_dim_out, name); + shift = isl_basic_map_apply_range(pre_shift, shift); + + sched = isl_map_from_basic_map(shift); + sched = isl_map_intersect_domain(sched, access); + + return sched; +} + +/* Construct a schedule for iterating over all elements in the given + * piece of an array. The schedule iterates over a copy of the piece + * that is shifted to the origin. + * We subsequently also perform the tiling/wrapping over the threads. + * + * In particular, we tile the final iterators so that the final thread + * dimension runs over the final array dimension. + * However, if those final iterators have only a single iteration, + * we try to tile earlier iterators instead. + */ +static __isl_give isl_union_map *access_schedule(struct cuda_gen *gen, + __isl_take isl_set *access, struct cuda_array_ref_group *group) +{ + isl_dim *dim; + isl_map *sched; + isl_union_map *usched; + isl_map *tiling; + isl_set *par; + unsigned nvar = isl_set_dim(access, isl_dim_set); + int n_tile; + int first; + + sched = shift_access(access, group); + + n_tile = gen->n_block; + if (n_tile > nvar) { + int i; + sched = isl_map_insert(sched, isl_dim_out, 0, n_tile - nvar); + for (i = 0; i < n_tile - nvar; ++i) + sched = isl_map_fix_si(sched, isl_dim_out, i, 0); + nvar = n_tile; + } + + first = nvar - n_tile; + + for (; first > 0; first --) + if (!isl_map_plain_is_fixed(sched, isl_dim_out, + first + n_tile - 1, NULL)) + break; + + dim = isl_map_get_dim(sched); + dim = isl_dim_drop(dim, isl_dim_in, 0, isl_dim_size(dim, isl_dim_in)); + dim = isl_dim_drop(dim, isl_dim_out, 0, nvar); + if (gen->options->wrap) + tiling = wrap(isl_dim_copy(dim), nvar, first, + n_tile, gen->block_dim); + else + tiling = tile(isl_dim_copy(dim), nvar, first, + n_tile, gen->block_dim); + sched = isl_map_apply_range(sched, tiling); + + par = parametrization(dim, nvar + n_tile, first + n_tile, n_tile, "t"); + usched = isl_union_map_from_map(sched); + usched = isl_union_map_intersect_range(usched, + isl_union_set_from_set(par)); + + usched = scale_access_tile_loops(gen, usched, nvar + n_tile, + first, n_tile); + + return usched; +} + +static void print_shared_access(struct cuda_gen *gen, + __isl_keep isl_set *shared_domain, __isl_take isl_set *access, + const char *type, struct cuda_array_ref_group *group) +{ + const char *array_name; + char *name; + isl_ctx *ctx; + isl_union_map *sched; + unsigned nvar = isl_set_dim(access, isl_dim_set); + int n_tile; + + ctx = isl_set_get_ctx(access); + array_name = isl_set_get_tuple_name(access); + name = isl_alloc_array(ctx, char, + strlen(type) + sizeof("_shared_") + strlen(array_name) + 20); + if (group->array->n_group > 1) + sprintf(name, "%s_shared_%s_%d", type, array_name, group->nr); + else + sprintf(name, "%s_shared_%s", type, array_name); + access = isl_set_set_tuple_name(access, name); + free(name); + + sched = access_schedule(gen, access, group); + + n_tile = gen->n_block; + if (n_tile > nvar) + n_tile = nvar; + + print_shared_body(gen, shared_domain, sched, nvar + n_tile, NULL, -1); + + isl_union_map_free(sched); +} + +/* Return the union of all read (read = 1) and/or write (write = 1) + * access relations in the group. + */ +static __isl_give isl_union_map *group_access_relation( + struct cuda_array_ref_group *group, int read, int write) +{ + int i; + isl_union_map *access; + + access = isl_union_map_empty(isl_map_get_dim(group->access)); + for (i = 0; i < group->n_ref; ++i) { + isl_map *map_i; + + if (!((read && group->refs[i]->read) || + (write && group->refs[i]->write))) + continue; + map_i = isl_map_copy(group->refs[i]->access); + access = isl_union_map_union(access, + isl_union_map_from_map(map_i)); + } + + return access; +} + +/* Print code for reading into or writing from shared memory + * the given array reference group. + * + * sched maps the original iteration domains to the shared memory tile loops. + */ +static int print_group_shared_accesses(struct cuda_gen *gen, + struct cuda_array_ref_group *group, const char *type, + __isl_keep isl_set *shared_domain, __isl_keep isl_union_map *sched) +{ + int read; + isl_union_map *access; + isl_union_set *uset; + isl_set *access_set; + + if (group->private_bound) + return 0; + if (!group->shared_bound) + return 0; + + read = !strcmp(type, "read"); + + access = group_access_relation(group, read, !read); + access = isl_union_map_apply_domain(access, isl_union_map_copy(sched)); + uset = isl_union_map_range(access); + + if (isl_union_set_is_empty(uset)) { + isl_union_set_free(uset); + return 0; + } + + access_set = isl_union_set_copy_set(uset); + isl_union_set_free(uset); + access_set = isl_set_coalesce(access_set); + + print_shared_access(gen, shared_domain, access_set, type, group); + + return 1; +} + +/* Print code for reading into or writing from shared memory at + * the given level (-1 for innermost). + * + * If we are not printing at the innermost level, then the dimensionality + * of shared_domain may be smaller than gen->shared_len. + * As the rest of the code assumes that the domain of access has + * gen->shared_len dimensions, we therefore may need to embed this domain + * in a higher dimensional space after intersection with shared_domain. + */ +static void print_shared_accesses(struct cuda_gen *gen, + __isl_keep isl_set *shared_domain, __isl_keep isl_union_map *access, + const char *type, int level) +{ + int i, j; + isl_dim *dim; + isl_map *proj; + isl_set *par; + int shared_len = isl_set_dim(shared_domain, isl_dim_set); + int sync = 0; + isl_union_map *sched; + + shared_domain = isl_set_copy(shared_domain); + sched = isl_union_map_copy(gen->tiled_sched); + dim = isl_union_map_get_dim(sched); + proj = projection(dim, gen->tiled_len, shared_len); + sched = isl_union_map_apply_range(sched, isl_union_map_from_map(proj)); + sched = isl_union_map_intersect_range(sched, + isl_union_set_from_set(isl_set_copy(shared_domain))); + if (shared_len != gen->shared_len) { + dim = isl_union_map_get_dim(sched); + proj = projection(dim, gen->shared_len, shared_len); + proj = isl_map_reverse(proj); + shared_domain = isl_set_apply(shared_domain, + isl_map_copy(proj)); + sched = isl_union_map_apply_range(sched, + isl_union_map_from_map(proj)); + } + + dim = isl_union_map_get_dim(sched); + par = parametrization(dim, gen->shared_len, 0, gen->shared_len, "g"); + sched = isl_union_map_intersect_range(sched, + isl_union_set_from_set(par)); + + for (i = 0; i < gen->n_array; ++i) { + struct cuda_array_info *array = &gen->array[i]; + + if (gen->array[i].print_shared_level != level) + continue; + + for (j = 0; j < array->n_group; ++j) { + if (print_group_shared_accesses(gen, array->groups[j], + type, shared_domain, sched)) + sync = 1; + } + } + + isl_union_map_free(sched); + isl_set_free(shared_domain); + + if (sync) { + print_indent(gen->cuda.kernel_c, gen->kernel_code.indent); + fprintf(gen->cuda.kernel_c, "__syncthreads();\n"); + } +} + +/* Given an index expression into a tile of an array, adjust the expression + * to a shift of the tile to the origin + * (based on the lower bounds in array->shared_bound). + * If the index is strided, then we first add + * bound->shift and divide by bound->stride. + */ +static __isl_give isl_qpolynomial *shift_index(__isl_take isl_qpolynomial *qp, + struct cuda_array_info *array, + struct cuda_array_bound *bound, __isl_take isl_set *domain) +{ + isl_qpolynomial *lb; + + if (bound->shift) { + isl_qpolynomial *shift, *t; + isl_int one; + isl_dim *dim; + shift = bound->shift; + shift = isl_qpolynomial_copy(shift); + shift = isl_qpolynomial_drop_dims(shift, isl_dim_set, 0, + isl_qpolynomial_dim(shift, isl_dim_set)); + shift = isl_qpolynomial_align_params(shift, + isl_qpolynomial_get_dim(qp)); + qp = isl_qpolynomial_add(qp, shift); + dim = isl_qpolynomial_get_dim(qp); + isl_int_init(one); + isl_int_set_si(one, 1); + t = isl_qpolynomial_rat_cst(dim, one, bound->stride); + isl_int_clear(one); + qp = isl_qpolynomial_mul(qp, t); + } + + lb = isl_qpolynomial_copy(bound->lb); + lb = isl_qpolynomial_drop_dims(lb, isl_dim_set, 0, + isl_qpolynomial_dim(lb, isl_dim_set)); + + lb = isl_qpolynomial_align_params(lb, isl_qpolynomial_get_dim(qp)); + + qp = isl_qpolynomial_sub(qp, lb); + qp = isl_qpolynomial_gist(qp, domain); + + return qp; +} + +/* This function is called for each access to an array in some statement + * in the original code. + * Replace that access by an access to shared or (linearized) global memory. + * Since the array in shared memory is just + * a shifted copy of part of the original array, we simply need + * to subtract the lower bound, which was computed + * in can_tile_for_shared_memory. + * If any of the indices is strided, then we first add + * shared_bound[i].shift and divide by shared_bound[i].stride. + * + * If the given array is accessed directly from global memory, + * we don't need to perform any shifting and simply simplify + * expression in the context of the domain instead. + * + * If the array space (range of access) has no name, then we are + * accessing an iterator in the original program. + */ +static void print_access(struct cuda_gen *gen, __isl_take isl_map *access, + int group_nr) +{ + int i; + const char *name; + unsigned n_index; + struct cuda_array_info *array = NULL; + isl_printer *prn; + isl_basic_set *aff; + isl_set *data_set; + isl_set *domain; + struct cuda_array_bound *bounds = NULL; + + access = isl_map_align_params(access, + isl_set_get_dim(gen->stmt_domain)); + + data_set = isl_set_apply(isl_set_copy(gen->stmt_domain), access); + + name = isl_set_get_tuple_name(data_set); + + if (!name) + fprintf(gen->cuda.kernel_c, "("); + else { + struct cuda_array_ref_group *group; + + for (i = 0; i < gen->n_array; ++i) { + if (strcmp(name, gen->array[i].name)) + continue; + array = &gen->array[i]; + } + assert(array); + group = array->groups[group_nr]; + bounds = group->private_bound; + if (!bounds) + bounds = group->shared_bound; + + print_array_name(gen->cuda.kernel_c, group); + fprintf(gen->cuda.kernel_c, "["); + } + + + n_index = isl_set_dim(data_set, isl_dim_set); + aff = isl_set_affine_hull(data_set); + + prn = isl_printer_to_file(gen->ctx, gen->cuda.kernel_c); + prn = isl_printer_set_output_format(prn, ISL_FORMAT_C); + + if (!bounds) + for (i = 0; i + 1 < n_index; ++i) + prn = isl_printer_print_str(prn, "("); + + for (i = 0; i < n_index; ++i) { + isl_constraint *c; + isl_qpolynomial *qp; + int ok; + + ok = isl_basic_set_has_defining_equality(aff, + isl_dim_out, i, &c); + assert(ok); + qp = isl_qpolynomial_from_constraint(c, isl_dim_out, i); + qp = isl_qpolynomial_drop_dims(qp, isl_dim_set, 0, + isl_qpolynomial_dim(qp, isl_dim_set)); + + if (!array) { + prn = isl_printer_print_qpolynomial(prn, qp); + isl_qpolynomial_free(qp); + continue; + } + + domain = isl_set_copy(gen->stmt_domain); + domain = isl_set_project_out(domain, isl_dim_set, 0, + isl_set_dim(domain, isl_dim_set)); + if (!bounds) + qp = isl_qpolynomial_gist(qp, domain); + else + qp = shift_index(qp, array, &bounds[i], domain); + + if (i) { + if (!bounds) { + prn = isl_printer_print_str(prn, ") * ("); + prn = isl_printer_print_pw_qpolynomial_fold(prn, + array->local_bound[i]); + prn = isl_printer_print_str(prn, ") + "); + } else + prn = isl_printer_print_str(prn, "]["); + } + prn = isl_printer_print_qpolynomial(prn, qp); + isl_qpolynomial_free(qp); + } + if (!name) + prn = isl_printer_print_str(prn, ")"); + else + prn = isl_printer_print_str(prn, "]"); + isl_printer_free(prn); + + isl_basic_set_free(aff); +} + +static void print_stmt_body(struct cuda_gen *gen, + FILE *out, struct cuda_stmt *stmt) +{ + int last = 0; + struct cuda_stmt_access *access; + + for (access = stmt->accesses; access; access = access->next) { + fwrite(stmt->text + last, 1, access->text_offset - last, out); + last = access->text_offset + access->text_len; + + print_access(gen, isl_map_copy(access->access), + access->group); + } + + fprintf(out, "%s\n", stmt->text + last); +} + +/* This function is called for each leaf in the innermost clast, + * i.e., for each statemetn. + * We print the statement body, simplifying the accesses based + * on the schedule. + */ +static void print_statement(struct gpucode_info *code, + struct clast_user_stmt *u) +{ + struct cuda_gen *gen = code->user; + isl_dim *dim; + isl_set *par; + isl_set *stmt_domain; + isl_union_map *stmt_sched; + isl_union_set *uset; + int nr; + struct cuda_stmt *stmt; + + nr = atoi(u->statement->name + 2); + stmt = &gen->stmts[nr]; + + stmt_domain = extract_host_domain(u); + + stmt_sched = isl_union_map_intersect_range( + isl_union_map_copy(gen->local_sched), + isl_union_set_from_set(extend(stmt_domain, + gen->thread_tiled_len))); + dim = isl_union_map_get_dim(stmt_sched); + par = parametrization(dim, gen->thread_tiled_len, 0, + gen->thread_tiled_len, "c"); + stmt_sched = isl_union_map_intersect_range(stmt_sched, + isl_union_set_from_set(par)); + + uset = isl_union_map_domain(stmt_sched); + dim = isl_union_set_get_dim(uset); + dim = isl_dim_add(dim, isl_dim_set, + isl_set_dim(stmt->domain, isl_dim_set)); + dim = isl_dim_set_tuple_name(dim, isl_dim_set, u->statement->name); + gen->stmt_domain = isl_union_set_extract_set(uset, dim); + isl_union_set_free(uset); + + print_indent(code->dst, code->indent); + print_stmt_body(gen, code->dst, stmt); + + isl_set_free(gen->stmt_domain); +} + +/* Print an access to the element in the global memory copy of the + * given array that corresponds to element [qp[0]][qp[1]]... + * of the original array. + * The copy in global memory has been linearized, so we need to take + * the array size into account. + */ +static void print_private_global_index(isl_ctx *ctx, FILE *out, + struct cuda_array_info *array, __isl_keep isl_qpolynomial **qp) +{ + int i; + isl_printer *prn; + + fprintf(out, "%s[", array->name); + prn = isl_printer_to_file(ctx, out); + prn = isl_printer_set_output_format(prn, ISL_FORMAT_C); + for (i = 0; i + 1 < array->n_index; ++i) + prn = isl_printer_print_str(prn, "("); + for (i = 0; i < array->n_index; ++i) { + if (i) { + prn = isl_printer_print_str(prn, ") * ("); + prn = isl_printer_print_pw_qpolynomial_fold(prn, + array->local_bound[i]); + prn = isl_printer_print_str(prn, ") + "); + } + prn = isl_printer_print_qpolynomial(prn, qp[i]); + } + isl_printer_free(prn); + fprintf(out, "]"); +} + +/* Print an access to the element in the shared memory copy of the + * given array reference group that corresponds to element [qps[0]][qps[1]]... + * of the original array. + * Since the array in shared memory is just a shifted copy of part + * of the original array, we simply need to subtract the lower bound, + * which was computed in can_tile_for_shared_memory. + * If any of the indices is strided, then we first add + * shared_bound[i].shift and divide by shared_bound[i].stride. + */ +static void print_private_local_index(isl_ctx *ctx, FILE *out, + struct cuda_array_ref_group *group, + __isl_keep isl_qpolynomial **qps, __isl_keep isl_set *domain) +{ + int i; + isl_printer *prn; + struct cuda_array_info *array = group->array; + struct cuda_array_bound *bounds = group->private_bound; + + print_array_name(out, group); + for (i = 0; i < array->n_index; ++i) { + isl_qpolynomial *qp = isl_qpolynomial_copy(qps[i]); + + qp = shift_index(qp, array, &bounds[i], isl_set_copy(domain)); + + fprintf(out, "["); + prn = isl_printer_to_file(ctx, out); + prn = isl_printer_set_output_format(prn, ISL_FORMAT_C); + prn = isl_printer_print_qpolynomial(prn, qp); + isl_printer_free(prn); + fprintf(out, "]"); + isl_qpolynomial_free(qp); + } +} + +/* This function is called for each leaf in the clast of the code + * for copying to or from private memory. + * The statement name is read_private_ or write_private_. + * + * The schedule iterates over the array elements, so we can use + * the domain of private_sched at the current scheduling position + * as the index of the array. + */ +static void print_private_copy_statement(struct gpucode_info *code, + struct clast_user_stmt *u) +{ + struct cuda_gen *gen = code->user; + isl_set *domain; + isl_map *sched; + struct cuda_array_ref_group *group = gen->private_group; + int i; + unsigned n_in; + unsigned n_out; + isl_dim *dim; + isl_set *param; + isl_set *index; + isl_basic_set *aff; + isl_ctx *ctx; + isl_qpolynomial **qp; + int read; + + read = !strncmp(u->statement->name, "read", 4); + + domain = extract_host_domain(u); + assert(domain); + + sched = isl_map_copy(gen->private_sched); + sched = isl_map_reverse(sched); + sched = isl_map_intersect_domain(sched, domain); + n_in = isl_map_dim(sched, isl_dim_in); + n_out = isl_map_dim(sched, isl_dim_out); + dim = isl_map_get_dim(sched); + dim = isl_dim_drop(dim, isl_dim_in, 0, n_in); + dim = isl_dim_drop(dim, isl_dim_out, 0, n_out); + param = parametrization(dim, n_in, 0, n_in, "c"); + sched = isl_map_align_params(sched, isl_set_get_dim(param)); + sched = isl_map_intersect_domain(sched, param); + index = isl_map_range(sched); + domain = isl_set_copy(index); + aff = isl_set_affine_hull(index); + domain = isl_set_project_out(domain, isl_dim_set, 0, n_out); + + ctx = isl_basic_set_get_ctx(aff); + qp = isl_alloc_array(ctx, isl_qpolynomial *, n_out); + assert(qp); + + for (i = 0; i < n_out; ++i) { + isl_constraint *c; + int ok; + + ok = isl_basic_set_has_defining_equality(aff, + isl_dim_set, i, &c); + assert(ok); + qp[i] = isl_qpolynomial_from_constraint(c, isl_dim_set, i); + qp[i] = isl_qpolynomial_drop_dims(qp[i], isl_dim_set, 0, n_out); + } + + print_indent(code->dst, code->indent); + if (read) { + print_private_local_index(ctx, code->dst, group, qp, domain); + fprintf(code->dst, " = "); + print_private_global_index(ctx, code->dst, group->array, qp); + } else { + print_private_global_index(ctx, code->dst, group->array, qp); + fprintf(code->dst, " = "); + print_private_local_index(ctx, code->dst, group, qp, domain); + } + fprintf(code->dst, ";\n"); + + for (i = 0; i < n_out; ++i) + isl_qpolynomial_free(qp[i]); + free(qp); + + isl_basic_set_free(aff); + isl_set_free(domain); +} + +static void print_private_access(struct cuda_gen *gen, + __isl_keep isl_set *shared_domain, __isl_take isl_set *access, + const char *type, struct cuda_array_ref_group *group) +{ + const char *array_name; + char *name; + isl_ctx *ctx; + unsigned nvar = isl_set_dim(access, isl_dim_set); + isl_union_map *usched; + + if (isl_set_fast_is_empty(access)) { + isl_set_free(access); + return; + } + + ctx = isl_set_get_ctx(access); + array_name = isl_set_get_tuple_name(access); + name = isl_alloc_array(ctx, char, + strlen(type) + sizeof("_private_") + strlen(array_name) + 20); + if (group->array->n_group > 1) + sprintf(name, "%s_private_%s_%d", type, array_name, group->nr); + else + sprintf(name, "%s_private_%s", type, array_name); + access = isl_set_set_tuple_name(access, name); + free(name); + + gen->private_sched = shift_access(access, group); + gen->private_group = group; + + usched = isl_union_map_from_map(isl_map_copy(gen->private_sched)); + print_shared_body(gen, shared_domain, usched, nvar, + &print_private_copy_statement, 1); + isl_union_map_free(usched); + + isl_map_free(gen->private_sched); +} + +/* Print code for reading into or writing from private memory + * the given array reference group. + * + * sched maps the original iteration domains to the shared memory tile loops. + */ +static void print_group_private_accesses(struct cuda_gen *gen, + struct cuda_array_ref_group *group, + const char *type, __isl_keep isl_set *shared_domain, + unsigned first_shared, int shared_len, __isl_keep isl_union_map *sched) +{ + int read; + isl_union_map *access; + isl_union_set *uset; + isl_set *access_set; + + if (!group->private_bound) + return; + + read = !strcmp(type, "read"); + + access = group_access_relation(group, read, !read); + access = isl_union_map_apply_domain(access, isl_union_map_copy(sched)); + access = isl_union_map_intersect(access, + isl_union_map_copy(gen->private_access)); + uset = isl_union_map_range(access); + + if (isl_union_set_is_empty(uset)) { + isl_union_set_free(uset); + return; + } + + access_set = isl_union_set_copy_set(uset); + isl_union_set_free(uset); + access_set = isl_set_coalesce(access_set); + access_set = isl_set_eliminate(access_set, isl_dim_param, + first_shared + shared_len, + gen->shared_len - shared_len); + + print_private_access(gen, shared_domain, access_set, type, group); +} + +/* Print code for reading into or writing from private memory at + * the given level (-1 for innermost). + * + * If we are not printing at the innermost level, then the dimensionality + * of shared_domain may be smaller than gen->shared_len. + * As the rest of the code assumes that the domain of access has + * gen->shared_len dimensions, we therefore may need to embed this domain + * in a higher dimensional space after intersection with shared_domain. + * + * This code is very similar to print_shared_accesses. + * The main difference is that we to take into account gen->private_access. + */ +static void print_private_accesses(struct cuda_gen *gen, + __isl_keep isl_set *shared_domain, __isl_keep isl_union_map *access, + const char *type, int level) +{ + int i, j; + isl_dim *dim; + isl_map *proj; + int shared_len = isl_set_dim(shared_domain, isl_dim_set); + unsigned first_shared; + isl_union_map *sched; + + shared_domain = isl_set_copy(shared_domain); + sched = isl_union_map_copy(gen->tiled_sched); + dim = isl_union_map_get_dim(sched); + first_shared = isl_dim_size(dim, isl_dim_param); + proj = projection(dim, gen->tiled_len, shared_len); + sched = isl_union_map_apply_range(sched, isl_union_map_from_map(proj)); + sched = isl_union_map_intersect_range(sched, + isl_union_set_from_set(isl_set_copy(shared_domain))); + if (shared_len != gen->shared_len) { + dim = isl_union_map_get_dim(sched); + proj = projection(dim, gen->shared_len, shared_len); + proj = isl_map_reverse(proj); + shared_domain = isl_set_apply(shared_domain, + isl_map_copy(proj)); + sched = isl_union_map_apply_range(sched, + isl_union_map_from_map(proj)); + } + + for (i = 0; i < gen->n_array; ++i) { + struct cuda_array_info *array = &gen->array[i]; + + if (gen->array[i].print_shared_level != level) + continue; + + for (j = 0; j < array->n_group; ++j) + print_group_private_accesses(gen, array->groups[j], + type, shared_domain, + first_shared, shared_len, sched); + } + + isl_union_map_free(sched); + isl_set_free(shared_domain); +} + +/* Set unroll[j] if the input dimension j is involved in + * the index expression represented by bmap. + */ +static int check_unroll(__isl_take isl_basic_map *bmap, void *user) +{ + int i, j; + int n_in = isl_basic_map_dim(bmap, isl_dim_in); + int n_out = isl_basic_map_dim(bmap, isl_dim_out); + int *unroll = user; + + for (i = 0; i < n_out; ++i) { + isl_constraint *c; + int ok; + + ok = isl_basic_map_has_defining_equality(bmap, + isl_dim_out, i, &c); + assert(ok); + for (j = 0; j < n_in; ++j) + if (isl_constraint_involves_dims(c, isl_dim_in, j, 1)) + unroll[j] = 1; + isl_constraint_free(c); + } + + isl_basic_map_free(bmap); + return 0; +} + +/* Given an array pos mapping input dimensions to the corresponding + * output dimension, construct the corresponding map. + */ +static __isl_give isl_map *permutation(__isl_take isl_dim *dim, + int *pos, int len) +{ + int i; + isl_constraint *c; + isl_basic_map *bmap; + + dim = isl_dim_add(dim, isl_dim_in, len); + dim = isl_dim_add(dim, isl_dim_out, len); + bmap = isl_basic_map_universe(isl_dim_copy(dim)); + + for (i = 0; i < len; ++i) { + c = isl_equality_alloc(isl_dim_copy(dim)); + isl_constraint_set_coefficient_si(c, isl_dim_in, i, -1); + isl_constraint_set_coefficient_si(c, isl_dim_out, pos[i], 1); + bmap = isl_basic_map_add_constraint(bmap, c); + } + isl_dim_free(dim); + + return isl_map_from_basic_map(bmap); +} + +/* Find all loops involved in any of the index expressions for any of + * the private accesses, move them innermost and then mark them as + * requiring unrolling by setting gen->first_unroll. + * The loops involved should all be parallel because of the checks + * we performed in check_private_group_access. Moving them innermost + * is therefore a valid transformation. + */ +static __isl_give isl_union_map *interchange_for_unroll(struct cuda_gen *gen, + __isl_take isl_union_map *sched) +{ + int i, j; + int unroll[gen->thread_tiled_len]; + int perm[gen->thread_tiled_len]; + isl_dim *dim; + isl_map *permute; + int len = gen->shared_len + gen->n_parallel + gen->n_block; + + gen->first_unroll = -1; + + for (i = 0; i < gen->thread_tiled_len; ++i) + unroll[i] = 0; + for (i = 0; i < gen->n_array; ++i) { + struct cuda_array_info *array = &gen->array[i]; + + for (j = 0; j < array->n_group; ++j) { + isl_union_map *access; + isl_dim *dim; + isl_map *acc; + + if (!array->groups[j]->private_bound) + continue; + + access = group_access_relation(array->groups[j], 1, 1); + access = isl_union_map_apply_domain(access, + isl_union_map_copy(sched)); + + dim = isl_union_map_get_dim(access); + dim = isl_dim_add(dim, isl_dim_out, array->n_index); + dim = isl_dim_set_tuple_name(dim, isl_dim_out, + array->name); + dim = isl_dim_add(dim, isl_dim_in, + gen->thread_tiled_len); + acc = isl_union_map_extract_map(access, dim); + + isl_map_foreach_basic_map(acc, &check_unroll, unroll); + + isl_map_free(acc); + isl_union_map_free(access); + } + } + + for (i = 0; i < gen->shared_len; ++i) + if (unroll[i]) + return sched; + + for (i = gen->shared_len; i < len; ++i) + if (unroll[i]) + break; + + if (i >= len) + return sched; + + for (i = len; i < gen->thread_tiled_len; ++i) + if (unroll[i]) + return sched; + + j = 0; + for (i = 0; i < gen->thread_tiled_len; ++i) + if (!unroll[i]) + perm[i] = j++; + gen->first_unroll = 1 + j; + for (i = 0; i < len; ++i) + if (unroll[i]) + perm[i] = j++; + + dim = isl_union_map_get_dim(sched); + permute = permutation(dim, perm, gen->thread_tiled_len); + sched = isl_union_map_apply_range(sched, + isl_union_map_from_map(permute)); + + return sched; +} + +/* This function is called for each leaf in the clast of the kernel code. + * We first specialize the schedule to the site of the leaf and + * print code for reading into shared memory, performing the actual + * computations and writing from shared memory, with the required + * synchronizations. + */ +static void print_kernel_user(struct gpucode_info *code, + struct clast_user_stmt *u) +{ + struct cuda_gen *gen = code->user; + isl_set *shared_domain; + + shared_domain = extract_entire_host_domain(u); + + print_shared_accesses(gen, shared_domain, gen->read, "read", -1); + + print_private_accesses(gen, shared_domain, gen->read, "read", -1); + + print_shared_body(gen, shared_domain, gen->local_sched, + gen->thread_tiled_len, &print_statement, + gen->first_unroll); + + print_private_accesses(gen, shared_domain, gen->write, "write", -1); + + print_indent(gen->cuda.kernel_c, gen->kernel_code.indent); + fprintf(gen->cuda.kernel_c, "__syncthreads();\n"); + + print_shared_accesses(gen, shared_domain, gen->write, "write", -1); + + isl_set_free(shared_domain); +} + +/* Check if we need to perform any copying to shared memory at this level + * and if so, print the copying instructions. + * Any array for which we are allowed to print copying instructions at + * this level, but haven't done so already, is printed. + */ +static void print_kernel_for_head(struct gpucode_info *code, + struct clast_for *f) +{ + int i; + struct cuda_gen *gen = code->user; + isl_set *domain; + int level; + int print = 0; + + domain = isl_set_from_cloog_domain(cloog_domain_copy(f->domain)); + level = isl_set_dim(domain, isl_dim_set) - 1; + + for (i = 0; i < gen->n_array; ++i) { + if (gen->array[i].print_shared_level >= 0) + continue; + if (gen->array[i].last_shared > level) + continue; + gen->array[i].print_shared_level = level; + print = 1; + } + + if (print) { + print_shared_accesses(gen, domain, gen->read, "read", level); + print_private_accesses(gen, domain, gen->read, "read", level); + } + + isl_set_free(domain); +} + +/* Print instructions for copying from shared memory for each array + * for which print_kernel_for_head has added copying instructions + * to shared memory. + */ +static void print_kernel_for_foot(struct gpucode_info *code, + struct clast_for *f) +{ + int i; + struct cuda_gen *gen = code->user; + isl_set *domain; + int level; + int print = 0; + + domain = isl_set_from_cloog_domain(cloog_domain_copy(f->domain)); + level = isl_set_dim(domain, isl_dim_set) - 1; + + for (i = 0; i < gen->n_array; ++i) { + if (gen->array[i].print_shared_level != level) + continue; + print = 1; + break; + } + + if (print) { + print_private_accesses(gen, domain, gen->write, "write", level); + print_shared_accesses(gen, domain, gen->write, "write", level); + } + + isl_set_free(domain); +} + +/* Use CLooG to generate code for the outer gen->shared_first loops + * of the local schedule "sched". + * The pretty printing of this code is handled by gpu_print_host_stmt, + * which calls print_kernel_user for each iteration of the shared tile loops. + */ +static void print_cloog_kernel_body(struct cuda_gen *gen, + __isl_keep isl_set *context, __isl_keep isl_union_map *sched) +{ + int i; + CloogOptions *options; + CloogDomain *cloog_context; + CloogUnionDomain *ud; + CloogInput *input; + struct clast_stmt *stmt; + char name[20]; + + sched = isl_union_map_copy(sched); + sched = isl_union_map_align_params(sched, isl_set_get_dim(context)); + + options = cloog_options_malloc(gen->state); + options->language = LANGUAGE_C; + options->strides = 1; + options->sh = 1; + options->stop = gen->shared_len; + options->f = gen->tiled_len; + options->l = gen->tiled_len; + options->save_domains = 1; + options->noscalars = 1; + + ud = cloog_union_domain_from_isl_union_map(sched); + for (i = 0; i < gen->shared_len; ++i) { + snprintf(name, sizeof(name), "g%d", i); + ud = cloog_union_domain_set_name(ud, CLOOG_SCAT, i, name); + } + cloog_context = cloog_domain_from_isl_set(isl_set_copy(context)); + input = cloog_input_alloc(cloog_context, ud); + + stmt = cloog_clast_create_from_input(input, options); + + gen->kernel_code.indent = 4; + gen->kernel_code.dst = gen->cuda.kernel_c; + gen->kernel_code.print_user_stmt = NULL; + gen->kernel_code.print_user_stmt_list = &print_kernel_user; + gen->kernel_code.print_for_head = &print_kernel_for_head; + gen->kernel_code.print_for_foot = &print_kernel_for_foot; + gen->kernel_code.user = gen; + gpu_print_host_stmt(&gen->kernel_code, stmt); + + cloog_clast_free(stmt); + cloog_options_free(options); +} + +static void print_kernel_iterators(struct cuda_gen *gen) +{ + int i; + const char *block_dims[] = { "blockIdx.x", "blockIdx.y" }; + const char *thread_dims[] = { "threadIdx.x", "threadIdx.y", + "threadIdx.z" }; + + if (gen->n_grid > 0) { + print_indent(gen->cuda.kernel_c, 4); + fprintf(gen->cuda.kernel_c, "int "); + for (i = 0; i < gen->n_grid; ++i) { + if (i) + fprintf(gen->cuda.kernel_c, ", "); + fprintf(gen->cuda.kernel_c, "b%d = %s", + i, block_dims[gen->n_grid - 1 - i]); + } + fprintf(gen->cuda.kernel_c, ";\n"); + } + + if (gen->n_block > 0) { + print_indent(gen->cuda.kernel_c, 4); + fprintf(gen->cuda.kernel_c, "int "); + for (i = 0; i < gen->n_block; ++i) { + if (i) + fprintf(gen->cuda.kernel_c, ", "); + fprintf(gen->cuda.kernel_c, "t%d = %s", + i, thread_dims[gen->n_block - 1 - i]); + } + fprintf(gen->cuda.kernel_c, ";\n"); + } +} + +static void print_group_shared_array(struct cuda_gen *gen, + struct cuda_array_ref_group *group) +{ + int j; + struct cuda_array_bound *bounds; + + bounds = group->private_bound; + if (!bounds) + bounds = group->shared_bound; + if (!bounds) + return; + + print_indent(gen->cuda.kernel_c, 4); + fprintf(gen->cuda.kernel_c, "%s%s ", + group->private_bound ? "" : "__shared__ ", gen->options->type); + print_array_name(gen->cuda.kernel_c, group); + for (j = 0; j < group->array->n_index; ++j) { + fprintf(gen->cuda.kernel_c, "["); + isl_int_print(gen->cuda.kernel_c, bounds[j].size, 0); + fprintf(gen->cuda.kernel_c, "]"); + } + fprintf(gen->cuda.kernel_c, ";\n"); +} + +static void print_shared_arrays(struct cuda_gen *gen) +{ + int i, j; + + for (i = 0; i < gen->n_array; ++i) { + struct cuda_array_info *array = &gen->array[i]; + + for (j = 0; j < array->n_group; ++j) + print_group_shared_array(gen, array->groups[j]); + } +} + +static void print_kernel_body(struct cuda_gen *gen, + __isl_keep isl_set *host_domain, __isl_keep isl_union_map *sched) +{ + isl_set *context; + + context = isl_set_copy(host_domain); + context = parametrize(context, 0, gen->tile_first, "h"); + context = isl_set_project_out(context, isl_dim_set, 0, gen->tile_first); + context = add_bounded_parameters(context, + gen->n_grid, gen->grid_dim, "b"); + + print_kernel_iterators(gen); + print_shared_arrays(gen); + + fprintf(gen->cuda.kernel_c, "\n"); + + print_cloog_kernel_body(gen, context, sched); + + isl_set_free(context); +} + +/* Given a constraint + * + * a(p,i) + j = g f(e) + * + * or -a(p,i) - j = g f(e) if sign < 0, + * store a(p,i) in bound->shift and g (stride) in bound->stride. + * a(p,i) is assumed to be an expression in only the parameters. + */ +static void extract_stride(__isl_keep isl_constraint *c, + struct cuda_array_bound *bound, isl_int stride, int sign) +{ + int i; + isl_int v; + isl_int one; + isl_dim *dim; + unsigned nparam; + isl_qpolynomial *qp; + + isl_int_set(bound->stride, stride); + + dim = isl_constraint_get_dim(c); + dim = isl_dim_drop(dim, isl_dim_out, 0, 1); + dim = isl_dim_drop(dim, isl_dim_in, 0, isl_dim_size(dim, isl_dim_in)); + dim = isl_dim_domain(dim); + + nparam = isl_dim_size(dim, isl_dim_param); + + isl_int_init(v); + isl_int_init(one); + isl_int_set_si(one, 1); + + isl_constraint_get_constant(c, &v); + if (sign < 0) + isl_int_neg(v, v); + qp = isl_qpolynomial_rat_cst(isl_dim_copy(dim), v, one); + + for (i = 0; i < nparam; ++i) { + isl_qpolynomial *t, *p; + + isl_constraint_get_coefficient(c, isl_dim_param, i, &v); + if (isl_int_is_zero(v)) + continue; + if (sign < 0) + isl_int_neg(v, v); + t = isl_qpolynomial_rat_cst(isl_dim_copy(dim), v, one); + p = isl_qpolynomial_var(isl_dim_copy(dim), isl_dim_param, i); + t = isl_qpolynomial_mul(t, p); + qp = isl_qpolynomial_add(qp, t); + } + + isl_dim_free(dim); + isl_int_clear(one); + isl_int_clear(v); + + bound->shift = qp; +} + +/* Given an equality constraint of a map with a single output dimension j, + * check if the constraint is of the form + * + * a(p,i) + j = g f(e) + * + * with a(p,i) an expression in the parameters and input dimensions + * and f(e) an expression in the existentially quantified variables. + * If so, and if g is larger than any such g from a previously considered + * constraint, then call extract_stride. to record the stride information + * in bound. + */ +static int check_stride_constraint(__isl_take isl_constraint *c, void *user) +{ + int i; + isl_int v, stride; + unsigned n_div; + struct cuda_array_bound *bound = user; + + isl_int_init(v); + isl_int_init(stride); + + n_div = isl_constraint_dim(c, isl_dim_div); + isl_constraint_get_coefficient(c, isl_dim_out, 0, &v); + + if (n_div && (isl_int_is_one(v) || isl_int_is_negone(v))) { + int s = isl_int_sgn(v); + isl_int_set_si(stride, 0); + for (i = 0; i < n_div; ++i) { + isl_constraint_get_coefficient(c, isl_dim_div, i, &v); + isl_int_gcd(stride, stride, v); + } + if (!isl_int_is_zero(stride) && + isl_int_gt(stride, bound->stride)) + extract_stride(c, bound, stride, s); + } + + isl_int_clear(stride); + isl_int_clear(v); + + isl_constraint_free(c); + return 0; +} + +/* Given contraints on an array index i, check if we can find + * a shift a(p) and a stride g such that + * + * a(p) + i = 0 mod g + * + * If so, record the information in bound and apply the mapping + * i -> (i + a(p))/g to the array index in bounds and return + * the new constraints. + * If not, simply return the original constraints. + */ +static __isl_give isl_basic_map *check_stride(struct cuda_gen *gen, + struct cuda_array_bound *bound, __isl_take isl_basic_map *bounds) +{ + isl_dim *dim; + isl_basic_map *aff; + isl_basic_map *shift; + isl_qpolynomial *qp, *t; + isl_int one; + + isl_int_set_si(bound->stride, -1); + + aff = isl_basic_map_affine_hull(isl_basic_map_copy(bounds)); + + isl_basic_map_foreach_constraint(aff, &check_stride_constraint, bound); + + isl_basic_map_free(aff); + + if (isl_int_is_neg(bound->stride)) + return bounds; + + qp = isl_qpolynomial_copy(bound->shift); + qp = isl_qpolynomial_add_dims(qp, isl_dim_set, 1); + dim = isl_qpolynomial_get_dim(qp); + t = isl_qpolynomial_var(isl_dim_copy(dim), isl_dim_set, 0); + qp = isl_qpolynomial_add(qp, t); + isl_int_init(one); + isl_int_set_si(one, 1); + t = isl_qpolynomial_rat_cst(dim, one, bound->stride); + isl_int_clear(one); + qp = isl_qpolynomial_mul(qp, t); + shift = isl_basic_map_from_qpolynomial(qp); + + bound->shift_map = isl_basic_map_copy(shift); + bounds = isl_basic_map_apply_range(bounds, shift); + + return bounds; +} + +struct cuda_size_info { + isl_basic_set *bset; + struct cuda_array_bound *bound; + int pos; +}; + +/* Given a constraint from the basic set describing the bounds on + * an array index, check if it is a lower bound, say m i >= b(x), and, + * if so, check whether the expression "i - ceil(b(x)/m) + 1" has a constant + * upper bound. If so, and if this bound is smaller than any bound + * derived from earlier constraints, set the size to this bound on + * the expression and the lower bound to b(x). + */ +static int compute_size_in_direction(__isl_take isl_constraint *c, void *user) +{ + struct cuda_size_info *size = user; + unsigned nparam; + unsigned n_div; + isl_int v; + + nparam = isl_basic_set_dim(size->bset, isl_dim_param); + n_div = isl_constraint_dim(c, isl_dim_div); + + if (isl_constraint_involves_dims(c, isl_dim_div, 0, n_div)) { + isl_constraint_free(c); + return 0; + } + + isl_int_init(v); + + isl_constraint_get_coefficient(c, isl_dim_set, size->pos, &v); + + if (isl_int_is_pos(v)) { + isl_aff *aff; + isl_qpolynomial *lb; + enum isl_lp_result res; + + aff = isl_constraint_get_bound(c, isl_dim_set, size->pos); + aff = isl_aff_ceil(aff); + + lb = isl_qpolynomial_from_aff(isl_aff_copy(aff)); + + aff = isl_aff_neg(aff); + aff = isl_aff_add_coefficient_si(aff, isl_dim_set, size->pos, 1); + + res = isl_basic_set_max(size->bset, aff, &v); + isl_aff_free(aff); + + if (res == isl_lp_ok) { + isl_int_add_ui(v, v, 1); + if (isl_int_is_neg(size->bound->size) || + isl_int_lt(v, size->bound->size)) { + isl_int_set(size->bound->size, v); + isl_qpolynomial_free(size->bound->lb); + size->bound->lb = isl_qpolynomial_copy(lb); + } + } + isl_qpolynomial_free(lb); + } + + isl_int_clear(v); + isl_constraint_free(c); + + return 0; +} + +/* Given a basic map "bounds" that maps parameters and input dimensions + * to a single output dimension, look for an expression in the parameters + * and input dimensions such that the range of the output dimension shifted + * by this expression is a constant. + * + * In particular, we currently only consider lower bounds on the output + * dimension as candidate expressions. + */ +static int compute_array_dim_size(struct cuda_gen *gen, + struct cuda_array_bound *bound, __isl_take isl_basic_map *bounds) +{ + struct cuda_size_info size; + + bounds = check_stride(gen, bound, bounds); + + isl_int_set_si(bound->size, -1); + bound->lb = NULL; + + size.bound = bound; + size.pos = isl_basic_map_dim(bounds, isl_dim_in); + size.bset = isl_basic_map_wrap(bounds); + size.bset = isl_basic_set_flatten(size.bset); + isl_basic_set_foreach_constraint(size.bset, &compute_size_in_direction, + &size); + isl_basic_set_free(size.bset); + + return isl_int_is_nonneg(bound->size) ? 0 : -1; +} + +/* Check if we can find a shared memory tile for the given array + * based on the given accesses, and if so, put the results + * in array->shared_bound. + * + * We project the accesses on each index in turn and look for a parametric + * offset such that the size is constant. + */ +static int can_tile_for_shared_memory(struct cuda_gen *gen, + struct cuda_array_info *array, __isl_keep isl_map *access, + struct cuda_array_bound *bounds) +{ + int i; + + for (i = 0; i < array->n_index; ++i) { + isl_map *access_i; + isl_basic_map *hull; + + access_i = isl_map_copy(access); + access_i = isl_map_project_out(access_i, isl_dim_out, 0, i); + access_i = isl_map_project_out(access_i, isl_dim_out, + i + 1, array->n_index - (i + 1)); + access_i = isl_map_compute_divs(access_i); + hull = isl_map_simple_hull(access_i); + if (compute_array_dim_size(gen, &bounds[i], hull) < 0) + return 0; + } + + return 1; +} + +/* Construct a map with input the shared tile loops and the loops that + * will be wrapped around the threads that relates these later loops + * to the thread indices and the projects them out. + */ +static __isl_give isl_map *compute_privatization(struct cuda_gen *gen) +{ + isl_map *priv; + isl_map *tiling; + isl_map *proj; + isl_set *par; + isl_dim *dim; + + dim = isl_union_map_get_dim(gen->shared_sched); + + if (gen->options->wrap) + tiling = wrap(isl_dim_copy(dim), gen->shared_len + gen->n_block, + gen->shared_len, gen->n_block, gen->block_dim); + else + tiling = tile(isl_dim_copy(dim), gen->shared_len + gen->n_block, + gen->shared_len, gen->n_block, gen->block_dim); + + priv = tiling; + + par = parametrization(dim, gen->shared_len + 2 * gen->n_block, + gen->tile_first + gen->tile_len + gen->n_grid + gen->n_block, + gen->n_block, "t"); + + priv = isl_map_align_params(priv, isl_set_get_dim(par)); + priv = isl_map_intersect_range(priv, par); + + dim = isl_map_get_dim(priv); + dim = isl_dim_drop(dim, isl_dim_in, 0, isl_dim_size(dim, isl_dim_in)); + dim = isl_dim_drop(dim, isl_dim_out, 0, isl_dim_size(dim, isl_dim_out)); + proj = projection(dim, gen->shared_len + 2 * gen->n_block, + gen->shared_len); + + priv = isl_map_apply_range(priv, proj); + + return priv; +} + +/* Construct a map from domain_dim to domain_dim that increments + * the dimension at position "pos" and leaves all other dimensions + * constant. + */ +static __isl_give isl_map *next(__isl_take isl_dim *domain_dim, int pos) +{ + int i; + int len = isl_dim_size(domain_dim, isl_dim_set); + isl_dim *dim; + isl_basic_map *next; + + dim = isl_dim_map_from_set(domain_dim); + next = isl_basic_map_universe(isl_dim_copy(dim)); + + for (i = 0; i < len; ++i) { + isl_constraint *c; + + c = isl_equality_alloc(isl_dim_copy(dim)); + isl_constraint_set_coefficient_si(c, isl_dim_in, i, 1); + isl_constraint_set_coefficient_si(c, isl_dim_out, i, -1); + if (i == pos) + isl_constraint_set_constant_si(c, 1); + next = isl_basic_map_add_constraint(next, c); + } + + isl_dim_free(dim); + + return isl_map_from_basic_map(next); +} + +/* Check if the given access is coalesced. + * That is, check whether incrementing the dimension that will get + * wrapped over the last thread index results in incrementing + * the last array index. + * + * This function is only called for access relations without reuse. + */ +static int access_is_coalesced(struct cuda_gen *gen, + __isl_keep isl_union_map *access) +{ + isl_dim *dim; + isl_map *access_map; + isl_map *next_thread_x; + isl_map *next_element; + isl_map *map; + int coalesced; + + access = isl_union_map_copy(access); + access = isl_union_map_apply_domain(access, + isl_union_map_copy(gen->tiled_sched)); + access_map = isl_union_map_copy_map(access); + isl_union_map_free(access); + + dim = isl_map_get_dim(access_map); + dim = isl_dim_domain(dim); + next_thread_x = next(dim, gen->shared_len + gen->n_block - 1); + + dim = isl_map_get_dim(access_map); + dim = isl_dim_range(dim); + next_element = next(dim, isl_dim_size(dim, isl_dim_set) - 1); + + map = isl_map_apply_domain(next_thread_x, isl_map_copy(access_map)); + map = isl_map_apply_range(map, access_map); + + coalesced = isl_map_is_subset(map, next_element); + + isl_map_free(next_element); + isl_map_free(map); + + return coalesced; +} + +/* For the given array reference group, check whether the access is private + * to the thread. That is, check that any given array element + * is only accessed by a single thread. + * We compute an access relation that maps the shared tile loop iterators + * and the shared point loop iterators that will be wrapped over the + * threads to the array elements. + * We actually check that those iterators that will be wrapped + * partition the array space. This check is stricter than necessary + * since several iterations may be mapped onto the same thread + * and then they could be allowed to access the same memory elements, + * but our check does not allow this situation. + * + * We also check that the index expression only depends on parallel + * loops. That way, we can move those loops innermost and unroll them. + * Again, we use a test that is stricter than necessary. + * We actually check whether the index expression only depends + * on the iterators that are wrapped over the threads. + * These are necessarily parallel, but there may be more parallel loops. + * + * Combining the injectivity of the first test with the single-valuedness + * of the second test, we simply test for bijectivity. + * + * If it turns out we can use registers, we compute the private memory + * tile size using can_tile_for_shared_memory, after introducing a dependence + * on the thread indices. + * + * Before performing any of the above computations, we first check + * if there is any reuse on the reference group. If not, we simply + * return. If, moreover, the access is coalesced then we also remove + * the shared memory tiling since we should just use global memory instead. + */ +static void check_private_group_access(struct cuda_gen *gen, + struct cuda_array_ref_group *group) +{ + isl_map *acc; + isl_union_map *access; + int n_index = group->array->n_index; + + access = group_access_relation(group, 1, 1); + if (isl_union_map_is_injective(access)) { + if (group->shared_bound && access_is_coalesced(gen, access)) { + free_bound_list(group->shared_bound, n_index); + group->shared_bound = NULL; + } + isl_union_map_free(access); + return; + } + access = isl_union_map_apply_domain(access, + isl_union_map_copy(gen->shared_sched)); + + acc = isl_union_map_copy_map(access); + isl_union_map_free(access); + + if (!isl_map_is_bijective(acc)) { + isl_map_free(acc); + return; + } + + group->private_bound = create_bound_list(gen->ctx, n_index); + acc = isl_map_align_params(acc, isl_map_get_dim(gen->privatization)); + acc = isl_map_apply_domain(acc, isl_map_copy(gen->privatization)); + if (!can_tile_for_shared_memory(gen, group->array, acc, + group->private_bound)) { + free_bound_list(group->private_bound, n_index); + group->private_bound = NULL; + } + + isl_map_free(acc); +} + +/* Look for the last shared tile loop that affects the offset of the + * shared or private tile and store the result in array->last_shared. + */ +static void set_last_shared(struct cuda_gen *gen, + struct cuda_array_ref_group *group) +{ + int i, j; + struct cuda_array_bound *bounds; + unsigned first_shared = gen->first_shared; + int n_index = group->array->n_index; + + bounds = group->private_bound; + if (!bounds) + bounds = group->shared_bound; + if (!bounds) + return; + + for (j = gen->shared_len - 1; j >= 0; --j) { + for (i = 0; i < n_index; ++i) { + isl_qpolynomial *lb, *shift; + + lb = bounds[i].lb; + if (isl_qpolynomial_involves_dims(lb, isl_dim_param, + first_shared + j, 1)) + break; + + shift = bounds[i].shift; + if (!shift) + continue; + if (isl_qpolynomial_involves_dims(shift, isl_dim_param, + first_shared + j, 1)) + break; + } + if (i < n_index) + break; + } + group->array->last_shared = j; +} + +/* Compute the sizes of all private arrays for the current kernel, + * as well as the offsets of the private pieces in the original arrays. + * If we cannot or don't want to privatize a given array group, + * we use the shared memory tile sizes computed in + * compute_group_shared_bound instead. + * + * If a given Array only has a single reference group and if we have + * been able to find a privated or shared tile, + * we also look for the last shared tile loop that affects the offset + * (and therefore the array tile) and store the result in array->last_shared. + * + * A privatized copy of all access relations from reference groups that + * are mapped to private memory is stored in gen->privatization. + */ +static void compute_private_size(struct cuda_gen *gen) +{ + int i, j; + isl_union_map *private; + + private = isl_union_map_empty(isl_union_map_get_dim(gen->shared_sched)); + + for (i = 0; i < gen->n_array; ++i) { + struct cuda_array_info *array = &gen->array[i]; + + for (j = 0; j < array->n_group; ++j) { + check_private_group_access(gen, array->groups[j]); + + if (!array->groups[j]->private_bound) + continue; + + private = isl_union_map_union(private, + group_access_relation(array->groups[j], 1, 1)); + } + + array->last_shared = gen->shared_len - 1; + array->print_shared_level = -1; + + if (array->n_group != 1) + continue; + set_last_shared(gen, array->groups[0]); + } + + if (isl_union_map_is_empty(private)) + isl_union_map_free(private); + else { + isl_union_map *priv; + + private = isl_union_map_apply_domain(private, + isl_union_map_copy(gen->shared_sched)); + priv = isl_union_map_from_map(isl_map_copy(gen->privatization)); + private = isl_union_map_apply_domain(private, priv); + gen->private_access = private; + } +} + +/* Fill up the groups array with singleton groups, i.e., one group + * per reference, initializing the array, access, write and refs fields. + * In particular the access field is initialized to the scheduled + * access relation of the array reference. + * + * Return the number of elements initialized, i.e., the number of + * active references in the current kernel. + */ +static int populate_array_references(struct cuda_gen *gen, + struct cuda_array_info *array, __isl_keep isl_union_map *sched, + struct cuda_array_ref_group **groups) +{ + int i; + int n; + isl_ctx *ctx = isl_union_map_get_ctx(sched); + + n = 0; + for (i = 0; i < array->n_ref; ++i) { + isl_union_map *umap; + isl_map *map; + struct cuda_array_ref_group *group; + struct cuda_stmt_access *access = array->refs[i]; + + map = isl_map_copy(access->access); + umap = isl_union_map_from_map(map); + umap = isl_union_map_apply_domain(umap, + isl_union_map_copy(sched)); + + map = isl_union_map_copy_map(umap); + isl_union_map_free(umap); + + if (isl_map_is_empty(map)) { + isl_map_free(map); + continue; + } + + group = isl_calloc_type(ctx, struct cuda_array_ref_group); + assert(group); + group->array = array; + group->access = map; + group->write = access->write; + group->refs = &array->refs[i]; + + groups[n++] = group; + } + + return n; +} + +static void free_array_ref_group(struct cuda_array_ref_group *group, + int n_index) +{ + if (!group) + return; + free_bound_list(group->shared_bound, n_index); + free_bound_list(group->private_bound, n_index); + isl_map_free(group->access); + free(group->refs); + free(group); +} + +/* If two groups have overlapping access relations and if one of them + * involves a write, then merge the two groups into one. + * + * We keep track of the grouping in "leader". leader[j] points to + * an earlier group array element that belongs to the same group, + * or the array element j itself if this element is the first in the group. + * + * Return the number of group leaders. + */ +static int group_overlapping_writes(int n, + struct cuda_array_ref_group **groups, int *leader) +{ + int i, j; + int n_group = n; + + for (i = 0; i < n; ++i) { + int l = i; + groups[l]->n_ref = 1; + for (j = i - 1; j >= 0; --j) { + isl_map *map; + int empty; + + if (leader[j] != j) + continue; + if (!groups[l]->write && !groups[j]->write) + continue; + + map = isl_map_intersect(isl_map_copy(groups[l]->access), + isl_map_copy(groups[j]->access)); + empty = isl_map_is_empty(map); + isl_map_free(map); + + if (empty) + continue; + + groups[j]->access = isl_map_union(groups[j]->access, + groups[l]->access); + groups[j]->write = 1; + groups[l]->access = NULL; + groups[j]->n_ref += groups[l]->n_ref; + l = leader[l] = j; + n_group--; + } + leader[i] = l; + } + + return n_group; +} + +/* Compute the size of the shared array corresponding to the given array + * array refrence group, based on the accesses from the current kernel, + * as well as the offset of the shared piece in the original array. + */ +static void compute_group_shared_bound(struct cuda_gen *gen, + struct cuda_array_info *array, struct cuda_array_ref_group *group) +{ + isl_ctx *ctx = isl_dim_get_ctx(array->dim); + + group->shared_bound = create_bound_list(ctx, array->n_index); + if (!can_tile_for_shared_memory(gen, array, group->access, + group->shared_bound)) { + free_bound_list(group->shared_bound, array->n_index); + group->shared_bound = NULL; + } +} + +/* Given an initial grouping of array references and shared memory tiles + * for each group that allows for a shared memory tile, merge two groups + * if both have a shared memory tile and if the merged group also has + * a shared memory tile. + * + * Return the number of group leaders after merging. + */ +static int group_common_shared_memory_tile(struct cuda_gen *gen, + struct cuda_array_info *array, int n, + struct cuda_array_ref_group **groups, int *leader, int n_group) +{ + int i, j; + isl_ctx *ctx = isl_dim_get_ctx(array->dim); + + for (i = 0; n_group > 1 && i < n; ++i) { + int l = i; + if (leader[i] != i) + continue; + if (!groups[i]->shared_bound) + continue; + for (j = i - 1; j >= 0; --j) { + isl_map *map; + int empty; + struct cuda_array_bound *shared_bound; + + if (leader[j] != j) + continue; + if (!groups[j]->shared_bound) + continue; + + map = isl_map_intersect(isl_map_copy(groups[l]->access), + isl_map_copy(groups[j]->access)); + empty = isl_map_is_empty(map); + isl_map_free(map); + + if (empty) + continue; + + map = isl_map_union(isl_map_copy(groups[l]->access), + isl_map_copy(groups[j]->access)); + shared_bound = create_bound_list(ctx, array->n_index); + if (!can_tile_for_shared_memory(gen, array, map, + shared_bound)) { + isl_map_free(map); + free_bound_list(shared_bound, array->n_index); + continue; + } + + free_bound_list(groups[j]->shared_bound, + array->n_index); + groups[j]->shared_bound = shared_bound; + isl_map_free(groups[j]->access); + groups[j]->access = map; + groups[j]->n_ref += groups[l]->n_ref; + l = leader[l] = j; + n_group--; + } + } + + return n_group; +} + +/* Extract an array of array reference groups from the array of references + * and the grouping information in "leader". + * + * Store the results in array->n_group and array->groups. + */ +static void extract_array_groups(isl_ctx *ctx, struct cuda_array_info *array, + int n, struct cuda_array_ref_group **groups, int *leader, int n_group) +{ + int i, j; + + for (i = 2; i < n; ++i) + leader[i] = leader[leader[i]]; + + array->n_group = n_group; + array->groups = isl_alloc_array(ctx, struct cuda_array_ref_group *, + n_group); + assert(array->groups); + + j = 0; + for (i = 0; i < n; ++i) { + int k, l; + struct cuda_stmt_access **refs; + + if (leader[i] != i) { + groups[i]->refs = NULL; + free_array_ref_group(groups[i], array->n_index); + continue; + } + + refs = isl_alloc_array(ctx, struct cuda_stmt_access *, + groups[i]->n_ref); + assert(refs); + l = 0; + for (k = i; k < n; ++k) + if (leader[k] == i) { + refs[l++] = *groups[k]->refs; + (*groups[k]->refs)->group = j; + } + + groups[i]->refs = refs; + groups[i]->nr = j; + array->groups[j++] = groups[i]; + } +} + +/* Group array references that should be considered together when + * deciding whether to access them from private, shared or global memory. + * + * In particular, if two array references overlap and if one of them + * is a write, then the two references are grouped together. + * Furthermore, if two groups admit a shared memory tile and if the + * combination of the two also admits a shared memory tile, we merge + * the two groups. + * + * During the construction the group->refs field points to a single + * array reference inside the array of array references, while + * group->n_ref contains the number of element in leader that + * (directly or indirectly) point to this group, provided the group + * is a leader. + */ +static void group_array_references(struct cuda_gen *gen, + struct cuda_array_info *array, __isl_keep isl_union_map *sched) +{ + int i; + int n, n_group; + isl_ctx *ctx = isl_union_map_get_ctx(sched); + struct cuda_array_ref_group **groups; + int *leader; + + groups = isl_calloc_array(ctx, struct cuda_array_ref_group *, + array->n_ref); + assert(groups); + + n = populate_array_references(gen, array, sched, groups); + + leader = isl_alloc_array(ctx, int, n); + assert(leader); + + n_group = group_overlapping_writes(n, groups, leader); + + for (i = 0; i < n; ++i) + if (leader[i] == i) + compute_group_shared_bound(gen, array, groups[i]); + + n_group = group_common_shared_memory_tile(gen, array, n, groups, + leader, n_group); + + extract_array_groups(ctx, array, n, groups, leader, n_group); + + free(leader); + free(groups); +} + +/* Take tiled_sched, project it onto the shared tile loops and + * the loops that will be wrapped over the threads, + * parametrize the shared tile loops and store the result in gen->shared_sched. + * The position of the first of these parameters is stored in gen->first_shared. + * Also compute a projection that projects out the loops that will be + * wrapped over the threads and store this projection in gen->shared_proj. + */ +static void compute_shared_sched(struct cuda_gen *gen) +{ + isl_dim *dim; + isl_map *proj; + isl_set *par; + isl_union_map *sched; + + sched = isl_union_map_copy(gen->tiled_sched); + + dim = isl_union_map_get_dim(sched); + gen->first_shared = isl_dim_size(dim, isl_dim_param); + proj = projection(dim, gen->tiled_len, gen->shared_len + gen->n_block); + sched = isl_union_map_apply_range(sched, isl_union_map_from_map(proj)); + + dim = isl_union_map_get_dim(sched); + par = parametrization(dim, gen->shared_len + gen->n_block, + 0, gen->shared_len, "g"); + sched = isl_union_map_intersect_range(sched, + isl_union_set_from_set(par)); + + dim = isl_union_map_get_dim(sched); + proj = projection(dim, gen->shared_len + gen->n_block, gen->shared_len); + + gen->shared_sched = sched; + gen->shared_proj = isl_union_map_from_map(proj); +} + +/* Group references of all arrays in the program. + */ +static void group_references(struct cuda_gen *gen) +{ + int i; + isl_union_map *sched; + + sched = isl_union_map_apply_range(isl_union_map_copy(gen->shared_sched), + isl_union_map_copy(gen->shared_proj)); + + for (i = 0; i < gen->n_array; ++i) + group_array_references(gen, &gen->array[i], sched); + + isl_union_map_free(sched); +} + +/* Free all array information that is local to the current kernel. + */ +static void free_local_array_info(struct cuda_gen *gen) +{ + int i, j; + + for (i = 0; i < gen->n_array; ++i) { + struct cuda_array_info *array = &gen->array[i]; + + for (j = 0; j < array->n_group; ++j) + free_array_ref_group(array->groups[j], array->n_index); + free(array->groups); + + if (array->n_group == 0) + continue; + for (j = 0; j < gen->array[i].n_index; ++j) { + isl_pw_qpolynomial_fold_free(gen->array[i].local_bound[j]); + gen->array[i].local_bound[j] = NULL; + } + } +} + +static void print_iterator_list(FILE *out, int len, const char *prefix, + int parens) +{ + int i; + + fprintf(out, "("); + for (i = 0; i < len; ++i) { + if (i) + fprintf(out, ", "); + if (parens) + fprintf(out, "(%s%d)", prefix, i); + else + fprintf(out, "%s%d", prefix, i); + } + fprintf(out, ")"); +} + +/* Print an access to the element in the global memory copy of the + * given array that corresponds to element [a0][a1]... of the original array. + * The copy in global memory has been linearized, so we need to take + * the array size into account. + */ +static void print_global_index(isl_ctx *ctx, FILE *out, + struct cuda_array_info *array) +{ + int i; + isl_printer *prn; + + fprintf(out, "%s[", array->name); + for (i = 0; i + 1 < array->n_index; ++i) + fprintf(out, "("); + for (i = 0; i < array->n_index; ++i) { + if (i) { + prn = isl_printer_to_file(ctx, out); + prn = isl_printer_set_output_format(prn, ISL_FORMAT_C); + prn = isl_printer_print_str(prn, ") * ("); + prn = isl_printer_print_pw_qpolynomial_fold(prn, + array->local_bound[i]); + prn = isl_printer_print_str(prn, ") + "); + isl_printer_free(prn); + } + fprintf(out, "a%d", i); + } + fprintf(out, "]"); +} + +/* Print an access to the element in the shared memory copy of the + * given array that corresponds to element [a0][a1]... of the original array. + * Since the array in shared memory is just a shifted copy of part + * of the original array, we simply need to subtract the lower bound, + * which was computed in can_tile_for_shared_memory. + * If any of the indices is strided, then we first add + * shared_bound[i].shift and divide by shared_bound[i].stride. + */ +static void print_local_index(FILE *out, struct cuda_array_ref_group *group) +{ + int i; + isl_ctx *ctx; + isl_printer *prn; + struct cuda_array_bound *bounds = group->shared_bound; + + ctx = isl_dim_get_ctx(group->array->dim); + print_array_name(out, group); + for (i = 0; i < group->array->n_index; ++i) { + fprintf(out, "[(a%d", i); + if (bounds[i].shift) { + fprintf(out, " + ("); + prn = isl_printer_to_file(ctx, out); + prn = isl_printer_set_output_format(prn, ISL_FORMAT_C); + prn = isl_printer_print_qpolynomial(prn, + bounds[i].shift); + prn = isl_printer_print_str(prn, "))/"); + prn = isl_printer_print_isl_int(prn, + bounds[i].stride); + isl_printer_free(prn); + } else + fprintf(out, ")"); + fprintf(out, " - ("); + prn = isl_printer_to_file(ctx, out); + prn = isl_printer_set_output_format(prn, ISL_FORMAT_C); + prn = isl_printer_print_qpolynomial(prn, bounds[i].lb); + isl_printer_free(prn); + fprintf(out, ")]"); + } +} + +/* Print '#define's for copying data from global memory to shared + * memory and back for the given array. + */ +static void print_array_copy_defines(struct cuda_gen *gen, + struct cuda_array_ref_group *group) +{ + int i; + const char *type[] = { "read", "write" }; + struct cuda_array_info *array = group->array; + int n_index = array->n_index; + + for (i = 0; i < 2; ++i) { + fprintf(gen->cuda.kernel_c, "#define %s_", type[i]); + print_array_name(gen->cuda.kernel_c, group); + print_iterator_list(gen->cuda.kernel_c, n_index, "a", 0); + fprintf(gen->cuda.kernel_c, " %s_", type[i]); + print_array_name(gen->cuda.kernel_c, group); + fprintf(gen->cuda.kernel_c, "_"); + print_iterator_list(gen->cuda.kernel_c, n_index, "a", 1); + fprintf(gen->cuda.kernel_c, "\n"); + + fprintf(gen->cuda.kernel_c, "#define %s_", type[i]); + print_array_name(gen->cuda.kernel_c, group); + fprintf(gen->cuda.kernel_c, "_"); + print_iterator_list(gen->cuda.kernel_c, n_index, "a", 0); + if (i) { + fprintf(gen->cuda.kernel_c, " "); + print_global_index(gen->ctx, gen->cuda.kernel_c, array); + fprintf(gen->cuda.kernel_c, " = "); + print_local_index(gen->cuda.kernel_c, group); + } else { + fprintf(gen->cuda.kernel_c, " "); + print_local_index(gen->cuda.kernel_c, group); + fprintf(gen->cuda.kernel_c, " = "); + print_global_index(gen->ctx, gen->cuda.kernel_c, array); + } + fprintf(gen->cuda.kernel_c, "\n"); + } +} + +static void print_copy_defines(struct cuda_gen *gen) +{ + int i, j; + + for (i = 0; i < gen->n_array; ++i) { + struct cuda_array_info *array = &gen->array[i]; + + for (j = 0; j < array->n_group; ++j) { + if (array->groups[j]->private_bound) + continue; + if (!array->groups[j]->shared_bound) + continue; + print_array_copy_defines(gen, array->groups[j]); + } + } +} + +/* The sizes of the arrays on the host that have been computed by + * extract_array_info may depend on the parameters. Use the extra + * constraints on the parameters that are valid at "host_domain" + * to simplify these expressions. + */ +static void localize_bounds(struct cuda_gen *gen, + __isl_keep isl_set *host_domain) +{ + int i, j; + isl_set *context; + unsigned nvar; + + context = isl_set_copy(host_domain); + nvar = isl_set_dim(host_domain, isl_dim_set); + context = isl_set_project_out(host_domain, isl_dim_set, 0, nvar); + + for (i = 0; i < gen->n_array; ++i) { + struct cuda_array_info *array = &gen->array[i]; + + if (array->n_group == 0) + continue; + + for (j = 0; j < array->n_index; ++j) { + isl_pw_qpolynomial_fold *pwf; + + pwf = isl_pw_qpolynomial_fold_copy(array->bound[j]); + pwf = isl_pw_qpolynomial_fold_gist(pwf, + isl_set_copy(context)); + array->local_bound[j] = pwf; + } + } + isl_set_free(context); +} + +/* Set gen->tile_len and gen->n_parallel to those of the first statement + * in the statement list u. + * Because of the way the schedule is constructed, the other statements + * in the list, if any, should have the same values for these properties. + */ +static void set_tile_len(struct cuda_gen *gen, struct clast_user_stmt *u) +{ + int nr; + struct cuda_stmt *stmt; + + nr = atoi(u->statement->name + 2); + stmt = &gen->stmts[nr]; + + gen->tile_len = stmt->tile_len; + gen->n_parallel = stmt->n_parallel; +} + +/* This function is called for each leaf in the clast of the host code. + * We first specialize the schedule to the site of the leaf, compute + * the size of shared memory and then print the body of host code + * and the associated kernel (through a call to print_kernel_body). + */ +static void print_host_user(struct gpucode_info *code, + struct clast_user_stmt *u) +{ + struct cuda_gen *gen = code->user; + isl_dim *dim; + isl_set *par; + isl_set *host_domain; + isl_union_map *access; + isl_union_map *local_sched; + isl_union_set *arrays; + + set_tile_len(gen, u); + read_sizes(gen); + + host_domain = extract_entire_host_domain(u); + + local_sched = isl_union_map_intersect_range( + isl_union_map_copy(gen->sched), + isl_union_set_from_set(extend(isl_set_copy(host_domain), + gen->untiled_len))); + access = isl_union_map_union(isl_union_map_copy(gen->read), + isl_union_map_copy(gen->write)); + access = isl_union_map_apply_domain(access, + isl_union_map_copy(local_sched)); + arrays = isl_union_map_range(access); + + print_indent(code->dst, code->indent); + fprintf(code->dst, "dim3 k%d_dimBlock(", gen->kernel_id); + print_reverse_list(code->dst, gen->n_block, gen->block_dim); + fprintf(code->dst, ");\n"); + + print_indent(code->dst, code->indent); + fprintf(code->dst, "dim3 k%d_dimGrid(", gen->kernel_id); + print_reverse_list(code->dst, gen->n_grid, gen->grid_dim); + fprintf(code->dst, ");\n"); + + gen->tiled_sched = tile_schedule(gen, local_sched); + gen->tiled_sched = parametrize_tiled_schedule(gen, gen->tiled_sched); + gen->tiled_sched = scale_tile_loops(gen, gen->tiled_sched); + + gen->local_sched = isl_union_map_copy(gen->tiled_sched); + + dim = isl_union_map_get_dim(gen->local_sched); + par = parametrization(dim, gen->tiled_len, 0, gen->shared_len, "g"); + gen->local_sched = isl_union_map_intersect_range(gen->local_sched, + isl_union_set_from_set(par)); + + gen->local_sched = thread_tile_schedule(gen, gen->local_sched); + gen->local_sched = scale_thread_tile_loops(gen, gen->local_sched); + + gen->private_access = NULL; + compute_shared_sched(gen); + gen->privatization = compute_privatization(gen); + group_references(gen); + compute_private_size(gen); + localize_bounds(gen, host_domain); + + gen->local_sched = interchange_for_unroll(gen, gen->local_sched); + + print_copy_defines(gen); + print_kernel_launch(gen, arrays); + + fprintf(gen->cuda.kernel_c, "{\n"); + + print_kernel_body(gen, host_domain, gen->tiled_sched); + + fprintf(gen->cuda.kernel_c, "}\n"); + + free_local_array_info(gen); + isl_map_free(gen->privatization); + isl_union_map_free(gen->private_access); + isl_union_map_free(gen->local_sched); + isl_union_map_free(gen->tiled_sched); + isl_union_map_free(gen->shared_sched); + isl_union_map_free(gen->shared_proj); + isl_union_set_free(arrays); + isl_set_free(host_domain); + + free(gen->tile_size); + gen->kernel_id++; +} + +/* Use CLooG to generate code for the outer gen->tile_first loops + * of the global schedule in gen->sched. + * The pretty printing of this code is handled by gpu_print_host_stmt, + * which calls print_host_user for each kernel invocation location. + */ +static void print_cloog_host_code(struct cuda_gen *gen) +{ + int i; + isl_set *context; + isl_union_map *sched; + CloogOptions *options; + CloogDomain *cloog_context; + CloogUnionDomain *ud; + CloogInput *input; + struct clast_stmt *stmt; + char name[20]; + + options = cloog_options_malloc(gen->state); + options->language = LANGUAGE_C; + options->otl = 0; + options->strides = 1; + options->stop = gen->tile_first; + options->f = gen->untiled_len; + options->l = gen->untiled_len; + options->save_domains = 1; + options->noscalars = 1; + + sched = isl_union_map_copy(gen->sched); + ud = cloog_union_domain_from_isl_union_map(sched); + for (i = 0; i < options->stop; ++i) { + snprintf(name, sizeof(name), "h%d", i); + ud = cloog_union_domain_set_name(ud, CLOOG_SCAT, i, name); + } + context = isl_set_copy(gen->context); + cloog_context = cloog_domain_from_isl_set(context); + input = cloog_input_alloc(cloog_context, ud); + + stmt = cloog_clast_create_from_input(input, options); + + gen->code.indent = 0; + gen->code.dst = gen->cuda.host_c; + gen->code.print_user_stmt = NULL; + gen->code.print_user_stmt_list = &print_host_user; + gen->code.print_for_head = NULL; + gen->code.print_for_foot = NULL; + gen->code.user = gen; + gpu_print_host_stmt(&gen->code, stmt); + + cloog_clast_free(stmt); + cloog_options_free(options); +} + +void print_host_code(struct cuda_gen *gen) +{ + fprintf(gen->cuda.host_c, "{\n"); + print_cloog_macros(gen->cuda.host_c); + print_cloog_macros(gen->cuda.kernel_c); + + declare_device_arrays(gen); + + allocate_device_arrays(gen); + copy_arrays_to_device(gen); + + gen->kernel_id = 0; + print_cloog_host_code(gen); + + copy_arrays_from_device(gen); + free_device_arrays(gen); + + fprintf(gen->cuda.host_c, "}\n"); +} + +__isl_give isl_set *add_context_from_str(__isl_take isl_set *set, + const char *str) +{ + isl_ctx *ctx; + isl_set *context; + + if (!str) + return set; + + ctx = isl_set_get_ctx(set); + context = isl_set_read_from_str(ctx, str, -1); + context = isl_set_align_params(context, isl_set_get_dim(set)); + set = isl_set_intersect(set, context); + + return set; +} + +/* Convert scop->context to an isl_set. + */ +static __isl_give isl_set *extract_context(isl_ctx *ctx, scoplib_scop_p scop) +{ + isl_dim *dim; + + dim = isl_dim_set_alloc(ctx, scop->nb_parameters, 0); + dim = set_dim_names(dim, isl_dim_param, scop->parameters); + return scoplib_matrix_to_isl_set(scop->context, dim); +} + +/* Return an array of cuda_stmt representing the statements in "scop". + */ +static struct cuda_stmt *extract_stmts(isl_ctx *ctx, scoplib_scop_p scop, + __isl_keep isl_set *context) +{ + int n; + struct cuda_stmt *stmts; + scoplib_statement_p stmt = scop->statement; + + n = scoplib_statement_number(scop->statement); + stmts = isl_calloc_array(ctx, struct cuda_stmt, n); + assert(stmts); + + for (stmt = scop->statement, n = 0; stmt; stmt = stmt->next, n++) { + char name[20]; + isl_dim *dim; + struct cuda_stmt *s = &stmts[n]; + + snprintf(name, sizeof(name), "S_%d", n); + + dim = isl_dim_set_alloc(ctx, scop->nb_parameters, + stmt->nb_iterators); + dim = set_dim_names(dim, isl_dim_param, scop->parameters); + dim = set_dim_names(dim, isl_dim_set, stmt->iterators); + dim = isl_dim_set_tuple_name(dim, isl_dim_set, name); + dim = set_dim_names(dim, isl_dim_set, stmt->iterators); + s->domain = scoplib_matrix_list_to_isl_set(stmt->domain, + dim); + s->domain = isl_set_intersect(s->domain, isl_set_copy(context)); + s->text = strdup(stmt->body); + stmt_extract_accesses(s); + } + + return stmts; +} + +/* Extract all the read and write accesses from "scop" and store + * them in gen->read and gen->write. + */ +static void extract_accesses(struct cuda_gen *gen, scoplib_scop_p scop) +{ + int i; + int n = scoplib_statement_number(scop->statement); + isl_dim *dim; + scoplib_statement_p stmt; + + dim = isl_set_get_dim(gen->context); + gen->write = isl_union_map_empty(isl_dim_copy(dim)); + gen->read = isl_union_map_empty(dim); + + for (i = 0, stmt = scop->statement; i < n; ++i, stmt = stmt->next) { + isl_union_map *read_i; + isl_union_map *write_i; + + read_i = scoplib_access_to_isl_union_map(stmt->read, + isl_set_copy(gen->stmts[i].domain), + scop->arrays); + write_i = scoplib_access_to_isl_union_map(stmt->write, + isl_set_copy(gen->stmts[i].domain), + scop->arrays); + + gen->read = isl_union_map_union(gen->read, read_i); + gen->write = isl_union_map_union(gen->write, write_i); + } +} + +/* Extract and return the original schedule of the program from "scop". + */ +static isl_union_map *extract_original_schedule(struct cuda_gen *gen, + scoplib_scop_p scop) +{ + int i; + int n = scoplib_statement_number(scop->statement); + isl_dim *dim; + isl_union_map *sched; + scoplib_statement_p stmt; + + dim = isl_set_get_dim(gen->context); + sched = isl_union_map_empty(dim); + + for (i = 0, stmt = scop->statement; i < n; ++i, stmt = stmt->next) { + isl_map *sched_i; + + dim = isl_set_get_dim(gen->stmts[i].domain); + dim = isl_dim_from_domain(dim); + dim = isl_dim_add(dim, isl_dim_out, 2 * stmt->nb_iterators + 1); + sched_i = scoplib_schedule_to_isl_map(stmt->schedule, dim); + + sched = isl_union_map_union(sched, + isl_union_map_from_map(sched_i)); + } + + return sched; +} + +/* Return the union of all iteration domains of the gen->stmts[i]. + */ +static __isl_give isl_union_set *extract_domain(struct cuda_gen *gen) +{ + int i; + isl_union_set *domain; + + domain = isl_union_set_empty(isl_set_get_dim(gen->context)); + for (i = 0; i < gen->n_stmts; ++i) { + isl_set *domain_i; + + domain_i = isl_set_copy(gen->stmts[i].domain); + domain = isl_union_set_union(domain, + isl_union_set_from_set(domain_i)); + } + + return domain; +} + +/* Information about the outermost tilable bands in the forest of bands. + * + * tile_len and n_parallel are only sets on band_info structures + * that correspond to outermost bands. For other bands (in particular, + * ancestors of the outermost bands), n_parallal is set to 0. + * + * prefix is the (padded) schedule leading up to the outermost tilable bands. + * + * tile_first is the number of schedule dimensions in prefix. + * + * suffix is the schedule of the outermost tilable bands and their descendants. + */ +struct band_info { + struct cuda_gen *gen; + int tile_first; + int tile_len; + int n_parallel; + isl_union_map *prefix; + isl_union_map *suffix; +}; + +/* Set tile_len and n_parallel of the statement to that of + * their outermost band, recorded in the band_info. + */ +static int set_stmt_tile_len(__isl_take isl_map *map, void *user) +{ + struct band_info *info = user; + int nr; + struct cuda_stmt *stmt; + + nr = atoi(isl_map_get_tuple_name(map, isl_dim_in) + 2); + stmt = &info->gen->stmts[nr]; + + stmt->tile_len = info->tile_len; + stmt->n_parallel = info->n_parallel; + + isl_map_free(map); + + return 0; +} + +static void list_select_outer_band(struct cuda_gen *gen, + __isl_take isl_band_list *list, int pos, struct band_info *list_info); + +/* Check if this band has any parallel loops. If so, take it as + * the outermost tilable band. If not, continue looking for the + * outermost tilable band in the children of the current band. + */ +static void band_select_outer_band(struct cuda_gen *gen, + __isl_take isl_band *band, int pos, struct band_info *info) +{ + int n = isl_band_n_member(band); + int n_parallel; + + for (n_parallel = 0; n_parallel < n; ++n_parallel) + if (!isl_band_member_is_zero_distance(band, n_parallel)) + break; + + info->n_parallel = n_parallel; + if (n_parallel) { + info->gen = gen; + info->tile_first = pos; + info->tile_len = n; + info->prefix = isl_band_get_prefix_schedule(band); + info->suffix = isl_union_map_flat_range_product( + isl_band_get_partial_schedule(band), + isl_band_get_suffix_schedule(band)); + isl_union_map_foreach_map(info->prefix, + &set_stmt_tile_len, info); + } else { + isl_band_list *children; + assert(isl_band_has_children(band)); + children = isl_band_get_children(band); + list_select_outer_band(gen, children, pos + n, info); + } + + isl_band_free(band); +} + +/* Comparison function that returns a non-zero value for band_infos + * with different tile_len fields or different n_parallel fields. + */ +static int cmp_band(const void *p1, const void *p2) +{ + const struct band_info *info1 = p1; + const struct band_info *info2 = p2; + + if (info1->tile_len != info2->tile_len) + return info1->tile_len - info2->tile_len; + + return info1->n_parallel - info2->n_parallel; +} + +/* Extend "umap" with coordinates with fixed value "val" + * to a total length of "dst_len", assuming the original dimension is "src_len". + */ +static __isl_give isl_union_map *extend_range(__isl_take isl_union_map *umap, + int src_len, int dst_len, int val) +{ + isl_dim *dim; + isl_map *map; + int i; + + dim = isl_union_map_get_dim(umap); + map = isl_map_reverse(projection(dim, dst_len, src_len)); + for (i = src_len; i < dst_len; ++i) + map = isl_map_fix_si(map, isl_dim_out, i, val); + + umap = isl_union_map_apply_range(umap, isl_union_map_from_map(map)); + + return umap; +} + +/* Group bands with the same values for tile_len and n_parallel. + * The prefix schedule is then extended with a fixed coordinate that + * is different for each such group. + * Note that the actual values for this coordinate are not important. + * The bands have already been effectively separated at a higher level + * or they are independent and may be executed in parallel. + * The list of band_info has been sorted before this functions is called. + */ +static void separate_bands(struct band_info *info, int n) +{ + int i; + int j = 0; + + for (i = 0; i < n; ++i) { + int l = info[i].tile_first; + + if (i && + (info[i].tile_len != info[i - 1].tile_len || + info[i].n_parallel != info[i - 1].n_parallel)) + j++; + + info[i].prefix = extend_range(info[i].prefix, + l, l + 1, j); + info[i].tile_first = l + 1; + } +} + +/* Select the outermost bands in the elements of the list, align + * their prefix schedules, separate bands with different values + * for tile_len and/or n_parallel and then combine the resulting + * prefix and suffix schedules into a single pair of prefix and + * suffix schedules for the entire list. + */ +static void list_select_outer_band(struct cuda_gen *gen, + __isl_take isl_band_list *list, int pos, struct band_info *list_info) +{ + isl_band *band; + int i; + int n = isl_band_list_n_band(list); + isl_ctx *ctx = isl_band_list_get_ctx(list); + struct band_info *info; + int max_tile_first; + isl_union_map *prefix; + isl_union_map *suffix; + + assert(n >= 1); + info = isl_calloc_array(ctx, struct band_info, n); + assert(info); + + max_tile_first = 0; + for (i = 0; i < n; ++i) { + band = isl_band_list_get_band(list, i); + band_select_outer_band(gen, band, pos, &info[i]); + if (info[i].tile_first > max_tile_first) + max_tile_first = info[i].tile_first; + } + + for (i = 0; i < n; ++i) { + if (info[i].tile_first == max_tile_first) + continue; + info[i].prefix = extend_range(info[i].prefix, + info[i].tile_first, max_tile_first, 0); + } + + qsort(info, n, sizeof(struct band_info), &cmp_band); + + for (i = 0; i < n - 1; ++i) + if (info[i].tile_len != info[i + 1].tile_len || + info[i].n_parallel != info[i + 1].n_parallel) + break; + + if (i < n -1) + separate_bands(info, n); + + prefix = info[0].prefix; + suffix = info[0].suffix; + + for (i = 1; i < n; ++i) { + prefix = isl_union_map_union(prefix, info[i].prefix); + suffix = isl_union_map_union(suffix, info[i].suffix); + } + + list_info->tile_first = info[0].tile_first; + list_info->tile_len = -1; + list_info->prefix = prefix; + list_info->suffix = suffix; + + isl_band_list_free(list); + free(info); +} + +/* Set max_out to the maximal number of output dimensions over + * all maps. + */ +static int update_max_out(__isl_take isl_map *map, void *user) +{ + int *max_out = user; + int n_out = isl_map_dim(map, isl_dim_out); + + if (n_out > *max_out) + *max_out = n_out; + + isl_map_free(map); + return 0; +} + +struct align_range_data { + int max_out; + isl_union_map *res; +}; + +/* Extend the dimension of the range of the given map to data->max_out and + * then add the result to data->res. + */ +static int map_align_range(__isl_take isl_map *map, void *user) +{ + struct align_range_data *data = user; + int i; + isl_dim *dim; + isl_map *proj; + int n_out = isl_map_dim(map, isl_dim_out); + + dim = isl_union_map_get_dim(data->res); + proj = isl_map_reverse(projection(dim, data->max_out, n_out)); + for (i = n_out; i < data->max_out; ++i) + proj = isl_map_fix_si(proj, isl_dim_out, i, 0); + + map = isl_map_apply_range(map, proj); + + data->res = isl_union_map_add_map(data->res, map); + + return 0; +} + +/* Extend the ranges of the maps in the union map such they all have + * the same dimension. + */ +static __isl_give isl_union_map *align_range(__isl_take isl_union_map *umap) +{ + struct align_range_data data; + + data.max_out = 0; + isl_union_map_foreach_map(umap, &update_max_out, &data.max_out); + + data.res = isl_union_map_empty(isl_union_map_get_dim(umap)); + isl_union_map_foreach_map(umap, &map_align_range, &data); + + isl_union_map_free(umap); + return data.res; +} + +/* Select the outermost tilable band that (by construction) + * has at least one parallel loop. + * The starting position of the aligned band is stored in the pair + * gen->tile_first. + * The sizes and number of parallel loops may be different in different + * parts of the band forest and are therefore stored in the cuda_stmts. + * + * Return the complete schedule, with the tilable bands aligned + * at gen->tile_first and padded with zero, if needed. + */ +static __isl_give isl_union_map *select_outer_tilable_band(struct cuda_gen *gen, + __isl_keep isl_schedule *schedule) +{ + isl_band_list *list; + struct band_info info; + + gen->n_parallel = 0; + gen->tile_len = -1; + + list = isl_schedule_get_band_forest(schedule); + + list_select_outer_band(gen, list, 0, &info); + + gen->tile_first = info.tile_first; + info.suffix = align_range(info.suffix); + + return isl_union_map_flat_range_product(info.prefix, info.suffix); +} + +/* Set gen->untiled_len to the number of scheduling dimensions + * for the schedule of the first domain. + * We assume here that this number is the same for all domains. + */ +static int set_untiled_len(__isl_take isl_map *map, void *user) +{ + unsigned *untiled_len = user; + + *untiled_len = isl_map_dim(map, isl_dim_out); + + isl_map_free(map); + return -1; +} + +/* Compute an appropriate schedule based on the accesses in + * gen->read and gen->write. + * + * We first compute dependences and then use those to compute + * a schedule that has a parallel loop in each tilable band. + * Finally, we select the outermost tilable band. + */ +static void compute_schedule(struct cuda_gen *gen, + __isl_take isl_union_map *sched) +{ + isl_ctx *ctx = isl_union_map_get_ctx(sched); + isl_union_set *domain; + isl_union_map *empty; + isl_union_map *dep_raw, *dep2, *dep3, *dep; + isl_union_map *uninitialized; + isl_schedule *schedule; + struct isl_options *options; + + empty = isl_union_map_empty(isl_union_map_get_dim(sched)); + + isl_union_map_compute_flow(isl_union_map_copy(gen->read), + isl_union_map_copy(gen->write), empty, + isl_union_map_copy(sched), + &dep_raw, NULL, &uninitialized, NULL); + isl_union_map_compute_flow(isl_union_map_copy(gen->write), + isl_union_map_copy(gen->write), + isl_union_map_copy(gen->read), + isl_union_map_copy(sched), + &dep2, &dep3, NULL, NULL); + isl_union_map_free(sched); + + gen->copy_in = isl_union_map_range(uninitialized); + + dep = isl_union_map_union(dep2, dep3); + dep = isl_union_map_union(dep, dep_raw); + dep = isl_union_map_coalesce(dep); + + domain = extract_domain(gen); + options = isl_ctx_peek_options(ctx, isl_options_arg); + options->schedule_outer_zero_distance = 1; + schedule = isl_union_set_compute_schedule(isl_union_set_copy(domain), + isl_union_map_copy(dep), dep); + + sched = select_outer_tilable_band(gen, schedule); + + isl_union_map_foreach_map(sched, &set_untiled_len, &gen->untiled_len); + sched = isl_union_map_intersect_domain(sched, domain); + gen->sched = sched; + + isl_schedule_free(schedule); +} + +/* Replace the scop in the "input" file by equivalent code + * that uses the GPU. "scop" is assumed to correspond to this scop. + * + * We first compute a schedule that respects the dependences + * of the original program and select the outermost band + * of tilable dimensions that has at least one parallel loop. + * We then have three blocks of dimensions + * + * H B G + * + * The tilable band "B" is first tiled according to "tile.sizes", resulting + * in + * + * H T P G + * + * For each iteration of the T loop and for each array, we compute + * the array elements accessed by that iteration, construct a rectangular + * box around it and shift it to the origin. The result is used + * as shared memory for the array. + * + * We then split off at most 2 parallel loops from the T loops and + * at most 3 parallel loops from the P loops + * + * H T1 T2 P1 P2 G + * + * The T1/P1 loops are then tiled or "wrapped" over the blocks/threads, + * according to "grid.sizes"/"block.sizes". + * + * H T1T T1P T2 P1T P1P P2 G + * + * Finally, the T1P and P1P iterators are equated to the block and + * thread dimensions respectively and so are effectively removed. + * The H loops are run on the host. The T1T, T2, P1T, P2 and G loops + * are run on the GPU. + * + * Code is generated in three stages. We first generate code for the + * host (the H loops), with iterators h%d. Then, for each leaf node + * of the resulting AST, we generate code for the shared loops (up to + * and including T2), with iterators g%d and after equating the H loops + * to h%d parameters and the T1P loops to the block dimensions. + * Finally, we generate code for the remaining loops in a similar fashion. + * + * The function frees "scop" and "ctx". + */ +int cuda_scop(isl_ctx *ctx, scoplib_scop_p scop, struct ppcg_options *options, + const char *input) +{ + isl_union_map *sched; + struct cuda_gen gen; + + gen.ctx = ctx; + gen.context = extract_context(gen.ctx, scop); + gen.context = add_context_from_str(gen.context, options->ctx); + gen.n_stmts = scoplib_statement_number(scop->statement); + gen.stmts = extract_stmts(gen.ctx, scop, gen.context); + extract_accesses(&gen, scop); + gen.options = options; + gen.state = cloog_isl_state_malloc(gen.ctx); + + cuda_open_files(&gen.cuda, input); + + collect_array_info(&gen); + + sched = extract_original_schedule(&gen, scop); + compute_schedule(&gen, sched); + + print_host_code(&gen); + + cloog_state_free(gen.state); + clear_cuda_gen(&gen); + isl_ctx_free(gen.ctx); + scoplib_scop_free(scop); + + cuda_close_files(&gen.cuda); + + return 0; +} diff --git a/cuda.h b/cuda.h new file mode 100644 index 0000000..8cd2810 --- /dev/null +++ b/cuda.h @@ -0,0 +1,124 @@ +#ifndef _CUDA_H +#define _CUDA_H + +#include "clan/clan.h" +#include "cuda_common.h" +#include "gpucode.h" +#include "ppcg_options.h" + +struct cuda_gen { + struct cuda_info cuda; + struct gpucode_info code; + struct gpucode_info kernel_code; + struct gpucode_info stmt_code; + + isl_ctx *ctx; + struct ppcg_options *options; + CloogState *state; + + /* Set of parameter values */ + isl_set *context; + + /* Uninitialized data elements (or an overapproximation) */ + isl_union_set *copy_in; + + /* All read accesses in the entire program */ + isl_union_map *read; + + /* All write accesses in the entire program */ + isl_union_map *write; + + /* Array of statements */ + int n_stmts; + struct cuda_stmt *stmts; + + int n_array; + struct cuda_array_info *array; + + /* Identifier of current kernel. */ + int kernel_id; + + /* First tile dimension. */ + int tile_first; + /* Number of tile dimensions. */ + int tile_len; + /* Number of initial parallel loops among tile dimensions. */ + int n_parallel; + + /* Number of dimensions determining shared memory. */ + int shared_len; + + /* Number of rows in the untiled schedule. */ + int untiled_len; + /* Number of rows in the tiled schedule. */ + int tiled_len; + /* Number of rows in schedule after tiling/wrapping over threads. */ + int thread_tiled_len; + + /* Global untiled schedule. */ + isl_union_map *sched; + /* Local (per kernel launch) tiled schedule. */ + isl_union_map *tiled_sched; + /* Local schedule per shared memory tile loop iteration. */ + isl_union_map *local_sched; + /* Domain of the current statement (within print_statement). */ + isl_set *stmt_domain; + + /* Position of first parameter corresponding to shared tile loop + * in shared_sched. + */ + unsigned first_shared; + /* Local tiled schedule projected onto the shared tile loops and + * the loops that will be wrapped over the threads, + * with all shared tile loops parametrized. + */ + isl_union_map *shared_sched; + /* Projects out the loops that will be wrapped over the threads + * from shared_sched. + */ + isl_union_map *shared_proj; + + /* A map that takes the range of shared_sched as input, + * wraps the appropriate loops over the threads and then projects + * out these loops. + */ + isl_map *privatization; + + /* A map from the shared memory tile loops and the thread indices + * (as parameters) to the set of accessed memory elements that + * will be accessed through private copies. + */ + isl_union_map *private_access; + + /* The schedule for the current private access + * (within print_private_access). + */ + isl_map *private_sched; + /* The array reference group corresponding to private_sched. */ + struct cuda_array_ref_group *private_group; + + /* First loop to unroll (or -1 if none). */ + int first_unroll; + + int n_grid; + int n_block; + /* Note: in the input file, the sizes of the grid and the blocks + * are specified in the order x, y, z, but internally, the sizes + * are stored in reverse order, so that the last element always + * refers to the x dimension. + */ + int grid_dim[2]; + int block_dim[3]; + int *tile_size; +}; + +__isl_give isl_set *add_context_from_str(__isl_take isl_set *set, + const char *str); +void collect_array_info(struct cuda_gen *gen); +void print_host_code(struct cuda_gen *gen); +void clear_cuda_gen(struct cuda_gen *gen); + +int cuda_scop(isl_ctx *ctx, scoplib_scop_p scop, struct ppcg_options *options, + const char *input); + +#endif diff --git a/cuda_common.c b/cuda_common.c new file mode 100644 index 0000000..3722768 --- /dev/null +++ b/cuda_common.c @@ -0,0 +1,116 @@ +/* + * Copyright 2010 INRIA Saclay + * + * Use of this software is governed by the GNU LGPLv2.1 license + * + * Written by Sven Verdoolaege, INRIA Saclay - Ile-de-France, + * Parc Club Orsay Universite, ZAC des vignes, 4 rue Jacques Monod, + * 91893 Orsay, France + */ + +#include +#include +#include + +#include "cuda_common.h" + +static char *skip_spaces(char *s) +{ + while (isspace(*s)) + ++s; + return s; +} + +static int is_begin_scop(char *line) +{ + line = skip_spaces(line); + if (*line != '#') + return 0; + line = skip_spaces(line + 1); + if (strncmp(line, "pragma", sizeof("pragma") - 1)) + return 0; + line = skip_spaces(line + sizeof("pragma") - 1); + if (strncmp(line, "scop", sizeof("scop") - 1)) + return 0; + return 1; +} + +static int is_end_scop(char *line) +{ + line = skip_spaces(line); + if (*line != '#') + return 0; + line = skip_spaces(line + 1); + if (strncmp(line, "pragma", sizeof("pragma") - 1)) + return 0; + line = skip_spaces(line + sizeof("pragma") - 1); + if (strncmp(line, "endscop", sizeof("endscop") - 1)) + return 0; + return 1; +} + +/* Open the "input" file for reading and open the host .cu file + * and the kernel .hu and .cu files for writing. + * Add the necessary includes and copy all code from the input + * file up to the openscop pragma to the host .cu file. + */ +void cuda_open_files(struct cuda_info *info, const char *input) +{ + char name[PATH_MAX]; + const char *base; + const char *ext; + int len; + char line[1024]; + + base = strrchr(input, '/'); + if (base) + base++; + else + base = input; + ext = strrchr(base, '.'); + len = ext ? ext - base : strlen(base); + + memcpy(name, base, len); + strcpy(name + len, "_host.cu"); + info->host_c = fopen(name, "w"); + + strcpy(name + len, "_kernel.cu"); + info->kernel_c = fopen(name, "w"); + + strcpy(name + len, "_kernel.hu"); + info->kernel_h = fopen(name, "w"); + fprintf(info->host_c, "#include \n"); + fprintf(info->host_c, "#include \"%s\"\n", name); + fprintf(info->kernel_c, "#include \"%s\"\n", name); + fprintf(info->kernel_h, "#include \"cuda.h\"\n\n"); + + info->input = fopen(input, "r"); + while (fgets(line, sizeof(line), info->input)) { + fprintf(info->host_c, "%s", line); + if (is_begin_scop(line)) + break; + } +} + +/* Copy all code starting at the endscop pragma from the input + * file to the host .cu file and close all input and output files. + */ +void cuda_close_files(struct cuda_info *info) +{ + char line[1024]; + + while (fgets(line, sizeof(line), info->input)) { + if (is_end_scop(line)) { + fprintf(info->host_c, "%s", line); + break; + } + } + while (fgets(line, sizeof(line), info->input)) { + fprintf(info->host_c, "%s", line); + } + + fclose(info->input); + fclose(info->kernel_c); + fclose(info->kernel_h); + fclose(info->host_c); +} diff --git a/cuda_common.h b/cuda_common.h new file mode 100644 index 0000000..dcff632 --- /dev/null +++ b/cuda_common.h @@ -0,0 +1,16 @@ +#ifndef _CUDA_COMMON_H_ +#define _CUDA_COMMON_H_ + +#include + +struct cuda_info { + FILE *input; + FILE *host_c; + FILE *kernel_c; + FILE *kernel_h; +}; + +void cuda_open_files(struct cuda_info *info, const char *input); +void cuda_close_files(struct cuda_info *info); + +#endif diff --git a/gpucode.c b/gpucode.c new file mode 100644 index 0000000..ac0d2d3 --- /dev/null +++ b/gpucode.c @@ -0,0 +1,291 @@ +/* + * Copyright 2010-2011 INRIA Saclay + * + * Use of this software is governed by the GNU LGPLv2.1 license + * + * Written by Sven Verdoolaege, INRIA Saclay - Ile-de-France, + * Parc Club Orsay Universite, ZAC des vignes, 4 rue Jacques Monod, + * 91893 Orsay, France + */ + +#include "gpucode.h" + +void print_cloog_macros(FILE *dst) +{ + fprintf(dst, + "#define floord(n,d) (((n)<0) ? -((-(n)+(d)-1)/(d)) : (n)/(d))\n"); + fprintf(dst, + "#define ceild(n,d) (((n)<0) ? -((-(n))/(d)) : ((n)+(d)-1)/(d))\n"); + fprintf(dst, "#define max(x,y) ((x) > (y) ? (x) : (y))\n"); + fprintf(dst, "#define min(x,y) ((x) < (y) ? (x) : (y))\n"); +} + +static void print_expr(struct clast_expr *e, FILE *dst); +static void print_stmt(struct gpucode_info *info, struct clast_stmt *s); + +void print_indent(FILE *dst, int indent) +{ + fprintf(dst, "%*s", indent, ""); +} + +static void print_name(struct clast_name *n, FILE *dst) +{ + fprintf(dst, "%s", n->name); +} + +static void print_term(struct clast_term *t, FILE *dst) +{ + if (!t->var) { + cloog_int_print(dst, t->val); + } else { + if (!cloog_int_is_one(t->val)) { + cloog_int_print(dst, t->val); + fprintf(dst, "*"); + } + if (t->var->type == clast_expr_red) + fprintf(dst, "("); + print_expr(t->var, dst); + if (t->var->type == clast_expr_red) + fprintf(dst, ")"); + } +} + +static void print_bin(struct clast_binary *b, FILE *dst) +{ + const char *s1, *s2, *s3; + switch (b->type) { + case clast_bin_mod: + s1 = "(", s2 = ")%", s3 = ""; + break; + case clast_bin_div: + s1 = "(", s2 = ")/(", s3 = ")"; + break; + case clast_bin_cdiv: + s1 = "ceild(", s2 = ", ", s3 = ")"; + break; + case clast_bin_fdiv: + s1 = "floord(", s2 = ", ", s3 = ")"; + break; + default: + assert(0); + } + fprintf(dst, "%s", s1); + print_expr(b->LHS, dst); + fprintf(dst, "%s", s2); + cloog_int_print(dst, b->RHS); + fprintf(dst, "%s", s3); +} + +static void print_red(struct clast_reduction *r, FILE *dst) +{ + int i; + const char *s1, *s2, *s3; + + if (r->n == 1) { + print_expr(r->elts[0], dst); + return; + } + + switch (r->type) { + case clast_red_sum: + s1 = "", s2 = " + ", s3 = ""; + break; + case clast_red_max: + s1 = "max(", s2 = ", ", s3 = ")"; + break; + case clast_red_min: + s1 = "min(", s2 = ", ", s3 = ")"; + break; + default: + assert(0); + } + + for (i = 1; i < r->n; ++i) + fprintf(dst, "%s", s1); + print_expr(r->elts[0], dst); + for (i = 1; i < r->n; ++i) { + if (r->type == clast_red_sum && r->elts[i]->type == clast_expr_term && + cloog_int_is_neg(((struct clast_term *) r->elts[i])->val)) { + struct clast_term *t = (struct clast_term *) r->elts[i]; + cloog_int_neg(t->val, t->val); + fprintf(dst, " - "); + print_expr(r->elts[i], dst); + cloog_int_neg(t->val, t->val); + } else { + fprintf(dst, "%s", s2); + print_expr(r->elts[i], dst); + } + fprintf(dst, "%s", s3); + } +} + +static void print_expr(struct clast_expr *e, FILE *dst) +{ + switch (e->type) { + case clast_expr_name: + print_name((struct clast_name*) e, dst); + break; + case clast_expr_term: + print_term((struct clast_term*) e, dst); + break; + case clast_expr_red: + print_red((struct clast_reduction*) e, dst); + break; + case clast_expr_bin: + print_bin((struct clast_binary*) e, dst); + break; + default: + assert(0); + } +} + +static void print_ass(struct clast_assignment *a, FILE *dst, int indent, + int first_ass) +{ + print_indent(dst, indent); + if (first_ass) + fprintf(dst, "int "); + fprintf(dst, "%s = ", a->LHS); + print_expr(a->RHS, dst); + fprintf(dst, ";\n"); +} + +static void print_guard(struct gpucode_info *info, struct clast_guard *g) +{ + int i; + int n = g->n; + + print_indent(info->dst, info->indent); + fprintf(info->dst, "if ("); + for (i = 0; i < n; ++i) { + if (i > 0) + fprintf(info->dst," && "); + fprintf(info->dst,"("); + print_expr(g->eq[i].LHS, info->dst); + if (g->eq[i].sign == 0) + fprintf(info->dst," == "); + else if (g->eq[i].sign > 0) + fprintf(info->dst," >= "); + else + fprintf(info->dst," <= "); + print_expr(g->eq[i].RHS, info->dst); + fprintf(info->dst,")"); + } + fprintf(info->dst, ") {\n"); + info->indent += 4; + print_stmt(info, g->then); + info->indent -= 4; + print_indent(info->dst, info->indent); + fprintf(info->dst, "}\n"); +} + +static void print_for(struct gpucode_info *info, struct clast_for *f) +{ + assert(f->LB && f->UB); + print_indent(info->dst, info->indent); + fprintf(info->dst, "for (int %s = ", f->iterator); + print_expr(f->LB, info->dst); + fprintf(info->dst, "; %s <= ", f->iterator); + print_expr(f->UB, info->dst); + fprintf(info->dst, "; %s", f->iterator); + if (cloog_int_is_one(f->stride)) + fprintf(info->dst, "++"); + else { + fprintf(info->dst, " += "); + cloog_int_print(info->dst, f->stride); + } + fprintf(info->dst, ") {\n"); + info->indent += 4; + if (info->print_for_head) + info->print_for_head(info, f); + print_stmt(info, f->body); + if (info->print_for_foot) + info->print_for_foot(info, f); + info->indent -= 4; + print_indent(info->dst, info->indent); + fprintf(info->dst, "}\n"); +} + +static void print_user_stmt(struct clast_user_stmt *u, FILE *dst, int indent) +{ + struct clast_stmt *t; + + print_indent(dst, indent); + fprintf(dst, "%s", u->statement->name); + fprintf(dst, "("); + for (t = u->substitutions; t; t = t->next) { + assert(CLAST_STMT_IS_A(t, stmt_ass)); + print_expr(((struct clast_assignment *) t)->RHS, dst); + if (t->next) + fprintf(dst, ","); + } + fprintf(dst, ");\n"); +} + +static void print_stmt(struct gpucode_info *info, struct clast_stmt *s) +{ + int first_ass = 1; + + for ( ; s; s = s->next) { + if (CLAST_STMT_IS_A(s, stmt_root)) + continue; + if (CLAST_STMT_IS_A(s, stmt_ass)) { + print_ass((struct clast_assignment *) s, info->dst, info->indent, + first_ass); + first_ass = 0; + } else if (CLAST_STMT_IS_A(s, stmt_user)) { + if (info->print_user_stmt_list) { + info->print_user_stmt_list(info, (struct clast_user_stmt *) s); + return; + } else if (info->print_user_stmt) + info->print_user_stmt(info, (struct clast_user_stmt *) s); + else + print_user_stmt((struct clast_user_stmt *) s, info->dst, + info->indent); + } else if (CLAST_STMT_IS_A(s, stmt_for)) { + print_for(info, (struct clast_for *) s); + } else if (CLAST_STMT_IS_A(s, stmt_guard)) { + print_guard(info, (struct clast_guard *) s); + } else { + assert(0); + } + } +} + +void gpu_print_host_stmt(struct gpucode_info *info, struct clast_stmt *s) +{ + print_stmt(info, s); +} + +__isl_give isl_set *extract_host_domain(struct clast_user_stmt *u) +{ + return isl_set_from_cloog_domain(cloog_domain_copy(u->domain)); +} + +/* Extract the set of scattering dimension values for which the given + * sequence of user statements is executed. + * In principle, this set should be the same for each of the user + * statements in the sequence, but we compute the union just to be safe. + */ +__isl_give isl_set *extract_entire_host_domain(struct clast_user_stmt *u) +{ + struct clast_stmt *s; + isl_set *host_domain = NULL; + + for (s = &u->stmt; s; s = s->next) { + isl_set *set_i; + + assert(CLAST_STMT_IS_A(s, stmt_user)); + u = (struct clast_user_stmt *) s; + + set_i = extract_host_domain(u); + + if (!host_domain) + host_domain = set_i; + else + host_domain = isl_set_union(host_domain, set_i); + assert(host_domain); + } + + return isl_set_coalesce(host_domain); +} diff --git a/gpucode.h b/gpucode.h new file mode 100644 index 0000000..9362c04 --- /dev/null +++ b/gpucode.h @@ -0,0 +1,25 @@ +#ifndef _GPUCODE_H +#define _GPUCODE_H + +#include + +struct gpucode_info { + int indent; + FILE *dst; + void (*print_user_stmt)(struct gpucode_info *info, + struct clast_user_stmt *s); + void (*print_user_stmt_list)(struct gpucode_info *info, + struct clast_user_stmt *s); + void (*print_for_head)(struct gpucode_info *info, struct clast_for *f); + void (*print_for_foot)(struct gpucode_info *info, struct clast_for *f); + void *user; +}; + +void print_cloog_macros(FILE *dst); +void print_indent(FILE *dst, int indent); +void gpu_print_host_stmt(struct gpucode_info *info, struct clast_stmt *s); + +__isl_give isl_set *extract_host_domain(struct clast_user_stmt *u); +__isl_give isl_set *extract_entire_host_domain(struct clast_user_stmt *u); + +#endif diff --git a/isl b/isl new file mode 160000 index 0000000..bbf85ab --- /dev/null +++ b/isl @@ -0,0 +1 @@ +Subproject commit bbf85ab5afe150c925b01e126c438784b015230a diff --git a/m4/ax_submodule.m4 b/m4/ax_submodule.m4 new file mode 100644 index 0000000..8129312 --- /dev/null +++ b/m4/ax_submodule.m4 @@ -0,0 +1,83 @@ +AC_DEFUN([_AX_SUBMODULE], +[ + +m4_if(m4_bregexp($3,|,choice),choice, + [AC_ARG_WITH($2, + [AS_HELP_STRING([--with-$1=$3], + [Which $1 to use [default=$4]])])]) +case "system" in +$3) + AC_ARG_WITH($2_prefix, + [AS_HELP_STRING([--with-$1-prefix=DIR], + [Prefix of $1 installation])]) + AC_ARG_WITH($2_exec_prefix, + [AS_HELP_STRING([--with-$1-exec-prefix=DIR], + [Exec prefix of $1 installation])]) +esac +m4_if(m4_bregexp($3,build,build),build, + [AC_ARG_WITH($2_builddir, + [AS_HELP_STRING([--with-$1-builddir=DIR], + [Location of $1 builddir])])]) +if test "x$with_$2_prefix" != "x" -a "x$with_$2_exec_prefix" = "x"; then + with_$2_exec_prefix=$with_$2_prefix +fi +if test "x$with_$2_prefix" != "x" -o "x$with_$2_exec_prefix" != "x"; then + if test "x$with_$2" != "x" -a "x$with_$2" != "xsystem"; then + AC_MSG_ERROR([Setting $with_$2_prefix implies use of system $1]) + fi + with_$2="system" +fi +if test "x$with_$2_builddir" != "x"; then + if test "x$with_$2" != "x" -a "x$with_$2" != "xbuild"; then + AC_MSG_ERROR([Setting $with_$2_builddir implies use of build $1]) + fi + with_$2="build" + $2_srcdir=`echo @abs_srcdir@ | $with_$2_builddir/config.status --file=-` + AC_MSG_NOTICE($1 sources in $$2_srcdir) +fi +if test "x$with_$2_exec_prefix" != "x"; then + export PKG_CONFIG_PATH="$with_$2_exec_prefix/lib/pkgconfig${PKG_CONFIG_PATH+:$PKG_CONFIG_PATH}" +fi +case "$with_$2" in +$3) + ;; +*) + case "$4" in + bundled) + if test -d $srcdir/.git -a \ + -d $srcdir/$1 -a \ + "`cd $srcdir; git submodule status $1 | cut -c1`" = '-'; then + AC_MSG_WARN([git repo detected, but submodule $1 not initialized]) + AC_MSG_WARN([You may want to run]) + AC_MSG_WARN([ git submodule init]) + AC_MSG_WARN([ git submodule update]) + AC_MSG_WARN([ sh autogen.sh]) + fi + if test -f $srcdir/$1/configure; then + with_$2="bundled" + else + case "system" in + $3) + with_$2="system" + ;; + *) + with_$2="no" + ;; + esac + fi + ;; + *) + with_$2="$4" + ;; + esac + ;; +esac +AC_MSG_CHECKING([which $1 to use]) +AC_MSG_RESULT($with_$2) + +]) + +AC_DEFUN([AX_SUBMODULE], [ + _AX_SUBMODULE($1, m4_bpatsubst([$1], + [[^_abcdefghijklmnopqrstuvwxyz0123456789]],[_]), $2, $3) +]) diff --git a/ppcg.c b/ppcg.c new file mode 100644 index 0000000..3616eb2 --- /dev/null +++ b/ppcg.c @@ -0,0 +1,60 @@ +/* + * Copyright 2011 INRIA Saclay + * + * Use of this software is governed by the GNU LGPLv2.1 license + * + * Written by Sven Verdoolaege, INRIA Saclay - Ile-de-France, + * Parc Club Orsay Universite, ZAC des vignes, 4 rue Jacques Monod, + * 91893 Orsay, France + */ + +#include +#include +#include +#include +#include +#include "ppcg_options.h" +#include "cuda.h" + +struct options { + struct isl_options *isl; + struct ppcg_options *ppcg; + char *input; +}; + +struct isl_arg options_arg[] = { +ISL_ARG_CHILD(struct options, isl, "isl", isl_options_arg, "isl options") +ISL_ARG_CHILD(struct options, ppcg, NULL, ppcg_options_arg, NULL) +ISL_ARG_ARG(struct options, input, "input", NULL) +ISL_ARG_END +}; + +ISL_ARG_DEF(options, struct options, options_arg) + +int main(int argc, char **argv) +{ + isl_ctx *ctx; + struct options *options; + clan_options_p clan_options; + scoplib_scop_p scop; + FILE *input; + + options = options_new_with_defaults(); + assert(options); + argc = options_parse(options, argc, argv, ISL_ARG_ALL); + + ctx = isl_ctx_alloc_with_options(options_arg, options); + + clan_options = clan_options_malloc(); + + input = fopen(options->input, "r"); + if (!input) { + fprintf(stderr, "unable to open input file '%s'\n", + options->input); + return -1; + } + scop = clan_scop_extract(input, clan_options); + clan_options_free(clan_options); + + return cuda_scop(ctx, scop, options->ppcg, options->input); +} diff --git a/ppcg_options.c b/ppcg_options.c new file mode 100644 index 0000000..60a6a56 --- /dev/null +++ b/ppcg_options.c @@ -0,0 +1,23 @@ +/* + * Copyright 2010-2011 INRIA Saclay + * + * Use of this software is governed by the GNU LGPLv2.1 license + * + * Written by Sven Verdoolaege, INRIA Saclay - Ile-de-France, + * Parc Club Orsay Universite, ZAC des vignes, 4 rue Jacques Monod, + * 91893 Orsay, France + */ + +#include "ppcg_options.h" + +struct isl_arg ppcg_options_arg[] = { +ISL_ARG_BOOL(struct ppcg_options, scale_tile_loops, 0, + "scale-tile-loops", 1, NULL) +ISL_ARG_BOOL(struct ppcg_options, wrap, 0, "wrap", 1, NULL) +ISL_ARG_STR(struct ppcg_options, type, 't', "type", "type", "float", + "Element type of arrays") +ISL_ARG_STR(struct ppcg_options, ctx, 0, "ctx", "context", NULL, + "Constraints on parameters") +ISL_ARG_INT(struct ppcg_options, tile_size, 'S', "tile-size", "size", 32, NULL) +ISL_ARG_END +}; diff --git a/ppcg_options.h b/ppcg_options.h new file mode 100644 index 0000000..b7db7bb --- /dev/null +++ b/ppcg_options.h @@ -0,0 +1,20 @@ +#ifndef PPCG_OPTIONS_H +#define PPCG_OPTIONS_H + +#include + +struct ppcg_options { + int scale_tile_loops; + int wrap; + + char *type; + char *ctx; + + int tile_size; +}; + +ISL_ARG_DECL(ppcg_options, struct ppcg_options, ppcg_options_arg) + +extern struct isl_arg ppcg_options_arg[]; + +#endif diff --git a/schedule.c b/schedule.c new file mode 100644 index 0000000..9af7239 --- /dev/null +++ b/schedule.c @@ -0,0 +1,337 @@ +/* + * Copyright 2010-2011 INRIA Saclay + * + * Use of this software is governed by the GNU LGPLv2.1 license + * + * Written by Sven Verdoolaege, INRIA Saclay - Ile-de-France, + * Parc Club Orsay Universite, ZAC des vignes, 4 rue Jacques Monod, + * 91893 Orsay, France + */ + +#include +#include +#include + +#include + +#include "schedule.h" + +/* Construct a map that maps a domain of dimensionality "len" + * to another domain of the same dimensionality such that + * coordinate "first" of the range is equal to the sum of the "wave_len" + * coordinates starting at "first" in the domain. + * The remaining coordinates in the range are equal to the corresponding ones + * in the domain. + * "dim" prescribes the parameters. + */ +__isl_give isl_map *wavefront(__isl_take isl_dim *dim, int len, + int first, int wave_len) +{ + int i; + isl_int v; + isl_basic_map *bmap; + isl_constraint *c; + + isl_int_init(v); + + dim = isl_dim_add(dim, isl_dim_in, len); + dim = isl_dim_add(dim, isl_dim_out, len); + bmap = isl_basic_map_universe(isl_dim_copy(dim)); + + for (i = 0; i < len; ++i) { + if (i == first) + continue; + + c = isl_equality_alloc(isl_dim_copy(dim)); + isl_int_set_si(v, -1); + isl_constraint_set_coefficient(c, isl_dim_in, i, v); + isl_int_set_si(v, 1); + isl_constraint_set_coefficient(c, isl_dim_out, i, v); + bmap = isl_basic_map_add_constraint(bmap, c); + } + + c = isl_equality_alloc(isl_dim_copy(dim)); + isl_int_set_si(v, -1); + for (i = 0; i < wave_len; ++i) + isl_constraint_set_coefficient(c, isl_dim_in, first + i, v); + isl_int_set_si(v, 1); + isl_constraint_set_coefficient(c, isl_dim_out, first, v); + bmap = isl_basic_map_add_constraint(bmap, c); + + isl_dim_free(dim); + isl_int_clear(v); + + return isl_map_from_basic_map(bmap); +} + +/* Construct a map from a len-dimensional domain to + * a (len-n)-dimensional domain that projects out the n coordinates + * starting at first. + * "dim" prescribes the parameters. + */ +__isl_give isl_map *project_out(__isl_take isl_dim *dim, + int len, int first, int n) +{ + int i, j; + isl_constraint *c; + isl_basic_map *bmap; + isl_int v; + + isl_int_init(v); + + dim = isl_dim_add(dim, isl_dim_in, len); + dim = isl_dim_add(dim, isl_dim_out, len - n); + bmap = isl_basic_map_universe(isl_dim_copy(dim)); + + for (i = 0, j = 0; i < len; ++i) { + if (i >= first && i < first + n) + continue; + c = isl_equality_alloc(isl_dim_copy(dim)); + isl_int_set_si(v, -1); + isl_constraint_set_coefficient(c, isl_dim_in, i, v); + isl_int_set_si(v, 1); + isl_constraint_set_coefficient(c, isl_dim_out, j, v); + bmap = isl_basic_map_add_constraint(bmap, c); + ++j; + } + isl_dim_free(dim); + + isl_int_clear(v); + + return isl_map_from_basic_map(bmap); +} + +/* Construct a projection that maps a src_len dimensional domain + * to its first dst_len coordinates. + * "dim" prescribes the parameters. + */ +__isl_give isl_map *projection(__isl_take isl_dim *dim, + int src_len, int dst_len) +{ + return project_out(dim, src_len, dst_len, src_len - dst_len); +} + +/* Extend "set" with unconstrained coordinates to a total length of "dst_len". + */ +__isl_give isl_set *extend(__isl_take isl_set *set, int dst_len) +{ + int n_set; + isl_dim *dim; + isl_map *map; + + dim = isl_set_get_dim(set); + n_set = isl_dim_size(dim, isl_dim_set); + dim = isl_dim_drop(dim, isl_dim_set, 0, n_set); + map = projection(dim, dst_len, n_set); + map = isl_map_reverse(map); + + return isl_set_apply(set, map); +} + +/* Extract the access in stmt->text starting at position identifier + * and of length identifier_len, and return a corresponding cuda_stmt_access. + * + * The access in C notation is first copied to "buffer" (which + * has been allocated by the caller and should be of sufficient size) + * and slightly modified to a map in isl notation. + * This string is then parsed by isl. + */ +static struct cuda_stmt_access *stmt_extract_access(struct cuda_stmt *stmt, + char *buffer, + int identifier, int identifier_len, int index, int index_len) +{ + int i; + int pos = 0; + unsigned nparam = isl_set_dim(stmt->domain, isl_dim_param); + unsigned nvar = isl_set_dim(stmt->domain, isl_dim_set); + isl_ctx *ctx = isl_set_get_ctx(stmt->domain); + struct cuda_stmt_access *access; + + access = isl_alloc_type(ctx, struct cuda_stmt_access); + assert(access); + access->text_offset = identifier; + access->text_len = (index - identifier) + index_len; + access->next = NULL; + access->read = 1; + access->write = 0; + + pos += sprintf(buffer, "["); + for (i = 0; i < nparam; ++i) { + if (i) + pos += sprintf(buffer + pos, ","); + pos += sprintf(buffer + pos, "%s", + isl_set_get_dim_name(stmt->domain, isl_dim_param, i)); + } + pos += sprintf(buffer + pos, "] -> { %s[", + isl_set_get_tuple_name(stmt->domain)); + for (i = 0; i < nvar; ++i) { + if (i) + pos += sprintf(buffer + pos, ","); + pos += sprintf(buffer + pos, "%s", + isl_set_get_dim_name(stmt->domain, isl_dim_set, i)); + } + pos += sprintf(buffer + pos, "] -> "); + memcpy(buffer + pos, stmt->text + identifier, identifier_len); + pos += identifier_len; + pos += sprintf(buffer + pos, "["); + for (i = 1; i < index_len - 1; ++i) { + if (stmt->text[index + i] == ']') { + buffer[pos++] = ','; + ++i; + } else + buffer[pos++] = stmt->text[index + i]; + } + pos += sprintf(buffer + pos, "] }"); + access->access = isl_map_read_from_str(ctx, buffer, -1); + + return access; +} + +/* Construct an access to the given iterator. + */ +static struct cuda_stmt_access *iterator_access(struct cuda_stmt *stmt, + int identifier, int len, int pos) +{ + isl_ctx *ctx = isl_set_get_ctx(stmt->domain); + struct cuda_stmt_access *access; + isl_constraint *c; + isl_map *map; + + map = isl_map_from_domain(isl_set_copy(stmt->domain)); + map = isl_map_add_dims(map, isl_dim_out, 1); + c = isl_equality_alloc(isl_map_get_dim(map)); + isl_constraint_set_coefficient_si(c, isl_dim_in, pos, 1); + isl_constraint_set_coefficient_si(c, isl_dim_out, 0, -1); + map = isl_map_add_constraint(map, c); + + access = isl_alloc_type(ctx, struct cuda_stmt_access); + assert(access); + access->text_offset = identifier; + access->text_len = len; + access->next = NULL; + access->read = 1; + access->write = 0; + + access->access = map; + + return access; +} + +/* Check if the identifier matches one of the iterators and + * if so return an access to that iterator. + */ +static struct cuda_stmt_access *stmt_extract_iterator(struct cuda_stmt *stmt, + int identifier, int len) +{ + int i; + unsigned n = isl_set_dim(stmt->domain, isl_dim_set); + + for (i = 0; i < n; ++i) { + const char *name; + name = isl_set_get_dim_name(stmt->domain, isl_dim_set, i); + if (!strncmp(name, stmt->text + identifier, len) && + name[len] == '\0') + return iterator_access(stmt, identifier, len, i); + } + + return NULL; +} + +static int is_identifier(int c) +{ + return isalnum(c) || c == '_'; +} + +static int is_assignment(const char *text, int pos, int *compound) +{ + if (text[pos] != '=') + return 0; + if (pos > 0 && text[pos - 1] == '=') + return 0; + if (text[pos + 1] == '=') + return 0; + if (pos >= 1 && text[pos - 1] == '>' && + !(pos >= 2 && text[pos - 2] == '>')) + return 0; + if (pos >= 1 && text[pos - 1] == '<' && + !(pos >= 2 && text[pos - 2] == '<')) + return 0; + + *compound = pos >= 1 && strchr("+-*/%&|^<>", text[pos - 1]); + + return 1; +} + +/* Extract accesses from stmt->text and store them in stmt->accesses. + * dim describes the parameters. + */ +void stmt_extract_accesses(struct cuda_stmt *stmt) +{ + int i, j; + size_t text_len = strlen(stmt->text); + size_t len = 50; + char *buffer; + int identifier = -1; + int end = -1; + unsigned nparam = isl_set_dim(stmt->domain, isl_dim_param); + unsigned nvar = isl_set_dim(stmt->domain, isl_dim_set); + struct cuda_stmt_access **next_access = &stmt->accesses; + + for (i = 0; i < nparam; ++i) + len += strlen(isl_set_get_dim_name(stmt->domain, + isl_dim_param, i)); + for (i = 0; i < nvar; ++i) + len += strlen(isl_set_get_dim_name(stmt->domain, isl_dim_set, i)); + buffer = isl_alloc_array(isl_set_get_ctx(stmt->domain), char, len); + assert(buffer); + + stmt->accesses = NULL; + for (i = 0; i < text_len; ++i) { + if (identifier < 0 && isalpha(stmt->text[i])) { + identifier = i; + end = -1; + } else if (identifier >= 0 && end < 0 && + is_identifier(stmt->text[i])) + continue; + else if (identifier >= 0 && end < 0 && isblank(stmt->text[i])) + end = i; + else if (identifier >= 0 && end >= 0 && isblank(stmt->text[i])) + continue; + else if (identifier >= 0 && stmt->text[i] == '[') { + if (end < 0) + end = i; + for (j = i + 1; j < text_len; ++j) + if (stmt->text[j] == ']' && + stmt->text[j + 1] != '[') + break; + *next_access = stmt_extract_access(stmt, buffer, + identifier, end - identifier, i, j - i + 1); + next_access = &(*next_access)->next; + end = identifier = -1; + i = j; + } else if (identifier >= 0) { + if (end < 0) + end = i; + *next_access = stmt_extract_iterator(stmt, identifier, + end - identifier); + if (*next_access) + next_access = &(*next_access)->next; + end = identifier = -1; + } else { + int compound; + + end = identifier = -1; + /* If we find an assignment and we have seen a single + * access, that access must be a write. + */ + if (is_assignment(stmt->text, i, &compound) && + stmt->accesses && !stmt->accesses->next) { + stmt->accesses->write = 1; + if (!compound) + stmt->accesses->read = 0; + } + } + } + + free(buffer); +} diff --git a/schedule.h b/schedule.h new file mode 100644 index 0000000..169e2fa --- /dev/null +++ b/schedule.h @@ -0,0 +1,50 @@ +#ifndef _SCHEDULE_H +#define _SCHEDULE_H + +/* An access to an array element or an iterator. + * Accesses to iterators have an access relation that maps to an unnamed space. + * An access may be both read and write. + */ +struct cuda_stmt_access { + /* Offset in stmt->text */ + int text_offset; + int text_len; + + /* Access reads elements */ + int read; + /* Access writes elements */ + int write; + + /* Index of the array reference group this reference belong to. */ + int group; + + /* Access relation */ + isl_map *access; + + struct cuda_stmt_access *next; +}; + +struct cuda_stmt { + isl_set *domain; + char *text; + + /* Number of tile dimensions. */ + int tile_len; + /* Number of initial parallel loops among tile dimensions. */ + int n_parallel; + + /* Linked list of accesses. */ + struct cuda_stmt_access *accesses; +}; + +__isl_give isl_map *wavefront(__isl_take isl_dim *dim, int len, + int first, int wave_len); +__isl_give isl_map *project_out(__isl_take isl_dim *dim, + int len, int first, int n); +__isl_give isl_map *projection(__isl_take isl_dim *dim, + int src_len, int dst_len); +__isl_give isl_set *extend(__isl_take isl_set *set, int dst_len); + +void stmt_extract_accesses(struct cuda_stmt *stmt); + +#endif diff --git a/scoplib_isl.c b/scoplib_isl.c new file mode 100644 index 0000000..c7ef270 --- /dev/null +++ b/scoplib_isl.c @@ -0,0 +1,231 @@ +/* + * Copyright 2010 INRIA Saclay + * + * Use of this software is governed by the GNU LGPLv2.1 license + * + * Written by Sven Verdoolaege, INRIA Saclay - Ile-de-France, + * Parc Club Orsay Universite, ZAC des vignes, 4 rue Jacques Monod, + * 91893 Orsay, France + */ + +#include "scoplib_isl.h" + +/* Set the dimension names of type "type" according to the elements + * in the array "names". + */ +__isl_give isl_dim *set_dim_names(__isl_take isl_dim *dim, + enum isl_dim_type type, char **names) +{ + int i; + + for (i = 0; i < isl_dim_size(dim, type); ++i) + dim = isl_dim_set_name(dim, type, i, names[i]); + + return dim; +} + + +/* Convert a scoplib_matrix_p containing the constraints of a domain + * to an isl_set. + */ +__isl_give isl_set *scoplib_matrix_to_isl_set(scoplib_matrix_p matrix, + __isl_take isl_dim *dim) +{ + int i, j; + int n_eq = 0, n_ineq = 0; + isl_ctx *ctx; + isl_mat *eq, *ineq; + isl_int v; + isl_basic_set *bset; + + isl_int_init(v); + + ctx = isl_dim_get_ctx(dim); + + for (i = 0; i < matrix->NbRows; ++i) + if (SCOPVAL_zero_p(matrix->p[i][0])) + n_eq++; + else + n_ineq++; + + eq = isl_mat_alloc(ctx, n_eq, matrix->NbColumns - 1); + ineq = isl_mat_alloc(ctx, n_ineq, matrix->NbColumns - 1); + + n_eq = n_ineq = 0; + for (i = 0; i < matrix->NbRows; ++i) { + isl_mat **m; + int row; + + if (SCOPVAL_zero_p(matrix->p[i][0])) { + m = &eq; + row = n_eq++; + } else { + m = &ineq; + row = n_ineq++; + } + + for (j = 0; j < matrix->NbColumns - 1; ++j) { + int t = SCOPVAL_get_si(matrix->p[i][1 + j]); + isl_int_set_si(v, t); + *m = isl_mat_set_element(*m, row, j, v); + } + } + + isl_int_clear(v); + + bset = isl_basic_set_from_constraint_matrices(dim, eq, ineq, + isl_dim_set, isl_dim_div, isl_dim_param, isl_dim_cst); + return isl_set_from_basic_set(bset); +} + + +/* Convert a scoplib_matrix_list_p describing a union of domains + * to an isl_set. + */ +__isl_give isl_set *scoplib_matrix_list_to_isl_set( + scoplib_matrix_list_p list, __isl_take isl_dim *dim) +{ + isl_set *set; + + set = isl_set_empty(isl_dim_copy(dim)); + for (; list; list = list->next) { + isl_set *set_i; + set_i = scoplib_matrix_to_isl_set(list->elt, isl_dim_copy(dim)); + set = isl_set_union(set, set_i); + } + + isl_dim_free(dim); + return set; +} + + +/* Return the number of lines until the next non-zero element + * in the first column of "access" or until the end of the matrix. + */ +static int access_len(scoplib_matrix_p access, int first) +{ + int i; + + for (i = first + 1; i < access->NbRows; ++i) + if (!SCOPVAL_zero_p(access->p[i][0])) + break; + + return i - first; +} + + +/* Convert an m x (1 + n + 1) scoplib_matrix_p [d A c] + * to an m x (m + n + 1) isl_mat [-I A c]. + */ +static __isl_give isl_mat *extract_equalities(isl_ctx *ctx, + scoplib_matrix_p matrix, int first, int n) +{ + int i, j; + int n_col; + isl_int v; + isl_mat *eq; + + n_col = matrix->NbColumns; + + isl_int_init(v); + eq = isl_mat_alloc(ctx, n, n + n_col - 1); + + for (i = 0; i < n; ++i) { + isl_int_set_si(v, 0); + for (j = 0; j < n; ++j) + eq = isl_mat_set_element(eq, i, j, v); + isl_int_set_si(v, -1); + eq = isl_mat_set_element(eq, i, i, v); + for (j = 0; j < n_col - 1; ++j) { + int t = SCOPVAL_get_si(matrix->p[first + i][1 + j]); + isl_int_set_si(v, t); + eq = isl_mat_set_element(eq, i, n + j, v); + } + } + + isl_int_clear(v); + + return eq; +} + + +/* Convert a scoplib_matrix_p describing a series of accesses + * to an isl_union_map with domain "dom" (in space "D"). + * Each access in "access" has a non-zero integer in the first column + * of the first row identifying the array being accessed. The remaining + * entries of the first column are zero. + * Let "A" be array identified by the first entry. + * The remaining columns have the form [B c]. + * Each such access is converted to a map { D[i] -> A[B i + c] } * dom. + * + * Note that each access in the input is described by at least one row, + * which means that there is no way of distinguishing between an access + * to a scalar and an access to the first element of a 1-dimensional array. + */ +__isl_give isl_union_map *scoplib_access_to_isl_union_map( + scoplib_matrix_p access, __isl_take isl_set *dom, char **arrays) +{ + int i, len, n_col; + isl_ctx *ctx; + isl_dim *dim; + isl_mat *eq, *ineq; + isl_union_map *res; + + ctx = isl_set_get_ctx(dom); + + dim = isl_set_get_dim(dom); + dim = isl_dim_drop(dim, isl_dim_set, 0, isl_dim_size(dim, isl_dim_set)); + res = isl_union_map_empty(dim); + + n_col = access->NbColumns; + + for (i = 0; i < access->NbRows; i += len) { + isl_basic_map *bmap; + isl_map *map; + int arr = SCOPVAL_get_si(access->p[i][0]) - 1; + + len = access_len(access, i); + + dim = isl_set_get_dim(dom); + dim = isl_dim_from_domain(dim); + dim = isl_dim_add(dim, isl_dim_out, len); + dim = isl_dim_set_tuple_name(dim, isl_dim_out, arrays[arr]); + + ineq = isl_mat_alloc(ctx, 0, len + n_col - 1); + eq = extract_equalities(ctx, access, i, len); + + bmap = isl_basic_map_from_constraint_matrices(dim, eq, ineq, + isl_dim_out, isl_dim_in, isl_dim_div, isl_dim_param, isl_dim_cst); + map = isl_map_from_basic_map(bmap); + map = isl_map_intersect_domain(map, isl_set_copy(dom)); + res = isl_union_map_union(res, isl_union_map_from_map(map)); + } + + isl_set_free(dom); + + return res; +} + + +/* Convert a scoplib_matrix_p schedule [0 A c] to + * the isl_map { i -> A i + c } in the space prescribed by "dim". + */ +__isl_give isl_map *scoplib_schedule_to_isl_map( + scoplib_matrix_p schedule, __isl_take isl_dim *dim) +{ + int n_row, n_col; + isl_ctx *ctx; + isl_mat *eq, *ineq; + isl_basic_map *bmap; + + ctx = isl_dim_get_ctx(dim); + n_row = schedule->NbRows; + n_col = schedule->NbColumns; + + ineq = isl_mat_alloc(ctx, 0, n_row + n_col - 1); + eq = extract_equalities(ctx, schedule, 0, n_row); + + bmap = isl_basic_map_from_constraint_matrices(dim, eq, ineq, + isl_dim_out, isl_dim_in, isl_dim_div, isl_dim_param, isl_dim_cst); + return isl_map_from_basic_map(bmap); +} diff --git a/scoplib_isl.h b/scoplib_isl.h new file mode 100644 index 0000000..0ded70f --- /dev/null +++ b/scoplib_isl.h @@ -0,0 +1,22 @@ +#ifndef SCOPLIB_ISL_H +#define SCOPLIB_ISL_H + +#include +#include +#include +#include + +#include "scoplib/statement.h" + +__isl_give isl_dim *set_dim_names(__isl_take isl_dim *dim, + enum isl_dim_type type, char **names); +__isl_give isl_set *scoplib_matrix_to_isl_set(scoplib_matrix_p matrix, + __isl_take isl_dim *dim); +__isl_give isl_set *scoplib_matrix_list_to_isl_set( + scoplib_matrix_list_p list, __isl_take isl_dim *dim); +__isl_give isl_union_map *scoplib_access_to_isl_union_map( + scoplib_matrix_p access, __isl_take isl_set *dom, char **arrays); +__isl_give isl_map *scoplib_schedule_to_isl_map( + scoplib_matrix_p schedule, __isl_take isl_dim *dim); + +#endif -- 2.11.4.GIT

H&uFBv|}d| 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 0}. +@end ifnottex +For instance for the statement @code{S3} the set of constraints is: + +@tex +$$ +\hbox{$ \cases{ i - 2 &$\geq 0$\cr + -i + N &$\geq 0$\cr + j - 2 &$\geq 0$\cr + -j + N &$\geq 0$}$} +$$ +@end tex + +@ifnottex +@example +@group + i - 2 >= 0 + -i + N >= 0 + j - 2 >= 0 + -j + N >= 0 +@end group +@end example +@end ifnottex + +@noindent Lastly, we translate the constraint system to the form +@strong{domain matrix}@code{ * }@emph{iteration vector}@code{ >= 0} +(please someone show me how to do this in TeX -not LaTeX- for the +texinfo manual !): +@example +@group +[ 1 0 0 -2 ] [ i ] [ 0 ] +[ -1 0 1 0 ] [ j ] [ 0 ] +[ 0 1 0 -2 ] * [ N ] >= [ 0 ] +[ 0 -1 1 0 ] [ 1 ] [ 0 ] +@end group +@end example + +@noindent The domain matrix (along with the iteration vector which +is most of the time an implicit information) will +be used in all our tools to provide the informations on the iteration +domain of a given statement. + +@node Scattering Function +@subsection Scattering Function + +There is no ordering information inside the iteration domain: it only describes +the set of statement instances but @strong{not} the order in which they have +to be executed relatively to each other. In the past the lexicographic order +of the iteration domain was considered, this is no more true +(especially when using CLooG). If we don't give any ordering information, this +means that the statement instances may be executed in any order +(this is useful, e.g., to specify parallelism), but some statement instances +may depend on some others and it may be critical to enforce a given order (or +non-order). Hence we need another information. + +We call @emph{scattering} any kind of ordering information in the Polyhedral +Model. There exists many kind of ordering indeed, as @emph{allocation}, +@emph{scheduling}, @emph{chunking} etc. Nevertheless they are all expressed +in the same way, using @emph{logical stamps} that can have various semantics. + +In the case of @strong{scheduling}, the logical stamps are logical dates that +express at which date a statement instance have to be executed. For instance, +let us consider the following three statements: + +@example +@group +x = a + b; // S1 +y = c + d; // S2 +z = a * b; // S3 +@end group +@end example + +@noindent The scheduling of a statement @code{S} is typically +denoted by +@tex +$\theta_{S}$. +@end tex +@ifnottex +T_S. +@end ifnottex +Let us consider the following logical dates for each statement: + +@tex +@example +@group +$\theta_{S1} = 2$ +$\theta_{S2} = 3$ +$\theta_{S3} = 1$ +@end group +@end example +@end tex + +@ifnottex +@example +@group +T_S1 = 1 +T_S2 = 2 +T_S3 = 3 +@end group +@end example +@end ifnottex + +@noindent It means that statement @code{S3} have to be executed at logical date +@code{1}, statement @code{S1} have to be executed at logical date +@code{2} and statement @code{S2} have to be executed at logical date +@code{3}. The target code have to respect this scheduling (the order of +the logical dates), hence it would look like the following where the +variable @code{t} denotes the time: + +@example +@group +t = 1; +z = a * b; // S3 +t = 2; +x = a + b; // S1 +t = 3; +y = c + d; // S2 +@end group +@end example + +@noindent When some statements share the same logical date, this means that, +once the program reaches this logical date, the two statements can be executed +in any order, or better, in parallel. For instance let us consider the +following scheduling: + +@tex +@example +@group +$\theta_{S1} = 1$ +$\theta_{S2} = 2$ +$\theta_{S3} = 1$ +@end group +@end example +@end tex + +@ifnottex +@example +@group +T_S1 = 1 +T_S2 = 2 +T_S3 = 1 +@end group +@end example +@end ifnottex + +@noindent Statements @code{S1} and @code{S3} have the same logical date, +hence the target code would be: + +@example +@group +t = 1; +#pragma omp parallel sections +@{ + #pragma omp section + @{ + x = a + b; // S1 + @} + #pragma omp section + @{ + z = a * b; // S3 + @} +@} +t = 2; +y = c + d; // S2 +@end group +@end example + +Logical dates may be multidimensional, as clocks: the first dimension +corresponds to days (most significant), next one is hours (less +significant), the third to minutes and so on. For instance we can consider +the following multidimensional schedules for our example: + +@tex +@example +@group +$\theta_{S1} = (1,1)$ +$\theta_{S2} = (2,1)$ +$\theta_{S3} = (1,2)$ +@end group +@end example +@end tex + +@ifnottex +@example +@group +T_S1 = (1,1) +T_S2 = (2,1) +T_S3 = (1,2) +@end group +@end example +@end ifnottex + +@noindent It is not very hard to decypher the meaning of such scheduling. +Because of the first dimension, statements @code{S1} and @code{S3} will be +executed before statement @code{S2} (@code{S1} and @code{S3} are executed at +day 1, while @code{S2} is executed at day 2). The second dimension is not +really useful there for @code{S2} because it is the only statement executed +at day 2. Nevertheless it allows to order @code{S1} and +@code{S3} relatively to each other since @code{S1} is executed at hour 1 of day +1 while @code{S3} is executed at hour 2 of day 1. +The corresponding target code is the following, with some +additional time variables for a better view of the ordering (@code{t1} +corresponds to the first time dimension, @code{t2} to the second one): + +@example +@group +t1 = 1; +t2 = 1; +x = a + b; // S1 +t2 = 2; +z = a * b; // S3 +t1 = 2; +t2 = 1; +y = c + d; // S2 +@end group +@end example + +In the case of @strong{allocation} (in the litterature we can find some +papers that call it @emph{placement}), the logical stamps are a processor +number that expresses on which processor a statement instance has to be +executed. Typically, allocations are written in the same way as scheduling +(hence the general term of @emph{scattering}), here we denote it @math{P_S} for a +statement @code{S}. For instance, let us consider the following +allocation: + +@tex +@example +@group +$P_{S1} = 1$ +$P_{S2} = 2$ +$P_{S3} = 1$ +@end group +@end example +@end tex + +@ifnottex +@example +@group +P_S1 = 1 +P_S2 = 2 +P_S3 = 1 +@end group +@end example +@end ifnottex + +@noindent The corresponding target code have to take into account that both +statements @code{S1} and @code{S3} have to be executed on the same processor +(they have the same logical number 1) and that statement @code{S2} have +to be executed on another processor (logical number 2). A possible target code +is the following: + +@example +@group +#pragma omp parallel sections +@{ + #pragma omp section + @{ + // Logical processor 1 + x = a + b; // S1 + z = a * b; // S3 + @} + #pragma omp section + @{ + // Logical processor 2 + y = c + d; // S2 + @} +@} +@end group +@end example + +@noindent We can note that no order have been specified for the +statements @code{S1} and @code{S3} that are executed on the same processor. +Hence any order is satisfying. For sake of flexibility, it is usual to build +a scattering whose various dimensions do not have the same semantics. A +typical construction is @emph{space/time mapping} where the first @code{n} +dimensions are devoted to allocation, then the last @code{m} +dimensions are devoted to scheduling. Typically, space/time mapping is +written in the same way as scheduling (hence again the general term of +@emph{scattering}), here we denote it for a statement @code{S} as @math{M_S}. +For instance, let us consider the following space/time mapping for our +example where one dimension is devoted for mapping and one dimension is +devoted to scheduling: + +@tex +@example +@group +$M_{S1} = (1,2)$ +$M_{S2} = (2,1)$ +$M_{S3} = (1,1)$ +@end group +@end example +@end tex + +@ifnottex +@example +@group +M_S1 = (1,2) +M_S2 = (2,1) +M_S3 = (1,1) +@end group +@end example +@end ifnottex + +@noindent Here we have the same first dimension as the previous example, thus +the allocation of the statements to processors is the same. The second +dimension precises on a given processor at which logical date a statement +instance has to be executed. Here, the statement @code{S1} is executed at +day 2 on processor 1 while the statement @code{S3} is executed at day 1 onto +the same processor. It follows this space/time mapping corresponds to the +following target code (we added an additional variable to represent the +local logical clocks): + +@example +@group +#pragma omp parallel sections +@{ + #pragma omp section + @{ + // Logical processor 1 + t = 1; + z = a * b; // S3 + t = 2; + x = a + b; // S1 + @} + #pragma omp section + @{ + // Logical processor 2 + t = 1; + y = c + d; // S2 + @} +@} +@end group +@end example + +For the same reason as discussed for iteration domains +(@pxref{Iteration Domain}), it is not possible to define a scattering for +each statement instance, especially if the statement belongs to a +(possibly parametric) loop. The iteration vector fully defines an +instance of a given statement. Thus, a practical way to provide a scattering +for each instance of a given statement is to use a @emph{function} +that depends on the iteration vector. In this way the function may give +for each iteration vector a different scattering. We call these functions +@strong{scattering functions}. Scattering functions are @emph{affine} +functions of the outer loop counter and the global parameters. +For instance, let us consider the following source code: + +@example +@group +for (i = 2; i <= 4; i++) + for (j = 2; j <= 4; j++) + P[i+j] += A[i] + B[j]; // S4 +@end group +@end example + +@noindent The iteration domain of the statement @code{S4} is: + + +@tex +$$D _{S4} = \{(i,j) \in Z^2 \; | \; 2 \leq i \leq 4 \land 2 \leq j \leq 4 \}.$$ +@end tex +@ifnottex +@example +@group +D_S4= @{(i,j) in Z^2 | 2 <= i <= 4 && 2 <= j <= 4 @}. +@end group +@end example +@end ifnottex + +@noindent If you are still not comfortable with the mathematical notation, it +corresponds to the following graphical representation: + +@image{images/basic2,3cm} + +@noindent The list of the statement instances of @code{S4} (the integral +points of its iteration domain) corresponds to the following iteration vectors: + +@example +@group +iteration vector + (2,2) + (2,3) + (2,4) + (3,2) + (3,3) + (3,4) + (4,2) + (4,3) + (4,4) +@end group +@end example + +@noindent Let us suppose we want to schedule the instances of the statement +@code{S4} (the integral points of its iteration domain) using the following +scheduling function: + +@tex +@example +@group +$\theta_{S4}(i,j) = (j+2,3*i+j)$ +@end group +@end example +@end tex + +@ifnottex +@example +@group +T_S4(i,j) = (j+2,3*i+j) +@end group +@end example +@end ifnottex + +@noindent We only have to apply the function to each iteration vector to find +the logical date of each instance: + +@example +@group +iteration vector logical date + (2,2) --> (4,8) + (2,3) --> (5,9) + (2,4) --> (6,10) + (3,2) --> (4,11) + (3,3) --> (5,12) + (3,4) --> (6,13) + (4,2) --> (4,14) + (4,3) --> (5,15) + (4,4) --> (6,16) +@end group +@end example + +Polyhedral Model users do not have to take care about the generation of a +target code that respects the scattering: the CLooG tool is there to +solve the problem quite easily (@code{http://www.cloog.org}). For the previous +example, the target code would be the following (@code{t1} and @code{t2} +corresponds to the two dimensions of the logical date): + +@example +@group +for (t1 = 4; t1 <= 6; t1++) @{ + for (t2 = t1+4; t2 <= t1+10; t2++) @{ + if ((-t1+t2+2)%3 == 0) @{ + i = (-t1+t2+2)/3 ; + j = t1-2 ; + P[i+j] += A[i] + B[j]; // S4 + @} + @} +@} +@end group +@end example + + + +Obviously with such a twisted scheduling, it is hard to see the "meaning" +of the transformation. To name any kind of program transformation as +a magic spell ("tile", "fuse", "skew"...) is an old bad habit that should +be changed in the Polyhedral Model: a scheduling may be an arbitrary complex +sequence of basic-old-good transformations. Nevertheless it is most of the +time quite easy to translate well known transformations to schedules. For +instance, let us consider this new scheduling function: + +@tex +@example +@group +$\theta_{S4}(i,j) = (j,i)$ +@end group +@end example +@end tex + +@ifnottex +@example +@group +T_S4(i,j) = (j,i) +@end group +@end example +@end ifnottex + +@noindent Using CLooG, we can generate the target code: + +@example +@group +for (t1 = 2; t1 <= 4; t1++) @{ + for (t2 = 2; t2 <= 4; t2++) @{ + i = t2; + j = t1; + P[i+j] += A[i] + B[j]; // S4 + @} +@} +@end group +@end example + + +@noindent It is easy to see (and analyze) that it corresponds to a classical +@emph{loop interchange} transformation. + +A very useful example of multi-dimensional scattering functions is +the @strong{scheduling of the original program}. +The method to compute it is quite simple (@pxref{Fea92}). The idea is to +build an abstract syntax tree of the program and to read the scheduling for +each statement. For instance, let us consider the following implementation of +a Cholesky factorization: + +@example +@group +/* A Cholesky factorization kernel. */ +for (i=1;i<=N;i++) @{ + for (j=1;j<=i-1;j++) @{ + a[i][i] -= a[i][j] ; /* S1 */ + @} + a[i][i] = sqrt(a[i][i]) ; /* S2 */ + for (j=i+1;j<=N;j++) @{ + for (k=1;k<=i-1;k++) @{ + a[j][i] -= a[j][k]*a[i][k] ; /* S3 */ + @} + a[j][i] /= a[i][i] ; /* S4 */ + @} + @} +@} +@end group +@end example + +@noindent The corresponding abstract syntax tree is given in the following +figure. It directly gives the scattering functions (schedules) for all the +statements of the program. + +@image{images/tree,6cm} + +@tex +$$ +\hbox{$ \cases{ \theta _{S1}(i,j) &$= (0,i,0,j,0)$\cr + \theta _{S2}(i) &$= (0,i,1)$\cr + \theta _{S3}(i,j,k) &$= (0,i,2,j,0,k,0)$\cr + \theta _{S4}(i,j) &$= (0,i,2,j,1)$}$} +$$ +@end tex + +@ifnottex +@example +@group +T_S1(i,j) = (0,i,0,j,0) +T_S2(i) = (0,i,1) +T_S3(i,j,k) = (0,i,2,j,0,k,0) +T_S4(i,j) = (0,i,2,j,1) +@end group +@end example +@end ifnottex + +@noindent These schedules depend on the iterators and give for each instance +of each statement a unique execution date. Using such scattering functions +allows CLooG to re-generate the input code. + +@noindent To easily manipulate the scattering function of any +statement @code{S}, we translate it to the matrix form: +@tex +@math{\theta_S}(@emph{iteration vector}) +@end tex +@ifnottex +T_S(@emph{iteration vector}) +@end ifnottex +@code{ = }@strong{scattering matrix}@code{ * }@emph{iteration vector}. +For instance let us consider again our previous example +@tex +$\theta_{S4}(i,j) = (j+2,3*i+j).$ +@end tex +@ifnottex +T_S4(i,j) = (j+2,3*i+j). +@end ifnottex +We write it in the following way (again please someone show me how to do +this in TeX -not LaTeX- for the texinfo manual !): +@example +@group + [ i ] [ 0 1 2 ] [ i ] +T_S4([ j ]) = [ 3 1 0 ] * [ j ] + [ 1 ] [ 1 ] +@end group +@end example + +@noindent The scattering matrix (along with the iteration vector which +is most of the time an implicit information) will +be used in all our tools to provide the informations on the scattering +of a given statement. + + +@node Access Function +@subsection Access Function + +Before applying any transformation, it is essential to deeply analyze both the +original program and the transformation to ensure the transformation does not +imply any modification of the original program semantics. In the Polyhedral +Model, we can reach a @strong{total analysis power}: we are able to achieve +an exact analysis when all the memory accesses are made through arrays +(note that variables are a particular case of arrays since they are simply +arrays with only one memory location) with affine subscripts that depend +on outer loop counters and global parameters (note that @emph{subscripts} +are sometimes called @emph{index} or @emph{accesses} in the litterature). + +For instance let us consider the array access @code{A[2*i+j][j][i+N]}. It has +three dimensions, each subscript dimension is an affine form of some outer loop +iterarors (@code{i} and @code{j}) and global parameters (@code{N}) hence +it corresponds to an acceptable array access in the Polyhedral Model. + +Each array access can target a different memory cell depending on the +statement instance, i.e., depending on the iteration vector. +Thus we use access functions (or subscript functions or index functions as you +prefer) depending on the iteration vector to describe an array access. In our +example, the access function would be written +@math{F_A(i,j) = (2*i+j,j,i+N)}. + +@noindent To easily manipulate the access function of any +array @code{A}, we translate it to the matrix form: +@math{F_A}(@emph{iteration vector}) +@code{ = }@strong{access matrix}@code{ * }@emph{iteration vector}. +For instance let us consider again our previous example: we write it in the +following way (again please someone show me how to do this in TeX -not LaTeX- +for the texinfo manual !): +@example +@group + [ i ] [ 2 1 0 0 ] [ i ] +F_A([ j ]) = [ 0 1 0 0 ] * [ j ] + [ N ] [ 1 0 1 0 ] [ N ] + [ 1 ] [ 1 ] +@end group +@end example + +@noindent The access matrix (along with the iteration vector which +is most of the time an implicit information) will +be used in all our tools to provide the informations on the access +of a given statement. + + + +@c % *********************** Using the Clan Software ************************** +@node Clan Software +@chapter Using the Clan Software + + +@menu +* A First Example:: +* Writing The Input File:: +* Reading The Output File:: +* Calling Clan:: +* Clan Options:: +@end menu + +@c %/************************************************************************* +@c % * A FIRST EXAMPLE * +@c % *************************************************************************/ +@node A First Example +@section A First Example +Clan takes as input a source code file than can be written in either C or +C++ or C# or Java (or any other imperative language that is close enough +to C). It is very simple as it only translates a part of a program that can +be represented using the Polyhedral model (@pxref{Polyhedral Representation}) in +a matrix form. Clan does not find itself the program parts that could be +represented using the Polyhedral Model. More complex tools like WRAP-IT for the +ORC compiler (@code{http://www.lri.fr/~girbal/site_wrapit})or the GRAPHITE +branch of GCC (@code{http://gcc.gnu.org/wiki/Graphite}) are devoted to +such a complex, highly technical problem. Using Clan, the user has to specify +thanks to pragmas where begins the SCoP he is interested by, and where it ends. + +For instance, let us consider the following source code in C of a matrix-matrix +multiply program that reads two matrices, achieves the multiply then prints +the result. Let us also consider that the user is only interested in the +matrix-matrix multiply kernel: + +@example +/* matmul.c 128*128 matrix multiply */ +#include +#define N 128 + +int main() @{ + int i,j,k; + float a[N][N], b[N][N], c[N][N]; + + /* We read matrix a then matrix b */ + for (i = 0; i < N; i++) + for (j = 0; j < N; j++) + scanf(" %f",&a[i][j]); + for (i = 0; i < N; i++) + for (j = 0; j < N; j++) + scanf(" %f",&b[i][j]); + + /* c = a * b */ +#pragma scop + for (i = 0; i < N; i++) + for (j = 0; j < N; j++) @{ + c[i][j] = 0.0; + for (k = 0; k < N; k++) + c[i][j] = c[i][j] + a[i][k]*b[k][j]; + @} +#pragma endscop + + /* We print matrix c */ + for (i = 0; i < N; i++) @{ + for (j = 0; j < N; j++) + printf("%6.2f ",c[i][j]); + printf("\n"); + @} + + return 0; +@} +@end example + +The tags to ask Clan to consider a given part of the code are provided thanks +to the pragmas @code{#pragma scop} and @code{#pragma endscop}. It can have +different forms depending on the input language. This is explained in +a further section (@pxref{Writing The Input File}). + +This source code file may be called @samp{matmul.c} +(this example is provided in the Clan distribution as +@code{test/matmul.c}) and we can ask Clan to process it +and to generate the polyhedral representation by a simple call to Clan +with this file as input: @samp{clan matmul.c}. By default, Clan will print +the polyhedral representation in the standard output: + +@example +# [File generated by Clan 1.0.0 64 bits] + +SCoP + +# =============================================== Global +# Language +C + +# Context +0 3 + +# Parameter names are provided +1 +# Parameter names +N + +# Number of statements +2 + +# =============================================== Statement 1 +# ---------------------------------------------- 1.1 Domain +# Iteration domain +1 +4 5 + 1 1 0 0 0 ## i >= 0 + 1 -1 0 1 -1 ## -i+N-1 >= 0 + 1 0 1 0 0 ## j >= 0 + 1 0 -1 1 -1 ## -j+N-1 >= 0 + +# ---------------------------------------------- 1.2 Scattering +# Scattering function is provided +1 +# Scattering function +5 5 + 0 0 0 0 0 ## 0 + 0 1 0 0 0 ## i + 0 0 0 0 0 ## 0 + 0 0 1 0 0 ## j + 0 0 0 0 0 ## 0 + +# ---------------------------------------------- 1.3 Access +# Access informations are provided +1 +# Read access informations +0 5 +# Write access informations +2 5 + 1 1 0 0 0 ## c[i][j] + 0 0 1 0 0 ## + +# ---------------------------------------------- 1.4 Body +# Statement body is provided +1 +# Original iterator names +i j +# Statement body +c[i][j]=0.0; + + +# =============================================== Statement 2 +# ---------------------------------------------- 2.1 Domain +# Iteration domain +1 +6 6 + 1 1 0 0 0 0 ## i >= 0 + 1 -1 0 0 1 -1 ## -i+N-1 >= 0 + 1 0 1 0 0 0 ## j >= 0 + 1 0 -1 0 1 -1 ## -j+N-1 >= 0 + 1 0 0 1 0 0 ## k >= 0 + 1 0 0 -1 1 -1 ## -k+N-1 >= 0 + +# ---------------------------------------------- 2.2 Scattering +# Scattering function is provided +1 +# Scattering function +7 6 + 0 0 0 0 0 0 ## 0 + 0 1 0 0 0 0 ## i + 0 0 0 0 0 0 ## 0 + 0 0 1 0 0 0 ## j + 0 0 0 0 0 1 ## 1 + 0 0 0 1 0 0 ## k + 0 0 0 0 0 0 ## 0 + +# ---------------------------------------------- 2.3 Access +# Access informations are provided +1 +# Read access informations +6 6 + 1 1 0 0 0 0 ## c[i][j] + 0 0 1 0 0 0 ## + 2 1 0 0 0 0 ## a[i][k] + 0 0 0 1 0 0 ## + 3 0 0 1 0 0 ## b[k][j] + 0 0 1 0 0 0 ## +# Write access informations +2 6 + 1 1 0 0 0 0 ## c[i][j] + 0 0 1 0 0 0 ## + +# ---------------------------------------------- 2.4 Body +# Statement body is provided +1 +# Original iterator names +i j k +# Statement body +c[i][j]=c[i][j]+a[i][k]*b[k][j]; + + +# =============================================== Options +@end example + +We will not describe here precisely the structure and the components of this +output, this is described in depth in a further section +(@pxref{Reading The Output File}). This file format, called @code{.scop} has +been designed to be the input file format of most of the polyhedral tools. +If you read the description of the polyhedral representation of programs, +you should already feel familiar with this file format +(@pxref{Polyhedral Representation}). + + +@c %/************************************************************************* +@c % * Input file * +@c % *************************************************************************/ +@node Writing The Input File +@section Writing The Input File + +The input file of Clan is a source code file written in any language based on +C for the @code{for} loop, the @code{if} and for the array accesses. +C, C++, Java and C# are good examples that should work pretty well with Clan. + +The input file may contain a static control part (i.e., a part of the +program that can be represented using the Polyhedral Model as described in +the corresponding chapter, @pxref{Polyhedral Representation}) delimitated +@strong{by the user} thanks to pragmas. Clan trusts the user: it will not check +hardly whether the program part is actually a SCoP or not. It will only try to +translate the program part to a polyhedral representation and will fail with +@emph{syntax error} if it reads something wrong. + +In C, C++ and C#, the pragma to tag the beginning of the SCoP is: +@example +@group +#pragma scop +@end group +@end example +@noindent and the pragma to tag the end of the SCoP is: +@example +@group +#pragma endscop +@end group +@end example + +In Java, the pragma to tag the beginning of the SCoP is: +@example +@group +/*@@ scop */ +@end group +@end example +@noindent and the pragma to tag the end of the SCoP is: +@example +@group +/*@@ end scop */ +@end group +@end example + + + +@c %/************************************************************************* +@c % * Output file * +@c % *************************************************************************/ +@node Reading The Output File +@section Reading The Output File + +The output text file of Clan provides an explicit polyhedral representation of +a static control part. The output file format is called @emph{.scop} format. +It has been designed by various researchers in polyhedral compilation from +various institutions. It builds on previous popular polyhedral file formats +like @emph{.cloog} to provide a unique, extensible file format to every +polyhedral compilation tools (including future versions of CLooG). This file +is composed of two main parts. The first part is devoted to the polyhedral +representation of a SCoP. It contains what is strictly necessary to enter a +complete source-to-source framework in the polyhedral model and to output a +semantically equivalent code for the SCoP, from analysis to code generation. +The second part of the file contains options, i.e. extensions to provide +additional informations to some tools. + +The following grammar describes the structure of the first part of the +.scop file format where terminals are preceeded by "_". Each +relevant part will be explained in more details momentarily. Its looks +long but it has been artificially extended to be easily understood and +it can be easily simplified: + +@example +File ::= SCoP +SCoP ::= "SCoP" Context Statements +Context ::= Language Domain Parameters +Statements ::= Nb_statements Statement_list +String_list ::= _String String_list | (void) +Statement_list ::= Statement Statement_list | (void) +Domain_list ::= Domain Domain_list | (void) +Statement ::= Iteration_domain Scattering Access Body +Iteration_domain ::= Domain_union +Domain_union ::= Nb_domains Domain_list +Scattering ::= "0" | "1" Scattering_function +Access ::= "0" | "1" Read_function Write_function +Parameters ::= "0" | "1" Parameter_list +Body ::= "0" | "1" Iterator_list Body_text +Language ::= "C" | "C++" | "C#" | "Java" | "Toy" +Parameter_list ::= String_list +Iterator_list ::= String_list +Domain ::= _Matrix +Scattering_function ::= _Matrix +Read_function ::= _Matrix +Write_function ::= _Matrix +Nb_statements ::= _Integer +Nb_domains ::= _Integer +Body_text ::= _String +@end example + + +@itemize @bullet +@item @samp{Context} represents the informations that are + shared by all the statements. It consists on + the language used (which can be @samp{C}, @samp{C++}, @samp{C#} + or @samp{Java}), the global constraints on parameters and + optionally the parameter names. The set of constraints on parameters is + essential since it provides the number of parameters. The @samp{Domain} + encoding includes the number of unknown (here the number of parameters) + (@pxref{Domain Representation}). Even if there are no constraints, this + number has to be correct. + After the constraints, it is possible to provide the list of parameter + names (the textual names in the original program). A @samp{0} means + we don't provide the list of parameter names, and a @samp{1} means + the list of parameter names is provided afterward. The original + parameter names + are necessary for the code generator to be able to generate a code + that can replace directly the SCoP in the original program by + copy/paste. In the case of a @samp{0}, parameter names will probably + be generated by the code generator (this is the case when using CLooG) + or will be extracted from another input source. +@item @samp{Statements} represents the informations on the statements. + @samp{Nb_statements} is the number of statements in the program, + i.e. the number of @samp{Statement} items in the @samp{Statement_list}. + @samp{Statement} represents the informations on a given statement. + To each statement is associated four informations, the first one is + mandatory while the three others are optional. The statement iteration + domain @samp{Iteration_domain} is the required information, then one can + provide optionally a scattering function, the access functions and + the statement body, in this order. Each optional information is + preceeded by a boolean that precises whether the optional information is + provided or not. + The iteration domain (@pxref{Iteration Domain}) is represented using a + matrix (@pxref{Domain Representation}). Next, the scattering function + (@pxref{Scattering Function}) is represented using a matrix as well + (@pxref{Scattering Representation}). The access functions + (@pxref{Access Function}) are represented using two matrices, one for read + accesses and another one for write accesses + (@pxref{Access Representation}). The statement body is made of two + parts: first, the list of surrounding loop counters in the original + program and second, the text string of the statement. This + representation allows to apply the substitution of the original + iterators with new iterators in the target program. +@end itemize + +The main terminal parts (domains, scattering and access functions) are +detailed in the next subsections. Lastly, we will describe the option part +(@pxref{Option Part}). + +@menu +* Domain Representation:: +* Scattering Representation:: +* Access Representation:: +* Option Part:: +@end menu + +@node Domain Representation +@subsection Domain Representation +As shown by the grammar, the input file describes the various informations +thanks to strings, integers and domains. Each domain is defined by a set of +constraints in the PolyLib format (@pxref{Wil93}). They have the +following syntax: +@enumerate +@item Some optional comment lines beginning with @samp{#}. +@item The row and column numbers, possibly followed by comments. +@item The constraint rows. Each row corresponds to a constraint the + domain have to satisfy. Each row must be on a single line and is possibly + followed by comments. The constraint is an equality @math{p(x) = 0} if the + first element is 0, an inequality @math{p(x) \geq 0} if the first element + is 1. The next elements are the unknown coefficients, followed by + the parameter coefficients. The last element is the constant factor. +@end enumerate +For instance, assuming that @samp{i}, @samp{j} and @samp{k} are the loop +iterators and @samp{m} and @samp{n} are the parameters, the domain defined by +the following constraints : + +@tex +$$ +\hbox{$ \cases{ -i + m &$\geq 0$\cr + -j + n &$\geq 0$\cr + i + j - k &$\geq 0$}$} +$$ +@end tex +@ifnottex +@example +@group + -i + m >= 0 + -j + n >= 0 +i + j - k >= 0 +@end group +@end example +@end ifnottex + +@noindent can be written in the input file as follows : + +@example +@group +# This is a domain +3 7 # 3 lines and 7 columns +# eq/in i j k m n 1 + 1 -1 0 0 1 0 0 # -i + m >= 0 + 1 0 -1 0 0 1 0 # -j + n >= 0 + 1 1 1 -1 0 0 0 # i + j - k >= 0 +@end group +@end example + +Each iteration domain @samp{Iteration_domain} of a given statement +is a @emph{union} of polyhedra +@samp{Domain_union}. A union is defined by its number of elements +@samp{Nb_domains} and the elements themselves @samp{Domain_list}. +For instance, let us consider the following pseudo-code: + +@example +@group +for (i = 1; i <= n; i++) @{ + if ((i >= m) || (i <= 2*m)) + S1; +@} +@end group +@end example + +@noindent The iteration domain of @samp{S1} can be divided into two +polyhedra and written in the .scop file as follows: + +@example +@group +2 # Number of polyhedra in the union +# First domain +3 5 # 3 lines and 5 columns +# eq/in i m n 1 + 1 1 0 0 -1 # i >= 1 + 1 -1 0 1 0 # i <= n + 1 1 -1 0 0 # i >= m +# Second domain +3 5 # 3 lines and 5 columns +# eq/in i m n 1 + 1 1 0 0 -1 # i >= 1 + 1 -1 0 1 0 # i <= n + 1 -1 2 0 0 # i <= 2*m +@end group +@end example + +@node Scattering Representation +@subsection Scattering Representation +Scattering functions are depicted in the input file thanks a representation +very close to the domain one. The difference is each row do not describe a +constraint but a scattering function dimension (@pxref{Scattering Function}). +By convention, the first element of each row (the one that defines whether +the constraint is an equality or an inequality for domains) +@emph{must be set to 0}. The next elements are the unknown coefficients, +followed by the parameter coefficients. The last element is the constant +factor. For instance, assuming that @samp{i}, @samp{j} and @samp{k} are the loop +iterators and @samp{m} and @samp{n} are the parameters, the scattering +function +@tex +$\theta_{S}(i,j,k) = (j+2,3*i+j,k+n+1)$ +@end tex +@ifnottex +@example +T_@{S@}(i,j,k) = (j+2,3*i+j,k+n+1) +@end example +@end ifnottex +may be written in a .scop file in the following way: + +@example +@group +# A scattering function +3 7 # 3 dimensions and 7 columns +# 0 i j k m n 1 + 0 0 1 0 0 0 2 # j+2 + 0 3 1 0 0 0 0 # 3*i+j + 0 0 0 1 0 1 1 # k+n+1 +@end group +@end example + +Note that this representation is different from the .cloog format: the useless +and error-prone identity matrix part disappeared. + +The scattering function extracted by Clan is the scheduling of the original +program as described in a previous section (@pxref{Scattering Function}). It +allows a code generator (like CLooG) to reconstruct directly the original +program or a dependence analyzer (like Candl) to achieve its data dependence +calculation. + +@node Access Representation +@subsection Access Representation + +Access functions are depicted in the input file thanks a representation +very close to the domain one. The difference is each row do not describe a +constraint but a access function dimension (@pxref{Access Function}). +Moreover, the matrix representation do not describes only one access function +but a set of access functions. Each array accessed in the SCoP has a unique +strictly positive identification number. The first element of each row (the +one that defines whether the constraint is an equality or an inequality for +domains) corresponds to the array identifier iff the row corresponds to the +first dimension of the access function. If the first element is 0, this means +the row corresponds to the next dimension of the access function, with respect +to the previous row. The next elements are the unknown coefficients, +followed by the parameter coefficients. The last element is the constant +factor. For instance, assuming that @samp{i}, @samp{j} and @samp{k} are the loop +iterators and @samp{m} and @samp{n} are the parameters, the set of array +accesses @code{A[2*i+j][j][i+n]}, @code{B[i+j]} and @code{A[k][j][1]} (the +identifier of @code{A} is 1 and the identifier of @code{B} is 2) +may be written in a .scop file in the following way: + +@example +@group +# A set of access functions +7 7 # 7 rows and 7 columns +# id i j k m n 1 + 1 2 1 0 0 0 0 # A[2*i+j][j][i+n] + 0 0 1 0 0 0 0 # + 0 1 0 0 0 1 0 # + 2 1 1 0 0 0 0 # B[i+j] + 1 0 0 1 0 0 0 # A[k][j][1] + 0 0 1 0 0 0 0 # + 0 0 0 0 0 0 1 # +@end group +@end example + + +@node Option Part +@subsection Option Part + +The end of the .scop file is made of a succession of options delimited using +XML-like tags. Each tool will take care of known options and will ignore the +others. There is no specification for the option body as it is +tool-dependent. Nevertheless, authors are invited to put the name of +the tool inside the option name to avoid conflicts. A reserved +option name is @samp{Comments} that allows to put some comments in the second +part of the .scop file. For instance, this could be a possible +second part of a .scop file: + +@example +@group + + Just a comment example. +<\Comments> + + + This is supposed to provide CLooG some interesting + additional informations. +<\CLooG foobar> +@end group +@end example + +A second reserved name is @samp{arrays}, Clan can optionally print a +table of the arrays referenced in the access functions. For instance, for a program referencing first the array @samp{FOO}, then the array @samp{BAR}: + +@example +@group + +# Number of referenced arrays +2 +# First reference +1 FOO +# Second reference +2 BAR + +@end group +@end example + + + +@c %/************************************************************************* +@c % * Calling Clan * +@c % *************************************************************************/ +@node Calling Clan +@section Calling Clan +Clan is called by the following command: +@example + clan [ options | file ] +@end example +The default behavior of Clan is to read the input source code from a file and +to print the generated .scop file on the standard output. +Clan's behavior and the output file are under the user control thanks +to some options which will be detailed momentarily (@pxref{Clan Options}). +@code{file} is the input file. @code{stdin} is a special value: when used, +input is standard input. For instance, we can call Clan to process the +input file @code{basic.c} with default options by typing: +@code{clan basic.c} or @code{more basic.c | clan stdin} +(usual @code{more basic.c | clan -} works too). + + +@c %/************************************************************************* +@c % * Clan Options * +@c % *************************************************************************/ +@node Clan Options +@section Clan Options + +@menu +* Output:: +* Arrays Tag:: +* Help:: +* Version :: +@end menu + +@node Output +@subsection Output @code{-o } + + @code{-o }: this option sets the output file. @code{stdout} is a + special value: when used, output is standard output. + Default value is @code{stdout}. + +@node Arrays Tag +@subsection Arrays Tag @code{-arraystag} + +@code{-arraystag}: this option dumps the table of referenced arrays at +the end of the .scop file, between the @samp{} and +@samp{NbColumns - +nb_iterators - 2}) To represent the statement body, we use +@code{iterators}, an array of @code{nb_iterators} strings for the +surrounding loop counters names in the original program, and +@code{body}, the statement body string in the original program. + +@node clan_scop_t +@subsection clan_scop_t +@example +@group +struct clan_scop +@{ + clan_matrix_p context; /* Constraints on the SCoP parameters */ + int nb_parameters; /* Number of parameters for the SCoP */ + char ** parameters; /* Array of parameter names */ + int nb_arrays; /* Number of arrays accessed in the SCoP */ + char ** arrays; /* Array of array names */ + clan_statement_p statement; /* Statement list of the SCoP */ + char * optiontags; /* The content (as a 0 terminated + string) of the optional tags. */ + void * usr; /* A user-defined field, + not touched by clan. */ +@}; +typedef struct clan_scop clan_scop_t; +typedef struct clan_scop * clan_scop_p; +@end group +@end example + +@noindent @code{clan_scop_t} stores the useful informations of a static +control part of a program to process it within a polyhedral framework. +It contains the informations about the context (what is common to all +statements in the SCoP) and the list of statements @code{statement}. +The context is made of the constraints on the global parameters +@code{context}. The representation of the context using the +@code{clan_matrix_t} data structure is described with the output file +format (this is a domain, @pxref{Reading The Output File}). The list of +parameter names is provided as an array of @code{nb_parameters} strings +called @code{parameters} (@code{nb_parameters} is somewhat redundant as +it is supposed to be equal to @code{context->NbColumns - 2}). The list +of array names is provided as an array of @code{nb_arrays} strings +called @code{arrays}. Each accessed array in the SCoP has a unique +identifier (a strictly positive number, @pxref{Access Representation}), +@code{arrays} provides the correspondance between an identifier and the +real name of the accessed array. If an array has the identifier +@samp{id}, then its real name is @samp{arrays[id - 1]}. The +@code{optiontags} field contains the remainder of the SCoP description +file, as a @code{char*} string. Optional tags specified in the +@samp{Options} section are stored there. Finally, the @code{usr} field +is a pointer for library users convenience. This field is not touched by +Clan. + +As an example, let us consider again the matrix-matrix multiply program +(@pxref{A First Example}). +The next figure gives a possible representation in memory for this +SCoP thanks to the Clan data structures (it has been actually printed +by the @code{clan_scop_print} function, it is also possible to ask Clan to +output the internal representation using the command line option +@code{-structure}): + +@smallexample ++-- clan_scop_t +| | +| +-- clan_matrix_t +| | 0 3 +| | +| +-- Original parameters strings: N +| | +| +-- Accessed array strings: c a b +| | +| +-- clan_statement_t (S1) +| | | +| | +-- clan_matrix_list_t +| | | | +| | | +-- clan_matrix_t +| | | | 4 5 +| | | | [ 1 1 0 0 0 ] +| | | | [ 1 -1 0 1 -1 ] +| | | | [ 1 0 1 0 0 ] +| | | | [ 1 0 -1 1 -1 ] +| | | | +| | | +| | +-- clan_matrix_t +| | | 5 5 +| | | [ 0 0 0 0 0 ] +| | | [ 0 1 0 0 0 ] +| | | [ 0 0 0 0 0 ] +| | | [ 0 0 1 0 0 ] +| | | [ 0 0 0 0 0 ] +| | | +| | +-- NULL matrix +| | | +| | +-- clan_matrix_t +| | | 2 5 +| | | [ 1 1 0 0 0 ] +| | | [ 0 0 1 0 0 ] +| | | +| | +-- Original iterator strings: i j +| | | +| | +-- Original body: c[i][j]=0.0; +| | | +| | V +| | clan_statement_t (S2) +| | | +| | +-- clan_matrix_list_t +| | | | +| | | +-- clan_matrix_t +| | | | 6 6 +| | | | [ 1 1 0 0 0 0 ] +| | | | [ 1 -1 0 0 1 -1 ] +| | | | [ 1 0 1 0 0 0 ] +| | | | [ 1 0 -1 0 1 -1 ] +| | | | [ 1 0 0 1 0 0 ] +| | | | [ 1 0 0 -1 1 -1 ] +| | | | +| | | +| | +-- clan_matrix_t +| | | 7 6 +| | | [ 0 0 0 0 0 0 ] +| | | [ 0 1 0 0 0 0 ] +| | | [ 0 0 0 0 0 0 ] +| | | [ 0 0 1 0 0 0 ] +| | | [ 0 0 0 0 0 1 ] +| | | [ 0 0 0 1 0 0 ] +| | | [ 0 0 0 0 0 0 ] +| | | +| | +-- clan_matrix_t +| | | 6 6 +| | | [ 1 1 0 0 0 0 ] +| | | [ 0 0 1 0 0 0 ] +| | | [ 2 1 0 0 0 0 ] +| | | [ 0 0 0 1 0 0 ] +| | | [ 3 0 0 1 0 0 ] +| | | [ 0 0 1 0 0 0 ] +| | | +| | +-- clan_matrix_t +| | | 2 6 +| | | [ 1 1 0 0 0 0 ] +| | | [ 0 0 1 0 0 0 ] +| | | +| | +-- Original iterator strings: i j k +| | | +| | +-- Original body: c[i][j]=c[i][j]+a[i][k]*b[k][j]; +| | | +| | +| +@end smallexample + + +@node clan_options_t +@subsection clan_options_t +@example +@group +struct clan_options +@{ + char * name ; /* Name of the input file. */ +@}; +typedef struct clan_options clan_options_t; +typedef struct clan_options * clan_options_p; +@end group +@end example + +@noindent The @code{clan_options_t} structure contains all the possible +options to rule Clan's behaviour (@pxref{Calling Clan}). For the moment there +are mainly internal options, but it's going to change in the future. + + +@node Clan Functions +@section Clan Functions Description + +@menu +* clan_scop_extract:: +* clan_scop_print_dot_scop:: +* clan_scop_read:: +* clan_scop_tag_content:: +* Allocation and Initialization Functions:: +* Memory Deallocation Functions:: +* Printing Functions:: +@end menu + + +@node clan_scop_extract +@subsection clan_scop_extract +@example +@group +clan_scop_p clan_scop_extract(FILE * input, clan_options_p options); +@end group +@end example + +@noindent The @code{clan_scop_extract} function extracts the polyhedral +representation of a SCoP in the file provided thanks to the @code{input} +pointer (the file, possibly @code{stdin}, has to be open for reading), +according to some options +provided thanks to the pointer @code{options} to a @code{clan_options_t} +data structure (@pxref{clan_options_t}). It returns a pointer to the +extracted SCoP, translated into +a @code{clan_scop_t} data structure (@pxref{clan_scop_t}). + +@node clan_scop_print_dot_scop +@subsection clan_scop_print_dot_scop +@example +@group +void clan_scop_print_dot_scop +( + FILE * output, + clan_scop_p scop, + clan_options_p options +); +@end group +@end example + +@noindent The function @code{clan_scop_print_dot_scop} is a pretty printer for +@code{clan_scop_t} structures. It dumps the @code{scop} informations in +.scop format (@pxref{Reading The Output File}) in the file provided thanks to +the pointer @code{output} (the file, possibly @code{stdout}, has to be open +for writing), according to some options provided thanks to the pointer +@code{options} to a @code{clan_options_t} data structure +(@pxref{clan_options_t}). + + + +@node clan_scop_read +@subsection clan_scop_read +@example +@group +clan_scop_p clan_scop_read +( + FILE * input, + clan_options_p options +); +@end group +@end example + +@noindent The function @code{clan_scop_read} reads a .scop file from +the standard input, and returns a pointer on a freshly allocated +@code{clan_scop_t} structure containing the SCoP information. + + +@node clan_scop_tag_content +@subsection clan_scop_tag_content +@example +@group +char* clan_scop_tag_content +( + clan_scop_p scop, + char* from, + char* to +); +@end group +@end example + +@noindent The function @code{clan_scop_tag_content} reads the list of +optional tags for the @code{clan_scop_t} (stored in the +@code{optiontags} string), and returns a freshly allocated string of all +characters between the two given strings @code{from} and @code{to}. If +one or the other given strings are not found, or if there was no +optional part specified in the .scop, @code{NULL} is returned. + + +@node Allocation and Initialization Functions +@subsection Allocation and Initialization Functions +@example +clan_structure_p clan_structure_malloc(); +@end example +@noindent Each Clan data structure has an allocation and initialization +function as shown above, where @code{structure} have to +be replaced by the name of the convenient structure (without @samp{clan} +prefix and @samp{_t} suffix) for +instance @code{clan_scop_p clan_scop_malloc();}. These functions return +pointers to an allocated structure with fields set to convenient default +values. @strong{Using those functions is mandatory} to support internal +management fields and to avoid upward compatibility problems if +new fields appear. An exception is @code{clan_matrix_malloc} since the +@code{clan_matrix_t} needs two parameters: +the number of rows and columns of the matrix we want to allocate: +@example +clan_matrix_p clan_matrix_malloc(unsigned nbrows, unsigned nbcolumns); +@end example + + +@node Memory Deallocation Functions +@subsection Memory Deallocation Functions +@example +void clan_structure_free(clan_structure_p); +@end example +@noindent Each Clan data structure has a deallocation function as shown above, +where @code{structure} have to +be replaced by the name of the convenient structure (without @samp{clan} +prefix and @samp{_t} suffix) for +instance @code{void clan_scop_free(clan_scop_p);}. These functions +free the allocated memory for the structure provided as input. They free +memory recursively, i.e. they also free the allocated memory for the internal +structures. +@strong{Using those functions is mandatory} to avoid memory leaks on internal +management fields and to avoid upward compatibility problems if +new fields appear. + + +@node Printing Functions +@subsection Printing Functions +@example +void clan_structure_print(FILE *, clan_structure_p) ; +@end example +@noindent Each Clan data structure has a printing function as shown above, +where @code{structure} have to +be replaced by the name of the convenient structure (without @samp{clan} +prefix and @samp{_t} suffix) for +instance @code{void clan_scop_print(FILE *, clan_scop_p);}. These functions +print the pointed structure (and its fields recursively) to the file provided +as input (the file, possibly @code{stdout}, has to be open +for writing). + + +@node Example of Library Utilization +@section Example of Library Utilization +Here is a basic example showing how it is possible to use the Clan library, +assuming that a standard installation has been done. +The following C program reads a source code input file on the standard input, +then prints the solution on the standard output. +Options are preselected to the default values of the Clan software. +@example +/* example.c */ +# include +# include + +int main() +@{ + clan_scop_p scop; + clan_options_p options; + + /* Default option setting. */ + options = clan_options_malloc() ; + + /* Extraction of the SCoP. */ + scop = clan_scop_extract(stdin, options); + + /* Output of the .scop file. */ + clan_scop_print_dot_scop(stdout, scop, options); + + /* Save the planet. */ + clan_options_free(options); + clan_scop_free(scop); + + return 0; +@} +@end example + +@noindent The compilation command could be: +@example +gcc example.c -lclan -o example +@end example +@noindent A calling command with the input file test.c could be: +@example +more test.c | ./example +@end example + + + +@c % ****************************** INSTALLING ******************************** +@node Installing +@chapter Installing Clan + +@menu +* License:: +* Requirements:: +* Basic Installation:: +* Optional Features:: +* Uninstallation:: +@end menu + +@node License +@section License +First of all, it would be very kind to refer the following paper in any +publication that result from the use of the Clan software or its library, +@pxref{Bas03} (a bibtex entry is provided behind the title page of this +manual, along with copyright notice). + +This program is free software; you can redistribute it and/or +modify it under the terms of the GNU Lesser General Public License +as published by the Free Software Foundation, +either version 3 of the License, or (at your option) any later version. +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. +@code{http://www.gnu.org/copyleft/lgpl.html} + + +@node Requirements +@section Requirements + + +Clan is a stand-alone tool and library. For a basic use, it does not need any +additional tool or library. Anyway, to be able to work in conjunction with +other tools that manipulate multiple precision numbers, the GNU GMP library +can be used as an option. + + +@menu +* GMP Library:: +@end menu + + +@node GMP Library +@subsection GMP Library (optional) + +To be able to deal with insanely large coefficient, the user will need to +install the GNU Multiple Precision Library (GMP for short) version 4.2.2 +or above. It can be freely downloaded from @code{http://www.swox.com/gmp}. +The user can compile it by typing the following commands on the GMP root +directory: + +@itemize @bullet +@item @code{./configure} +@item @code{make} +@item And as root: @code{make install} +@end itemize + +The GMP default installation is @code{/usr/local}. This directory may +not be inside your library path. To fix the problem, the user should set +@example +export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib +@end example +@noindent if your shell is, e.g., bash or +@example +setenv LD_LIBRARY_PATH $LD_LIBRARY_PATH:/usr/local/lib +@end example +@noindent if your shell is, e.g., tcsh. Add the line to your .bashrc or .tcshrc (or +whatever convenient file) to make this change permanent. Another solution +is to ask GMP to install in the standard path by using the prefix +option of the configure script: +@samp{./configure --prefix=/usr}. + +Clan has to be built using the GMP library by specifying the convenient +configure script options to buid the GMP version (@pxref{Optional Features}). + + +@node Basic Installation +@section Clan Basic Installation + +Once downloaded and unpacked +(e.g. using the @samp{tar -zxvf clan-@value{VERSION}.tar.gz} command), +you can compile Clan by typing the following commands on the Clan's root +directory: + +@itemize @bullet +@item @code{./configure} +@item @code{make} +@item And as root: @code{make install} +@end itemize + +The program binaries and object files can be removed from the +source code directory by typing @code{make clean}. To also remove the +files that the @code{configure} script created (so you can compile the +package for a different kind of computer) type @code{make distclean}. + + +@node Optional Features +@section Optional Features +The @code{configure} shell script attempts to guess correct values for +various system-dependent variables and user options used during compilation. +It uses those values to create the @code{Makefile}. Various user options +are provided by the Clan's configure script. They are summarized in the +following list and may be printed by typing @code{./configure --help} in the +Clan top-level directory. + +@itemize @bullet +@item By default, the installation directory is @code{/usr/local}: +@code{make install} will install the package's files in +@code{/usr/local/bin}, @code{/usr/local/lib} and @code{/usr/local/include}. +The user can specify an installation prefix other than @code{/usr/local} by +giving @code{configure} the option @code{--prefix=PATH}. + +@item By default, Clan is built in 64bits version. If the user give to +@code{configure} the option +@code{--enable-int-version}, the 32bits version of Clan will be compiled. +In the same way, the option @code{--enable-mp-version} have to be used to +build the multiple precision version. + +@item By default, @code{configure} will look for the GMP library +(necessary to build the multiple precision version) in standard +locations. If necessary, the user can specify the GMP path by giving +@code{configure} the option @code{--with-gmp=PATH}. +@end itemize + +@node Uninstallation +@section Uninstallation +The user can easily remove the Clan software and library from his system +by typing (as root if necessary) from the Clan top-level directory +@code{make uninstall}. + +@c % **************************** DOCUMENTATION ****************************** +@node Documentation +@chapter Documentation +The Clan distribution provides several documentation sources. First, the +source code itself is as documented as possible. The code comments use a +Doxygen-compatible presentation (something similar to what JavaDoc does for +JAVA). The user may install Doxygen +(see @code{http://www.stack.nl/~dimitri/doxygen}) to automatically +generate a technical documentation by typing @code{make doc} or +@code{doxygen ./autoconf/Doxyfile} at the Clan top-level directory after +running the configure script (@pxref{Installing}). Doxygen will generate +documentation sources (in HTML, LaTeX and man) in the @code{doc/source} +directory of the Clan distribution. + +The Texinfo sources of the present document are also provided in the @code{doc} +directory. You can build it in either DVI format (by typing +@code{texi2dvi cloog.texi}) or PDF format +(by typing @code{texi2pdf cloog.texi}) or HTML format +(by typing @code{makeinfo --html cloog.texi}, using @code{--no-split} +option to generate a single HTML file) or info format +(by typing @code{makeinfo cloog.texi}). + +@c % ****************************** REFERENCES ******************************** +@node References +@chapter References + +@itemize +@item +@anchor{Bas03a}[Bas03a] C. Bastoul, P. Feautrier. Improving data locality +by chunking. CC'12 International Conference on Compiler Construction, +LNCS 2622, pages 320-335, Warsaw, april 2003. + +@item +@anchor{Bas03}[Bas03] C. Bastoul and A. Cohen and S. Girbal and +S. Sharma and O. Temam. Putting Polyhedral Loop Transformations to +Work, LCPC'16 International Workshop on Languages and +Compilers for Parallel Computers, LNCS 2958, pages 209--225, +College Station, Texas, october 2003. + +@item +@anchor{Fea92}[Fea92] P. Feautrier Some efficient solutions to the affine +scheduling problem, part II: multidimensional time. +International Journal of Parallel Programming, 21(6):389--420, December 1992. + +@item +@anchor{Gri04}[Gri04] M. Griebl. Automatic parallelization of loop programs +for distributed memory architectures. Habilitation Thesis. Facult@"at f@"ur +Mathematik und Informatik, Universit@"at Passau, 2004. +@emph{http://www.infosun.fmi.uni-passau.de/cl/loopo/} + +@item +@anchor{Wil93}[Wil93] Doran K. Wilde. +A library for doing polyhedral operations. +Technical Report 785, IRISA, Rennes, France, 1993. + +@end itemize + + + + +@c % /************************************************************************* +@c % * PART VI: END OF THE DOCUMENT * +@c % *************************************************************************/ +@c @unnumbered Index + +@c @printindex cp + +@bye diff --git a/clan/doc/htmldoc.tar.gz b/clan/doc/htmldoc.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..d0af8b28408157c2acb0cc24bb909393ead75c24 GIT binary patch literal 241395 zcwPV_K-|9{iwFSr&2CKq1MEF(j3mcdy?ZZf;}8o)2?{2uJ0J3HSnu}xan8nfzPt4u zoX@Abvt`G7IaPO8@3cKLJ?iecz0I;wB(N+SMTQ6=B{B#heqdxkN~9<@i_tI+Y_ zG)19LK~wnbv*S2HP$Wr_RZUenUJzx8=a5n*QXSV0LhK{NwY;`fBVpfkyT#w8t`^h3 zjze;@A}-iF{ozfS(ti@JoBo*6LRf;=ah5@Ws=T4;OjYK@?t7NxIYiZ;A?J_%3=DFe?5H?U8Z>#pfze-m|x>3BZE^*VCeO)F}8 z1dunO8U!`H5QUzH8o0U15;nb!MFdSxL2jZA7xGzNgF&tZgNoP->pFKxR-rfg(x7Lm6BwDPR^g~g)CmJh5(<8ae1iuVb&=NFbr zw|pcR5D^JTO0(|py;2~`R*nX#koGoy2dVDn7j(l`ZNoAQcrj$dFdbXec`Wh7Fht#; z%`X5`qgKSl=rq8MH2}~8dF>El77>p;i1jzzVBBv9D@zS~tV=Ju%>SXt-t`|@Q?%*)e-cg-ZBdW~+Fd9z7GztIHOIod zLv-5_Eo;B=o4RUUUj7yRR*-*Hn#%tq97sIR6UX2!hsQ8_6nTX>A}^~j7vMET+Hd@( zu3DFue^tFD;gFyqFk4!_wd5#2kYyn!~{u!c?QSN_CU6yH!{7?Wf69{WjaAPL*8iaXHKlj`N8tIX{-1=i-E|+gYUrW4tvQ5|C=V|cQsFoqZO1cWd`UBq6s9Bm4XpA>@7OA2ue zq!35%m{J(R@Z%XlD$u%RnsOMeD~>~Fh@@sh3*n7?i~r27D)AQM!x^Q(gbGeZ!W7sy&HI~^U6+RaW` zY`>uJcvG=~u&z?BZnlU`oL!3vqjYFcafPAmOw!)K46vKU3_z5r*J{Tk*=`lP;kkDI zqNuHjZ8X1n{=(T9t;GR&Ep%CeC`{5fcOyPto%mP!}96s!7g#N>smocH#!*Iod}9^_n3o$Xm`HOBo5+RRFfT zl;?F3#)hh9$cE%#!_q}ivVz82#8EAUH&kY)Wv`7I7B)~guu=Qv8NN|V8o3!!JM}cD zZd;P95=Brf8}pbD-q8)g;tk!7k7H*|Zbr$v>U!-F z_L4EW8G6Vh3_p8`>CbKuG$bxGD#7jU%tU#aSC&Pd*H6HJ!Vf}p0}!G`%rlEdr!RQk zLx^7znLqTBSKW>gEbLHSPfiary4Khv)PNKsjC?z|DOjqj@SJ zz5ER`5?#ZZDPdKxdBqeh!N#_s5kV!UD42ctI|kW@!-Ise8JEYr9Y9Y^N^v+NFr8*2 zH>5*TQn%xS_!L}h%PT-PaJ@}}C3HSSK7o9+T-5T|;eE==-4eEoP|a1$)4>44cR5>P zMaIzz5=Evz3nCJ;hy`(UxvJ30YQ_ZSQfXn_vjDOoZSmlT4R!|(ns&)M!r+PKAFZE> ztbb;Q>QT?)c;5CRT3bc~##4j)Ace;UZ%VQyijqhT^Gfs}xuz(JC~F2xUUM><;?u7W zVzE&t6knrY7vgsl%=wn@!8Eh6K(EMnkUlbq33Xfq$qNG4go!20jlDKCn>b=WMO*F~ zo3?M%*xmgmD31n?H4Fr>NU- zCX1Rt9N9D^9Sfo)S*ENDk|hvHlmyf6(}%M<^zFfEEbGUaj)=1{hDj{sE=Typt4v`H zH=m9)3ia)P`1b-!0|aWmlHSomq|VMQ1hnN?i!89toA&fUxj_Mi%o-;Rwmjb_LCb5} zv>cG;$SOHaoyBitZNzAN?P8l5h4 zccqVb;M)1bt~#1;c(w~8Al3^ri=Z)u7P_@w#2MEfNozbP>#e2bMjQuq=39Mivernw z)hBA8ombEqePZH@7sOUD@`~p<`@Nuko4Eq}Z^nf8{}o=+^7sFQ>Hg0o+-ew>xghA*Y$c2<|~;i9iyV3o>)(el~uq&y_bxX%&Fv2YtVi3uoCpOe*B}4 zj=r8bL^ZLSMSA9H%cvDFdMi)`1$xiM>tpN%^f4-AeTT&?Z%IZ|{BUv>GF^$@JLX``+c}f1*6`?|)o?PU)McHmZXM(_-A+~)3Q1lR7dS;A-s?DU0G7wO{H z!>1mnk27a4T|Kw`d4(^P`qHV(ryf3g_3Y&d9mrtF)cs0&5zQcPl^`b>V z+R$vrpnIb)jR=X~=shzR(KFg;SVX-i-b$Tfi-^$Y=uZJhAMM{hC$|Q)T>^8+{6`C= zt7i|VfBtgYI0+~82LwE@-6j3kiAb=?8;a}*j%o0`sbbBMG{Mm&qFJIE9k?pq5sy|t z=$qSgLl@V9LX5Cgd&uc0cb;~xfK@_Z-@UCOik}XT=I{eauZojiHo$oA0o7GV! z**>@W<4!gi=Tr^x6ob)23ZM{D4lZUfg5ooO-_>wKA+mCw$nAsmG;3P8it zGjP#Jjc!-FPMVy3n!4B=^|<8K zH!rv*^1TgOV!IhY)X~uo=*0BCMn7*E?FqA8k@)N2ov&;}sk%41vpm7Fcj}G0Yumj$ zo^r{x^T|6cB55f2OPgl?;-eQXuu*Ua`cOOHywGRod*Cj2QLnhzUy&{rh}Aj?**Oi| zd^)S#atY|^^WHC~M~P0HpqX=f%BdpU?|E8PELj;-3)X;b>_6@KR?W4g!o^b?2Q|7n8zbH%H^WhBk?FqS(`yZ3PJu%kH9}}Fd zYhzSFS|wLWCV3l7tK=@p1aE_BW7KC_MRztP`PHGS?pRFldQe4|PR1akDX=kcTZUBQ zsHeDJSA@iIQmgA@RU<=__Unp}I2Jyct_R-Uu3-QF*7*L*)c(Un99B(9vt-^RylFdv zqMEuYsiLXaj-rCr*l+x%u3FbE|DCm&r7(2HSH@uZ2cZ|`jQlGg|0?K&sr*mG&4B+9 z_XX|%*Lvv8+0~gj?rn}cHxHqoeCX06SAO+lUw)qB&R^oVyB>V#%A*hd)-zwa6XLHz z{Qo_2Wm#N*;Lq;@AoRZIV^#yV{`t*cTH&~Z{{~^tTQ@?)9i83exWhF5;5rUkJ3CMk zcMietJJ#!)&etCQy;JZCFtqQ~2)6&_$G-V8g$-V$00qU>y6KR;s*i8J@6K!aa&#x zuD)~E_c(6#9HjXxR`;1ddVzcXmEXDkp-;WTec%q(B;Pvoz2`d5oj2ZFIr8F>*D1c- zY}#f=UVm?8=H?wA-+5!_FOR&)AZ6Vjvyg9d4tIz<&mCkrXIR)t@U!&&z_T;I2(jED z>Cl&`UCQfWLU)Ztn8Im!WKf z`zrkYEPEO|{{iVA2md@wKMvsr!1+0fGd!0Me2e?cL4W5BsLOo-^D*!ql<@#O74VlK z%}>Jfe(*2Myv98{^V-heLi`52{{oc%0u2ZM(<~q40XScT_*KY9+wd89|1jWjC&e55 z0);*MGWYoGhq>><^M0uRSK_w+A4vaHT<&w=KT6Zk_5+wJhrYk_{n>X|8-5$|T&8W$ z!d`-Q{_7cq(d5s#d%+)tus>jB{|wMAqSGY^-=6(fpdI8t`~z+~_DA9OpTzB+^S~P) zWwZb~WId%r#@`KT7CLn3^?=u_@LXZE$aztxx)m$N=@uZ}+) zw||EY-JbH-+l+?Kba_gP7NhmT9eHhcAoh3168rP;Yli(k$kpKa5$-MsISg-iazDa- zp4*ubW?!5A)7ih7eG4=f7l$M6*ID>?;_#WB|Jr$H=bv_7-TBhH@4frK@BaI{|Igl+ z07P|Ui&ouxyPJK7W)W#<5s{syK|nxIQ4kOT5fKm&5RiQl5tZOh45H$S`w~S$j4_HP zF{p7Nj$;fVgmD~WjN=$HKI0^gW3>DBKXq@jsWX%3_TK!L#-gjMtIl5MoLc1GdCDX7 zIb48_8$KY_9VaQY^Hh&ld82w>&Fu1=qDGj-0-;DlQ%hS%S5M!-(8$=t)J$w{VQDqU zda#Ye)=oOaeyGDR$Kg)SF0O9w9-cBUxwp>H7y-2TmI%-Yd3A*v-|CRdz+eD-g)=H!S~)jbh!1%(GQP( za=h&XD$UHwMU}gX^H9YsRJ$2L+{@c6EYwFi;KQ^EX7mjD4Z4ldVTLn{nXj0?2xx&=;3NnV%oiF6orU?rW?`rBj))RPi?T(t zMVmxNMCU}`i5_W;(R5`^FDVgeD_Q z5>2vAHkrI{@`I_!G{AJN=`UuqnZB8onS+_kEXZtvS&7-7%)U3fFGgY=vAKAN*j+qQ zTqK?+UM^lM-XU%g9}{0TcQyAj4>gZ5PchFmUuS;J{IBN!u%IpUEvzgYEcROpEDbHK zEgdc8mZK~uSjJnXSst-GWqHx^vgJ+7zga4+#8#;xi1d}+%LXT!a7sN45(wCOfhQ_8+ zIc|1|c4=-AbSWcPAAFuV{1|n0k^Z@KD^)CLf&SVE8OuyzfIas+_k>UM2t5A8h-e={ z%MJFwu<;GB;F7{J)l*TdQ_kLvz0dP@`= zy*cXA?NQ%64Brxt(fAo`Fh+s~wr~Zzc?BDd50bJ1XRg4j*+RTp`Db=B@eN~Gma!K) zA~!Sw0gKo~BoqNhLmY+%V40bi{1^^(fFC(5Qhnqyn3-m#Qqp2bzQl$?k<{MdoWtJ9^4h6w!qXzZof3UfeG;YBO8& zNuYV~$o07Xm$Fdp&Q7CG(w0gqJmyOnnsSjjXlQ1iewgi~S6FCJpRsC5m?y(h4q-ck za4Nndp6lYhceIAmQe5jjI>%S$0y6ejbqlY7v`vvcazsIBBJkr0R1%(qQad2di{rvu zY{wHV^W=%PmtpCz>xnn6&dj7!QgfX{H3q#`{Ml1%5hjsgc&#DLF_M?klLuoVBJlGeZNXr@g7ExdPze`f>h|@MWl9WLlu- z$wyAq@ywhx%QI(a;`G#7EzK2~8KjS21b`XmJ0U&LgXk_-)giC|ejSl73Ps3XO*==q zT4OTc%9L=0y?wkuqoisq#cE|q)!b=fVIQ0HN8t`D-~FsCJ1q2*d4u#av(|1&iJcI% z3LE$d_v8x%kG^H~>m98^-2!L2S=w0PEcV!b51ZJiS>*)|JHo7UstOLQOin7;67S@` zG{3k)jl&;kXs{RP(!^0tK8c=o5l+5-p3cfKcvIdK?~tO%uxZ5P zQ99j;O?!mLo&N}X;Gj;N##U#^YzmBsjZ>Z&{l41C^KY2*@RVW0&ZGGNmsE`@xE2KiA{k1huBVBi@HdEADO9v6yl(F z0G1x=?vAi9tLl2d-jAZ49Wv|*cPaP|6-rf;_z$q{V>j9%M_kQKOgIvj!CntiypsJmwubLU~ZxjD<@( zs4$=jRvc72z}EuYw(>v>CM+|QQbz2F52}Y4i7SpUS~X^)qa7zcii6%@?Ti?DOMw<6 zTVmq|0--*!Vv((>tv8vuL6|pj2`v<5>En(s7FM%&^bLRC)`r6LVf?Ui_Qxu;M^m#fF~uX~(6{sF%(Aq~EqZU>#Ifu}BU8W|0#eWcyq-WM z%pH-`$i8Qaneh{ih{J(6&K{2;6>(Z3Rm$;8PkrjJ2wR3H{ahaNyWL)cS1$PjyLK<@+ZC|ne6TA#W3n~5VT#%6szuN0fd%=%%3aYbn6 z&n6VLiFWc_+%Regi8PQyGLD@5bU6uPnIS|CL#YME)Hda2YVDHl?!&AvPC7xaR>bUL z_h6Q)QZ50W#sg1QFmfnoC$zUupCf#V7mjCR`jT>w-@MhA7B0d|7Jja$&lX2g^x=Rm zZJmR0zGai<6h{sjwl`1Ea)`~1rxq{0{O#(uv@os`8r{;y^CnlfB?tRkyU}K9t0K7V zh(tN7BFIU2;ZX4(O-y^Kv46rHCtz{T^3O^lO%F?EJIOws1fThDL12 zP#WKBm^?N)wxT9BqA-+NPs!d6tealH+0F3E;?H)?ThJ~PUaVcJgQ$_N zwsplAmz3b-6=R)e1SM{Y3z;#gV*BKvtVxuj;{K;Z28%xZ+nkA!ep8w+m(F^7PM8<| z!&JYRxq(gzzR?Q<9h5uLBMRS|6r4GsU}ba==pqVeHtNv@hWW%%+oOJ;-oQvE7n%G| z(#;sLKjgmIPLwgY#KoH^qhO`I)2H+2Q}gG7I`Fnp+N|lK*a-#Wvg#*?CC5^?lwa%} z_15%N8$66b9gEF{3znYe)WPCu_;`B4q7P!_>9Ou}R9wv|1&lTeX`ZZM%#r#f2%ze)-ds*up%DkM~AeLcHl)hf=j-({kC zc-R!nHDPHRtuUh<6qhM!9hmk^T4*C#_KSs%Q(~o`f=q$ESPMsZQniNyxQw?P8dNTqswC1hLxrNHFPEGaOw&8C%#k;@v{mX6k z{DaG>0d*0%t%?P6@!;DRr}3b#mXO2&@>DM5@8_(D_^ z@v(`PlGvzC(HE2_w_c!39#A@6pa10nKE(z>sC1%IsU~Ft@d3L)vkDkz0Ga$yUbj+M zSx9=K1tx-l29k31_*Yv)MzOHsgffLn!Qy=H&p+`Qq(Wafdb0Jn_#aN17mfvpXNJsR z-EedJ?0iAj;i(0GP9MKyH06KZM#$Q4mnzo2B@bFN##za7c@*S_xtwhwV=o^gK4$lN zS3?7}vSpMlxK?^-dgdDJ=NE)`%`??K?RF?4>zf6Yt7|&%WO}`W4-<*bEw0hTtS?nq>DKnx zPRjn{=wWA_v^wk_lZ@rfC6d!a*5%gStZxudH#>IxU079lTu;|=pW@HwI>q!m`>;4F z_J@<$BFOO2?AGQOzpcC2A2kSV%^*t$HRmKn1aU%l&+c*L}@7> z0988FedP|t3W|ksdq5*&xYe^-hd7=3PLT@abvE(zH6kPwLlt7Kt(4Q6CdV_~_8FUS z7;E5<@FA>ugt_t98b;j_m^^Y~Zos%LK#^0gt~sKxp}?tIp*Z|GtxNc4K6(tP?PGuD zEaGFG;2!AP4B|7yI@GIQ@NB$(`S?cG7Gkqrr)c0XRB(^|N--&c{r1!+j#^DyF&!L= zT|PY_5hz{0TeVgT*Dt@SZ}83P27SDCJ=Mv6%Vv2S9c;mpaT9P*=Q(HX50A0!K9q0c zcJ?1e#_YZQJGJqKjS34(Joug6gtCu7M)x=gh_Q@h{)TFvz~%mCLmpME@CyOTZMx@+aKKN%SQnd83pnyzknp@!xLs^U;~ zf4<*qW^as-WOsg#HP*LcYpmb2QwML}&OU%V?e6}an%IM3s)5orpsx`4w?@NA-Xt~? z34sbzDHtg4Af-JnR7m$ZP$qnUYxJvE6wmJte!;llPj;Ly#3@LG}`LB(xu5 z=;bqT-g8k=ppJjGBrb9jh&qn##+khB7Rc7ISGLuCk3Ck-z(=UJ<0=m&jhf(7hG%~n zZkN7+eV_gFmInGrSzcw6o6oXwCI;yd*r0oM?!L0ar^4(ZuS=IZ*kt-{4V$vP{7Bu> ze`xJXnoMSh6WB)^7mawYCbu=Ey4qM1ra|EHs8it5#QC!WVBe1XJjdJ=Cj@e{U7fEn zxhJ-6WgoHMHrAXt5I^T~RtQXvTi2H^Zmju&v3Pvzi^!o>(Q^P&0O*525^^&V=DCcP zUR2(?h>zl}7hsG5a}RpCAS5d6nYY9jkdE+AaKD3XVh?q&HC@;OPq>KVuyGf2;jtV> zj$w|I!jBes@csnGa{o9)wv@qN*=#oJ7G=O1-on+m=Fb$Xq^LsWYKo=0m911bjJAT& z;V@c5?eDmu7AKUa{)$_1^Pj13(vM!DbfmhWH(4h&t38D&wj~K1mHm zLqS)|IxM7k#K*bQWaZLVn$?4Nw}^<^ zltDuln+jm9cre1-TBu{-VkUJdvC}ECby1cikB&HLAr@PCB)yt&{)R|Ugt!dda)MC6lXTvu&^H(hF_&Gm-I=|oDU{l_{dpUuax;Ja=)=fx-O?Iw( zJBe^62P_YII0NgIKLJ{7_|)p~!N&9@o&n!2C|x%H{8t4G!*(`IiJBEVuRb=cAd*D7 zx|O!N&6}|RYi+4-6bdOP<(2uxhrTRLoL~6fcO}t)HHNHCfj8dA+VZ=+1VayJ@*ebN z0^8mMp0QHgriO_$Cay9x`f^;0!|wdGcNWd5TXOmAqELG$#eY$WRN~~h>*53PwZ-Fg zb*l8J?#{H}y&DwRaQpgsA<3l)0*&QKQ_3cTbRngq3Fc%m zE%)<+>vG=4n%O?YqUvE$a07Hr;(E`bj?12U%-K*%`&PQiS4W35H>b=DoZL3mznQwV z%H6m;ZLRVk814DFQq!XFSqidtTSj~Z=XH4BBsb=KUrWn=L05M-oAme+EQ1lHy26HF zU#_1q->*02lk*b5zRk^_4|B7$kqVOs8S#T3-TP1?6t1RRZAKBwE5K(mJ^3D=>xl?9 zTYTwGhO8 z!Z7S7q`qqXw&W7;v0LLT%~I0+CVmwlvJ`=Hf{oTaewSjp_&^I-I^TSoFtC`tpM!9YloZ8notM} zh+A_<*m8OSU4+AYG67inoVSqlc_w0yPo5x9E?A>FwXyp5ztqgyG4K5L*x-tYqOGx` z7lbp>r`O$Mzu7qd@VW=sZPT1>Z|1*qH$QY~-hO3X5a$Qk5XKGg7$RGs8lsUm;4(oAy0sMW-%6#!4Wrv`EcY$+@ z-uqMO6ylp;emwweyl;{kKIt3eGQm^6sX2A4{cv!*wbd6+&(+o0$U3c^GLd&q`H^f0 z|HwJEnpIH%g<4P1FIKt2s#`?nr{n54Ccr)d!;zTef9Pcae*S z(_84U$)77b8IMnQIhhE_jxc!A78ptP5eMTQirjF&bC3b4n+@*Wum#yY(qB;75Mn>k zPQK%-@gv?Sd{>d=j1LQTn_1NRS!E9M+tU#!Sw8zXyC+ze!a*e|;lsS69Sn6HWHG^o zI};-t!)C5GrX%g$qn!-&96a;=V)iCaQg{UdUDm1&N<)yq&3f>3{iCj&cs-bol*U0D z6DRLM(f-?pYOh}14Bk#@JJwKJbCq6>^$^-=1$JOB6X`4g9I`M{ zl})L|!IM8s;*7QdT*>-n!_4v~6wv-k4KUf+X=|xe0?UMWBY@SH*HPm?W|y79HrVYX zAJLcy#xwWuvaQ>ELEYuHa60V9L-<0A)a?2YKKks!_3l zTBzI)u0o+$-$+yIpmzdfdXSY8Zv=Yc901wZGE=8Y{-luzo2&-7{d{ggK*T8caYBvm* z62j(>jAfhmjdawnGZ_=Ogl#??Xh~M&ls#iW*KnSV+lJ(3Bg`H?p31l>WXH`jT$-YX z^K_Qk4fB=X^L3eIB+Q#C51TmUvth#o)WdZG;SZj=wsq1-D+g`c^FNX)z`OAsWo>l0w8JnF=|l?g{$*!8A9+X+t5u zlSx&dleXy8XReF?cFxT8rLFNlrh5uo^k+HO-I562@TU(cJ~sXF55>`<_VXq!4c}tR z9aYB1S`GKdS2XyUD^AlvPV6;j&mVKhrVz>07@{BUjGQ0Cwb*vge@N!ADF8^bw25 z+0Ro+=k-A$$j%Gil$`GoQ^k#1x%Vg%6nYE#Ef9>j0HRylLRXtGj2^oe)u&l z`QbbUrXR3-a1y)c2)hHPLXoq{2k=~6c!15My0W+Bu#Gq?XInO`2J@)~r6X|KHR>-~;1N2XP;y)HPp|xYf(Y>q#sXgH z_Ufe)j#y)Dm+x&Gr>oEIUMMxdJr&X@D*WwL@ zdHH)!W=y?-Nt|eGTAP-^6wlb; zE1&Bl8RHTV=w%{4m6Q~md?z+NYVeRX=^5qOAK{-A!8yhz3ub;hE<`ePyqg{H9l+eA zQUu5P@(wzb;1kLs++1#Atks6S%xo~#7E+u)!|cdl-nMn`GbJIgj;FU3v$?$BO8 zOYX#u%BPxvXBxS1Cw34n?0Xi+{g=jl3uE3Bg141Z?9dR6Q|ub|M+W+OR+cUi28_48GidTWx=il@&nzS-zQ#bUNNnoE zzn#ZEmoMj&U$~?7Q8TwF^sF zzXgzagSj-yR5~>1sm(e2zTHaW|E6`&41oM#|L@DmxQIBJA@OpX?kpITC#FS|@^Ae{~M{A~zbRFY8 zX1bsASh-;Sv}x6gr%g>vUGT<{^0D4y;k$A2af!YzP8*7_UnIk99@%GqKH^FaN@U#^Y?RYzvNsb0WCVQyW$V5AR zpyoJpoXS@3mXTX7HMiJHRb;n}WY}x~lL$GZgq$$<&3-P1^d;GRl}Q}qQEw^4bG|MN zYi>^Tom#_Y)Ts33lWxVLNFnA<<=FL%3q&5W9`8#IZ24^v zLn)=zQJ!92*kmK2Q2C;!MU;{D#_A)dRxCDW7X30tc>I?!_7zOjw1d3=~&8=S5pf=J;qS~cqtQSZe8dx*j85z80J%6{x1_ChPAa{WAX^hR_nXPiv$FkScKKOk_{BDlFjM=+Ej_*wn+oJU4srqi zMltN!t5>N`_6+>4eZo63Xuhgjc!A?hAN-v46C8rQ*!SG6F(r3v`teL(tx%*_FeBM& zymNYOZ8iIkeo~;b9yvXzq$JADyo=ZuC$qaj8U)uVH7@znnAA6n{@pC?M?uSM#f%EZ zzkZN_supz)_w1XtIxub5z_hKS>54g{U7w(gmaepvVxgl3OykB>ktmo<t;872t+%Zap)86ubuDtPl+8?7-!khj4!vs zkTTt5g#m5qQ+@*nbPgxrjj$TAM+4i>;__#CO{~E?&~9?1VZT(&cNphXTjb2b?80ve&Xf;ExeW$H0Vqa>*45R z$@z`Uz^Spxwr)<@o^Cxp#Vn|CqOHTxFo*s(3tVV#jd3^b@i}#7!wjt!E0%8TyKitc#P-13?Dy=~d)I>G)Heb+ja6}ybL1r2*M1h~ zKePP|F2(BywyQN$%xQ*iSD&L3_^M70j>{A6XH{L#Y(F!geGsTKfQPTT#=&>tH0-Fp zBcVsU47t?J;15VS{x;iQZTkP6>a3}k-vh4&;$3AI}KP6PK+i(ii zT1%}z*Us)?8_u^zVCmaK|&-KZEv~f$eI!UgG$caq;Oi3Z-vB>>|-atcgXM*g+HfV7exQ?ZPfuY$w~5 zg>T_65#v3`A`J#dCXa7n28N7|N(SGe}S#ING$+xS|J~=qK9Gn2ubBo|E zXImEPI~u08J#)QZW{xXQoWRZZs!}V;j<8O+?!dUA6{FMGQoM+rFX(!(s`&j+=9D*; z1jcV0Z4a8ORb6LR3p%-5GLn8*)5xwle>!g3vu9?|bHt$T=Y*+5tmh~yj;ieNwK%+D zeg`C5nHy-m;!y8vl`S6rE-qN=u6f5Z(3Z|^86;T{Fnrm_)W>(2kWcf|7o;|{Wl@?o zb5oMp6ICJln}mOKbpO#olSn{)x=AFA?r^(EW6{9&v*?bBeMb8kbn}`0KSQ@vHwLx~ zwi3yso2r}7=--a6_P_z#3{`aqPczZ5hKxk<{0)YF2WxKq*V16H0~eJ1*=)~Nk(nu0 zUqb3#U1D2xU%ExGFF2|ryk+S2g7rr$hFIF}+7K}2gOqU_i!db+ERdM&kq$rVp(|+7 z!Vn(Dxxq-yi0tWn-`!*c)V+@iCh z`dpN=rJp#RhM|G&XVC-BmY!@sgA|Aw*sivjdz{Vi?L9l4L(#bl z3TQq3MC;k}>@!-=oJYN_Lgsgr13(^%W}UyuxAvSr34TIDATvY8ytGN|RtIq(vNOu< z?D2<15=a`KNVmh=^WT(3jnB|FY!5#$B10fb96Q~@;atqIO;f%&T5**9dHytfb9-!X zc|-|!R7Dx!i-$K&cW~3uGYsjP9L${ zT+IS68A`Wvdtur=w|V({#pFgWHLa_wi*l;3XPe>uC-OhKXk@QC&G>WYh7xiY2a9@q z9T9e~rTfrWEn7|8YxInNP2$dZ=f0dbKX_UC&iU=PDS$m!Rd}Dcao$rPM;-q(# zv(Bk#VEb9MhkCO847$NduV1@bO4m6l@$Kr<7!J-}4t_G~IgNA?w5o4q^qquvbC54E zv*p;lW8Sf?JGO1xwr$THTfebw+qP}ndiQ&~Tf6VCO`TMoBweYbl0MyS^b-X-c3ifB z7wX4Y^S&mQkk51!bl#U=#kHFIGgfAd$ZAQ2=%`Hg@-b8F>aJzibwkgoZ_Hm$a4kZJ z=d7$#qQL&%)jmx?j9Xd_8;2pQxDql7)KgJ?k>7G_cHWMUEoY;$5~Bc8weZ2GZ$hD^ zGa?R(C%;1J@2si=N!@>Z&Kbnw5ZzA4pW+_VPA8208r)tTC0OR}qJs#ZXIpkLJeodD z^iz;Jr~ELn;^F(oIYX~^@^*B=-Q%5ol3MfddGC^=*FF8;ixNIiy(`?^i-ra)SSkVY zt!(!?gj8bS6rh^p@(A8k{MAq~bTs9Y6O&Yl?(H33oQXS3*DczD-|Jx{%?uTlL{%h8 zzckf#R()k&rpL%2K{?3nQxiwi`nl z>p>OAUHy|+fSWPKH5UbD96x1{*h{X<_Uq{+9f&H%iZC#VUyDOhtnJnUVxxc$Ml8LFf zk%|@ zdZ5Q@OVSSD^8m6-h$@lWv1FWFMAjr7Rn^0jV^sx(Jv&` zVHycf2?G(}QKP>kE!;h&%8Kk<4Z(h&hU=S>5~6$3r#e7Drb1)>*l)kDjo3*-fY?(} z9I?efYA%UnVJ!H`EV8F49nr-EA-t)91xYMfhL$rG+55i}2?m>21QJd$}?Ql#C&;LO3dyX$)lkKxq{8jY5ppinxlyG%Vq( zwj-EhItmXEUf4tY?7>{N4@5tM<(`3e&*PXrL#d;^6Z)xpf$?AC1&ikCqk{Ol!Bxr# z3P2waBEpNI@bAV0(jow%61(Jvec0qdkm-TH2=>YIEhwN3EnzbLDh8aPH{#HWO3jj+ z^StBJicrtNG@@OJc`?Ln3;PL2$%7t_^A&J50@H?hKjJ+8X@qAj=qdO(1zr!?2A60Q zLY0Qxs{*Oh1w!@>^$nvFAZZWh6>Aaj%|3-)4A=%G+!3mnTREj(1dn{Bey3N4l^h2i zLNY-I-~o~h<<+21gvR+J&`u%K$c+({^WMzyIYV9ZEgONl0xb1e-7%K?woVb#`ankg z>0r%{RnSc)8YKzAjD=_$_?30z4z4*k)xYrj#cW2IDCqjnSl@84+h*Bdea!(O z-ZPJyz-JZU32T8Y!@;71gfoo^pCBwuJPrC}FjJ#h*`fJnDJLm_!So~2BMM?J<}NU_ z!=hv~perz#+?$?gY&Q@FBT--EA4rEqk1+ff3|?{7-dv<$!3t#c47^XI=`0Veqe_sM zzXRtp+$Cuj0ZXieqxeod?%Qes!yga$qj$VH2Rxw%JP`*xQ3qY&2R^oZ<#$pCIT^_s zivEwSJ7kuYA5wveQh|PY&>)(^Az*!00;Ghtl<{y%Hq)C_+yEw9SaNdGmELYchQSH*Y;;BJjoFqa*-3* zE%_~|E#WPqE%0``v+E_BIiA9gkn5Fp#HV0SGEY~}YtH~rWX}lCHP42p-|L0w*t1t0N&7zbH=DNZJ$-7m;lg(DZ-lIJ!&DEfF{YvvsI`A zcJR$zAvSG+l!}QwErS$n7|P*A@xqW_053eZYtQAThcN77rO!a!G5$9+*kzVLSxe@~ z-YuBpzbK^gXoBi-BU$Cw0^pPt0WT0tfo@(Zl>BQ@t(*dMBLe8D@+7-|L9h)2#@*wN zl+E?PzR-myNwF%2KL)E6*Pz*60n?&@ z20Zgh;P4mVeII}K-vrx`|4n!Ak=1j*fV$-fQ2^eE@?D@ToyaWG6x*TR%3%c4>>x)i z0rzZxR~mUQEEZMJgms8T8_;oEP?MH``dt6=2L2@tXOMS)npG=#I^e?z<7OadusRtS zOidsmW_@#DxYPhgvD!Q%{w`v9J%mLopp;x7DLi3fO3nZNkAOp&+AtReTb?9%c{af{ zFcYq5K42rL-?99ld;yPsAapk%&0_vCz}(#arz8H-*B~cu0S_I$Z$AF7P$Zu~ukJwJ z+(5jjrD*RyP)A0!hK9@|{==pKJH*))VAWb!b8U#Yzrck?KxdfzoZ-^IZd^?I5l#5~ zqPMm+lHgY*AlI&OJCt!d9+=561&RjBRMC+Tn^*oFc=j!z*HVBjC4!NMe*kPfWXZ&P zxZ?n*{4=e3r(EK;WB_HLhpuR+oKVi$kQo_33ogCF))#c6xBq}|?+$X! zkkKo^2QIztungNE(Qd#8I*-svDDqG%+5UNWfIk&BmN=7}V*GyOvpdj_ZXjRT42jBA zpcGO7B%R-&XA}O*&a?h-@DO_D1H547!2BP&03SqgVTi{+LD%#G5Jtcp(X@vQgX6}# z%mj7;-6+a?408B=+`v@%R0R!Y%ur~|l6Bo!A0f-OMKNqxj26#8@ zHNMjIiHOQ-uP_cwGYsua1}ZK5PE0U^3!9YK#sh4O1kIZ; zdFMX+qD(Qyzz3t;#IHb%F_*%x!AVfR1T3<}ukc5H5gyeA^dJ4V+bJ>Nln8^14dmFy z-vx0ny2}#B23&dsc!IRI9!m6T&wK@Vy~;oscNW2e(R@@C4Y=_GG*}bRg$`H*zM|#t zz~PSs5|29yTqF`Ot7FLB_x~x|EkFSl3Wx+={|a#R18n^^e}Vkp6x_T9be%9Wq#k*k zj3U$E)3^7hjtclbR2aaBMMAR6?S;B3Oys_4(W_T~4sxgz!9ZUUkWB_EhkCe=M!gXN7EVbtP(-NFCjGCHHfe++|Q%fcTKf(#vZauaa#B480% z|GTmf{Jpu~?YH0?=6Z0}pNj`|8h0APf5->=cIkBnr@#WnXMh2mgD#_E<^g5t5L8(C zpD;}pixHG;_)7uDp#n(&r}Kigwgau0^txbi_xX%!Cjdi&ItjwIwn1-x4)&3AZv)|e z%lQxo+O_ZEv}uBrBt;2}-tuCK zuG-f<0KbNQ#L3n64%x(I;j()`X_Eh15jgbY9O{2@0CHfmX9EY2^}<+C$>%`fn_^eS zCG?Jv1UV}aB(A~VhOhX2Ky$DKIqv|!(#mg#ID+Xn3v$352~qqOB2031?3Vv+Ni(~O zz|tI~vJJ`!?ej+-tYk{dKM4Glrq^s~z6&(1=# zID^1v^ADf__I{;8cflS(J=%rb|C4**6t>ic?{#mNIL?bIPn+~>zu4}RgW~HV`$wzR zI^Qx(zbZIJ;Si=pPGLvEAP%zAZ#^J(Is)d9gv?gZtg& zo(pm#@p`@&Sf|4h-~z5=C`od-zs@4t%}!8q8BSure+J2M1Wl*Ebc_$dbR#cq5;KW) zYuleh19tUB0&Cbr40i3N`gX{Ots0>m9nBueKHc+O%uy2Zrp&p7kG7ylqMidChpl{gzFvO1ymcQQemXn359RoNZd!VNzBF}z2xor0u1gkvoQv^ZXS3M(;Is;U||~^0IL8vy=1l z@}Kiw{9ugL`fh-@YiI%0yZ|@V7^Cbq(LU);q4!>BpLb<6JzJ@tf8|Oa<~}@4p8Rxg zzuxSf?LBCH{`~g*3LErux%`}g|NbG~IH7+7+Wj-~^|Nz<_3bx!@$|F%=98oOij(l5M*g?1?6}_j5k_5F*Dp0qfYSsTbh?@!P69 zX+b*erAKm@Ua;cEY2ln}7Sq!eO*e#R^m|QX>!E{g2SaVy-)Sb*ezR=(wWg!^kqDu8 z;Nb1-3A6NRr5Wvb?~bW(3-a(ys3GixAGvdwTEPE31il9`bOaVCo`*8%q*L?d27a%M zR%b10W|J3_-cZ^n(EIyvaNq*#;b&!a;bHQJH!zn^;VzC(eJJmXeQ{c`Qdf|!G7|n-4SNP6{KZg(Y;nssFsB%({e$tC{-2I*eM82n$ z$y+z@U$-Ri`u?0cAfYufsH{H_U0rB>D>`|H>Cb3yrX z@BRKA8`d#n_t8^xkgN>DfkyLP;b~hUF6ea6M9P@1kxrTp{uA3=VPm@~I=^$GM$z)n z*Kl+w4nh*Jcx20h?~xyA%~78>{_@_VTcZ?J z^Yig^4uSe&wTgNcMMYQf92lwI%SEH7Tvp|h@yHfn>f}SWZ8z_f4iK$!5nd{7$wtpm zo|u#^dp%#WuPS)#3LVZGE6MqQ&_71(l5z6&YH+7n_BqI%A$J?S1>qFR>r#tl?&Q6BD`x1rxR^M58q&`_J(Jknnj#I~z3Wg>$^FpH+|YP% zvir`f+&`YX2~9nCSUPzXd7J97?f$l4Xv57vkNMQ${@j`J zIOz0aD^=TXAq;1@53A!Pn7UU55;M33?Ie+6#MNR81_T0oX?hcI&ZY>g3y? zmwq~P3t0FMM@jq)X!x=4p2hl}%h4$?dnh=)F6eu+ityCy-B`Q-Rm6^a_7kvZ*Yjk; z{JUMi4Xck8GlEhPccYdD_fCu&=HA#0j30Kg&=&@rkPKO>%`HRsp4j*H_|bQS)HV)U zNtYvivn3W>AlcTTP}gxRdoyVAw@ zFLZrZ-yh%I3J8jvo!rgsW!Qx1tHv`W?$H{XN=4eytI&=nvWP$$E)c0Mg1KJ9 zGSousQkvvI?*Z%jIcUefg(;c>=VHxg;;4nb!8T&~1SfnsPvm?6(YTwY7D5Go%QPlB zvVl8e_7Gpm{ax)3-`nf+0a&LypwB5|Jo-)?y>1p8xe-1%YjuXJ9-I)g+#K{*0k0u6~GtpQd*PIDE6HjacR?&z1(0L{0{7 z?hZ~ZA70M##k=AcmrpX|NbHINxv1Ed^C`0rIdPQX`E&7}fcBrPAV)-BNUM;yH*<*c z2EgzUDw&|SyC0aq#QDS1Q~K9ZsUIg6oIKu-jhaVHI$ph?OIDTMWg>j6kmj|`WYBWV z&3&Gqf*rB6-=xfqxf}z6%rb0?hQ?9H#o4Z-i!=TrH5CEMOI ze{V-t5Om%VhgKN=P-!381VBYAh@Ur%9jN3U-Q7g;l6#+r4Efi?MEue9`#T0M?Gi9t z0fdx;!0T3X|Mriyrr#TZDXjE&r7w8bj^~c5F3lRd~}VlV-Arwkm>PZ{rH)`b(FywX|F!r@@^A$ANSI=Bq{yE`-Fb8~UydAq_GDs`l1r+F9?$57hE z=+Nlw*)?yJk3*?L3>6XvpC8S@_#J z)#6Yn$o7o@_mNHfYK!}2Sz_2`9NOE4USiGRW{GU(Q1Z2SkSx_&1Knnvq2MsmkYauL z>?9#eww|$qJT5EFIyjBhQKXUP{HLBy(kj+Lf{1)<+|4naP%Xnw(uQ+1*@n@!(Y-2qAA^Pr^WNJN=gD;cjGb!~D$W7TQ(1C4B)=h6mT z6pD!!PO7TI&|CBBL=ij3#&{Q4WTMkeL>gz^FI@w`WGcIacG&`{gtkWr$YgY@;64u! z#^c!DE5k$=gCez7;b3ahC30&~_=s~KK!#iGee2;K|4my} z$F<;(>5WE^yhEPeDGzmb{kh-|{C2~6+jHw|&y1Jq@5Y&sZ`$pKbv+-9_o3|u&9`dU zFRd=KCj|kF_dgzTGkMC|rx>0y8Iap2ficlw!Y?n6xWqh}`BZeSFT+*5X{}Xsch5&14HRfE?;M?-E$koE z>8P}V4>^1l_>?`9({bGFJd$u*w}o|1Wj5y@y1I6BqPfi?pmW(80xd99Z@<^5CL0Mh zYT9I~?91)%siL|~eZWc%Hl6Ipy1cwrtI=6e$21$9xrSmd9eXz{?Nqa`hz;7@03$__ zerulh0PcK!e4IYtTaNJ?k3hjId>}Hrh(D^>=I0wBHf-cITK?Kunsg-Dux{>6Z>)`| zz%A47Cw1$6>lWZAKd&^$^;kW*tNFNMu6|SX!l2JRgbnekZt()TlFHx6f$?_1 z37ECO5$aOR<)3sxlXF$4#{FzL+a4qpHwDJ>8}_bpJ-;ze(VrA9R2tBU8Xqd=Mjup` z>n`P5FHK9o3})LS!(L&n69;UP*#xfHjTYvILcKp@`QdhkY{)7=y z|FCC$3^{h+R#7vje(B0zOdTDzK*QX`ZQhx#_N#q#%ATm482bH_T3O@qDy?e!U$7yD`##w|43Ah`mf~ ze{CJ)r;f{2Fu_{c*#9h+H}5^@d5p&-aYPv>h+`FLBn?JH!^(&xkceu|8i=?4_4%+? zYaj(kYEZM6t|7x`><+UbN|W4+Ux=fV(e7t4@Dp-Og-fH*x#Y0;J49`@%v^}rL61_~ zfsdcL1|LP+qhumVJN$ZRl#l_F+y`5PqYsw{ADZl{@v{ZfUu&fWSBKZir|DQ0 zVoU{k?_mj$!g_`LR-{Q~u>rG(q4(AV-uyzqWSwR=?>ck_c*g#8S?fA8F5{-z9q*6MJ zfWX(?`x*DSDOcmR84$uq|K0U=OnOQe501HlRYmKrH;>S*bRD^)u_vn>3xrQC*(k61 ziwG;pegL=?NUv0SJOh`ba(su^NVPUtC8aSCG!ie*AN=~|NgpXEE$~RWgk^fEze#MwjU5x@Ngd$_YGx$_O63_Rh*IK;Df2UUn&O(<7O76- zWVLpSMBGk`D6gTOdvTyN6G(#Sq%{b|RT;krO9;R0+HiQuwPJ z&7zlK{!G8yOyp4~svEkYBOhr}o{rXyM-i!rEFbFVOs^WSca#QIB(;RPx;g;WH^6S* zUd7H!FVHM;r$``(jPp|f#bY0_>`$IHqSZQL+A<&D5AtB+_2RQBOG$0Ubal|hafHos zm?lLf3E-A{#7kI^R31WE1nc~02aR?jvZH}uyJ#sYw46_hZQ&wvye7(nz`{U~_|H)F zMxim}QBAu`Hh>6MrlWq~4TCu6=9ZJZ);9yHT-|Dy;pEg`9TanbxYb1+`W@kAGbj{K zY2u-!`;eepz%*P>&s$3HTD_V$f%z&g)U5B^gT;Uok&K0jCXxv$V+&nR&Cf)yliA85dnb{kcgNnQvyK-B#fss%Tan?p_) zI|iIx-N7d9x`IX9#0`6~hk{Q@=B33Xs!=pYJ9lH`FZ4E$6JNf%Ksps#Na0;7rmYvJ z?g}%+BBwosNo7#_?vz-qs*9 zYK0XgQH3WQ$Ov4ei4}|~WttL19+H?H3mlbyS0v9j0}wDPh`Ch1pheS!k26pt2%068 z67BN}Cl&M2f=cT=uo$p6;@PoRhRur_X$z;v#H@nEW~KHh*zjH+&p%XbWsKBy*%&BG%KQ#cya$BU$i#*{Og zqPBVh2{s`BFx+zUzj9Qr;bt`VBGmcz4Lq`jEV3j9N*Tb}5uqOTCyhz!+|(Ka)uu0# zr#N|MeK>UpexpNL%iP(QLFQPh$BH74F_0G%Q4_Z3+$(qQEl2- zX!##p%c5A{!qxsRUWlG3C4kA6N|DHq+N>=UXS`%|h`Q$7CX*fCQgE^FxPN9qv>tLu zS6{m;EnBuo5|}AQeYc0}Atr+kcBPqOUc#NVd5+WI&!lxy>HRpg0j_!K0M*6W7jWR? z$6#moND_uy)-Bv+2^r;Hf*#9*9g&fcv0KnaTe8*asa%T>2F>iYj2Y>6N%FzgV=RYv)r=E@3;QvXS&qEMq`C@w1Akej64D}xn92Ylrb!Fj6Y7@H=n_t~wr+Ps1TEPuAS;QD!4}C}LXE2K z#KDk=@0K}8hD7FC*g`EbPU$G&A7G#87E0RySHb-&r>|aN=qHgX)mkeuyuKCdI|R}l z4n|<)9tp((X?&cF;eL5j7{w zPf9tX6m-#IhHDp80i^Vy5K8gHnqg2HyWA_rlwa;em1x3?m*KE7w+K{xtt}CO6wHj& z>cHQB(5aAXcc)nmm@Hu6Rv@LedF^D=lHy!Rs{E^xxeT?m_NrvQb5If-`}N~(poIM+ zm54oH3NVHl{%Q3Xd5zo}0hHTjG04on3!5c#4K%2_*Cqd6wupD6q==9ZWQ`XYgvDdr z&D$NGEw;1F91sgP^noh_u@_tZmA`NuJ(s>mtIrj6)87k*J%k*9#k$PUcgVdjArL~q zX#sQ8VpcCn;m$h&c|OtM5B@c<8%U^|bL^&xToG8y5>vn;2P;_`-e!=tgra!j!Mr;T z%?4ZUnO_C-N!ry6rfl7wD9*H~oagNYE| zrsRNj`cD(pD>ku;n);I;03whJ8oX@sF$n&}Jr0A0 z!*wSb2|dZj54R>R?D2{=XCv3IN&#iw2&RYaEUK%y?~;UXZNCvg$XUS6+7|6%`HL1M z`B*rDTTQ0T&`o1}WSI%24-Qvo7BiC~ibyCi2}hk6 zc>tC4H2kA~~E#mE~ekE^M&2DJTcCdZF7ZYS?oI<+hl zG$ThPllib?&_!)9hIGd8(aQFQ8{6P(>b-k#bK^OGv6&}QvM$~=5uu;$k>DK50R0}# z5Gvm*p$v!8Eh0JHzz?`jqc8M)D8`K?N$jL58(wLp7XF}dSL8hv`DLPecH-~95iAi4 zo2Z<}wd+X1#~>gqHjYp-F;P-I!3*zbDx?D2Q!2a_SC#FzntynrS3U7EH=1ecp5;JZxV$- zwuT(h@_8hrnEvGo@0H1ZW!XI>G==lX!YSYwftCc6188~sttDb;=dhmn9l9wX@E5O%<1;%vsjpBE>I?_?Xu%f>T95+`J$lqaG?Nc8Kx1U^m(CA!^ zY1{1Av)k-VGcQ0U<_=;pObQveOTdZS$ks>Ggh^&t!+KyXwVTlqyD^T}RBvgMlE@#E zb*ub-%6`LO#^tJ7Zh!dgS68Y1-4O3NQG*NYWsh9Z-KJOQq#oi$4<1cWO98>c8Q4Wb zUQU6R5?r=A{Cuu5e3@ifV_ulTw^K#rWG0DHQZdG;ST*)h`}(-BbM091aAVen-STl1 zCvN-L4N4%|hfkUFO7&X3@@-3i{A@Wf_)~hf{RPjnyQFeyF#DZ?FL~dRAo~!f>s*r) z^>yXNUi`4JHH(1omnRw#)o`Wfr>-QZF3j&SF6)%g=Y>sYWuS)jx8z@F>4W#HDZ8ET z&*SWm8y(8`0fd^OuUp$N&h@UJyOtOJxe;KBGxiSDKVN$ni!U!dgyEC$#U|TZaX#b2 z0}t&z+;|H^7qi6jVvKs=b4HeH=NV0|@Hj7-tcC4X#AcZWj00YSjO<6f5lw4CNJwzN zTyp3)Uy};r2=mh8rbP5jHwuHnwwbbIcv(X77F|jyx0*>oF7iQph~pBsuXiw}(aPgR z#A{)LJ&3*>$3VQLr^Z)QA-EZC=X?BaY={mxWWVSN2Bp|?%%HCgk%*)!O5^5G>Kd)M z4_Af*=slXr6AP&HIG}57UV4cY#%^LJKH?5=_~1RdH$rqJ3b;p)O~M&T;uVpoFwlCP z9{gHnZ>n}ZQM?ORW6rL6d;-e6rg3H|!HLNG?q9JVS~kV%w|=|*36dONLFDUPk-xO} z>48MKdHO^82Z_S*)%EAmuCi&wD^hO)1j8IGOC40S-*}jnmHI^6Vw2|#W=ZE`dsf^% z(%V%*zY(%YuMzZNI0X!gL1FOl_p`>@s}Zjvrzu&^L}1`qEaYH z0j<&6uVUe1S$TuC1q9qPM=?>>l(wdmsUy4^L!k=|NsJ58V#c$2^aoS5Q2%pxmpehRI4}MQjMmUayQK&wc{+Lib05 zIWY=-kW)~&QV^6MK$*rFPSWsJjzC@pF?QpMfB1~>I7y$gz$vxPUq&(7bd>n^AuZH` zOuoMxk7T?^#d-PH{Gh zY)ZX~ANWnur_C1T^L>|VvxBO1E*-(s(+L{fbL=`b2Am1rn9FB1{U zZk;?(d0;~?RtjsVo%fu`L*S$wk%b(u3KFiqx{PJVe3i^ z!+CA{z%$DVomzu2)6gl5NO57LS~1s@_k1$zERuj%fWb4s?lDW|D-GCaqurSHt=%L{i=(s6<3lDevnRfgOS!S?bjoAfS*x1 zv_|qO&QQ1QQWav==xMfmCoV^_bwxEM{JeF37Tp*fl?ip>asYW4{q@V*ABy#Ca>#x8 zA@|L)U<;#n1$Ushcfku|+lGK3%3xS8}E4GOkk^DiDxs4`-`(-cV(TR(tbRuuiAg2WcbT*qAAoz za?x(NWU&Eh(hET#Es2{Uwk_YBVfpT`@;Dx)%NfoUaWA4iMn4DT&dh}x9ADE-iZd=o zKmQ5=c92*Ydn|u!uop(edGO<2+A>a=-s{RsyhR{Gjaly5_{-8m&&J8zP+qZO2iN>UL?kz7#qh!%AP(eQM4lvc zcBgLpoNI3(Z9?>IqY~pulNC5##)}l^ETOP%2PMoeOLyHMCpxl&JIR6ohG?YWhGwaj zSVV#zku>BRH>&ea*Q!#X2VVuq_Kr2(mXvtPd=3XHdz)-D==|x*)`jhTo|r3B3z+$+ zd{safijB5)iz2;JhV7Ab1hRDNmZ}kc&bfHtZlrrY>)hf*9LJJpuB~%LHP+AF<`NeXiuI5XW&ZsSd z77ZGd^F<9aJ(B@8Hx~$kGyp`IAjzL{ra*1tf;Z=Ze*u(k;ecM(H$ae0L`kO7yi4&9 zyhcj`w&(0@-Q`f%mY8!ft@`{C)lXbpF z$qmq%xxd|VVV&eYwn;XTewa}KP>e)~7BMC&wpw1R`S$)ed>*pLygnPCj})<Kp-1=y`}jW*}IhBmB>$}GXbruA5RKedXmQ6Z<`hkMw{9G)|?=utCph5 zrft%xsEI7s(?WaOB22K$M-Hfo6--DwhCz@U#{Pmy!@-{ZN=lb2@}uQMrEiRpd#m0J>`#|RP3g_B z+Sk-}N&};KvEyNiaBW|x#BtyKECI;G3T__TrA`xo-CI;YO3zi<4Vg z_svc(;&t9mXqWPBjVm)Gb(pwGGznMd>jmCk1_W9%G2yBSY8*8AjNJt7p=b9MteoWw zlSqx|OYnwE+s)o_g&W$0Ug?83t*I0aGNhUV7 zQ`qy7yHnJHbIk6->x67%s@POoqJvPZrk`}4FaQ>IJ2(_}Zo*7Ndp2~5s3`ED5yYlVK8+EJy~~- zf&1H%UGeTLF>EGG&EKrtl6gg@YyB{rWJmv1_L;eZF$MYnj-HQsAB(7#BprSNEG6nR z#c6)Z_jKrC#Lt5}%adEjNg!sTaU+RcQLkd4F7say-Jdfnr=g%{L`Kq#zW|tz;(C7< z3CHUBeeLh%=4{HgbW{YE^`mQ6E6a&2RwYNiUl*`JVhyIRaj5grg3=x$mCkCU8xs{R z&RNM)ce7{V`!RB<^Hyk8MA?{4K-RA*hfhi!SV&OQ^!fnN2Ogp(lJJ^SSGQ3sY%eES zgul}Vs*)x%rL0%0$cil06h?ac)(P|LkCY8mf>J^ZaFdA*btq0!kf+pO;Z_G=K)>iw ziDcQt|GcV{WOw$H)>nEn(Y<1yY8+KOKSV>E+L^ki?L(Fa#8WEAda(iXw6AuL; z^HN|qDK4w;?Zq3gNR^@JNS@p~#DM%QGu~a{((lC)c6J7{3V)2KXq|N|x==^1QabBU zsBH23*eh}Cfadiauq@ah=~_xh63rf^5}#0ajJG1p5^EeP>d;BtmLaa@C`k3_@U2SI zlcOwNlK890F|D-hzA(3%CI}U3mH+FGlID$NWO`?YtnZ`Y;mCSJcB^xT!2|)~y)t7v zH;X$MtT-q}mW+X?HYwn(hzfH;L{UGY1Jy)xO-?qKnf4DwnG*z_vvPf3mi&x0wgpc3 z6k8~+#Ik#?q-G*+OOo*L=qaKM?ZOofgE$|Wm+~*&r*w)*q=r}}L_I3JoPV$4<`wAT zDMc_LAR}g*5u=D@z04~(nT!O?WQt`oN#rCOf`cN1*ddi$)B*V0R>r|1$~)WFgRSE z-+=LB)MX|DqERgbU2t3P8YtcJ5BT6R#dOKA=p z8wHav@We0yf{XHN@zmS%<8{moF_drXQgsk*qNp_1A}$63609cCksaim3(=wFn?@Y^moE6{tT%?o=lE?cW|Razy+oK zNRkoF*+Hr}KKBtD>@g5{ne<_&Gacw;?d~Cciq;?aV;=ONpsp(hmA%94XOSRl;c! zjn%+UitY)vpQgw@H&S)QrMf2zTcrMvehadbWc(m*F%Oio5Q>JxYV4D}LjMF3N>i|0 zv(#xDYWTbrywq|(GhN6~!KEfCSb5oqJu6c0Q5{#rpV{a&^=)z)DBKiv3{<7vaEP?1 z>4Fnu_66*WrGqByq{Dmm>_J|OVY5UQU5Wv1(NUPICWsxV6u94l%~%TT0zQ7qg?VM?cT-Uagh;X^;4uS#q}XLtDcHgJy2n%_%HN>V$&W}*Lp-m z5mEiAK^}0(5UdO#iDK#AnUrEfKlsrVk!P*X+Key7)i%?lOxa(EmB{0a8tt(e@&5Lv zx24i+KYJsfY5U*=L$H@KoTaP3VY!6Dq(Q)2l7*m| zd53&z)+-}j{|+H=A$jdhVJ+@Mw~%A3_KRt7FVsHe+x|F z5D^07+RO9EOj}fYn>H1z`B&;Ky9VuSo8!WA5xaq>@Rb7z6vMgKt5TI?aaSgQ8_86< zAP9^{?Y)e|YB}@W6ygQt{mWIwWkDuVs3KY@3d6}n;KJ(J61dc$>*4M_6@sz3noaR1 zJYUY?q66opMRJ0p7Ojv36X5b7kro$x;s1V#Y-b{1UrQO7_2%xK1?%&XW3#U?g!Hb1 zK~Pr@lU6h*#pe3He?G(7AHYUV1!;^y1fX|V3s+ikb*U5tf|Z3M?iO*PSc8aV9T=GQ zHuerL)8i9~b41Cg}4B#3CsoAVGl~L|aHDJg2Ys7VfOUy7sv%AX-IM&qiAa z|G?8%?M;Y}IL5M;D>s7xlh@9dBUFH=AxQJuyl+yK;|BOe-%NbG$qR3#Fx z_gE|oygc(&4j+Kjm)1{>pB@IlvPLkVR1Y?g6VReRo?Z$_K4_`3T`sGZ<*^H>eu#o_Slu==;YG50>M|yCFWZQq)zE%#>>(8WD6g|3&Nz5GD5qfW8B9yQHB*Q zO4L|Iq23KB8C#jM+8djet&YSAen^-@icU$gI{%fdn3~#$tH@~?D z%06f=Pub_uM_o2$=(%h7*=nJY?ZTv`-y+QfHPd-Qghh%}vt8Z`{j__q>j1{3XM(7W z+ik6FC+F;Jc(ldDrYT|wrwJleOLj1X239GN=3mx)CMSw`F~;^&No3ce)vnWM&A=|P zdjw@ui4N{EY&3m`S`gX2MuY9<*=&P~7jBj*ob9Vgf&fRy4&qM3=7pW^!U+k3909y- zlVy;`vYkr4Q9}cli(2PhQw#THLvCEW(VsNC*P3fmf!0k3z75+lU-X}*|Hri z{Kd2xlh^1A`+*6i!Ad3F-`vlvL-#Ve) zl91ae(a#E=VRb(P!8F+PNONie@`YBQ0j!B<6BV0miSehzWVLGMf*EPz?z7OE8&VZ9@G`S? z9Bvr@x?X!F=oz`)V)|*vDyhdT8agUPN62ydXpu{eYDc}`x=B7&+oE(*6?7ETtjxa9 zk>+`wA0?ex)P?X)AE}hGC!j3&IZ_godk$%1H6E3tC~is_yd9UFnm5KwZDQ=Hpg_h5 zdE1nRu7*BpZLsMNE@%-hnp0iraH_90YsX<^iH|hBunTK^z41%90_-~ z9VSdB1U5bW@O~nmm5hKB`)lPj>#S^HKb=`(1YsT3(rqryjN17FXIV9RLLw`F1tIIg zINZWcs^pO`y2MyXRW?I9rj!A9GU%(KQDf)9+`DwUU8Jz3Rx?~qm#>TK_w(6=+KE|# z?fT5jPS($iX5}}bzvtV?LJR#8Jk1684!6(8W9rGt%udcz9I&Fcjx`3%LO&*$j@=m2JqP@iQYCukj-rVPnx^fS@RPSF(Kk zQ6l8KB#_aa+YuNEzvq7e89?U0f(67vWEEnhf<+25=}n=cMp;gFUXkFgF;QpsyLbOk z|7d#8BmG_ep1zNA-O5B0qAeS=-pI`B>&xXw>+hJmBy^;{0KoHt-0gOqvY*rylk=O0 zi5g0)_ZLfP&Wf+;BP3Dy`hK-alHUv_A8xvLnMgmDXPjgNrD;Kls47zO95RSfibeOH z=cU9zb>Z2&Uw(S6Wrg&ZU!9wApzozwWBHyJ32HN6b%=iPd#jVuv!8V4J=oNih;+@m zBFiad1S7zB#YIXAS~Ef_jtI*umQlP$w764qD5)mmiz0^%d@^~lJxL_9_9KvDNS!?~ z7Y=o=QsT6zfV7?grYR88Y%Wt&BT*w<38~+Aj#oP!VPE`4by9jZY>&wa(=_WKuif%m zsovnb&aHxlVWxyTUJ@Er!I(XRqTtW zr)SUGGSWy`jK75X(DzW=^cDZuC^D7fTPXW=SAbVl;4n7{AH_-q3uy|)GmNVM-AD$f zU*pM>+3feLc|2_)9js5nr^5N$Up=aRl1wtwT1eJ$*~^tV)Qnk(a<-_}W7h1NKGu%5 zQq@%8U6?>2*-lPWSB+ZcU3``%kF;K=R$a@Qmn%au#jj01IlL5;x8EAvI(VhTylh%o zjjSSZ;oIjw|N88?r%9Zimmicc)L!bPcD^|1~n#@HI)V^v#85>h;aj zXXgqtb=jrC3D#zk_j2(#Tis2yfr+4Si&w?0rn|cu8?yeqn zZ{Hj>H&Hr`-CR7l(^L(osQ+PE>(D9cMhSLo(Qn2U8mKQ-vc@#)?piR z?%7Sc(4GUPTV-UV017Kna#rFJkxZIjyvQi4nDhWyo@e@=?q^pEN%mDD?SOfrA@%5t zJEXMM{{aDYOqAA}^6pD*U25<3w$?_Rul0b%IV3+Wq>s&|L&yaeDCHHVrN}YNk@_)6 zQTXIHR+<_L2G*Z#L^M{UPyQw{)>}JD?Ad2c!G7HqsFc>Ao!`Wzo7a%A3o{M`OVu8w zik3xIVw}ky1b|dH%^=O!yHLuu$#}U+dQr8tb$ueWu`#;tEVCzN+mZ(hAg}V66iNjV zutK0lX^EBO5vdTc&RNMJpwy?~^y;z@3pG((HY#KJT?LZ$E`8d%DfmcdY{|W6H`rna zuy=RSAm|#0jqI0Kzn-3U?@vXvCY-A^gp~3+PeESc9A~sBc};S@W3r*^jQM0RF)^BL z%)2MWOsReZQ}a;qq3`hQ5Jr$17Lr{711!gsfU+u4!5M&{28CWN_@`RH_$(3wA$ibv zl}RzHt{<*(?VgO-__ynnl98JUyRpPUv77HG-o%@YB$Z#$M*FQw18Ann^FaV02 z)}^TRJn2uf*+lT^iPVQ4k)?E<&Q||@TiUkM1U{+S*cf$pmf4fOZOL1j=04h;`RI(N zHQ+UetYkR>X)UO<&vA(}j3B|jgyxOT$7M8Z6CtU7=J>hZhVQKh`XBT5Wh`mQi;)tKYN_9G?UPc9GHE*j{4a zesKl&?;KY$-a~B@I#xWR6_74%1?2dlIj11!1w>qSnP8Y{RdCh}o?U&lFSWJl8W2v$ zMCrUK@4gh)rEY0wuaVcH-C6r7kTg7`f)$*gy2=1nKhhR;NlH?rL=S;;>6hB=1_ns7 z(sO0K=og#R^(hofkJ0uZID67P2IH2hA>O=>sZ;4gTrgMX@}(7#Dp}e+Wmsc*zq5_E^F_L@a$*?Gc~A-`tBX$8LVu1Jt+e*C&IspW-(O84shjm7)B zI;O`r>U>ma`8%C*Y7r}N?}?yNWnSkjUriVDg3Wu6tVswt568iNSZa_5@7 zw5ZG94f^sWY*&!dyJa$SPj*n&h-;i$JTyaR1+tsA$*O9@6Z>p;sj)g%GOeqs!WjZ( znpc8yP_Ya$wG*+&)}orbjYH}!+*Z^{>%FB&<-P@Nt|W2thBmhH1BjESQm0D8hN*KI z3czwibIjDwjB-?(S+DnMxD@r*mqwB$dNKFprrF8(Y*vXI`~FER3R%(R&C%DRL_Z)O z=`b@v>IERhUeM%BgD*U?fP$h90stm}CO{@IU_oY}Q}ac(0ctR^fd-U7la@0B!F;g> zBM1Ua%~wKAKq8f7CQAlgq@xiF+T^z)K@q~a0Hqy3$W#u%<}%DQjTwritdnIMv28y& zKsGIpHI#M$5mPHM5QrfTF-;=|X<`5ogHhH8qb`0lMk50j_v!w40J=R800OD0fEm1* z$;?a(nZbzVCZ}Q6wA=mBS~CMS+tU3u$Qy>tVE`eOYF=6!iE6I)(ZUrLu}EIJ$=>%>4sj*4Z^u0PG-KS0ZUCJHLOMr0<-~? z8BD1GL``+nph7JmlO?xxbqA9Jggf!NF$MyTrP*c!%cZOt{dOoCyz_vG^H?9QfsN7# zS@{uz077c!ou;{5Rtg%7U{_RZ3?OQnW^jNoj<;XNpa}wOAwIG{I&1Zc{?saGr`G;B zTg|L$R<9ks-A(PUxmET%GizM+`|ED3&M8OI4bJMUu6fFfx}uqohA?9}w96v5(%r|Q zN;6W-4zt84MXNB4GJr-yK&yap%Lg{usA9vJ0NJnH7b{kf*dge|l;cd0SygOMv3k?; z4$OS9M^axRL3TJNsl|Nt-{+qut|!;@UC0lA6ss9TR+2mkelGiPZSgXf1}&t#=6S7- zMxb?37hGB~EX^pvW_IL-{bgt&e4l8y*L!{K+*lQUoXiS7S(*g9?Q=YBJ=$d(wPQ!K zWJSGsS%$%$W2&seegusP9-5GPha1Eg-GR9I=v7KIn zbZOO8i+%B1*h%TxMxA+YKhaj+T{h(EL|Y=8gK^GFoIyx&Eodr0A#&Jb^S1GM<{fV+ zi0{2|`&NEXC`{*vc|io009NWme1s7Lb&3j*0W3GsB#7nG}00oWsHpta@^+X5m=0jWrmDlZUbxT+RPxchPlDW*l=rrY_c_O zqqSO_%i`+zx^@*H}}D?KQGb2dxFFxb3x+c$M1#V{0t?s*{+U$+30!tlo64f`efE z6l`qI&R0;0>n_8106GgF0J4s7V|#99&xW~NuVL#=n;@*!(ZQJF$YilZ1$k3Rz(>{= zX?n&O8!6m~(Hdvl(FL4GY9P>%vuz|^k6gp3Lx4O&I7@m52y~jJyjUH*d93wo+HE*7 zU`U6z@$78S8Q~#U(QdQ1V1xr=1LF%@0~8o%4Hy9-b(v#GQ$cjdg{Xuq?J8l-ptYuL z7LgdhxcS)3U|2?h#>zd0U|Z9g%*f*cz#^4Ei0s$lw(Hz^IrFXu)Jf^9t?$(LnIGu+ zsGo?Ibwx-{NhJ^hS*?z3C_v6Y$r!t}zV3*#W21|#pK%-+xIG7&;n`!Wl8z1InF)d8 zKs!PszF{+K*+8%!buf#O1XANTkh$fbf&g}caAMj`+eQOygIkCzs6`VD#FdNdE3V+(i7R-3 zxZ+tMo$wNpOk|i9NH7R7NCjjvmU41u;wrIovf=DDh^5&te>Ma>=AUD76u_kVI`Y-ZJ)~b$0+2S zC@Q222*&6d1+;_M(aa%(hh5o4^8gwhF0PiVnVtqzp)az6_?}`*<-Ie(r7PZFbV>On z)D_r8#&aQP23QRkNpV?-x?;4rJJA((q8-uxB86MI53MlIKr&@O5SSGWw>D;1JMH?W zT?(`7S?yi|TQpqXw5t}O#&!BK)P%UBYDu`7jvU@zUAAd<%@#HGi&Or@ue{R=;sdhS zuC0W2bT$lHp80JGO$)bSp`nG_lwhl~%ZUC=qgw>b{kfk`6B^IntyYI?tY%6?EjjDJ zR1z*G*`*-Q_6r*0$Pu7v8{>!*(66;??2?mPA$4m_22dJd4ZHYDfUD9mB=D1Mu+>QG zGFQlu7H>;lH?;;M-EY^2*Nn(KSU-m$uLRmX51FfJLZ|x!#OzqJeusl+{guGC%^Hk4 zEBApX6m}2}i0z=Sc{S9H!S#mj=vddZaM%Y7WS2GD6-*tN0(Q2&HT_+!$Pe<^pbdpU zyICfrkzE)CQ9mJYw?fa4w8S=*+YLJ*UxsLg%taf&veRoY0?7KdFxZ8X`4j8jShHnp zu22?O?>MBGC64VRKn~Z`dMm$D$@<0D)t!`{+FED6vspA#^#QI1!UbbFr>cR=Q}+YtIJ6>D<7-Q{PI|J5dn`bD{_~0NT6wku?hhtsUMmLr#}Ed zkh+sU4Kg?%W<%L*n%(pB3|LKEKinw$%AQDtvU&wM+ zU_jF>6M2g2>W{{6c)snkKK?WOsG8j=pYIs|kkYI({s~CYF#f;CQ;k0^`1~UIyPg~n z)kl&1R?nuZDZdm??!8zDaVAy$y^)Grj{hy5NasSU^H`=P!RGw%pAzO&+J(DeE-(08 zJh6v7sA8{VF_8SGK|Z->ehd1jyf?ZK%4~U(K7ymq<7#yw-|(oMO=gQH_lgNGf4?_U z*Dp+L)W?OmrbNaqSJx9+yGjz(y+qX=l=3P){+oV*$!|8t<+z%vT8qh*=%8(&E@zW* z)q;R6-m7XdE*@QM$Gbt&L;Ul_cqP{GUdIw0j3x519M8TblK5aGaf4*3Own(NBsmyK z;!#o^K=&=N%nrsfYe_lb)5ms5?Laj$q~e&4etmoTuq1Uy#ZH|VPd*Zg2y^EF&AdAXP^?-bjcqYe81PhkIN>7f6=$AeLhn8;~{s{+%a z&S{F&aY#570u%IIx?p(zxF<6H*`H$klVSXSj|V^qc?t3irFCB7f&pG}05~VO7MWmw zG=9VLZJ+h=FReHEdY5%cj%Nv}$F6LRhDg6Op^`_pYVTz!+(-f+FR?c=pQ4!aMbeA@S~qP@0edqZ6JwvCBN zlJGtaD;_sorxDRqe~HxH-ihHOw04ok&Jur#YQ_y$Xm|ztEzS23&bwsuO`y;Jm%tp- zlKdZg&)OU}j@)PaSJ0QMv$V0b0N?c0rL48J8>ejVmhDa5Rc^}%;vq3R8mfjfl9j~% z?ZJZ&kOVoLA!j5d!`hW45@-P3=tcwRM+jZVjS+A~5;MwB90yK}DFd4E!Z1uOO?X-M zVX~vfmY5vq1U+i4Y~V2VY>bH?guc(*IK}`(#P?j!MktK2M^vt>4YHIE!!(zlCd>)3 z+Jo($T3ceAR~;KZ)ChFFG*U_CWIkYlK9%gRm4q(gD&aC=30*Xk1ZpV)%XdnSLvL{M6#+_)z0WN@a2S(ncxeA8=}(I z62WWJOxDu|Uaxw?QH16)V-bg4gCQrRtS#_eG{s-)h2#uv77{P5BbCvG6Qx+w`C@uL zPet;hl=on9lVtRGWIlQ}A_sO~`Z=Zlw!gi2QDL(EZ7%bwnX|G@o36GyRjrEIVoKe% zK27B?Q7^Q8lhl^GfF5DrTW?EoFY0cQ!?q5fPqwSfp=u3o3S!$uI1Hfg(138!YljHI z*!5zgd@eVfqlHaAP|43`$*0K+(btnZ;@>(S znr6J<#r|A)reMFDae}thGEHoKC)UFk8$j8TOEeI}gAMh98Ok#2wV)pJ zqCRyX@O=zvKp_$vf!NGcde^#mOJCMy!Ny7`GzD#)tWwEWFROPwN>NQ+5h_YmEAMdm zcT+p6w3RE0MTmFGkHM8{+WeAjU5=DTRK%z*ca%U37jU39C zX=Xdf4X8(HOk8L)6i^m~j*1oC-?bqUMHW0rlsk|pQn!6z62+*GcS)4ZM2L30X<~l; z^s`5VYyf3T5u$uE=R?derV)%IOl|7BB%m~m zY-XEnaV#^pR5{Kp8Y2kvWqAyMtn=iW&XxRGUhtJFD^DTje9v$x zPY*J_Nsv2llaLV;v|#*Xd1BRhj(1_fE2N91g>ar#EpH)NsO4N7nxI*h)&!#JwLn_Y zpK_C`%P)~bLz7;U3!Or0t~)WQPCE)oF1J5aoh9W^>T*g>2w6pqTO58>gFcev6em=c zR848Nn#m>Qcq?ILSHkMYny|{hJJt7hoYK}gozq2vpK+;cU5Xckl0c zvBWchLNZ6QDwC}eaN^KIvTa8$HSO>tYe+w} z$G5PaWKc9!?fumOr8=iPmeW(q@Kd2SN80g8OYO>Z?X51V7Zv~T{?x=R@695i*)z_0 zv`R=WlVI}-vs7k_mxC@wI+0k+zW#PvE+qw?^G_9~wMHudYKBNzr?6It)3WqP1?dayq%jF^oWMFb+;4>s`m6(RtoM8H&vdGxoC)@h(bb`OCX9|6!|O)Vv(-e zEFAJ)b?v7ziWc}HKLD-qj5_>m?rAiANWXs4FQ10o=Ey6G`aO`yCYB}A)QYMuJd;U` ztDB2^yFU`zn!vM=A{=e^V`sGS32ilJ5FsNERn%pUiFb1|ryjmvTX##oSGA|-dj;1z zYVxZWk|6Lygi&BqFZ59Wecyq=jX~sL;+gq1ht_#-oZnF>=F0CWWblO{w-u74eE3;@ z$xDS+AbDG4zT(QV3M7@u4arnD#N%*5VoCQI`_qpgp$3+%HH>aV%2 zrI4sR>i$hasM#~BrAJt|=F8G{mva$h9`p!c*tMAxdalh?SJ%g$$T8}Hj>|dKov!&V zzpBZOQ$GLHwsPGxKT_jTACHCBo$@+jfYy=t`HauzEKA}U=ba@_hin#fel_);Y_Gg*^RdL{N# z!lXy=mN1bi_F=OX{{2>L5&1^(oG#@l6tXV3ipqD3^yEb9wz)%q+%aSGph%8*#nb9It(?vetW;VjFrukR17j+oTWvx9Hq~+4R|uY z*VhOm57j!jW>aygtk_NBEVpm(5sPcb2|kExDI0c1;i8(Cye-i zFl3>_!Z5O3O3b1z@2Do;=!^;tyxbkLMS59oAy2H{S!dK#t6kQ<{lDt|fA7%mR0xo1 z+gRiO3q3o~{Qo@R|7SyZ@c-M#!`H?ae2!8iuGZNlnxByC_zeSRmT4$tooZU z@%^)%&SCLV{!x@PeGzp^crWy(9`PSnne{xa+N<@XYE|#iqpQs3uiAC=mU#WL4xil? zNx$5l)A>oZynXzL;)~S!!-v&;E|z&Y{rL+2hsTfPuUfTc(M!%FQrxQI<)1~Bgj7}N zq5pt$FP`;h>+g>r-CT$joSrYZy7D};o=Q;G(OdM1{`G(O8qD<*OE^Mi z&$VN3DS?ll7O-dOx%H<%S^r`E@sC;y*7NhF1+3q!Kl5fpL{E}h`EQoh-S4uvWi|u|DiQJrv-`CpWNS^ljjHWs!@7U3~G{E4H+U{=as&%8)P&cmtk1` zUEIQ|N>;`Nw6Y3GmewlEO(Z3rta)jaz;|-1%XwxUk(CJ5Z^>*|!VE*|0aR2Z)~mOt z??orxo&Ht)^ZM+UPyZ_K{Tm;CIsI_@?(EaqhmXQ8f>4&sY0(`~T!|LxoFtqX-Yl)l zln9dpO*%+BPF1DDqI#r7NKRF0+mScKJDcOLX2H>@sSrZ* z6`IM{!pOYk6FgGvS7E{mDz$0DTW^x)e)^!9rRuZ( zHF>?4>oEDMYtts_Sktz9Wb8(8wv@9vj8O`s4rm*#QH`Q0X8{%d`VQCrxP-;j4?Kt* zMo|#?vG0(`EN5$d>5{a(kfscBcI5mzOK>99!9++HF-haX(^COcmOGkHzkHnwf=h}x zE3Tw-s1!E~X*XORA}I@G4ok9-(f3{ZvPf@=FpF9Ta&0K#vX3Gns{I#Tq*7H}T@mT% zbJv<8M{G?fD9WnXh}syY)!PQUqu%ua$^(De=YQ_L^FIb&V6guQ4(EUScpixTk6077 zxc0tl>!00SIPbs;C_jo-y2kVt1`swZ44f&ggLY-YR3TQGzDSGZ^UUoUW5=RXh}&VTmuRQW&Ude>|H z6_(jQW!abczedZiVilSq^=Dl-8l3o3g1uuSEj@@P|J7hqRlKHOmJ4MN)tzWE$AOA; z(3b%*hiNpjD*G`2fRMdf!ySP1jC~tt?^~A&tv=PBbPQ38aM2ihJ2=MBnonBOyelk5 zz2Y`eG3pS^XwE}h@IM>ZYT;)G*?#0ju@eBm>=02D+pYr<@gqb+w;pP)(Nr91u z6YglSX4WuLE`QqWPza_@Mp|2QV@Ap=Zfq%3u}TL-Lr|?`&Zo60s!UDTs7&zByYdzn(DGeYgw2xo z-U>2OjH{WIJQMaV*$NAT7q*%`Ye#i7AalxOR|?sA{8iOkHKd~=6l}^@^5fcdbAj~V zepbK8#a-4GRk?iGh7)yzz~MG1P1b6%-X%)r!#S?8xVHJHx%zf;;KquE0HN6p7Iys+tb3jKz-##AA|5MDGc*R(5K`M<(KdSV|9qyn` z|yPOx0JJN=2-Z zUk!CKz0+lucU5GrIw8bUM~Osg9_eaPp|HQGT*o=Oxa8|9h$MbQWW0_7v4kYTGS1Wf zGD_#~DpQEd{(jdd#%ekj-3=z=6T{>w%GPI81O9*-9QJ3`-sd3H%Z{W^1!)Ha(uY*1kQX8p*#QGl7)KF_A{uxEg@8q| zA41CR4~4`U)j+#kw#+o@Dm@LA1gMR|AoQ-lJrq+TY|1+a*vw;&8w4oAK^Vt`FwZBB z=Tqjn-6WfmDwSGL6x0-j22Fa)j-*HhX?Uv9_2}2fQpY~u9su74VQ9M{3=n1%+c0$E zAOazX-1{KX4Ek8P>KjzGrnazI?Xj9e8|0L9G>*4U&=6oMPM~oB2zFT*aiY0lz+mXQ zk?Z#mv`I4~J#YCoVG43;I&+;Ix-xAf<)E6AkWm9TJrQf;tdlTi9;Y6qT&?gz7<(b+ ze*`gcU<^4C!QE?s<#whhSM6^aH0vojl13$DIwvc5}eOuX7E!LGEt6XTXrle7QObzJ=LmIg;=6ZzhQ$KV#%?N`uVgx`K zNiVlg@~m(!(%P)%%l0{*nU%&*iD|C>b=+P>|x&<@DmFFwt~D|7LcX}deD-uO*b4c??2)*54-dI4Z0vOVGi$Y#Lx zTow~RDD(L?7y=(pwM_L!c2l>O(}i{utVkYL?wQ>3&dl|G~=8hx{1w ze}sFM|F#qOZTs)T{r_H`2O|Hsb{4(s2mrgztT9RYkKKB9Pnrc}=Z?nJm?d8$pe=Gj#^8f=;75`h6ep&uzj{iN>#jDBX z!((x)^1E^KdM&+8)*2-K{hxBT6nRcm_^-S^`{CE0zJ3G!r9OT5_3Z06*k9h!Jn<=;;~ygB{h?b$~TAAljYb!xnwF|=DGe^MLk%m1zqy{y?=>WOhG zHI6iERfe5pmN=@_{RV1BmCCJzKHo6h`RvCb={c3kZ74P`Vb%~R1HlL ztc3t$sf`dIt89q?S+|7%%5Z3V9>5VM4s*o~mG86I;Ue0m2z6ZZw&G}Zqo#9OR*2}H zxh)iqg0>N=JHc#;{!Vy;I~zn1a}UKfLXjW&UI=3BQ5rHF5HFySADf6$GyGo^S0M?S z^p5jb(-;sX(@sqU#F-2_GeaGPqb`k1zN4GV>n6PGh%(&c`7SjYo z-FeVoe~R#jaDTU9{thB*?lJIh6>f4wtU!A__f8Y`a^gUtdyoF>OhAkYqGrQUv8?}( zT^btpf5Ck?|M3s|zr8#RVhpH{oCshLxls@S5Bb0jFb+@a!?WARaQ^G;+y2{y zE&D&#-~9p5!2oa<27m{9ut^?+{P*sK{s#{7e;?}6y0_I4$p2ML;Qb#ulAod2m;4#-T%RZ|Hob)E&hM*-rAc2z^_sO z*df`cNVy)KIw|fcrwp=si?p&O ztj%qZqr7gf`f7%B$IXSPDjIHcA|pgJ3}fSWRM(rHMpU>Bzd#%H#Z)- z|DPP(Z}i^7W^;RSefIvsx`@&@d&%yni>kJl=z$Xbe)|XCl40CDnDuV%_mZbcntYYu zD)Q}Ud5)hS9fOcfpP1h!>0a`6f(Hul!wJ;DJ*OZN68}-yD~{>v;d$iQ)Iv_RSmr_u%#R z_2K>IVz39E+w1G$`?o#~f$LG9KKbvPL_bM3pFV-%>x0L9yn)^{t_r)>2c?>B{F?Ug z=)32y2BC?`wjnNwwy9c38N!WhuQ=C=jX57d6ZCxTDF1y+x_0# zk-J{kT!NY($LGV7H{S;3eCQAUGEmT=cBz6)+MjnKYRUS_Rvn?dJ|^JW-jw#uE;8Px z6D)7E2$cjEzircmavN2q=VkQ{U)^t-ac-o6pu_v!@$%~G^5HM{LwI>KRdih4r%>ZU4C4hdJoV{uRti$Kg^5 zmCfpZUR?S=#@@hvYleXMaCv1N(&e|ca>@#PSL5>Hj}xQ7(e}-8McigReEIUt_IS|7 zJ2*agK5Q(wv2g$JyYE0%28WfGU~M!sqhrYSzmAWdd%NR@?_nJ989b&43?;p%%^6t(hq}dcdUjf-BRMYz>yOI3jJ^V_W3zsl-CwqIq{O&%1|9<|- z`Kuc=+QAN9e}8g(zk%NWB!OA~_Wb5a@d{f&NFOl`oZ-u>O#-*ZXQ&t3eJ|?3 z&zXlOM{g$P9mjD0;6i{o*#D7iT=S1lg3$7Rx_?kGy#DQ*Q4N8yz=N?pKKZ^j15e(R zgIYPHjH~6raS6}CtCOScpb}3_{6G9~?2lae27LY<2zuu%=l^;4%e#AMY@e@XcV&im zdkl6JJYdqjy(#IEz+5j&Q~=P`+~S>=n=VW3^>!FaAEwLEM_aluUD}oh(dN1xE>pub zP`KNX(uFQemusk;(`y#3J^}TZ*{i;tA zJhSfji#tXu&UwFVf2-^sU?H`Yrk%k;o}XXp8vD5JV~o%{E7suV0EWFSxLCVH07nK|QGHC>;? z+v?bTX>jhu^yDjhU#~IDc%&z4&F1l_GW-DVD@{J3qza^5-rmH|=r)gc%p&1ENz^K8 z@6=5;c@<85y2uTo9{}Np?`}RLai4gXM|DQ`E7t`}p}N%x>RdkoB5`*(tC&aB|Fet$ zWr3VyIKznibDf29%7|-XaWYENpwP-sss!>UYPK|Rvp=-nw=&-mR}gRc8> zHHXfe#r9(3R$Tg;*~_9=>8cL>G)YGWlh$fwRe-v440*?4>7>^7BV2l$X5`12a%zt> zlw-jvdW$K0jEoQV24<4CM9dY^S0QKC`szGN3d~rK7joeS__vrnN{IgHZ~a1MS#{^2 zE4yX}yL@LW&g)9O0(6-CGfs5b7&YDo3A#r^xQoYA?ruH{M%PX;V&ZlP`o?nehqkKz z9`Tj;y5+5`Jpj?~b%~q%r_JFY?sng~Xbm z%qpUAk#VgA%~+9XHlyng@27|%YHzj}0D6IhRRFg{JPO>Fqz4>paw?IcR%xlg7|l4h z0{$t5St@i|s7YYM9eB^~TKn-D=tgK}f)nyAM5Fb%cI91?MJ)tpg)tK6d4{wwMZrzV zB;q`uUHNJ^<*sh^_R0Tlu>AZlp&!gF$KyBYI3Q7B)39qGFkCz|G~4n zdLu$p;m)0z6|Kk@Rgp0~4GpR~ zNHe?AJD$Zg-?7$PW+M@2IhFkCsqhb;Xefgmy5B{S9##qM46F!?PTRhPAaR zI_~#87y^&t+1@wL}^ekmaVZv=*AOU^`&2tNGhMeJ6l$$M| z-Bp_|o9af_XI8SLURb}9Y4&!{7=a8_9vN^0z^N*P z{BfuV1FML|If7w=Sc_R<^UUVXXH1nrm`*E&e_#6Su6%9U)Vg(bW<5Re!U~orHzp5p zM3p9f_7jMt5(&zA2Bu_|X~qfDd5-jCrK27D&+g(a{0$J3lrzDJ*cQSRaes~j2Js43 zswHwEWl(C#Etr5i}wcvcst^IEAd{e_R8ar^Q&U~&*2!54YOj>F2=@x>E_pI8jL3CLt+W3ape{AQ zO)%0Hy5nM~UvK}?#l;L9aYCI1KqX-&){3_hYg5LORX~L&BuslOlnT)f!6*11B~j<6Pr8 zOY;LWSdBsVC}afQ0?tM7b=X(o*DXZk)FP1?iV(PQ88V0&Ze7GA4U=vmbyoUz&J0q; z-Jj+8t^FNbY4(2^dtZJ3yS-BK=Iq1$#@S7$rPiMMO-*~ryI&-Opa1OAzm2b)-duj% z`*Bpv?-F;4s@lia6sF!6V7zlavk&%dI4`fax1E;P`uEcZ34i+c@z3kfBX-rGmhDI; zHFcS^$7%0Q(C5+PoxIO+#5nf%Q<(82CbD3dBCe>+XhD=Uv;e~t+x{{A|6D!XDZ9Gm z{E54$!8`XCHKF5J)mDzNbM`N`vhrG0lIlJc69o@K|eZ_9=G2-u4V1iW?t7eZ5f?41S>Mja>c18q+rTqsg)*mGZO}b zO7oHSXh$fRiEVI%YKKu6g`$J&B*#Kb1J;#@1`@)U84V z@UWhChlk#wp&m5`&rr|P@S#wHO(P72B8;1Gt(;}eIv{0T0}lx6j5(NOTBasLJjVjM zhAa@ZlBOxQh81S+67f)Y#tuYr5XK>>m&#cObtL6+P)EWZXuL5L6#{w*j5pwTAkKs( zxh)jqk~7Nkxl6<&AuVH+`l4PA0KQV%D%g7jJqr0Ac@J5PzGgX0sR(>!k#gi-%4b$6 za91?SxlwZ$KBE9?JB-?K)jBB8;#!Dii+Lr2Eg4Ir!FBdR8Uk1fKvzg?wIP|Ixj-z3 zUtCPT*)JdDBSzH_mEofzID04-LFZXk0p>Z&U{>$GPMUyL?t2*2Dqc0#Fp^3FqbpI? zO`I&vF~wBUOcPAxV$ax}_kj|fR&8=xHppqY!1vq#00;H#`ZNfdm-H(RAn=U}^MzPC4e<4-xegGpaJ zO}2+G9j|uZfAj7FO7zuN7rj-fKhQ95FMg~K;_fB7ub>`0cwi}XTHaS*&6ijexu~qC zvNEHOfL8R@*lB5sCBO8i*`Xo)fzA4SUsA|3pFCx+@A;(~LLqw_=03P)&#&!FRq&C& zpQ1jA)nTz@(>%Di0#~K%7wMCx<)3%}_V%7WMFA@1wGl}AN>hK%icMKEuOJ7nkB`RR zmrP5nKcAx^;!nA4VFuy-2+c@C)E|9rt^A^{_64 zsYk*<1mVv4ZL2`5Yzj^kEpU-@%Q9J5D!C*wo!&}WHc$|syjGSlWO<}o6V!`TD_~ru zS^@u1VD$(xM8G7^1dLyWqB%vn5P}*kE#um<*><|yLD1CRMb(c%itjIj1vu8>0gRnK z#x3-%f)`v;1s%&u%3&DF3$ApQYBhZ*rr*Ka zskU0HR12zM=7SL)3zX$~Ceyh~YZJk%cj%1AxbEQmS)?w+e^l7Ywiqv9wE2*6%1z33 zZjB@b%@`vDw7sB=6^zb(-Pnq$+(6X|v>d}d&9My1kaZn!p@iPB(6N~UBY_K$!muTn zr!=LiNO6v_Dbk#)>Cbhe?^s=@B>1dQcm2K^}z2<{PD5WbN(vR+)M`_RZk&25=iPWK!oiNI`7Q zQHqQbLNJpFP0`|Yvv3{2FWP+3T}4aw?!ql5{>o(2>tYYB$0bkQ-8Q}3LI68J z#J}S0+Dfo@+@F91;5_x|Wm=C2z4p;%KY4QsIKmUlFD)5sUHqZs9FYQrX*>FrZXWL% zB@FlJ-ln94#>PW0Rb zr~cF!EfhL;dx2XjV>z@P8SAm`hcCv>B z$aFJ{b+KK>zZBPwgte%41bv1aY4HGy!98b%)<)Bm8Nn37QX?UW(I{1Omnp)Gb{#BT zmb;-g7@}W?IdDD>YY?z7A78vumZ3bi42hH!ngWQLQmdr}7ggkF#$nMaoT!_-%RGz0 zG#}lWJ&Akr#dCJ~kjUM}MJh$gm36z52!Z*Sr_f$`ESXWUx&6!b(G=y`qbzAJ(X8}lXm;X6c`Hbt-)#a${=Rg`=(o# z@@a3&ZQuT#Y->+ zC1Xdo{$I=gm9@M%g)pt%AiY}uI)$%p{c=(IM z)ACHnX}MzbjRO*Z+kuwI_wwwbjod#?v0X|*r@%hRV4&Eo>$4TxQ7=|($Fv~5VSGG^ zP?P0~T7dI2Mso0V@jL zGZKUpf-sc|Y$z#Mjwut`%y}c+PAKPU7NwXADnCg(8;&;LVqDtnqe<{$7Z7u;d4_XT z@PaCpy4Y$ik{GcV44vsc>_JXN*Bf>T7K5%bKry@1G%SmIPQ%%k?lJZZG7KhO$|bfU zRfOiL0*|;5OuBu`d^)sdD^yKc)m?(t794|A3m|EjR)Es*w$jGNDtSXl5nYD7{C-7RZ`f&TmQQdM0S zRyWy_lRPX2sA-Wrr&u4!!^1=J9D`M>fl>rJ!$}JO?GEIRy}NhO6RX_2F9Qht{&Oa% zz`&)jd?Aoa$}%*|gE`Jk0+wTiG^c(M(LzF7N)dHlEDJ*+q~|5nG781y`}@cgIlNAl zug9ySti$V6D9eSrx7IHq3D%Af>o{k^cRL)No3ZgndxmfSH5&H2+lnTV%TFjj}jwhTjAmZhsanM?qzF^rSt-h zafYm)GS6!d%h)A|-?2*i^Mo zr$GhJB(FOeI!Se*i=hgozB~@_`7pq9kARjcgA7DM0BrntcGy6#!#L?xTx`$laox?7 z(Z%fCeeOkmookljtJr1HisyUW4kMzl_VWVva!m=~bqxm)C)UrS?EIQ<77%pUSsfyT z&NpM%OV(|@_GGnF=E=yj;1+Sn4U+Esp_9x`!|>gc?T0x^ z=PByY8k1hAiDj!jyJM&%*90;LF;&0;4ZWgajIo9=$P`_!1o~jtRZD?cAk*J}o<}wv z=+BlcL~%w|hG4wSG$l+SCO`jV@0!E*@Am#BUEZ380}Gicd{Q>=&hGc}qkUQUz(*7Y zXKGSWAPmz^a7%#&LP6DlbbV#XH<- zC7+l^yhAOXY$JCzaSz0@`QeY-?;2mD$nnAIjlAuOfBolg|N8w`&DQ7ao;G{?uIY@t zf3kZWdfCC=efUo9q=&%n_V2HIgRt@WyUj!2nM1Krt6%>(R7h`4_}T2Oudo0Af27tC zo=}+pbfERG9kB>~BXRJ*9(`T2#rke?{pEnt*29w;$j=UwCU_UkoYP8&lu3 z)Mda&cO`iST|o4eR*C4U1+6ComQ~__);gDkfx?J)HoT8*S^^p=PVc+ zjng*W`w0ZNSljA=;< z;u2(?Ck((%lNV^0QPtr+C9W1qGy02U5^_{%-L|%+mJ&*JxIJJU*Ip~8Rz`9Er;Y!V zo!1v{Z=3Y0Zs{y_Q0d+^f4z^o*nLnu!&hI8oiTV-G|<^bdwOeLtsknF>+rJfo6}*c zq_;&pths6)_g?3_eQsiZT5*o?(&=Dp8r@`IXU!?^-_M-?U!5-3$06VDuNIB;?N@(0 zPd!S0+@C3~`;Kw720)*2!XaJ%j@zxAhc2IbeLYc;W6btJz*!P_?nbiaG`yN5DwzyaYuE3&9a%M6~D4rIYGB?Cj5* z?c;uE@fmuH{FNrC=W|IzEVxv)#d?VK(=WN8kqnoRd!Eu^IRn6gu^dp24pdmGaV%I7FK}(f0T3{RP zo59c!mZV1)B)yU7>1LyE8ng9NNSHjsycKLj@0#-2MaABvx3`aX_vfaFSoC&tZ|}D! z#QsSh9--S~_ElcfIQj)#;S!Aj9XnevNi6R2luQDBxA=IwRq}Q}@2_3*S|>k4bx}9( zh%XfLGcFg%4l0CVAjBCG+RJ&{hA_6i_hO?tXbo5_SXRBr-^oweCLVmu_qlqk*^FZi zTpi`*?vVTp^&MgRc*y7i^L1`X7g$kD`bJ&Jo_C20xm0zL6(*O8#1(cI^cl^R6D;iV zVZt>aI5@b45K86ykxB7!D|`(9Lh%7|-bsf|pGoRspQwbUZl`EM`&Kr*Dc9u9Y%+H# zx$iA_*^RjqHa*uuDyYIhd%cfiCjchSDGH%c45zaNKiI?LL!6s zD=W9#-Zj!MwCwJ;aX-Lq#%sck`t@tQ@Xc|#H)lPzj&jGQ>gD(% z&7@2LsZ&0R%5NWc#kD!EfrnY~X>&-39kx>un#5%6U|uMm@zPx4s69inkb)s`RdB9T zTqZUH>6=Tr6z>-~uOc~Qca5ofsq z#j-PGfAqbplTPoNAA6ITj%$N$^OMOuZjNUjW2*g(Po zv`YBN8ar$qCdN7kUy_|IzN(YX@e}p-;rXX8UV<=8A~k;O7cZ}t%{`>a8s~rZpWT1( zsB8x3BuyXhl&A1@OAWY5Fm;R`wrL+WSofZ1wg2Y{@n1%|oe(Nh&7f9Bq@C?LA(3e2 zV?L#>iHVam7YT|)`__`8+vz_gDtwWp3gxJF23f_FB1{`6A&>woB#7ayB*kJtc4rO# zS>xZo{cT2nKJ-C> z%;qje^Cdj$Mt7D+_1;&WO@VE2>OON33?7J9lU8zKUF%Fsk>kb?g>mpgs8<5z<)m~; ziye0HKi}!nU-EuXv@%)qwyLDAYNZT=H#L}N_&4jGCpt;?xbvVNhU_{+E};@y7WVVC zp*pOEslkxy5NrTQdfvfgH{k||Rkb{`dfQ|FS7=CFTHbBnHH^*0JEq zOoJACEGQDpSqAmLKzNuFqygpC%yFAs$f3CHR#{wP(_3YBfkh8l(Tdi3^}td=9F;A? zE!Vu|oHO6%Z)yczQ*}G#wC@Q!yRNNXY!Vy}zAVni%yP=xwEW;p-*D-W%Sek{c!uI! zP=cY5Mp~~Da3?7BBan*L2*yk9!n&P}*68s6_%kQz#UB|;SAAn3Nd0i4C_iM>e_?7fulk0d89cML6+QbPV-l?=x`py_@?CDDx7vaBS|&uo!PgkBIXC0IoG| z!=k}4f`x0T^%DTX*efq>E26&gXL}eeH~rwT@@}!WytywNPNDiEAi|#+uyUnp0gLW| z>PJ%a$&&@E^$RS&x*}f4YOOqGSR+G)a|!`$(go)ptn|uZb08^|>8im3yHK_iy}0c@ zMkXfY5L_u)jbbFb1jk62M-ofjQf;JS*iTN*OLNUBCSE<11bOvvjAV~p;MbY*!u^U8 zw6>3j5dhoALk6d1nOcOlrS}-JBXc|4XP9rZQ;2D+{cP@#hC~J5Y#jMDMN61Lnv5~> zOiql=uoGSeSh&bCLL)huSU{F5RSQ}mDno5-I-8KMh;&H2++spw#5JTqLah8?4W=w1 z5X*M0ZdjgmnDr_7#riaLmo=nTILrD}GoV((!JoC(mH4_FD@EOxj8bNwdb(^403*6e zEJl=hSQHgZTFQff@pHODew|{RSAncga)7Lys9!z1y2uE>l0Vyi;WEFuaa^>{&fBDn zpzFT=jzyj>v`ao`+?Lg}#ci9XuUZP^S>zj=Apre6qAX!8mwpgv3=v=e89=R{Pm(`zrmTQm8Ev^3Rx58GoO?)z<@JMOgod>3=x&8`~9jh%iU z8H-M2>|^qFQ6ATH`d*(g3NcDzSa+XO^$= z-(yHlmMaElOjU)@m~iCyA^siVxs@Lm@My}RmBtdSrNG#>+Ut&tQ=uv1&X$DZ+s~|F zCIiYJNTE|-C)lfgsM2ndpSkf|zh17)g zhdDB~wKy@y`yBV%Lu0y&k>eSBeDvehlk)KsuD^^vJAwz&zB09kD}J!nYZ3eH`|J6E zhWxhv_*}!;een~=8O|FZ_jAM8Bq7tw)=Jj)wi*-Kw8!-}v_WQtgs3S*JJ_PjLCqN= z1~`o^md-%G6n2_mMnOxc0pl*0x2wIbC(WvNeY*1$HCJb!JN}hvsAZYjCMve!P1`3L z?-n9q`*>KB2`$CI8WWCqSq6;d1P0Yb8Z0Q}i=C@N>)m7Wzta5}12oGihUKx^J4*-5 zV{*_kbXdLSJ*ijB14vc-&LMc8B2E#30CvjHIjH5%FZzWCvcOr~^YhbAJ_Jm{|6{Nw z>BUfm(lr*WP=3vvXT7*l&|J4}N`-rt;uB zYG;1`d7g3vrJ!sfP;oC5G{7xQ^SfXD>JQuPt(Euhy}~mpwcQ2X=Xb9M zfB$?Jqa4mtadYoZO~VIHl--+0Qa5UN{XFfFf4tAb(;EB z97spbejFJ(Ba-Vc2k#m6G*06StQG;>v5ej zsMw90<2$R#hadj<*YCdh`VS%DFJJz5GJ}5q^|yb%p3mh_F+gNXu!7EM#Vw_fLci9Q z$}kt#*xy9n(Zya885c@~QFTN4C|j3l*)}*;z8>|C^77u?zuNca-ihCTeEH1}U(M}1 zu;touDZGGCA$kY^M*6wXs}~{IxjqW!h+ijho8O(=1`Y3%TKh53p94;R%?}P|%Tyf? zPBdje^%pJHy!wx=id|hkKuoTyF1|DDl}<(sA{;91*YiL~sg%_SDATfWV4|<@H;3T9 z^5>EOMZZb`iJAsn4WV$@)$s}PPZo0-xf+-68Q@VSXi?dWFrr`Jzga!sECB(Nf)McJ}idgc90Z!i<-`b?FjPGOg_`7?K za3XwQKqE&IGfApstPP0;amtM!f)o3g+Z-8?$Q|J$1|$*1f^^gt2pm6z&?5#b-wN?O zg+%r&)~12Set<^r7}o~Q-#TG`tO1Oz07n3Iq^Te|{!Y2D?VE9^LP{5>x?=V@Wl-@H zRSe)V1!Wn)1TKiFFRzP(9PW(wvMt^ppGm((ewE}46mKv0Vm-Xn6ID_#L}H>^V&tc0 z)(T{)VumXsy&!Bw7k~4uq~5U+QS7n^($Ns+F(p1z&rhR~4l*YtLmrAiK?XsU(z{%N zhaudtnKKAtu;~WlloZ7$j88CPfTs+);;lG}D;CEgizz&IL_YoykYliXrpiMRnY95G z$a*$K3{E|#7_{k$^Yv)Sak#ZJ22DaoB`4w151MGHkLNFBIJeZu-A+EAJ))SYS@>}$Kdr#p<(_GiG9IsKp^itP#W@!{ zVx>~G?LsiuMh7D-^Z!~%0I?VWX9V%%M#NQ_s9tCRfuRwcJF5%>OodQ@B)aTZ zRAcg%3oV$8I}JQ)nB9|(o;dTIFu3ITN(Sr{19tNHukr~OG2oLA85o@Y;@sC4)}URy zb^6TKU`)DJgMq=U3b|VT>ovn!2HiSyo#-tVS|taO2Z2~nb|FvSntz={F5p1f=s$d%Hb?4g`6`^ol(iew znRi#k<-v}(mNP8;;6|opI-EPBTG{_&?@4>)ww26h{|eb_;Mt4GSiE$2*AF&wybX|K zgE(32Lu_~{lJYdt(;7(KGd7I*@5>@}AKg-4GxO5?Fb72z$zoNpSS%J1^>8r6+`BL@ zY%}Vi!uz6%H@;7fAHEf-nWiT1vbpl${-su51=Txkh5{vGmr)d;2#H|AW@}W8Zf+eA z?Ah*YVI2F#RZ<448Z6L>)4e^UX|cM8!0fVJ9`4(u=Lm!ssn|z)CxS^xRirn}NcqUs zTN*8Z$w<-B+nHw2^T86MW@Rj_-REV(HNkc9#n#W0?d&8OrGkKYm{6Z!5r&b%G+;sG zx;{||hht^@rCRa=jqrCH`JL~R5DGQ+uRfT5{6QyLBVrZ^<*PtZ5``X7T95}SjHPk| zH;(q}!BHILPyM+D0IvPCIb<4uzT#DW@v{U#dOnW%ITAplAN$xCRTn4=a;(+Tx%o<;~2Zll~F8-$6^s{U08Xs(3;-?^pnM>QvFzb>S!meuhURC z*8gyd6%Kka*9*yFBZdT$X?!t_Gu={1psbj&rj9II*dw0irF=s=07Pl=Dc zDcXHHJe{u4VTBZup;FXCF84e?lr&T_Kq1u&4v+V!(An#K&6|H^-e@FE37FN?q;xBA z(onnD^SraYq8^Vu>IJT^TtD=ckM(Xe2r1Lc3lD;5RO}TS zQW3GhV}!X86PyVoy)dRY6qtKj4`c&^r4~JF^8{Bn>$;ckI^V`)U}C7M0tdDkJ>#ft z-%-RP9t|}%Jb2S2g7`54Bds%Nf)B=+8}h4Zt$S;=+|i@kD$GuaNu(HE@&EBR45f5gdRx!{-T)syd2rQY&I_T&umz$@Yva?cDQ_7y5WT^XdtFQu2udO*d+lZDQx^zZZ?mS^6r1z)X2j$whp1KWxNy z+i+tcOgK!~fW1be#Yw9w^a*ka#9a<+8``OuoMs!` z9($uLg-MtET?@5S8l8IdfA?PK|Max} zA0v4j2N;DhK~W$nccq>K4-?nJ+>0dl@4A1dblBA8e@2gN|05K2?SJ~$iT{s~9*F%f zG4cDd^NS-`08wE9#9a&EoZ1(}MCIwArfXx&Xw7SpsNI@kmZ+BQ;iHb}l zR|lENL1yxI@4nyc{sCqZwP(`bqbT$D$d&#cslwk2v;9>!tv&W%@5uIF;t|r;|B#DM z`rk29Y5&a+C7s_FU^yBv`Fe%PH!uCV_~Z8Wk#XO8_iwX>n6I?P_w+xX<}2>S)4xBx zeYB(Lw{(~>{;*|s$6F!~QdxWlNjslK)+8yGiH%@qi}E;DpZZE(a^0&>wUU`yjx3qp z+&X{Y_xrIXcaZ$p4F2^Oi-WRUBlmI7)U+&_rr<cjwK*(a_XKJ!S*LSSRzGY;#z}E;5R6sqKKOt^5%PnG!CwLvbZ$ zdg7zH@UBkaVunI5!Z={km4Wb?@6x~v8NtFh>bwC1t+BrXN~9))Sv=bkD~76Hf3d_} z;-rx~0wbp2$XFR`SggcN-kla|e4ockgh9YL3Y4#CBv?QpZZGu_mpRqwx)38?eS)X4 zGLTN&5DT!drU}Ez6{*y7#}En>oQ#%^l&DC?cBhFJ#vndO5NnKJH}(Y)aV${8aD*aP z`EgD$Y6+1+I>_0IXwsY4U$p2d@sj^P0wd|o9?=0^XyU@xp$xEm@}4VPoxy$;vE)qYg~6F()R)?(?=M^WqLqQF`qE z=w8_W*-8I9M&i`ki3HL%Gm0qc+ihK{GSE?X@bYQG5Ud)0!1^FD7+OtfO$eOJDu1`|3A|Vf!P&&GbNq?C9I`o4@;Hl^}wx zK?I%ozT_fJHezuX_TOg4|ElKrqotbTU<#lpXzWB590kP=mc{}yC(ab`P zyj%FKTJo7zM4WHy&y~XgW%p^;WqzM)l`3bJIozt)eGjbWdHFe`Gt~iQ!|Xn;kofvb z4WVWIf$xt2&WAygX`L`v6}O8_*`lMD^^P`Z8bVBY5+R}@!abx==y^U1d_-bFnHQMD z=C>BT6_CyWb9cVDln{fa`ytj_q5dy<^ctYKwFQ7w`wQ4$)8;U|zrZ|6{#;%4f4el% zHj2PGJ&yyYnk{TBubdDo?}AN416_Xo#qd~3D7Cz4!~s<%dNQ@?!S(OB`kABUgBE50B_occ?*@u-<#X(YRR4~HAg0Jf{QcHE zoou|U@@dM>oW;t>LC8(CwCr)anm%pAjJxHu73C@yD?NbAttWJ0qF5~&v8`%((B{*&Q}6xnl@>$35|1PVxVbl1l#{tJ^r=&*o~t>j(L_<(oNB z_I3Wd-^(Yz`UYM;@ATfGzXtrVT8xVHvx`EzK!CxbwfcjPI#X4wb5OXFU z$UG5ze$BxNpq4qiR>^7!+0Vy#ZWZ%6;6v5omB)>_tIpQ#RCYYCdP_a-@L%gdzEON~ ze2xlV4LB__d-uXwM{14ds{9WKDe3vb#Zj!Y-5^4NB*Ybx#f(znHl8x;M_7wuYHkTF zQtG;|jjcHvv8{^ZP;AI|0Kx#letD9kP1hcM9+CLUtL1k#8KBO{p?ut zmh()mOdKQgNG2Trn;VZt@18xOIVXV26}FKX-B=3VxHh==|dsp7KkzRB86|eIaCJ-LKLXtFZeX z{21UbXc5o=zYBDkriIGRjWB4!ftkql*2O4fZpxyf<2RxKe3L z^p<6o7kp{md7&`4&KMrdA#=;Pz$B?!uF?f8Y_XHAOfaN)H9ylut`Z2kmO{N{PW3Hh z*8GciW-p6u!(T;j^VNjU!FlVmMzLA|8&`D-q`&`f`-f4bOl_zN`ra0th-t-%-%sYm zDrQuZ^)C5rF`naEYD$-X+Iq|&2Tq1GnIl^Oc39$CkTx!LmNP4b%zi3$wW05o+ScJ# z9tQ$5g(HducM0_{@f3{-7A*9c*UPP~UU$|?y#y({Sk7me3B^|U0B4Ry!ffIEO=rNj zzZDLK7L>E(A4_L_qmXK9nkShhD80!rBmEi%qPH3P{}+vn^Fi0df<`Cp|9Z}U@5lRp zC;Q(~68FM5)<~B$c0(_YJrOXEz&(gSx+FNo|N0kCJ^UXY+y4{y`G1_^{~aYg5dV)m z@&DY}>EmFLpZ>DpAC4aRX|IvM4iycA?oJK|i6wRl(sA!o&;9>npZ_7odhY+9&i{^* z8u$O#pZ~dj{nkI&6725-p8t(Mx+~X&u}5>Z?^_^)Fw{4HE4ZHH-$Eil&H4%3XRV8318 z=HqT$%=ACFQpN~l8Zbl{iA9K`IMRF0n1*4@L*Kq*+hcw!j4&_F%}33#AJ4kqgzf{} z!0s{Uwy$K?K7kRkaV4^8t%XmhZ0yufOqr$)JN0<@Qoo9oUZ}YBMzoogl zR`YdUQq5MkY3O+)6hm*pfiE`bgl=Ir(S7GeM*rzh!R0ym*C4`9dZ;v*dJQ`yd z@`u#lOmszc(;I}bFKpD!MUp9~2(R&hN7q%FToA<^F_fZm+O8Z>o~uNhYDuWHJ8?9$)7@PbE@d{NWXp-HJ_^%-NK%c0t7IXe&AeFE z&dz>iB|#b2vI5~fF)$mRWi>K0^=boeR=v?E;vhQ{fZc#$2-4IBd>2hY6u?>`L!s?L zkm)=#k{>3ekd9h5e_SLfOc#WoyP0L``8KYmXeU?Gog#?UqiS})LHM?AE@0zqK&E%| zOZnaXR14)dyrT5QGPAKCJ3f7#V0z<3J*cjIQroDsYlQvUdRvNnsJo5FUIV~7*>1h{ zY~;SSAZ9cQu-?iO8Y!2`nETSh7`d3mShx}C7sRH;AxR7$t>7^PXhO+dYK=DiZ1!n< zeURMUeZ=iR4L|owzM8y%zHa3zz6bto@?jsv123+3AWw_gu)9-@>#3YjQ~LV|yS^t_ z!xs~vY{?}x5aUlm)`A(!GMlxa4pS*Fl*~iED_x{q9%1GRNr;U6P-hNkH}$R!@m76V zHw9ZOA!rJl`AEnMOp9B%qlE# zvRX)pzgv#zYqVF+w*#oh+AchQ^PSyTRih>>{#+zCCFbvk)aYNm`(%mf^N=hV8K`!W zM6qF_*KhteOO!ECc9SU6qEfE~b3loLHPyfqzZ_vHXv96qJ&FWXl*F8D9-FB+4`qQnQ@(F@N2#wnl_ZfU>0ssezdK-a*dzYhg~4Cqq`4 zx`+XDVn?_r$^#lP&u1};eL`4>h|eW)F%OjB1Hz@=&!Jm#(P}mav&_P=<&yea9uBw| z8#4fRKF+Sy!pfiJg2LvF z%axsDmfGbUj3#`ZB@KaSdksh{`crOF>+(x~uS>7J3!Or0ZnBtE){a7wo9&OXwxk?N zQ%)IzFjefh!T41T`k9$dbJx+RrYc*_&64tb*ZZ~2TYdR=QhonP&$JCiJ`-nJ>N=N@ zA(foj4W+%BnB&x#&h{+v`Yj-bwo8=ekzRpSTIkmay>Sq>6?g@J{fWB*;#li+zS_2h zp0U(*L|YWeAmkD;8pI4M!6c!ca(zsAh%s>oL|fUX4T7zb5t`Q$jfL5Q&r4fjF5qmC z{pRJ}`d#sw@gr+VKfA|w#41gJ|4lV$s@nTo1EsZ7J~!l9eXF51M;ct+ZK+*ZU3+Va z>a^k?xM^P(x4Jj!Ol4=9^OPB&;^M-YC&^WQLDC3V7<3u7Z9if$yM6zrTuKT&=btJ} z*BY$=SPC(+&SI?)r)B9K6|k{4m3I*k*5KR6+xcPn8qu(^?v_Hq*53b-m4$n_O_eVh zBRuek2$UQ6GN6oxE>g_(JtgCyUpVBw8jQ=Kcq%S(189S1tnstGr>W^f_2Z}d;nSGY z9CJj`JO|PX_af8q>;}U=cmzjP)yc)Z-5-Ir26#44jwI>**cnZ>&{i~)KR>gBQNj%<#at`P&NZK}RAx3Li@J596WgOYEHSNX zs(L7dJ&lr$TU#G7T7S1SbiASFmQ-vi?{xlVAoRqp0dKv&&^3cgSexKO?7Ojyg)6bE zB9AMkgok3uWTbf^4*Ln-c4vs*%~wn8BGL3`x0Rd7{8`;A>N#lLNfFZKnRQCMO0sMg z%{A{VWwKiC9_z_q@4azwz0vDc%M<`Bgc*uz9{AT+q++Qx_QzUn=Yn6G4SiI>xWhC2 zb?-AyV5tU#K`v>O+Q@9%z}$rm8<2MA$p*N6FlcMfX?%IR<}?>a!l(HE*?ZRBxN#)E z=U4RP4%pqhY#>s6hT)8Ne9J~V)6}(0B@S(G9%X8n(^|X_5b~l|P?%>bBwOaZ(Y&t3~8eGoX{ql>S48)40$TF0tcR$Thy z)otReJa~PFSX|h4Me*lbuO;$)7b_m}T+KisDa&*wvOL#$X3ue^V4Hwjtwcfv#zniR zD+d~gH*;>TT#~$UsZ=*lp1bpmch0(2OSSg0n&*UP$E24yCtQy^JoGk$h|51mef4hF zYu>cCUGje3jse)C))9NNR3(&Uq$nuL3-GxJHhH48AWRfVjx2khl(ES=-)OmiP{!mI zA72_>jIKuV+-{=$UL9iUy3TZ=!x3XwDS~;**T>8|nbxcIO027zugSgUS^0>8z&k>v zD6*W=ToEI3TwqLclIuhiT@0*aSziecgFTJTs%{?kYP}KatL zf*G3REXxyvvs~dklT4%?oUC`8x5~;d{cY?1S^PA=|DKrQgS^;r{vVtsJox^b+V8(9 z*?<4NljqIs_I6mr)9GtTF6E_}{C1m<$L~SNT~7@-i0|cFb1TV5@Wz^DALM&8(w~}z zg}hKV@ARZu>b|NTsR;JN_4(CEfg8~5;e0Hwnnf@ruWSbNXiVqlS53gz*H=aM+pSB? z0@ADruE(El-WqG0yMbG!aL)>7HNLiC^V_Sj@;kb>DZqdy_d{}dRr$U%B31=gBarx)@J=ZChx4)j?UsX>pVcd4UuZv>AIiyFGk5|bbnxcQ zYh*tC1`^&DB@fxdWbpaTo4N;Nd$=v@pWBlxF1Qc!`l-ikfF9C^tkEWUNPVlR-L)9} z0`SK$;qd@ve*@n<(b>Qb3a|w$QR(aAdL%1TtMRj77y}{0r0qS78i)903~rjj0B32Krs?1Mgql1 zAQl(IBSrB@Q9M!{j}*rv#qmgSJW^~&T85|GvUL%uYT12hG5XCu^Z8#m{TlK=vHkte zJ9&%^w8@+)oJxYggU`6kl#n`8%79D%rN_5_w)?c?e@b?2|ECG8`MLa``~3eqdFuR6 z_2s~KrhrPS6i{`8$Kj8zL{JN|JTqr|-re zr-P5+$Gmf!c+-I%O@M&sHv?z}bea8{jlduA1<1{%kZQRTD!T73gz)#>ZR8@mE`I-T z*U*A(t+s*BZ;LJ8#}9YR#I8-UmVQ>*C~N8F4px-=UbC`z>whlZ*W4OQeoqR+Qq6Tr za$cka3qgs-G!Yydg=q7mnzo@WzWA+b=1*GwL9T$SI1-#XttoNWm2lzS`W*lKXET#) z(-wN2&b~RaS9b0GYB^8LU~=4XuUvG0;6AeZ9X+l0zkCh;AKBY~yLeJ0iqtTH(=10y zWw7*>R=G5U0?Rb}(&O7d+kIN@e-}IV|57@i|92n%*~!!5|J{8FyqNd@RA_Z?F%fW| zG`|aT1v`hZ&3EkW6K*ga@RGh*hsl{fgYYxe53ExOqtYE-*6$XQWUp zEo4HnT!Csfs^B!sg+hBbZ|~;q-Msy?k*CG}+j0CKOg%Dx|0mnu|Fx5+vj55$`Q64} z75tw;Kd%1z7R^aaXV|+)0j<-!=>gsFz zg;jZ3ng49Ve=9Sej{dHJx0!#bU7 zzJh5w*GDH?obBQZ+AY%h#Q1UsYw~-pSzcgFMGpTIIS6r-;XDV&UedhaJTzG62i#?? zmi6`%p3)?of&})T6ppT}p*g+NV*L^p>JiwCV{N}z3w8!w5&++%BOS+@hHc4JXNQ(A zs*Ttd+qLF&o9P;4Dstak0#C}h{8d`Pz8;gh{sK()L4N%f06zh#|Lly~ql=OMoYUqY z`zU>aM_4H%qaO^W=B>-DV5f^UgeHHv)3|P%Jl$4xi-%T!=Fm@W)#AHN_yofJ4(Zjq zj}>KD-9tYy)*+_u>Nr$g!9@^@vvz@u!X_h}YMc~CCNv>J8lee7*igl2Gkv$2>|z5hSy%bysWF3RMqb;bUXwq8I5Z!eAoiarLnkhwkXLf-u^82)pS}MX`{{S_@8~ao)g!>)3L!U=aQFdrWNBOtF6I(St||8GJ0@ma zn&%C?J!Z|RU<}%TmO zpzqAFDohCLic3N8!PtQ4waYB%#LdJdov89f`1BRfms>)uiBp4`$@t^!j-Frur8P7H z*=MA-&Hm3!#?Dl{zSJ&D)R(ptfv^ps;5q9r)(LRfRrE4i$zM7`@_j$^@jr$h>hVV7 zTnqMp8DVqxzwXcf?YAMSd7@AlqcVDwuvcwLMyu56y!NB5sijClz%^8N!`W__ne zD0$!nej89#Q9}OqAJC^u-?*^P={tF89)TPjPqb@x0?p9iwd?ZH{b0NA{)2bMYPv_s zL;S#fjR${`2jKRPCy(yu=Tg1D|G=KPJui#iPRtFbP&U1~Ifnt*Dx>cY?CTq?g7^OQ zKiwaA@VbQfFwz(Ht@-)2iAL^wosQ2(y6yr8L-#SzyT@G(G8p*BcOV|;#yvmEbmdW| z;V5kwc6);)D-V(cgY=Q$?TwPIJW5)PvJ6IVZ;))|L9%*~(J_dnS5^C9AN+JSe02X` z%kN06atU9)_I$0n;462*>)F)!;$Y+Ks>YhFJl1S}tbIAQ&Va?r0~XEsHQR65{NzF? znp|T2$yIfMl9l_gO`8-@lks#L6i7rw0eJP=i=*xXq18Jlo39`OesQXxBU6D=jz3yanGX>Ge z1n?P+w!sV>GlOn`8FT~8plb=a?vA(1g>(8tW z`~5rg$u{Dn@7xX8fPSs}Si=oK>o0V)+3>@zgJ$sR^;v<}S4?#un+=O>EsPTkcnz6> z*O%RBv+)^!erzjqkH&Lvv%!q(ixHS!8)fzP<>+@jE&f0G8uCBT{r5jRd5ji$riErX z#@G}}rnzCfV2DbtHR4}-eEVm+Ps{lqyyN&EP1?@??DIeDUI-+<^!WDAcAu8~k94Q` zA7SBBjQ07zztB_Vf1DltxHJDFo#lU=K|ikk`fPJJY~iXTcXg*(m}~L+!Y1r+ISYUN z_2sKyUmSjJPb=8y{HaUmwy^Uz|59dtbNwGZKRG=+{QOT$vkrh~wo8DL;F06${IL4Cy%@h%fn1i~&*x{w$zS*u8A%@YVgSfK+|N4Xo714q- zUqsuUF>4R~;VMSY)?4Y1nw1MDeYGQwV5C?*^Qx`Y2dFg({Vy$*HMlct#|5`C7hl;; z595MlU)D&hw2(6v4_%G9%SWw~Pb$3LNosBV^wrs(u$R#yx>u`JRC82Pv#u3%cFw!j ziuys<;4@W2Ep#v6i)cvzZ7NB9!Q$IouV>X7yCc^k`cqfO5(r;kwKeh0`L*ctShc%O zEJTF@CAU5>P+u?DvuR)?jn-4><#SLqs?V$dsOD5s3*A$dbb43^_~+F6BU%z@4zi{Q zJHy-z@y0r^R+J-5wK3*GCBZ(f0?|@;A6cv-T(tzUTSHYI`Y>jyATP-Bbxlo-8K`2UhEcY)I#jk zyo0Mvk@L@`=8v#4h?}ImH!%Cpk$%6lu@5tB$T> z(vUVvHx>{9-gFoNReNw^mMwBxB@2U{D3>cowV-?>VPltaxT1~sZenn4Ka z6l@~Ku}~)o_hOTmsX2A9(*A%o#%@)2368FfE}}80z~(Yl-#+dLLrM-WK2su^ObWOL>HI5yz#&tJ+Q|?kGmDP{ThJH zN9b?wnt4nqPv)VsV z&v<&>ZCY7)v!`zQoN7WC+o3QK z08G^2lxe|2t3=2t4LDUzqau!r$l(R>SfL^jSD!>T1?l4dSevsq8*@h(3&7=)B$(|4 zB+56<8U~<(p}@G?$&*$?;E2VX&)bA(L*K2G`7Ny7ONfz7pkiV~nChZaqC_yQAjr~I zK{Ez?9**l5vV^&-E+Q|jB)py-(2Bz)qc~*tRHReOAsLzGLr*b$zIY}VjS^qK@5Q5o zVjsXNKudWSffh;=gVzgX!bT?9JtOMz)7Z4v>fkSOqPu9E_Nf4eS^uQRmS;vmIl$4^c#Cfk)7XUP*+T zSC>{S*xJK`iHb1jkcuEinT}Q{jFfK}GPY^fvLyU5PjW>t)A9xwoDi^1coT8!4vE*r zUUMXIvx;TeHSGXl_{ z;k}e;g-+%i-i2s_ovdC5bXD@sqZ7)*ycbI*F<~PwN3MuH!7R!^4@yp+35Gv_iCCh@GQbug4EB|i}jbGDkv2YSh@Eps_2-B_|EX4l`v zpGN8M)B;gEBc);qBZDz#BV-Ii{K_$<23e*n&OI9i+qFGiA!OOQghRBizKM2(=;IwU z74l|dW1lb4$tCWS0Pj)Hf)*NNDhDgWDPzz=S&3=y5UM@(^kF+m64gw6Hnj3ua<{Xl zIFcz$xdcKX{38Nyk2Q#O&B92gSK}uyr_(Zn=L4w#|F5h-{wu3sw$}(Z9QmRoDF+o0 zAZU!jnugaLl_3itxOPpNv>w(47R0Kiyz?3Z{PkXO#O&)NKzx!(1hu5{B*>ycc0tO? zNIH)u3-D4dk^^ymc2R9BZ{m*4kZ=Fjx|+#YY{@Up{vw)-!PhC<9MFMoCkrt?HAKDo z;@TIvkcy1aO0x{v*94o5UYt4mJrUJJ8kBght`kW61bW%SDj9-A@JnfzRr;ao?0Re` za{@TQn4vC4dQu$*Ej%|{K~8MC*MAQZ(Red(+OxLv8K?^;*q&*~GcAIF)@D5>QIS09 zJRtRw-OYLi_C&&@5anZb#bw0VqDQ+lXuU)b{eyTDRRk$u?{gSnjVD7;P=5JgcUkSZ z*d!fe=+!8v9i}fP)p9oEx?W8A&#{))vL__09^ZlY1i=G=j&rO@bmj;O-Zz^u;=muB zruNXFwsOM{X})Df%a-dVHeTa4{k*!h22akTjmKmfa9_K`AaW*gvJ5S<>f-Ac(W-!a zJ4|}iS0hF?8_D(Sq-8&>xnG9`04IRb#IWc3HMoli4$$(Yq_%N}py0lZoBKlTG&id* zMm1L3$?a9@GAY(XQWWYcLJ7DO9szQV2B_gX(B2r|dOKyw)HXIIMIe*^)~#1uOzJJR zvwMrwXGm?jT=kqyS&K7}PAgd@Fyl#Pf)xoH+T5+MCmfE8fZ*3KwyUouj5fO1<4xN$ zJUY>RvH`$Q3`GWujNrkwUp&Ibv|&Dyr!i@RM|0Y|GgQaZNeL)bB+0|mMvIa z!=&aIkASkrFvY4SJgCTP(~EEqvu=A1s^Es}nSZNv*C8uhE&C%`FJ82(TCscPS4)%MBBg|Dp^K4A}mh7EkT-6KG8|++@jtw zk+jvYxZMqY^3A|)^rm<3Y(1yREMQp5{+G$-|1vpRrJhB# zt)l-AOpfu5$sxM7UB)XLxkBS>r0UK0tO3i+9xAeY4kU*< zgGW9iw!+=v(V3xMrIJZX{>j)1^K8Q!;RP>~skP;)1Jj-JytUS=M0A|C`)0wm56*mq z-Oy^giXaAf@DZ{27-&S8PQXNj(POEUkPbPi?-g3Rl(2VWX4&S~^tDYQx(bWaf(3t% zqixh2FTH z>p!g2pLG`{t^0l$3a-e3@;FME#S<|EW=fQJgKV2u4oe)L4$pwzrYd~rJjXE@Hx-Br zoJWbM9H%PORlbP~;11JUmqWpFoG`9Mg$4CJ2zp3y!gM{1JZM9LL&c%79ML%6+?8ZZ zy4)mFB&EOS^gJSB9wmi(=W-G^yc7f|8Blrwc_(Fct{ch%@(I~ysVfq6(Vqx2gGE}{ zDv$1c*26T%8^l=fr95oCH6Gk1BKeDau_n`^(5NQA6zNEUS4A!|(J6xz=6}qFF^E{q zgu=0pZO!{};?u5C#*+MAh~@tbs(_e7l%`Bpa)HQlkWCxZU8g;X<{wf{YL-Zmr#GC{ zh@Zt!)}4nlN~M4uK{)fANgC&_E_=0$bn0<>LLQqM@IQ3Mt@S16a5cO_D<(;k^g_3x zp%ztk65t|V?;Ix-%xP<{Ed4EKwjsrWcH`_tosT2uip}FdSq>n>f8>ep93irt-hUk6 zWP1cxv8s&v3W9j&GL;lnPx$(zB-a|A6juX~8^^L#PkuTY(}E&b*~mFLiqK3Hv(Gst zr9uMCF1%d%*zg^=_B8SZw=vSBi-dVpP{knbV+Twytb?HdDV+>#wdSS0@y78qlJn-= z;!2xipv<2Tc#H}*WE?a!t|HE2uInYPu(R{%L*Qyeg)$ax!2>0G5e<>KB8nHFZ@J}_gwD}<)QfZ=81n%2TLNYb23I7@&YCRi+Hd?+vR z8xBkVG%ZNxwighiSsZBK>{Mi`RF}&fH<`lA+@e*Dpysyno3!I0CoEQ3V zApuFb7I{p|FoJghw(_B|=3X-wWOV{`68EJsQ7_^Eh&Z4S{CPr@Z@Nsho+J+Ci>Tpz z0RO;khylNc4J9gpP=PHCU^I2nq!jB(gG@^@Oe^_NDNR``Z?9^mHk=Nj@u2kT5*2(L z$H@qXNQjIlZW_FA(%P%bb;?>xoB46H^M$3sNWk4-Oz}RJ(tSyd8Cd|Lq=zkVru$fJ z`LnR1JbN0oSOzgr8@xH53t(B`0?ufJZm3GG>wGvyg4^P{x~ixAi49@f@;az>%IuL~ z!6RI-G#$pU-lNJkmuX%;T7B=xYZwP=DetgqJjC0+o5dt>*iCTnBOnV-h&#$8k8Wa` zPw^b3Ozg(rd|tR3B647$hGoqXp+Sw{{a}H%HBkb~&Y5ldd=5#MU!klN3(5;m|B9SJ z^dkZ02n0?Jc>=*4rVyazc@BavS7ec~oS2lu9y)&~FfY(QPI4lmWm*Z)jF%lU^L(W-AxeWC+5bbgFSNuOOB|kZ3Umb)E*70if4@n3CYy9`C=&!fK8H&SA(lwJ12s zfvw{?(TAoCvGuqxJIt}T&8k~5$AKm5yw04*6N3t-4Ir7%IGq`d=Yr800n&3WLra$C*Cz#WQ%+E<*+Qy7F5!YD>98M#n%(86QvF_!Hsy=cu{`MB#W4Z z5Pcrm8If>2$0P3h>eWAInVWK@u+u+q#T`w?dJi(~*2BS%#%o-2> z&)`3`;pG2S|G&`xKUBy0S+4&NdTpWh|3eTpn3UH&svFf%(py~bSbj9;#kXd@a8Exu z?#&yKraIdDgiVw59QUR+-m+6yBSW9IyRD;|HSQ-;p& zYXdy&FQ#NS*?1LwL1){uYSA$(CO@jo-R8>Y{b?_U=I+jnnMGgQoHLJ(t}fT-)kSA- zyJe3p7U(|l`PTOC)-3ekg28}1Uw~Rkir=ghUhcML&TeV&W`)n(*tz(zXDmZkpKkfIE`AWjY6pZun^R zd}n%%rR}e|*q;|*9;G7m->dm!Y*P374wU${NH_~rL^{!r%mt$Xo*I8(3p_fo_s*o-Grtt6!M zFs(!>7QYOK~u!=)D zi?aj`^gvijX_vNlZhpiR5S^A$tM16opKZFGJzh-9HE+6P za3HJRB_F9}Ooj51orP(Zpo&QBC6zc{!K&;H(ZGMpoAPgC!oS~W|I5+o*a+V2Tz|4VmLjN+Iv4UST%E2cliSBI=Gf)JboI-Znnqg?|xJyN=PN<9VL+rAJMrQ1c`K|m39dZZu2QCFW$(x_aqq$PYiMhY7;25;|H-C29*9W8m8q2#seUTJ)2k!AmOGK&@h@%> zuIv-4O#P6_d;@$zvA?Uo?Wu1OGGOtDU1!Y+pey2%09G*q-=BM5h3;Ssk6N(DdT`*r z50u>zNdvR}#O)s7fslDW+rgpn5%dm=;x4PmbR%+$$Us_0QTG1H?Zi65E0)7I-gXOy zeaU2$MmKVHeF8)aWCfDFw0Z%lSO2=HMqjl2 zIvjnnYUz1YeW3{6MMQEwY4v8_d}yX3FoEXB{}Q#)M|eToZhUO!`q$zi^speYIH^d^ zmqN=8(_Kgahh^4$vM4A`p#Kcgd}qLSS^%uWmTmS2>;DVv20GdBjWkJLIRP=$5m4O| zQb5uN@z;eCZu7%7#6dRdyo*PAA(#g;-}t~;t>pLp{Nn)^4YvDzN!rnk7=}_^-dw7W zB7l@oNU@sys7~apn03Ziv!_6SrLwmaLV>+OJ{sS&bqT2%pNDz~E~_qo{<-`^?$6td z+EYILbj9oc>df45Rejabw@?xC67tZ!)v4eA@z&l*BV<*TM9k}-(Yrz#fQ)vrV1nk6 zb4RGP$7_t_FX)WW&&5@oByG{CR~Q{JZNU-&Q5Z@;h&|f{)aTh@#n~-cwe;gv>;E8X z0?y=yderdZHS8&PrkK};Q5+PX)cjC(4RMga?5&vhDrLpaVozZ)aUSpgTe%{J+z-;& z)91;D#XC4!zxY&CaNXeh_#*q^n*X!5xh?nnZHfc$A%DK}QnfN=0@G_O@I6W{e_x&- zpSCH00cqkd#)psUE|`~6lA zK5-rzFN3;J@&cGhZMYcw13XV}L2+!v zNsXsNZq#d(x{tGG{&MOKi=E^tQ?}9e`94=Ai_5Yj`<6)iN+pCHt(eVq)H1X_B@1Zm z&yCd&ym}TLsh3i`BX>kXJ}<|KmmaTISmB@5tSB^2C!tuLt37vp?FMx_2zCAW{JQy( z&2h)^nloc(cZ(NmXP6|#e>!W8kmaFwSpNEVv^e4SEq{I&^H-K~{Pk|{^7`i=KacjO z+uP7wj<6qMhp?ahkG^dWu6Tg@c^PuX1(cU7v`TMx=RJH}*B(M1ad~f7F512}&?Fn9I`c718~(7ZX}f+o%>u~*B?iz#!XD15i& z&$Xv#s_wESF1*Mh?uw(uK+f4$mjD1g|Z*g*BN1 z36KUYdeq1rkcO;X3FUNyIOKLXBCB&^-e7qU0Ep+|Tv$$sXKi1K!Dfds@K|ZdO$s73 zeJ-h!A9y&d^@s+KH%BBdW#mnR*a9-)c}Gs2;#CIF*lIL0Am_Dybb>D5WEy_);kU0Z zgld>V(%c5#dIl>L3&PL5bE!^+Lh~3>OQ%Jfs=ZC6Vt{mQe8atlh#2L2RSKSNk zg!`dVN($@n&_f|5i!E5!LHAKIaUE}nW6xU7Uq4WOZt8wGB%$i+6XO2u1Vofg zeOl%`1@#&DD%@jH)F{MYQij?!S$n?JCBs+98sGGQU$EevB50=S+R}Ad38QK>0KCWx zV*t`2SPy6I1iDuq^(V4Iht=-*6DA2y=%YTjPrvnko=$vy(`pc4gVW?47KlVJq5@@K z7OH?|Euhdc$3QIo7RsssE+f}J-6?YjE zt8Rr!U`v@X$47yacT_Mwa?uAHF7HTTnezx^cB&k6-OORdg4IXLR2N&ET|FmfxbegIBZm+GruLyu z57tObB>n~+WoA<&B+&TIsV3vEs`60S9O*z-M>~X4gKu7j)1N)hWB(M3-!E>a!n;$- z44MU$&tSpSS5Gt*7N30&7R-wnn%n~u2ry!Yym&TqnnH363DIcmCSg;G2;P07hLJHv zyEUV*qiE#|g(gCD2=Rct5(5$+**TqT?2TjPX;mLRtD}jNQuZ?`FoW0#s+Xo#M5cUu zY98xuFi2Qp5)t;Gg!L|J@G3J3K1CH-QZ3+lrvzA?Y%`-YC)o5Bmr+AfPw7!uI_{v* zI79Ra3W>}!kU>xqmos9Cg1DpiJx;US_Rg*_SOU%S9kgENH}~(fO0i?lGMkR5YJ@!)o(+|tfk#^M1l8g3D+jc3 zi#Yk^9wt-d!I+N)vlU?sI{b{SWfHJ%+n!)FL6{FlGN>33mWndREU{e(uumEQ+0O?* zp^|OZ)-=Pm;HhFs33f$BNML#kVgbh_HKo?uyTcX`kuGO`NLZPG&nPa9*pT-rC4-&D zSfWBV4<+eZTa)(mZ66)uhqDYNM7m}k%H_h3&JGF16d;SpM;vG~a{ZZsU90(_>t)an zgX}6Rjyy0nWeYB;eat@bdmzM7#v1~grVI;gEOQ5$(kBnWMj6WCefubz_=90$irL%k zNpUj85WP>~tjhe3WMLv=FE$dxv9@SV@^^TM3ZN#e^hKl24?p zwJvjOnnL!(v zF5hgf${8-VJK;rVAxno_t|PUyU>r!T!df(VEs?>hQ}%Rd93kV8VKH;iR*DAMas~UQ z`cc;%P1qPsM&NZwUQlA_b{H){yGrpoSn-norb)L-b~wqSzFEJWEm@a{vJa>Pf!7=; zd~Q&;%6&&Z`G5Dk%eWj;_n2Z%pYokvzRSxrKmR1;y&zgIKC;>lf}S2TyUjd|FXjDR6p^RV$*-{^$#(9-d>*(fb*sK_51h}=j!};IQdezzIu1* zHx29GULR?t7rL8>bjj!_m?#i-6zkoe3z>ab1>i8@?yol;05)@}cV^9&eR-hYFJ#XW zI&WX;@ykkxaXjt0EXWk&ykna|XZY>w==N^5AnecvMYuvZbIH_t`~fxkcP z{QDiEY8`}RFR*l#H}}GM1fL<#5?FkfGduE&w7Fp2N+2v$|ob4wI#P#94=)Qx4Tp6|}NyZ>B1R>!{ znI*FUA!vR$DcX}Y$-yUd&_xZ-;cLNJ&l}TVy%z3aAr$n{i2?Fdw?O>q9YShPyfLo>uu>tj0a<7$CVkYfgrP#m3ywG`Izet=ML9y#J`fI|Xal!2T;=p8a@ zx5$9plxPb$JVDYIJR3pM#?}4hz$U48ijellkW;;{6hve$v=CG11wOI^n4$_I09J{@ z)rcMHJRBAZ0dVbtN|ixSAr%(M3ciUdV!;1lH36w8fUu$!jAaKvMHd(WQtbkykfIC9 zf>vCR6|4|dhy+++`pygc(sbQGOL-Y1v_DG+kx%op}IiVlSrx zqA~PxadPtb#byOUjn6{U-L#A>$l;JU9P{UdHS0)oBgq;Kl|&Sc%uFKJ5N%6;n|GFzo$P1w`mUp zbDwGmgeNfF9|y!VEC1@lpVfYc3?zyPI-HaK`)pF4ps_znl>1M<{@@z*&8oJLJ zd0QYTEK-Ip3dSZmm*?sznv98s26F_Q^X!a4pErBxV79r$;$sbR#R!S2x@;@72t)gf zyA0LC$SS<$D7*^jjL9yl2qb{}`}n@!qr27oxbZ4q5Gi0PrEg7>TA|3_DK7C`J%-bW zL&goEXj0Ia+uq{K^S*Bo=45|Hv_=U&fZA_R3=mQN;(}g+ry4%_m>b%%M4CU8BQwRQ zKbc(bp+Q|v{s#YrL3<>UT1Tl&fSuH(W81Ftq%>GGfTsAZ=2=O~Ri%TS@Q47xeBPhd zD>eIfG`%GR=tpv{RyF9uI-==s6ZAzM^<}?iv;uP#Kw~XMd&(U@t<0x}CW_7g zV9|t2hyGC90BI80v4f?En<}}JJ(`=(;gOZgNJ`*@3bFOq2NIMc>_CNJw|=^q3Rn@Q z1UTSUM+0bpvT5K1z)`#t@EgqSl?FJ0BbH{wRaJPECo9n04jXIHW{MeB%UxGz$x%}F zRJt$4qFT)|+t$cL&{1qoDjjCiliWeXz_a4LtfEa8MTEk;>LfivTrTh#Okqwpq50W6_ zGu<6{f9|{d8Tg*kY5EB_qg;p8g?HngcUVzqw#kIk#a9^KCH^WaW{%xJbX&nYh!e~s zLMoB#WQWiQSFo=sd0!EwLhTi2MIo|QTdZJ;(9u*F%ru`Pu#SR?(FfTty)tpg1Z(EO zMDUh;W3<9A27ra^2^ndBLxX^!HzCh1G=2g2N3>CO9@u$?wP&GeD)v=#q6`(o;BY5m zKi=|{3>q+#ulLWwQ#k8KJd@yJjU|mcC2a^Du2ekn#JVfD>4_f|NFvlIySq?J?B2=` zSM9#qyOhnb9M$`0els9P(h~Z2rLL8W%$_TDZ294xhnld|K>Pr5DHCP(9zaVgf|zG= zP9?~T0bgFpk~@R^`5n^&bVXHIzHBks`Wj(v_AA(bXMv$*qm%BFDqb+UdIA@`n2(J>rsMU-g9`mhgSeO&Rv~Kh74P!oq@}mDm0Hc zbZ+)hnKuP5^u&4M$gvWpwXK|eJlVocc-UqS*f>xUtd}WPqJg~hI4vx($UI?CLE0^W10n@Wp1P~u zmDSzv(!d~HTxRi16F{7HL(IKO^+;~EP8Ibrz|$T3rxI3b!U@$$my|@Exf8FcCF*eK zUy#rz>q|7~XhmPH65v#^S}&Uhw~*5hCAr0Bw|{M9=K$izwoV+^{wy(!jyUnvS?34H zAPI9K)loOXJz4EYpaFI)=`B{01ty)rfiGgAtw{>5TQh)k2`)e~FRrOB>;0Ap8x?$ z1lm-0s1xT@PvTJm;OcWWnbi$jm~0E6XlczIpCJkVeK?{1al z+r|rhf5NRQqP4q!blOwXzwz`BKGR?PO|y4PqCD~gT*Iq>={xxTtvmSty>1ROfbK3G zqp51K!9SE}abX1=HIpnLDh35ZbhVWN^9+vm<1nk1LRPz7+xr-cwH7iFOZ7|DPFY#y zl`W|2O+MXI8G~0hzsC8zF5ct#OTS_Bw{+#Yps=*!!qx+Tjaxgj&r`saw}s0qN#&5> zyyJrQqkxkE^7UWbK75q8F*xAHn7A7968)}RckNZSGo~|QB@E6iGj2-vdGErTURFvP zoN)h`lnmrkE)<-^pP>!W*NTF3j|}JwfvfYD4yv46U0c~$vm6|paB|Ra&V{SX@%yEB z{OZvPh|B>{JyiqP+1c+k;px%o3#i!!wo2iHF0b$Y1O(mRxRLz(Z84Ox5#j$; z&Go%Ehx#YjRve!z3;KAl=ll31$SnZ618@xv``>#hHK0o(DFX6t8tVLS(sYWLCRs(` zd|FGW|HDQC!HdW7ql{&WxlZ2iTzB_Y_*uAK_ku+l*?%~btYwO&P@S^~lm*V%GI(25 zpKk~8BBGB(5XoaH{*DXUyg2nyA~b8MVg)15XWJL}9j2wVU>jc=UZ;UF7AW?3vHccZ za4YG3K^^!C^!;Hg3!M3zosgb1{DaOTppsA!M7xXE6Q^TRISW*WZdm95$nUQk z>>eO|S!G;Fb0<4c8AqfKlO&|8&p!5oXS2ZfU4lvMvx0MH1>4l9ZiPOVJ#UKBmOUGtyNWGh)XFu17ke%S*PYOK|+0QbL{;^Flhc9VJdHw~FTd zI{AD&U96V6+#jf4qz6Ae1;eNJ_m#DKjyiXZj3`8oEhFx#I>!IjPsZ$~Km4A5-VejHsLi95M@K}{ZRj(#4#9xhG}@aFID>*qs=uG1j> z(72@{LlO2R;`DN>Xr5B-;Uf_A9y7ZT^c?$dmi_+)qnpRKx*Q-*C%=m3`AIEmbXScO&^G$wEBDS9aK~ zHiIYseXB=|_kZzBIF?8Q2L(!+6R(25doql7vdHcv`Ns+@1$gfUR{#rZD88b=#3olo zdl5JP=e(8l^P>4NJZ)OJRx?k@*P~t&*AM7_=ifT9tRDbs2I4!9+G`*Gcl)^a7egj_ z>^5w+jdee9QrV`$@0(N(7_XCOHT(E1nePRxI1O55rur?aMR&~7os|ZSS4-qk*1>{y zM3%^L0n=WD;4+$EYsJgk&BOQO;P~WBOXo!=;?fCQ<}lg1LghAHr({dV>|z>fMP2%o zSXW&el7KaDvl=)HURPHOm{#lZ#6UN@@N`gdbtR17?T1uud;eruhK)M6==^VO)=FzG zwyPDSKEd6w!Poid2$t;Kz8o(%C(+egckELF@Ain~9A?sdp_H6Q8WW0JoxR9ANIci@ ztl_`g%V*&NZZiCrnjD++7pwNWmox!F)40hMlan3$(z!9wxuHOvYa9X0VnOOaKZIL{EY>IyUOP7_0H z)^>ZxKdZ)nl(xeyi&w zHH|2PrbSM_)iv#sLJR|>>i{duMyu*jn~mze>k^bJYXD_?xy{bAv~++Ix|Uhp7PpZX zS|gYuPPk{_#bg>rW%Ykwt$W*Ji6{5=eo;bvG)OqfZ{LO;K`7dCR&#AIn{uS-G!TAT zLP|vhORkaOzIN)p@p1?`k7p)?qnOG9M~K3ee?DDZRb5?EMR1%AT-e-ewsu$5vq*h$ z%rNn(zcjALV&H#Yo`#ea*?~41&y)>e;c#eapp8)@G=F;%76Jy4IhfPRi3$E)qc5`{ z3ZLw5?UW&f_wQ&AyKJL@mAMU1f`e&>W5C-WdXvTq%yDCsjeD9=B+vwh`Md{OHbm3H z%(#vY+za&`7yw%LAZWiIcCylkAoWRQ`uz_3yHwJsLW%bzOnzXQdYOJOOqXY$v{U1t zX;a4cBvVz&;6099PTuX$u+_irl-3Q%s-KcH``A!zP9FL^9rVx{ijg8r0Z@ zQ>Zm-*gjshs1z%p)CdoRPTB*o7gju_c%4DC?m`v?h-L^K5e!WnfOeFA#31+35=o=@ zNEL)l7gD^?iV8u-w>+*G2?3DESq%k_bJ$?6Z$>3}OLDK(gDX0)2BI_2L&*_O95x$0 zM5~sy*w%n6)|e|guXK0iaG9Rf@zzpPZz|ryHGWzYEjJnQqQpo=c-Mqy$-JRDVj`!o zChFv~u4VzF%XfM{j3e1W^HCfFv6&8L9~YGnLc0;F<09Gsw>RyhJ^G1*+$kH&VYVl~ zcBGDerd#W3bWyK%q=GglM$d?$&4|%qp_mQ=kX+4KP(;7btZfpR*L>?kgG9MftZCt{ zWj>h%I(7b=+Z`awTVbmBG=zL#4SN!_oXZ1m`r0TBk=2vfkAD>s(r?pByY*LSME>w6 zxV-bXDF!*%F#wD)lu?pzC0y4yYl#ueNpynW>Fcv;qp9^Db2I*Vd+Tpg!jZb|ryk=S zN8td54WqH3&oLqj@i>2dF>N;W{5$*ktf$&L|5Tq)9K-|+G92w0%>t~f1)TFb?DYJ< zNk7X4@NUpgFIV_P9VmbK4lCn-ds2<)mIC*CdEa}^ymebY2l4~fm* z!5VMd+NDzd+w#8x!TnA8I(qBX8r66^U7=>>D&$9tp|bfjE>2=-v!6+w^mTVrH9Mt! zKAim-U8Qw2>^Sb54mx%oNNWDhwB)&MIVoCsW4C)c)0XA5<;`j1*dOf6vTZr8n@()j zos!JxCA)RCYqqXe`Mx~7zovJ4$ZL@_!a|j&HNrj1a1THt&cB1X@)I>bMa!?zrLXMS z$@PIL*Dc^qcuJNkBeDWeiJ%gbvo@ek%o4eYp#{oaiQ7OSS+j$@1S-#fZd>3S@I{k5 zrFijdKtwG7L>+{IMFm^5F;HDQOhuTQ>kk|SqqO9*Y0Ez=LLD5f7Q)KWY|WhLE{5$) zL?fu(GRc-5^K`*%qh||duk}FhJ5lWkH1{oFPLsU`^k|0iX1teb*P)@?-rlZ=E3vWz z;WiPrXu(SlMY;%;=7`a349gylWgB4_+hHND9fX8fc2YE%i#HxP??BcWq1C$~Bfw~i z!|WkgeS|AB=Rvwm|*{5=T{+2CjRxOrX0oJpg_@&Mc z`^i51Ij?X2v?;rB{$5mF8e-V#U6N)i7MqjHKLySq9g9Cx%8C7B7*D{@NPX|)j@)!WmZ zMc{_f>1MZ<;}*M)thF06eo8f(z%i3b&qtzUhZesmRKWw3G@> zsp!g=A`nw68kkV?l^$TeKzur*JO+i?f}!a^~QKuH5PE<>K=1cF7{l ziUG=7DGAAxMJg!S95RZ`5~iIZYDTG?R9pM|$_}Ar6ywa6%P-N)jeopU`|L?F$xLQ{ zJP_|YqmA>IXTJO4>cC$7F0V%;Qykb#S{}Sm+xi9v0S#fcV|Z7Qk~aB)4=+wKAm|w3 zhkoguanj=%lC>}Ni(2(le-N^}vRLg;IQlm~25I-oe~Y5`ckRmm{}%1opZfK8wi0{Q zx}N_h6tDP)E&5}xQu>FB-^=ae`uKWt(A^BCRREv^ct8P+g?P{bo+K>I=?-Er>P35> zy#hr2(%&(U8gpHJRk8SoVHW-7&r#a4_SdH9^;5t0=k;T6{XZ8sb$#mfggha?>MEbA zQU-mc?gfyiC0q*N&PurFA)J+Pa6ryVwXK6@5SJ37Gm@?aJ*}yqp zLj7yWXd$tPLaXOjo7J*vjXmJ!bPjL`Ed_=`h8KxBzRhs2)!xi7s4wv6hWZSfR{Dk) z=yv<7UHh9%`lH`3S^H~ObkqFn@0LCch3C^7tyn6b>n2deT+;@+wT0B6E!bUVx@SlW zV2!mkf}>#NQqNFFv@!(LpkM9f3IC#gz{w+3h$6_VlBa)sYes)1N|DaUrryq?(DqNl<_gOJf#dRk{e-aNN^)gPAtVagTd#j;R4(rdf2zSiiSj zoxb1*{f8^NbJF+}h^Z6X9}+kLnkXW-iS0ATM<(5=7T~NReQVrjC2CZJ6{(ORJ_D(U zHCnLY?w)u8Ltj_MFlm)i#9+Ix)GT+FT`<0U@$TeG-IV)N*%ZQ2#6bk$9G>W$1r^g+ zm|%&!48OZ0OGf$69JskK5s>r$;MtpkG+~-%XJ*H?ZQGt5+qP}n*6!H0ZQHhO+t1ne z`ycXel0W_5H#_eGKad_4+pg|aW3OOi5)X&BNvXbH(iC_;Krn53ab8|4ZxyuNz| zjfr^4-6b{z_gkaAw67XF<1jps!7%jCC#rU6eMeBR&DICF7*2WgMPoQB9iSiM%;A(} z%IBkbOY_(G zXN~3`^7L2wV7)X93^EnN?!YNJ?T*>zOW%ZM2G@v;@Zx3vJ#>nT)coXziKNP#=T?(R zd$z!6Yg+Rwk(0;Wa6l@CXg#u&Y5Ci>;nH6*vA;BZ=*)g3wfvXh+VH4;f(@#Wl^0Xv z!BSO$XKb(fn|Elht>!Ucy5$4_XUu&s3b?%!uLal_UN!ve<^o<%0lRDO{+1r1r%DfGABO|IRMIXal6Oh^3>3On!O3qe~5_@^CT2%^WLP_&F)9EK+2+bX*`^{JRF} z4Ptq&aAr!9FO*|Sq7k6g(M~us#@;>#XQ)3)tyPmu+lh`gyV>Pj>CMx}u+t@CvgNh3 zuaofEF*@=DABEI(E)fYVfyA89l?pSQWes-vjX7q9RgtiF@=o8&=bKjM_UW^E$N3$x z*)hA){?tmmocTmw#ht=Ax1yTNIah1@KHQ}$3KL7^)n38NdFGrdzX_l_oXYiX?OI5G zc!Oa}Cf!YM=rnz4`3cUjZQ9?f&ySFsQ+?mBwR#$IA)w2;rtVUzX+Pl7Z14cBlGoE_rhgRKjqtf#8nXIezb4ZiDsun=z9`4U1vF82bh-hn?m^6NJTU3e@_^h`p zmq-Eih^@0t4&M+60LSjk6^e^!9Y| zwzqwE-A^#M8h$(b!>^!TT)RV%h2O=;%ftJPXt{B8#72SbpLS9t4eOqG>kkdGZ1LyW z8c+-eIRAca#Dc|%kBhswS7c6G{v5Os5S0EDB_B5F^4(eGGGBV!rLPY3Y{_YZ|A@|H ztQaN?j~l6v2b?%3J*|OqSt}egzgkQ(7tm~=kdGywG0jUm<-k-DV z6C~pRzgymg&NP5;qh}FEF1VkwXVGVq!6yCWE8srm8W1tun|cNKe&1D_px*@C-h_Ru zK-BZ8szMMT`_>D9o&5sl{SX9l?bE|UGPs$Zx@dD*#P`4CxZcIZBY^iidn)lb$(8}_ zM@J6970a>=ODD^shAlA8AtlzM#naQ#-IWVRI^WhyjK6YV*>2E*xeP^%VkE*n#tvbq zQ_Qzti8!)*n#&S*;Y*=c%uflB@&E;(5M$)Dwhe`f%04Ev`PA7v()RmZ}%x^&8DBCFJdowFWm zJ8q`Sx4RJ^3<;SLG(=EDuqMVGTquw&RS+nB=Y~KJ4khwH(M1C25V3#G!2s_5H@10X z#2+Hkj>FO{GiKb~9TORVqKmXQw%3u)9<7R?Y$y~#TMMQYCO7zlo$inY6ZKU`E&;?( zk!c@eUO{k|QO4)Nne^VNcfB4pcbG_()NQy=svqqnbYuA;<)`yqvQG;PAjK-Z01y*CWJ_OVZw#2X#~9 z2TXGkl8jTlFjh2cfqk@!X+MUpL&@wx_Zh(JB9JK~qh6!}E5SMiG9kTbX4A5>PdQ|z zV{nub3Csx|%sk?T$K`v_cgvGU*L|r`w^(;pk+(p11yyPYU1AlJQT=O3b5Kc9e10xG zT>b`2%ayX%3aOSFSXWl%0@!P8sth#Zg`>K|YTBiLTSj$N^vrQ=;ok9p^hVu+!L{93 zNCcnzZXm;Wei?KF=i>pfXba!`))M!HxWgEF*P3EwZmhzN#tWRHukZGvk(Y)mv_YJx zQ`a6P>DMEPUi&~=M*^)0k#`1~U=Hmp&)h=re?Dnjd85(1VFp@JdyoKH8*|fSA>|3` z!&`8^q$|B9OvBcE9BXwQB7l0rPES>b9gY*UD{a}vOM$p7ZtW8i-hF9^v5~1>0A+S2tFeauaJrtE{Pe8w1X(&jo{m!&D-U;W1_|T z93>H(SrU~oaPgQhaimI;@I*jO)GYoPz{|_yPCu6T7zYH^P*BsZJ0Qj}KNc7j=?t_S z7JxtQ@5A!t@FWlpXXUV^2ub9eeZ;hr29%$nP|cjr9~9tdIJC0*d~?@}vn0fHykLclQyUtfgiKvDgiJgL*~sRa zmDR&%!F&rV0aHvN2(lL=6cx5Eq-I0}8|1g#)%)S$<@I($TUjH-2Q6Vk1r%inOKYIU zIe^6oY^;YBgR{)S`}4i`W{kor5{_AdsF*_p9Z~|VEZ@|)1Q9^eTF|i?UYh}%QHU*Q z`bV903E9GGoGKX>rWg+;*^_|zVz3ZlFfqQAAcIzt{11{Ews}Ba0+1n6r1L>UK~k`4 za~7;WpO3SX7bmZWtDDP1jbt2DaHK&BOF6Hj$S5gdTHPHA7CL>c%m|Vd^rb20imWlL z#Zcf~3gICi^fojaWmHqh1{Dacjneep@-71QG8v|Fj0PB%Bf6#$6w!U#l(0QWuD0qb zfw=h~2ZZ=2fjkZqUL@Y3mV$7E`TQrLMJ}Tp0(1aNawJQF){GoNm}07ZLQH7rumxGr zN+ggGI2bz+msCuAkACHahqHs511~QxpKh)@u{cm(kY#=#II?EIfR^GGGWH$rT50VR zGcrx&yV4H+*Xj8A-Rs~Y!t`7iBs;VgET}m1lZ2<>uhoz{z{TQU)??a zyv(Q1Ktf>3bf>n|0#K!iSOKW-7_i9#q6x>4??-Pdi70kH;dt}}$HoZ$xfT;wS69_+ z?q!zkV<~nvccN#h6^{=}%^Xz(wmP{8f|D4CizMt=82I!VH=^eXgsI_u<6$!6eXy8~ za);5q+bqQ(IS3CI3llgJJJVhsi(2l`_&cuFISjnVvg zT)%^mf`SZz(vDEVwDUvZwaCFFu5o|9oH((1v*KP_Y}T8;A;H==D3RJ){~VzuWCo*- znlh`pL#D@^JWh^#aA)MaAO$g&GXt%1sv~2L8bPBYrjn3d)9Ykr;ln|3G0d7Be)Gw! zY{^8M{AGp%X8_l*%Bo&=3ea)UklC4;mcx$myWjO~XljI%rU{&60#2hFpr|zBJR@+D zuf$pG%sC$X&=e#XY64T3f)O`4qpolr9#e>hr!V{WCTA7)br#HvAtJL$<=ecx= znaKnh0p-s5(~GHqwV&GYz|Z**J*u#dDAZj(s~pAanZ4Ip*Lf$SB@LIyJ>1pCiT&)R z<={LP-lMw}_$Ko7Qp0qrp&vB=uXu(H&zG=-?IT?!tWi6L2sY znBHg+3=!)HoJXm`Jky`8Yw--^MXjFE+WR4d{>DTx2d#&8iD}N|bt{{~f3CLBihehr z8QYx@A=HJF27I-Eg+xOG`Eq3fE__jydU85g=>PJ<1mic_3}$+)AO=2U+_zUu{2@%X zW%bB3miFvOrC#QpTGIpC5Z=0OLGZV%VzrE_(@BEmOY86bQ&n=32!q{qb>P=DuPGc?(onsQqAA+fiBVE4Da_udnAFA)A$%{5nyR+0Cy? zVv)4_xXEf|)$I#h%*)_dm^n3NH;I~}$G}Ux=+y2>AZJ|kg6lAAs#16%cV|ymssxMJ z*r<;&+{al_1;&OY>=%8c*CoD8++Ay($4%=$iyHA7!t9zNiZoHbBOD~eK_Zs+lNmA` zwxgjh_bbN^%oCVXH#D0N;u#`hbJ}d{v zVkmAj_F>Fj0YiKI72}N276w(3QmLYquq;Mo^!}V{T%SLW?)K<%6r&S7P)xRU&}YLfa!pZVz;jR?PUHG zFr@pDhcV%)9rQm{)O5c>Wq=*FdUkzzb8dE@br9@OORFDkd?e@d9t_2(XQ-{HFMK*T z5ncG+Y?jOw1%HjlFf(y-zk)1^acS(8mCtFut<;bDZe%qWSb>$B65>Z4$553@8D_Fb zAN>?JM2(YqbEs3;0y*ih#HMI z!UCgm2f(Tkh*(qVrXDxQ>zcU~d=2s{fo_ozb)%EU#aJpcEyG_X&NKL;cLy{Vtg*s^$HawWBloUa(j*>i1V32KXWQxQ?jS$ z=D*>0uk~&>q#zcGR1xzO>Metr`Z@9EiM^3xXj8g=XwSVv3Lo@KSi(d%0(rk$>gS+Ats!tTI7M zT)<5VgC^>WD>gX>^N_2w?$OGg5|bN#ZHmG}ATC*a?EXZ` zjI<8b!qWkt)Kf~pWFLt#TD6X!b^DX+=h$le%LJ2-le#j&Wu#yU8dAs0t<)y6#do<> zmTtk^BT$j)@@u|pzZEL#fvi6 zc?O}~smdU=$*;Q}2}h7cX?yZFjG&SIGG2dWQ7X_d83sa^dHg4|^R<2b=qrC`@vZ~0~vr@^+tiof)!RmGs`;*z1>~o)x(JGZFLxm** zEm}2Eyv=tCz?Bs{En6uWOw@ZyK8`r3;?C8|YM@@J(yzo63Kh@5{24YpZ(tgsM#V?aB8>HBTC8DQk0w*SgP< zpk76ln~je=Z^7>|V154v^x7G*Cncb6T*j|5&?T4gyqLdFlxOoOw|sk}C;|ld za$>%XymQrIK(#MrT(+_jY%SO-80pUVZ}?D;3lM@kyt&_%{aF7DXsSi@z4 z=Q|$(fS;e5t)A`*}pZs@#pZohw&1|CNrRE;~7?n@}Go^(Q6Lr!p`rEk6XySMnl^%P^ zS>twIz;gn`#w8sW7pY9-!2l6?78IW8&btj~w)_W?>DX2($fT5)FG*m9LLJg6S`>GC zD|B00LBy5%kcVMgVK=f_!8otF;W<;;Q-H6C7>{n(S@U$FZON;dkqr5f7Hk=A6d46* zt=8s)CiVNH#;P-`Mxi19Il$;^^#)LUUbkuoV7NC2q}Dz>L!1Met#00zKmCs@HwlRS zyzXdY``F)JEQ&Wi&GB@m$OU{J^$84Zyp`)t6)p~M3@(e_VYSlftCt=virv0%v67G* zq^Z7nrOqLW|K!;JAP_x^CZ}yGO4_S1&lV_7`)7!9KtzQe{q62TcdmXts7-$_uH7!J-Qr~>t+o(x__6ix{O2M2iCcHT%%6MB zugThNz$$dV`=P$`$WIL5AHl5;VD_Yb+Mvh7KXYQQ?VR}OluZy&TLWC+*S2};y!6WM z^AmHMNuW;;?jC)T(k5Swd8Zd8&g7`?R$a==}P|H)-+)-W8+9h`$HvfivDg z8==#yV{HhV_JH`+9d^UG4l%bPL>v4%skEz4&=kD`&Uy=N5fS#Mzjx$RAX_gB zA#71S*dNZkasTOS`4!RW)hjSJWp}~~THStESKm;K5hVez&Bt4;`+$!0hA+a2H67;{ zRJOnG!OZV3TEd5)D=+@|zW3$=?!bpLGcziVk+=`5W8&t$wEOFq zH*Y7q5E#Q$9)tSoB)t1t5Qsl2oK4jv9XeM|UT{ zDWnBvml$L>7;@js@zL7&OO;)>^Y}HmGV0^{#^7%M1)8vFrZ0EMu2Q2O45S_c(ry0D zAdgE7fy2IU4*Zd4Eb!{EGRhNAp8>t~T92W{k>O?Nd*8@YJV7q(*O$P|Pd^!1PV{>n zk8U&_WW=@$U5g|AOVQ;%GPzC<%{eqVO>gOgT`^<-*QSGjL@Ss<2*4T7&L51@S7WP3 z6O8ZP)S=V#bE+ku{w0K)vky;H6Ud`V_ssZ*S;KA&bQ|(ZvB#2JP}vfrC)TZ=Vq;a) zEYT1fNWK>1P960yTIkSaj0T|rD44^as7^cOk{j~6p!J^qW$06@`IYhdi9!I1=7Fst(tXzm)<*?)CeJ=iSr|TRsH;#+P661>bV?g z?Dh<&)%5-61D@R~nZ7lE_!VekqWN#%4pBIpD3qaEQ5-Uy*hzfE?5V^Cy(bL46GEF! z!Z>+gO-<*HZp_OPaVsGS!7%F)df-uN+K9QcrQLpsdRFF!D*?qXJWGt;P{MYIApEqg z)*ywvdPRX5fcQ0QECfqqJRtoXV2SkXkMb^i=@c=4AUjJWGD^?WV6 z4#YIwGn^5J#P`FnAxd*}Sm`P9F5u(xC1p$Ayu8J+@@0swXJ?C+ANIG-u$J?J zY)qj^ITuPfNrfe;mNy+TDaF0X8TZIhoHMe@GhEauw|45)$vmm zi%KXi2L6a`88=DmbeQNEq`Vi|%5-Si+C)TJUrU9!jUr^c>rO8vuE&}d`nV<7eJIhk zOHkw|(y7kLYMK?Nd&QX1Dk$@$5N{tC6i17a)yBwV&`&iww9lLT7_bexxh~2VYdcKg zRA;SF&B-E9@Ju&^$FJDfI?!xC8N0BEQBSkAW?`kAg_Q@?Yuu5G60kJ43S{$@jkv3_ z$QNssRMMTJd1T|!jBAGmK*lw~ni~?=sIbICa~y`UY*^p86g{G#i@gu6ziC0fF|meCB857)TBDc zFEokMEY+aJvuG6Z>X7@bdg3yXpB6)VOyoUU+{r9PDJK-cE5yJ;Owj zjy3G+;NHxVX5k#?x83 zo#=>GVj89MQ9-ODMlD|6KM*9L@HZ7rc`^Qgnwogt!i-uRBsTd*b(|QIz(y#e6fS1n zg41)(HnseW!kC(s>@v87q=#BEo=c>^fjxukr}s+N)_GGb;isn;ghuz8yhkDf!@!J? zr$)(SSh1RxE5V0L-EEQ$6V_&Bp&%~l>Wuz#_x2oEQi4$;;GWY}yVZqw(#MjQk6~LL zA!A!@nV(@ZqTB**@XUai&XWoK4BtDZ)VxA`SfLRKJS`YWpY0j zbtJ}=#@@!&W;6%GK${%xxTlaXdp#~@GMoypJ!RC(q?&}=NM2tlZCs7wDK=;Be#(GQ z#`%mOjxj17UbERn7CoYEBV>tD^M_0G2A7>&+L_uWuN=vi%8HKTfG$H-Bb19)Eg5?* zHwh{limg0Qh&`Wscv~_x#dae>w2*E_vJUMsNdXca7oEz2kCM_?Na@hFIR$4vrJ$ff z7QAUo>DV$DrYMD`zpSifEI8$KH=6+W=h$Lg(I3=xcu=bmEXNxAjYK`8vIM)-8`1oYbErWtQQ4sRJzoz=Ve+j z1E6AV+1960)H-~t4kQ;w<$bXAE_&zCsI!^KibXQMnpm{!K3w6GdlIeh(NQD%9(pC^ zCv_F3H%MX3B0(JrXulP2?)vj`HzIlomn!?zvCJD>RJtbn&5Y>EROOWM|Q>H`_g8qQ#B^LCbJ0Unny^G=w|?r7B5nHh_%RH%H;zV_w^)@MKES zi(UvNYUmMOAcvu?tsj|~yN8=I=;6{XTPtIs#ZL4Qr6fxrb&mxFmqQKGU|h&D4~c5Z znl6c{gi#L|yTZgF_8`NP$Ixo*yHr#xto9rnV`cp)b+hLx&cDUL9s4j>-@zJGh>jo5zR_;rmeKeu`owAh@=hgeRkVLku zl%VriJBtw*VSff@)&&twTFK+1NI@TjCJc{8FTK>jkJ zg4D~fY#FM{TdrB7K2w%T8r|&Xs+2sA(RQbx;2u3)@&qy8kv3~9STA)X6?I!}!(?G5 zdqAv9RKeGkhLap21v)3o^Duo*uZS^Q6#oSN{`!~?Y;#CdoP?gMfPXj{ed(UBnT&ze zWm+Tj4UwSCJ!dDP&EwiLC8$(+ub3q@u;-`>WSD)Ag`V>5;b@uJh0%7Spl}{N?Ft%p zSS5#qa#@cQmJ zTe5_JS0E(g(~!o+`UyQZwtK$?4nw61YM!a3qSTxX6tPtE5%pWI)@*E>G!?DxIG5JL zU64vhO;MCfIrUuv5nnEz>%}@b6E}9`KBR!C7O{e%YKqqyEYQre~qq#YQsW$xT!-@j}KOMLshJL&i95Jsd*MkbD%SrBlo_u-}h|8r5?(32@ zabYDE9@WS7N*_3Gso-o~3npZmL344pwzFd=W;U&G8m+62%%?goVsJ49O%7eMEK`rd z;?>5FII$%zEJVUGmIh^!>8~I;m=qMOH)*6btr}38xX3j2A|W2cO6f=%kj#%MboxB9 zW5LWyXjgEsck*@Epj<6s;@-KJhT?&mCv1V4u`nY6 z4t9JEJy3jIH;zmUm@PYx?|mA-R7v4yi^|)Jt$?7 zcpSfGU<;VT>J%!OGdn-Rv0KJtBE`%eCU{_7w2nlD*v`{MaAmHLl47HNR4j9Z z^=H0E#HzrJ_M9F-oKwO+e~RB}Tg0wgE)F#=B*x69WI9O6kSIO7Vasq9m6~(|HtoPezu{NnRu(yvF{>Aa2YlFDM z(hW4j=qf^upKuh9H8<6iH|RlXpKsqwu7$p)ENnsz;$*m@DTOEGJ$~Nbe^+W}uN*I| z$3`#}5!=={A6ji(D0R>Wkz;zivtVD;B!||H*^V`Pd;0mf`T4YS*8It8X0_=t`fKj8?ayo1o&TOATC?IOG@zec zcvCBNJe^AW(5&BZ_8~V!zI!qT!PEKk^h`((yUAUAx;t0qyiGOPjk9V%u$=3GKlHqh zeRrGy_HauT+zrEK9=t8*ujGk{fxvcLrtId$anlc9EMUkR5gne{vqnoOu2HqL`BXUbf-vRBq!)Y4hPQ$pi_e$Xi;dqZKcqO~Ow_OJzUib~Q zA*3U+1_6*v-}x69P5mBU71H5dBTCI|XzL6_fXDensSIw5Kqo)4R1S0Fc<9G(5U}L_ zmpIF*j_R`m=hXmVBNq{GNc1U>bz>Vp3E?I0dwk{}=aTCUtEsHJFu|3`CrWy7o5vi% ziKw!eODlNrx21oA6C#FkaAG*NOQ$mbTJ{SCA%vsisX@-Qbo$ix8N}zp&(Q%P{ly!{ zS*I>F!Ijb{N_cSFnX$hJ*4XwM#OLx)(Hk~;gm)NBzubOf1b^H3BikWjpm>d)7u)REo&6UG zvi(=#4_^ILX4lSq1OyH5MDzbJ@^OAev|Dz2!QWQ?MmGO2Z;wD-o5fN6^vwe2Y!T7i z2T8)x>y6uU5TA=bAuIo6r>(x%Ct+>E`PB(u%d5d17zLGf{hIK)7W<#o0&qvBzu_(* z6BgHD{Au=+*yy{R`(5+DWtRXSHN2= zJ$Jh=eE05Bb_Djo2t*XIW&C2`nX4O`%>lP(X^4dhB+ik!4C7at;dFU zrTUqO9^A&TpJjzcdihd2Sb6(QK??48&$skD&<=yAt546r!4MH+U6yXnoo9U??CApq zD!6T|$11RAa}k~)VKtZZAHS;x%-!~mn+ICg4`?4Deaos=->qB6AkFqO#VeSjVmwmB z$=Hn;f{(|2$InnVA^i>T7?&xK+b@DE+t0*@pnsl(;|NS&UH_fDMo8A=m+T!cghLdI+ zyn<`RI z2DHuLU#=w#_?s8LgQ| z{@n9_LA2$?)j7VCBTnC1bdS;8(`VYIgZW-n)FDv`X}Xtie*nRFyJ6Tv@rgC!Fs3_s zQ<)sq;L_RM=oSQUeK0W7B4K4s0qZkTYS#)jz_E!loHaLoO-0#S~b}BNPbcw^0YKEzN_9!H7-*6 zgX>JvSK8Uo3?LPFD0Ed7`IHpzf;_n&(%&?`Y7S0u)VwSVTlABNTi}$kAkJ33*Pud>o*>tP&OEu171A7g^JI=3iYwxARe| z5Jl>J)vy%nE9#1MNk=Mvs%}c|ekf|F&f&?zQzMY@O*#f30%l-D5+{`KBr(sVPTsS2 z%P~pIg`+2(Lxv+@JCf&OtCy}=7PG8J2WR>->G{TEkQ_ z5>=>%2Y|%=p~EH8 zO;U*&&)1}2E8MKzpItBeA!nTPjd+{gUVD5so%2JTJfQq|8J0#$w5^+)>1T*25U^U= zyK;_1pt-xIO8i!*k*MZ=eSP8g`)cd7$mdG$+3wsmdO(mDyWJ&kEVu5k(bMnVmb!W~ zdx!mox%&-q?G&?5!${)yalPVWIgMjvWCvo!t7#N6C;uD~zoCRA6=&xYJEkoeq)FmHiuh5G%QI z!-oRK(plGxoen9uc>x)Q*-rnDpTFbqz25RDf*m}4Zf<)kAvDJNh1Su zWdU2|dusaf*W{EH{w6EnFqhTsJp@onD`PWdU3CgbFm0Fyu#~*_z5#CUJsw8Q&BOO` zZ^I`sD8?t%ce8N`$hCRAy#>YxySvR(XD=`obVm{=snk9rw1PJ7cXsBf@DM`!zQ=j& zCrjmbK5;VV@(1DowVU(d_O0;s>R-##Gi2Mykl!))wI32BRc)g#sRk$ZJ-)8*-*H5a z9EF+n{!*uCpW_2wWEhE?<&Wd9h4uao>b-{u@*{j`=tqpWaR8eQ{SVQs7fBSDNxmpDoZczHh={wsB^xtafKMPxa(|M;l)+UF%Bb z8B#t5weV$FYa``vytjF-e_pdc{(f2dJie`(oO1Bv^IgzV4P^NB+Q|0q9?cgXcV`FB zczf^j)}7Wv3okyUR$G2V$1gI@8QZ_szG1oIW`MBU$bQ~?;a;Rm`0Z?X)qh7ONTWPv zh80jH4z4s2m*%I<4%LpkUFBO$T-CARjbG;HrF(F~@5YxjW{QTNe23igrCdXeOo<)N zH3^tmZzO~}mN5{F>@TlWUaRB8k5I$P@|d)g@OgeirXmRZWL(|2r=lImo*MP^IN$RH z+V6Dr&)Rv$dhXMFMhHM7AU8KRKAsYKxtr6Z3-q2B;)okhyj7STO4Fw+50eeXoeRu+4&SZdN-xP zq5RncTwi~G>+)LGPIQm6dJ0g9FXQQ+qkq|Ixof{JzBXp`y&b)uR~`)o`^&2DTfpM# zTkhd6Q=&`U?aulS-u5Y?EIU3tv|t)5X2oRnX1ov0Bv^ZaCvhlf1pPL=zPLw>)kUSb zJ|NNY2Q~p5ET1EZ{L=GJEO?*?dAQNyGj?{sj=y)c=_NG?bTs*dz z3O4~X=jVP#1HX~?ANiQtTNuhDj0we9L!Za}@Zz^CS?8taQnReh5%J>Yd4<8t7ju^bBy%6o=;Oy%Tq6@Isd5AJ`rW06LUuqP~H_ZI?^Y-v`c0jxo z%_E_QpQVpa(8JBeDX!r6^Kf+lsqDP}y`WXKHcvD9e}L+s`hldRh-2}?b?{5Wy^sG) z+RGdBsr}EcvAq7E;Zz;^i0Q+O-<<>QOgz5<+1gP5v0K_L+^H!0i%LyPX(XO}%}$uB z=WJ$d1!&+G$N1HW7r({o?LKwlBP%Q5bl0T;WxY?BFgt`U1!9N zf&V~*0(@nDdnWRZoqW?@`=!@6cld7-FR1o)r2sS)gZ%@t+>G5Ji$~b;U>JSvOE+?P;eG_TNqujTcD@GT=SOD>;h5HkP!etaP_> z_kHgAD?TPX6Je(Jtz$6D2&KX3>tXP@b6JGUa=Q_@Y@ts7#snN+@_xgK5LY#h z29y*E;6=n6SfC~EE1%%TfqhUZ;4QhK>)CCA`s=j01kw6}@J@u-5H2oHV}ncHqPgM2 zu*8(X_14S^I{Ng9hL|YX|5jj)@gCf-eIIYVcrL5zO$#@lNe15n(i^CIC zJC8fcwG&bYC3I&K!Urz!rKCbYo<+(Ykk0vaA4ftn$Wp^xZSXkwZyOZbA~OjK_qfVC z1AEicuG%~+6+-{5Hru;iJzK)7YB=SjZ5fQ)my&2pD{ZpQBGT3wDGULNE(udHCQ4xu z^P0|ZNr=F%QDb9l^$$DfJvkm--pkk0>%;f>a+mqsSk|(gO3HdF^P`lVvRn(RVOfi4 z*$0UBS(f0sh6&l1FRN%U;F#E^I>f%340&!3%5W*{uYPz_o$cFtqaiTedobg6UD8&6 zbh)W7u5Sy*jw&Z!t9?&*JQeuV=V%`E-hkloc2JdntB*zl4gv8dlLm9 zYF^98WK+vTM<(r}7e!|rTFV+)s^xP6PCS|#%LTv+bOD-}M-HBSNu>(aZtIttFolQs zqM-s-!(oW&U8pfu)iHqa>1tx3y9Ky!c+hiIs- zs$M-ZEJ|=y3mO?2rady!{yz?s_?}kpQaZ)caRONc64*IC z1OJwr0Jtf7Z^LqOzBGFJ#U>=J3SEJ_g0I{J%Ju~Fs7Iun-EFw%*jGFDsg&#rx$sw* zte`X@ixQ@KW*-aOo!InZb!oW<<64)x%aLU5?)FnXd#ZCDk8vdgl9K_3f}SS^v=!8Y6{DcxJIn`Q&sg?W zOj8V0;q5k`bGE2dzVG&v1dX2#@PR}-8u@so3ryEUE>lJnG0Q;WHrZnXKA0(&nU&*z znHcgM5-dn$HCXXbIAa2z=Opcg4Tw$qeX5L^(($n#RVc}jUIn4)ij$dR0#rdf%F_d8 zFlb?GOCL#$vmyWMUmQJP%zr#|CA+ko!m-9npH0h8X7rH$YIQm_==U@ZHoG^p4ri$vlJABH@WAT__pa z4OQC>yALcp1v6wj@*9@Yi9asJml(3;58)BxfegzOEtGFuV9~}zS~r#krfiKpx?+U! zqW5+AeqVbY`Tx2e8UE{fl#uAML2b{406y@o*(2D(&jba*42KL8g2h3nBZ_SlaX=8= z%VpG(VC+uED+LKfMEw6fm*gc}R`h{D3AA8ou#FLWgjM0W{|_8M!6+{e;v)wY|U$2{wcH(KN|e4m|zeF<;6#I{$qAKKInM(z3D3} zFZtENU0pgKEXrj1DRf}ryJfEB+2A&Rnc0K9SoCr_7k+Gw*4yg$^mMV9UY)gi%K4g} zm7xqFkO7)X!?X)AG!R%YDY&CJCX{9u{a;`F_wdJ;Z{GhS)5VOB^3PZidnN1f3adhF zYP};03gDqdSaJ-gK~xDsjZh_F-(0-Cc>VJI%eU{oXo($iDy9Y#551NEXr{Qw9D0Er zHxY<(CGiix{_^hq+lyDfyx&gbhDq>Kv7f%*X;3fLd=M3}A|_@l6!&|TbW|}Neiup` zVhk-3mva^(UT+pzJ#LLiTM;(mPWQ8`tqCPtHbm#D?j_@?w~)m9pt^))Lr z9O9<4e4&azR&Gh=3AX77&JktC00~m$EiZ2Z4@Z;WTn8Qgr(5o1Jbn@fE-YqQ3uR|1 zUmP3Nq1(!Dr4HFjkSjtb>0?xcOn_rj0VE0)05HPxW-5>uUyo;i$}E;6|FjQ@EFH2; zVjkjDdlLej4_#EY*Tr^P1SXDHgXJu~uO_w!Kahy*93^9Bw`tJ5{%M>-+?<+b@^)vMaZ59oGh`e=Mz)I#06i0A5FPZBTtJ)d(b)cwgpUCu%2`xWia z=$$`q_~Ra`?#|AeMC~VO z7}%{@H&f^R$c$Xf{Qu1SFLiQj5z2U@;pOU}sfkdRIE~ytX%%VxmwQ_1wJA{Cje5SU z&#;2s`jGE&F7GKVzcGk-0&ZTe#HO;ECeH@176p=5_=YMzpMlq3slP^7YMh8IG@&14?l`nM;~1~2S*ko#!oFKqZT5UO@wJoW9e>9JrD*^E;^sWB2Y7nYX^7;E9na@gmO;%fE z>3Z4nd-G?5%K7fr&DSS&0}sU*4XPt^-{<+sbrY^Stf z@yWC5X?JNdjl<8laUD0(Q>C=$c@M8j#bo>3%PsDT3p8){Hc;|5qUW-{3%9{jDSubC zZfb3Co8*cBW}q3JsMGZ-(GU#?N73T;ahdWh@ka%aaf#0J=LJks;W}*}ac|>?oh}KS zE(!b#JeBkR>}+Q^c0qIO9#J4V@;?Y>JZo8)RMR9M&?hlv$&*1+|h05`ojpjB3&1i9(u0QMqz)O6eY^>S{@75jA+*Y6D?{@xki`PPRi%jsXrDz0dn+n&&Qz$pU)H8MsL$Yk;)MK#c-LFDM*=JNYOGW zSCHyum+GWgnUpU``CUlKGO1BPYP1U}Qzo_2fvu)&LCTg%T@|FRb|K}J@{_fUi^4*K>7X4pI`m*&GXh%u^h(mkq#cW*4jBBEFhY3hrOdx zS|(%t5FBsLYh10qq{q!M2ZZ8ynvk750#1+X(NzQsh37Dq2&0lxL@4W~Z=a zr%)jO(xmv(WQ#9t=l$;F=jLBp6kqBEgqMHmw)oQR7GL^o4zG$1uWE95mG|zi4Gu5J z9o~rA<(-j2Cp(^hG~nMH_6 z#4!g(%X_eCBAcd(O{3;v)$YL^6e0Yu(nuM8kwi-EEfPRs;G{(2KHQBWccUim(q+<3 z9HJtV8ZrwZb{Z=NLpL(Uso)TMLnsr~N|h@`%HXkLB0`Toh?Te;M?^9%5c0x64-gPQ zJ4_{l_vwR4?1M>DAH+}f;EfU}9g~hA54B|8I>MZg!gxa=aIT5BNWDWh^S%wE?6sy4 zNBsnzgb}v}8)0#XQazy!ecMy;SrmNMBzU}A+JiMfNC;%Swj2mYmE#HlNy5Kg2v4AB z9`@O%9%hMqZV+ThQz~hoWw2)^jJ_a%2D9XAW~ryd^CSLnkrfUJuLO}s35a0?Lc;)fNu?HH2JNom zw~@8mCf2gtiXL5NykpQ%PN51j4;kVVuu@|}t-~DZ-MZ{9@^#n5*9seU6K~rf&DOEt zidI%Qu00y+2MpWZ&=PaCM??KUT-zF2;-mIxrZ3!TYcp||uSYw5u~FOFNw}ju8rv4k zw9?oTBeX{=y%0y+S}Eaq_GqdXL}*)63462GIQ2mDY;CE6li8!SUg(<}T1%LgeP&c2 zpv<<$a{S32&Gdq^Y;9(kX+Yc4GG zVX4ExPh?szdnrp5ED^r#LpVeQ!~~x(7-ZnIf|?K$oG~BVQ0u5gHNvMuiHg1yJYiW8$`gZ>g#d*(T`?vJm4?f(nlt~o`8z#_ zeb(kbkPlt|0WgNv zJnl*ag`C`Bii0z0h;qakEdb-xSZTG>)SIHv#QV3uy=)c}ei33iZv>(g7-=l_Bp%r_ z<~0uP4RT6>T+E*?F5k7t`DF}eR8FOlQj$qV1<-~%C%oa7awnNCp$=aD`oqQL@b`L5eQ2$2Kk*^A9jChsDHf8RTyB(0h;@Oh`WDosAsZkT;0ZXbC^R3iOA|f3V^W z-3~-=m5NSAu0x$vk4=Xn?+r@x*;IzCR3=#8;*#nzJ@{}caymOX;Mqwl{!_vOxOW>J z`~M6gTF?I_{Ivh~AkQ)H|NT(T|2^&cePz3TC;X=q{?iHnsZ&8tcu(7rI^jL-rq?I@ zr|n1`2maG_Osl(YN~?SG_TuN)7niSofBEZg?>FH<6}51MLV|ciz3?1*LMc^1SVjOb z!TAY6*K%(lhk|OnDn>UjF zSA_g*O$l=WM%sU*iXBI_47Im)K(r^FP>pt*@PX|jrmG=$**FydONai*(#wz`f z@74dI2lq+;|1*Al(*K|I|0n(bN&o*g{l8jLd<6M`&FcU4N&jQJq`A%~lb2cs>6t<@ zg$?@XqOB=XFkD%CMO=|UMU1b$m_2Qdaz7j7r9PXBC_(wYntcB-UiKZm0f?L6=SPOGmg{f1<=V zspQC9GuL2~CZ-VCCg0k;w4?kljIriSSqvDxmK~zSwiJ1rlB|!=O~ZjhcyWyNrb^W$ zaxpp4yy#kcmCVRFxs;> zT9e3Z%WlaidtdLKtnqYRt#P7qW!0@LNRA@3p(^8BQwZ7hi=KXe-!+F>YmN$l4-OQx zb{wLt$z@iajn}RFQ%%dB-#E);MQ^2tF=9@hoW`mxWK|VuG2T)N7l#@%EFPmhyx-hw zWF3kuLiAO5CbP0wJOFae0PLT zsg(bRRLXnje`ecglViN7|DEvw@4o++0BJwz|9{4>-?RRI^wXaX0Dau4fYk?pmYc$o z6F}2)alPKrpXtrT)%RPbg58zIBe6D&EvtOuActGAL`8fLw{xx z0sId?)WqlCR3`M-fB2!+&K^4dx@C>$-CbSC*Q4pJdvI#|$DST{=_Zdo^=(^6 z8$Cbru!sv<;cf2V%Qn8ad-~$fo8K+`+5adOHQFu0GR{)c#j4;M_T4uR} zs_`YPtzohMTn__p>lmGlPR0}gOeULLAXsck`$D;2T5DdyYqaxD{)rn5=u~|*u{x+a zwQC&O_fL*NX;(_c^kC1s-z~wcjUNV5f=~@L7updEDZX^-zNgIcXakLuBRZqb)B5`((<)K+M^(@k#=VV>VdXTlOvZXoE`l2l(fE^0l4C0rq7fIT>-t!WJ__z}#9GsGyCoNH#(nsq6Jl*H^8QW+2Qdu*kL= zYDkb#iwU>p^3KtMh^!e-2(;r(7{`H84VZ*DhEAB2nUb1CZ*KBCkB{H`L zlnK#`s*GHMjxH;e`fF0!3!`p}ydM3>NRR$?WJaG2V(tP<{0&eer)Eo0d>+JXAk_%M zR{9*z>Dlhd*^=qo+4uy0KGLs8|28tiFg|NCyb~6kG`55@6W1T zWY2V;mEQ*OCM;)|25e^I9#&&_xCs4S^mmRe?u0H+|1c zq^npOa@3Z!0uhGD-uYr}RO}N{C6wSDtn0I|f^~9w@ZZatprH+J5Map&<-$r-+QmL4 zVpb-Rib?#260tPrEMA7Zvokj% zVzq?!3G&QsEO)%W?_PqBYpj!MqLfmum2C(d<-eQ_>L`|+p8y~3o}P&;J=^B#{gQM}$amO&OhOu86fwDJ6#gbLZg<-~Ij0h~A8L z?(bVk)#RtC2+x5~7*XINX0mI+I|mUo!pB04Hflpc*2=57Vs0UVL-xHw`iqX$DUsAn zWD?Y%O^M=^$aJn~4(jpA+ubGUm4P^3Y?q9C(!j#FoA1FyLe`v7#0mU7T2VTaZzbRy z94%?jI}G0|JJ=QwJ&x9@qOb&Z9u>LhY9iay@xAktlkw5n4Ek_Vf?C!v87C6TfC?Fs z1))z|po09I7hszl{&DwkStsI^v{T#xrfic{sGZjtQ8|fWuFYxEO21S6M1Spw=bu+T zm%+8$ptO+?X_TX2#86{VU^P3%_}+6TGPT{a|1yY$A}G#>BEl#|Sr;l!Y|=;3+483_ zlhpf%=cixKnc$+hGO3q$w?E9LV&}cp9Y}o1p0iLP)&T*ksXj2;R2h=QU9p00xv%(_ z8P27XK{wnK&cmk$fSdpYI$A_hA)v`svEVMj7G25p*ErwubpF!ej%GZ+hjKoQaH~mp0GGVHE0R<5j4|8LHJp zVp+ljf>mcuPPO(=@1}g0z{Nqp4ZY@ zhX03YI=Q>$B9VJKxw@WC3Qy%{Tm}K(J1Ev?V5LlMnVo2ptUV|B8MxeCRsZAl4KH*1 z{of9F0xj^5wYs4iej|jy{Jo@T86zPUiXgQz7;MuT7D8E51k%om_cc*j?^_#@nJe1;YQ;-Oq0hru;8b)WR7ts{OQ1?2+rpwI zQE9f=-UIG^eY_ZCxgPy(bWuk;^_O-f{Lbo@DZfElywF$kVH0Ku*j2FsC0VM1vC6Z^ zBm@(|_OC>)zVDx=S3l6S8{B<%Caath8aAm~r0ioAtLLsr;<|qyF?#)a^tZo{{@$+3 zyX4W18ismIR0|~sH3@;rGUuqh0RsuFEQ3q4BYEGRcTQ_3-_cYC4l zft<~e6&0stD@5;%RV_C8xq`g*|GhuRYVR$PNoE+TkW?!@7F*6r=&~}^<>ZS43C3ar z)$~c<-Lu`p$@t{txC6WMUN~iA+t9Fcqk>wE?1p6IpW%_y~3}$cwA# zs6~cfM>~y~3}b<ekb| z?O&5D&;!>#I1_JnaCm;QgnABxcYciZETV^6OEu$F4HdG;{Lt#-OK~iA+>52N-F9o= zyea>Ly!6O#7#f=FWC(C4{Z)3pv+kai+yZ9J5WEh zy5a7udGDY?%m@fJGxploT3Y94e*h0sTe!Bi?!Q5;(m)f3uL8Gm03XUPR)-0AGx(X>6 z8$9{oMZQXKZ8-Vr_U?w?E3_XPRKi>%Hd=3;C*^EQGHNZ$OhpyyDevWVDuZ8Cp@cR@ zaKa9uM6j~Al~(Q6#X`|?kM!c|V!8oG_h$4IA3s9UP=kgD*(y>cd0Ryex>_@6U2=PG z-!m{uSI?%hX`0bzIozk&XoHxdOxbA{#4c=QBOV{3 z4USAL)p?VBFM{VLssAb)_euj`bnR`FX(!>Fk3MIUKvj=El#**Msmq+y8|L|W+I-00 zLVjl}=|SPVUc{of--sb3ay1N`;8*9X8G&2AFuf4un>+14A0Y%^4p-DxDo*@{LR zBYf5yL>B`++TK+=-!)IWhQ-o3IpTt#txz2_0<$WBQWPR3*ZO2Wuftjp)qlMG{?C6I zfbSJGDRRW>m`Y;dFTO@Wnk>XnBKnTp&0*{r%LZ|6$x@2}-P$*#4DF6fs?jqjRx#@= zamBov-JRKAbJAmzukvO_$sT?m%+7=uGpcs{G?Hvk4z0#tgr+UzThquVT{*kfbt~I) zOW-m@Obni6Icw{R6a$xP#ly;vs+v{e{5mNt8sqwYNYMU|y(@i+<4E@3{a1|j!3(mr zs{61dy+G37Wfy~k!@K)r$3&enu?Q4^)^<4jzrV~rh8||1yYY;sc{XxL=Blc!Uu9Na zl_{b~K!{Fodqm*GM5tGAzYEW)3%no=1!_$G!`qb*wlbfN)R-NXLBV3CY z?m@xGfYB`VXzjrb;i*;xUygVz7?YW!HH;0)W_Ek@;WAxJ%8a&U(p$Q=R+2@dL*NFD z_pAiB*~sKVVw{7{XpGG@mQ^vzhXQ0!)?{UvOkBrk4Ohek2l_C#E(j%RAZxPfnCz1M zHmk!;g1RORkVLRMf$&(bRWs1@jZl$=sVJ@A$2=6^jN~MNIl+=oiol&GDEbv#qvPnQhcs#5c)QQ8v$Drg8E*p3GlrOjaB5+0qcajPFnEgiU0)mzE606^KS zY~Tz_Z4pPg2NILF+FG!gYSQW#We-Jb;Vu}7+L+>CBjju_X_Sk|r4uZtDP5-^^v}*8 z6t~fU9eN_kfhX>Aq@aA}Ah?pm2w5u9mp4c&Jh$-qy_) zA^CvO(}>+o0!y(-Ucse3MBAO=TYWD;2eTkQvd3D5MrTf$1*w^eYhYTmvBWOa=AQqM zi}H*Q#pE(`1a-7WJ^Sai&bB#PVik?mk=ExG`f6yaICXVN*!QkO2?ReRItAAu22=$U{4rDz zkvJncTF}RV`{wC<=YC!po%hOfS;-NfekLRaxf-6|A)LpGs1}xd!zJ?nx_6DVD;d&|_=yTSYQfa5PthUvf#Ir{Bg91jt`WO$wPvK@IgZ zm}x9yWjwdC_mzG6L_H+Rq)rip2dHcyOaf@LHYS%d=mOXQr>f%{PpZ$>x}dA=#H_>|MGl18r}F zUEhWcgDJ5Ep$v{QNhKI)EJ?2-SfR_^W&60ok9V3>53ZivRJ}RO-maY)R zt1~YH7qNPKmjB$aT82fgEvy1=NRlK7FE6-+-BUq%3087xO;qulH%$HEH!ND}2r#9W zV483NdQ)JDkzgeV(!@%aLiq7NE8MULl8{Q1F;X!uG-ttDpO`Qb^e&=#qRf^KVHn`5 z(ko8R-d-p3J|L?VE>RDcD$Uq^+=}GEdZkHI0^$V}1ipyQ@cw+s#`%g20}RKbir{Su zj=G$ZC6rG_o{0wHlaoA0Me$*ZO*zN_0ufW;t1T!O@*o(|Q=>!H&H`~BtMC)B(*aj) zY~VD&y;EiTPLQ_xo!ax!tKF@=$@bRn;dt;Q%E&y|J_wQpBfyaoE2yeusFc8~@tVYN z{_b5mTY(>GRqkj;y&}RHFnnmv!RsVJr-vI76p5&^z9#JyF2Ku1&di&`SNq@Y?!26Q zv-PjZ;nBg)-q*7l#nYlt-HT72{aD6DUl+-Uqu1x*1MZQ-$|^;O^popFy0h@(`2}o< zdzXL+t&|5-KVd4h@Jc71le9J}ONh}R3kweU^vRP^JpcKZEBE%x5p0J~7tbG6%l>Ql z^2?XwuXpwyjSAXZha9md>z2nhcW&9otx-1!|unU$Bktnke@U@n=bkq)~B!y zbDI&*f#CuC_r(b)f1>yYzj7PS?WM*$;f(djE0|kH91zU7>_1DW-&sO^T?ezh7k0OU zxu{`wby8cW7}7~yM92KmCF_E#y^nVC+RF2UxtvLxc=4>KWju@jm0=2z6{@3K?_-L!br*+r? z;WJ(Px-j5@N1C!_$#S?pg8?C=LA%jBO0cw49}G}r?~M;C7+Oaj8VuF)*M&rTd#7$l z98Y^dRY0^3JR~5lS3e*@)!s*~6Esz`wc3to8+1UhR4X5lJ{F|GH(`_p6!kV36|r7> z3?fG(u)bJFNRFsNH$w$V>#&0YrCR#}JDxMG^!jWYk*t*x{__mq-e6N~!IKL@7_6_~ z51grkrFGchfwR!b@}xlL30)gL)KEiEF^a-*jc{^ zS!ZUmkXY!La*s=LB1wYnSKwCf4w7kbQR}F~!pPjhM3k+Mdt3~eIYV7$g2&7`_Z&fnG`%sZ5swIS2qthW;~jgGz*IIRN@2%N_12jn(u@BH2gnzB87 zjY`{?145--_&gwY^|W6XR-p6>OM>-WQ5}WQ*5j^b3)eWX0PBd=@lErmb=(2rb$plo zqom~Wcx_@1-NTH7Hk@?`lzAOhz)*M!MCpvx<~rjuqhYs>J1~51Rj~!LV7_T)*9cPb zA~8+i+7Kx*m6PU4qu-eNNSN%yL{0szb=ZMnbejUlyQ;L8)0(@&=gC*ZTpK~eX+6Ni}iT#-GzIHnXZpsghq1D9Y0)7 zfA@^#NSn6~xS+LURhnZ1OLAbN_HmMv|Rg^4K0aD0GO;K&^ zc%=UQ@5$EDiQM%R6@8PZv9gv?2XtrDOP@!qZ1;TIL0I{9u9Kvcs-%UEoLiE# zQy~W>IWxQ$GRNDK!=3-FGc#HT9vC>)>KB-niW{*mc%m{kTCACt&{kJiZ8E@43PwT# zVc82F6b9q{?a8;}z1KT?U)S-0wkZY&)D1cY6!HY~N!#cJo^WprwN^-DEtcL2N~o?D z%r%*N<9}8#wGKT@tKE`etjLa)iG=d)hB-L2RTp3t|aLAuuO1mh86Nn83QHUNv@o|KOWx#JqL%VIG`< zgaJAF!2ID+65Y{$N#Ku-ZvdazITbP%^&V0 z>&wyJ@$T*>00z7LqK0kBvbMvoYs+qSgX{j=j4FPkEPjuvjkb%rDE7Q4jIawERo?Hm zFcg$D$ArrYTf}>WO-DPa*vlfzn@E&Tt*LgbjcT9 ze+K^l$3sbaLS10lNjT+jroGitTCnt-Ps()7--Uzsdi<(Zv|0xp7R%tu=Q#w+02fGC zMP-+L`a1g^m0`g|8&V)fT0u-?0@c+doRrwzs}Dkxox{og@xfv3eQXSAZVP915TU|=xapkleW++Qnh z*C4eej#}z0Pgz9nO(5P2o}(6q5XtJ7iWq{ZU#Q}J_5Q1d0@*%IpC^o1u(7Q6x`_dh zNq9ecQqH;AoU{XR{p))od5?=Zn^Tovfp0y-0@Kr3;df5qtX;U%M=$>JJ^9PCr}*s` zJr~)xo@Ipqtnh|<-Z|FJG%+~}7IFp%5^$B1%vH8a!-^dul}|*g{p0e0Yg>L@$meMzsI-O z-8*TUBVcFcd#cKCDPR|R8HC8nM~=bCxLT(eB3w;6=HZg-f-5Ku>Ksw9i_{Rz zj|Wp0OA-g7P4qoN+GUY}v^-wKxISjqnLII7Ky+OghPfV4~~$ zN}yg2y^v?%Z7*9Bi&L_`Va3D!O>sR(!bt{*RQUAIqAI_c{<&bt0` zxy2cqJJx%Ah6P%`f`2|cz4~e@I!2$lcOZ4~uRF6<;9~>VW>FC;05YP2QX+#G%Sd^FzQZmuQZ*X{}hoL%qd=bxV~gtGnsVe;ne2Ml@K zzRzWFq8M;<6#8v*^CZI_bzFD*l0X0ahq|%W?_bl6{mqrpyIdsiq^X_B+dVF`ZU~%o zV|EiRuP#o`-cI-XQPG%obaFPr(&(e=0v=^|a+>0!DH4nJw!9YrfQ3x=TQf9wD+=ip zTY{96bQ3iI%h~yJ(huySZs;}M8`Gudi{xUdGtg^w;ftlBzPb7QIazSDmOIBC=W5Y5 zw(r@LK{m=gFJ#cp-qFF`$%yS!PN#lY$G!W`6)$S;xXf;T{C3CB+;QCNk8qmY1^nD{ z57b>VE?V$!-+%J`J!8StC90AV%u%aB!MDO#Ye2cj5=1J?J{H5#WNUZl>%H;oy1G%@ z*u%2=8U)N6eV4Fjcy@1nV7l@OR4mENomQ4o!MQNR2dA@0(c`SAe--lg%g_S? zXJ-8i-E9Fb^{YDYvo5p<+|im_xX-eeT9S~hm65rmOh~GagLH5F&t@I-)`16vRb%yw zkOJKvJ6W`*#DloVN+?6H&c4-2Gp~}dLMEM@F}`88t$)k(zSY=90@w7oZ%iwZ%PI4xKG6s}6<9ggmhp#3_`;+6H3aQqChgE>9LBMTL z^fJoVTZU_6BsmYXY!kTW8BL1?>D8v^Xs!y~Q5NlM|D$#C2FcYTyNJ$nYs{<(I z|I94so*|SVRr1(bLj_`tVm_0UlZ=K(nnUL@YL!fDq<~D5=UT?E1@vqJ$&dtfGq2@N z$=Ok0&rtI^azirfE+1tg^7nws#Z*~1-L^nrIM{I2#e(dwBWf0t3>>)3xWB`v~oM5Lv z-4}2C`_(@tJA1F{y!X}#1_*tFiUn_g*7rVvW#d&2AqGiRvO$`V^s>=nvR8sn@}f3EEPFO04qqDf=e_ct4W_4<^RXtllHc8EcsUk{;=2tj@|c> zbsQ)s4EQ;Lt-QAnK|u5=aYJ$Rctp{^-|ji6Aw{}pMwDh`IY4Yn@H9-3TwN$i$etIWM>y!8@#9aR^Nxf%*Cq0-|&GWa0&&(PC}twOpPQY zIAX!ZW7;}oxiM{1u&%F7K3~>D7Lq_mBzUTo4|UcZqegRNfwUSZZ4J@F2}3N!INlDn z#{bMMm-W4G3g);{-^#TgT4uS= zmTtA0&d;*-Wmb02dXatk^7gx0mF|=zpIj)j$R~jrW7Wm{i;ms5lF6gnIhBP=y8GfU z{-=)*9&8B7q7UF%@LUDMLP%l=l8%XJW7Yk|;wyhYZXdC-s^&hLgzXDQ+*7Bo<6<~y z&0Vtg+)K~aYWIPqeLJ|97xifX*Wr+MYmwK6j_nG8b}Dp0w%hmlvx5Gtpg$| zwer2ml*I+WA>!YAy#*4+2#h%J!c(mw6Y=WI23d&&?9g`d^yIssDktww{;`>8kpev` z`ZU&mn@a!npLHJZLyH$K%b$j#n88Q{W)})M34^7;VbEvROQvF#~_IpZna*_>)M`&<(G7?`PTeWHl(k0b_(u@j`z*tZ__3@p{7fu z=e}ja`Qr7fbM*Q&xIFH@3`N5BZH3Sl=L1=4vHDSS0i@gT%Mq{6WB;*lMwhc|wm}(+nNSbmD1Oe82611_09H5|sm4XPd;AE<{4Fu}# zhz&`TfJa2qM&(D6v}uGja4{rh4F$$(>73Wji&#VHjF1j1?wNzOtvW7tv)&fONzfyr z?WV4$y+lr9ZVM?x5*f!1xf~+vV2lVEj+F}fgmH#kFs0jiRh#`ZWO5Sp7>V45ylI?m zp<_t$0OqGL$v5=XT~79uGD zwn5T(Y+-P6yz;_h*Ve(l8Liw5S|x#xh``I$Vr>o|T!0J8?o85L6}gFDrk~ou&yW;{ z9wVZ$2{r@{`bA3+41Ny~CoY(XtjmPgn>kNOpd+Gmx1*d!SA~foX=*9uf>1!Yhk`q2 zh<1QG#38px`L?zEG3&NyxLZ**33fzOEf=07XBtx*Bn(N=bcS?mf^O2N>p>JL&?6#h z8&j%BGWoqzwTfK*w4R$7tm+cFvWP+v3`3&nMN-^=VE) z-c)(cSIfFt zHp|a~^z`}SqL4Y+)Ms;NA{H0dS@?BkonD`vh3B5f=hl}t2*_o&I(J#wRJrb+JekE0 zR+Az><7&D(Z+>TWu2$K(`YSBbg_Xs2+r`AK@(QQ~SDcyn{wo&*j4R>BhgJ6B`~24| ztfhc>>C9Bks;|HK`Q0z?f6Vgm$>M6dbT6`3c9xm^;!>H_>sL1XuV4QfnZ&K!Vp%4H zy^O!M1&J!Dqw|H0f)PB+jGN7t;py<^Z=Rv@=gXicil0FxkRrcCF8oW)f{FOevsHfi zY(xK@-)@P61}jERIo<3#=F)_JW=j{)68`?TGN!vaV>W$_!An41A^^nKnV&9} ztL(2p<-o^r_2KhZFXK122F)!G8VZQlW8MHDL4SV#_T=5<^nF?To0t%XHjhFSEQyjW z`wWDG95RV0iMgeKQ9-f8f^$j*k&589vv!LH=e5t30$JLId+zH*>p3FbTarf;$YI=|Rt5G4ptLOIhQY{^zOB z(eBK|y5QiCulIra_xBj^4OvwK^miaYFy`{>u5)x_7Wnn`Wq!F8CGV%BATrbnORZNi zH7{^79S(D9}xVFGr2JnD+%(s3Pn9(83&)u*Jfuj8DN?cH{F)0byQ z;s1v*wGO)s&6)QxEw~ue{^oS@)5)8+zx8tfoFd^IG8*h32pD1rdO)eQfH9+pZQEUB zFEb}$?`7sdtl$55GThvomw*3b#N6Dv50R(R7$KaXjuJ{uY|ZREHx5YZR0ngvIheN2 ziA(_>x2e(G(Q)|hX;~USOaq53Y^G+jti)n} z9}08~4?8=~D4*UJ>xvtySf*?iQ^vdsUUK$%wqCBomV(h$9QHl^4U6CJ1mkwXVV#u~ zKp5W2P$*7q*^9I^<=VgjXg{2yb}?VJ2Sjj_+u!~8uMUqM*h}LV>kcac2f&%)?6-%* z;emdYtsaL2l;%XU-_&=5aT^dZaH3W1$ zFC+!~psD{nyNUIWfsbqJzp=;TaNGkL|3gOj?|M5iT#*0Xj%d7Yk2iAJZhl90bv`xc z;j{%SK6**fd5HNOFS0%+J~?0(FDE9StuN;7O<9Z&f|^a|Zk|7sRUC|}{VNIVGHWz3 zZvzYp1PWkHzrHqr+gRxGz*>r{>q*JLU5sf&55U{%F5c@BS4z!5F#M@B!Ax~R8bgA3 z#@28kYzOPaw3Q3hQ~7#zH+TBrrCnEPk`67jl_t01 z4|UCE>J4KPDYcP!YeSy}%bhQq@2ICge%0Lm!kUy&ZkBMD8*48hl~iM3fK?oO8D8bR zrVv^kdueni+Xz4HxLzsPn^BF$-K|zj_dMGavpn9+ss<*GbLx8DZAXL-?sXlxyy=PN zXnk<2^=09OmFcLv7desTGCN&3vzjDVW0WR5vmD#DZQHhObH}#r*|BZzc*nMF+x9$n z-|zmZRG+R+x|5ufj=rUTlA#%mF5~t=HHqxDVm7AU@*-(>XH};A?DO&s!c7KNk8vD- zeRMv!9^^1m44iZRwGUvlZUAO0t%S}NHt)LV!%y3}A@1~H+R>8aZrqBBZ4L#x6BF> zF*@Y#;koEiV^dGM%t4VkaR8~1%gMl#mg-?kr-*rE&gxL+*^^x#yiDhqm&2Mj28CGZ zR~Hi3riK|JuJ*(OS-ON$O5Qh|szM+s0hlDLGg!q-Bt(L&aDSwSo(J}Im-cvBt{uqJ zkK6=^Smu+U%b>ePZ??HkMe_(Ogltb&55o#ed)x-)Yk&&9KT9>tg@E5Di@z@hnT4&|=HT}%i@y4qc!NZ;7K7U7 z&-ird5^yEj)pv9+R6Qd>{Xo4<4z2^1(qY7KEIE98>Vm3z)SFbZeq2xE#b0kfULHyF zTYsO=`UJ6ZHUswAL;Sg!n4K^~``+WY*}6wJ_tIchB^S9$NRxJZrAgkN@+%`glhCPuMX#l9eG27>EE)Q4YlMS@%g%x-DL)j zRKv7)lHk^8=J=hPyzxW+iC1;Fa`EEruT3Th*y{RTc}n2;G0#~eDya2+6~l=*(BMGP zA1{2pI(nm(VEYd2^`KbNXPoYGq)zOtm*RaRHY{I`C!f<(+al}V1Vy|x&5zidB)e-d z8oCkhH3NZK`+Tf&P@rIC!(1#U_#tKAZ!sd1tH3>Ib0_aqbr=!p07C0=8O}Jp7PL_wWCvjfPpTMAH0dz48g05`FRoGQ1x(vZjYx*NIp!4ALg9@@dnxKZg zaM&4c*oew!P}w?m6*SM8_67|fJN3_%S^s?wQb|>&Y;O}hI8@C5Jb&ufrS+V@c#2kTbIpz> zQG+Yam|M)aNAaLatYhT!STrG-#2J`^H_}L=HnLMqo$LJ8j;|cA}x&r zxRD)CSy)gFNN^KtX%(VACb{_fQyaVAP83i?mf zS=&`}7rzEX``aPNGB!uf`uNv~WJ_OhfPd*G4Qx{QF)*`vZtSs}hlb|XMgd0bIM%`TN{r7SHOKef4*@QBI9Z`Lh zgbLSXV++IAM97Ox19E6J76r7oFP!S_9yF_h<>F7gT~hnnMx-%B(w`e@J5mevap_OFD9u1U32r&p85o`r)kHV#DPiM|W z1?7IiNrk2+W9O&mAIP8X&ap$Rp0U(p>`KWE{gs^nC)ppq__j{Hc5^04oXqR}D6S{g z#hD|_hdYznN!sC&*o5WiQmV_Y|bPbu;V4g zP^iaUk;~j8(!=d0k;N|-leKt}A14gY!J|ne{`b_>gL3c>i(pZ zw(D8}8)&gDoSME5CYD4t%G0Wvd0Ty(SvEW~IC=Oy*VuC%!lUyMz;G+x4ov)u+PKXF zB2gocz7{bCsEG3wy~}?me0yslus}=y+7v^RiQq3h4G!j90T|!I#{Vu7aiK=%` zRyAr{OvAaJ3D;y~R@1yb;j%f7x0cKAOyhs4L;3!ro#3~CeZ0amTl8)Zr=g?ekf@A7 zCF=G$l($DeOi}$Ttr)aTfaSBeYxNe=vo5pp<_s|1X{z^bI$Y$s>PLvPq>fO~mW)+K zF{O-c%yXiF7vJi9*)Z++ZJYt7=b|3#gn_8=B?r&D-*`}Y?DQM{^XaHVcVvCzh?9GDRnuKZS}|yPIYU?l|~i}pUZ*q_K%{g zabvmz++m?aF9KIZc9BMGC~J3RY|CH8L8rOxBhp3(R0NiFJ9ncZxN#E1vL2m^W00pT z?7AnLon7e~3F6Fmxf>?i)Qf01Gf0hnxK|Ai7&bKB#2Ly+Tg3>Ed}*DPzS3jzvQz@x z)W1hYNR;C4OAx#F^NI5(4+IHiFc!0E+y4C<1&Wj(+^#kj~=HuG%z!R4qS9D7=NdKjP z3CG(XHZ;R>*c_F~p7!CXy7%id+)5MHtwZ`$t`ARsLLoC3Gd+*J=dI+A>r2Cg7n9t~ z{AEDZaC6@sVu$vq8XmgCZ^LdlLVN~(*CkSTxFD8R<6|@&+XfBcE)hgGU3VC&Xyv#t z*8YmBOGMQI+BzJb=`Y8}l8p`-QfphlCVyJI@MFNRf1)Ns_1^A>{LAjJn@y&F>gFZm zAA~kaD;FP;34yL*3vZ4+^+e?TU{1Wv45uN!%Q+K^0*iiu{J{F!RI)OT8G1vyh!SnW~E!9@vs z>-*@MA=QWj{us8C4WvD2kbNp;$XIg)A(=tqCi={xkJF(eOy$@Wa$o8_Qll6S6w0`g z+;7a39}3XX(wA5AyI(hH)ocChe?~L~i%IjC6) zJpn!s_Wyp2n}~u0>0UCbWd+{mg=V|%%0zIeQCN+Ujur40KvJd6?hwFs;-4m)Q7jZt z%{p!+eJe#^CM*?K73C~s!x4vCqj^wB%)rp-DI^!{&I>9~mA)?T(?;&ZiRvXwYiT;?_Uoos42gtZ1zq9>v}Bh%nCdNR%QjxoBPre&4@swYcZqy_ ze0b%`uZ!fN6PNB)3WH4j(kn}JyYSpU)8CMJXyV3-6SP`>=KIv7idDC#KOS1j)^bg=}P9k&ER)NI3%$<;u`PAUp%)h*BTQ zo=F-PAVJAUBC-TEh3E&vykvb%N?A~8&Ve*uYOxUaU%3Kd zB=sXjQ0IPLxm0ysE5ID>6LCO$5BSX}KxI?l`!|Amo$hh>?PYJ9wVF~mw6R-8k&6i*m1%pVgnT$`Xb9BvQ1|u@Suc zS*-vy%6XB;vNqz^dLd~Tx7?lCJQ+QzKX4YveI5|XWyu%$MUG+nFf>5z2#MVcW|hs_ za}so0`-R*OG{i>eeGlyPd?~CpMfz#$=VWoqarm4F? zf(`OpacJSNo7F978Yiz@H>cXc3T7n2l)?ocOAD4(fn zCqEtbC`cj54N+tYJm$KO{m~6C?;1yCaPC4@3%Rm!DsxlS?DOAkTk{YSqR^)*!b6#2fkOjv=OuDL!*fUt!broV+pU>792SlNN6nd%zQSa<@MJ2Y>e&aTf&Kn3vf2}yLv*pT9b;u;vG9DZeQd-kkL;^`LaIs0HIUA8J zIwv0kedXJE=M*;HrPy35dRlf`;=j7$ui1X{E^cqb6otaHOE;Cpcdk8W&`Cf9X{prw z`=G@#9W?opZA4~n(ja|KZ_s4D=lx;JpyA7JC0(c`osxw^9q(Z0F%GmIiliWhNGfBd zz+G!cF?9jdQB3s@Jy&GjQp?_UhQXHE!Xnd^zpSTf)OilKKsf%sqz7Je1G?I{tV?tx z1u`Hl0cy`XP+w}J3(}fs@z>W5z9_$xQ39evGghbesK>zpW&z#(NU%5GFWMr@Qlh9e zlm2B|o*DZG18W+MwBZ}N$`%yyxO!h6`?^o4EtOQAbPy+)>H0#+gR)$oS+)iP0xL2o zSf?|ORRQHv&V8el&huNudu?zSQ)|HAoqXaz&EM*wjXd03!w`DR^A8{iytiZ)_ z1$c2-vHh2Ob%kFz*?(di7NGnT zo3&VDY?fXR;r{kZIQ{Bi$}v7qVUPif`8E*3u?2;O4cgyWu|i&E*rnPD?E*#Lm}qOt z6pvy4c5frSXoh8;U?Ozgk?$}$NFfay7{X8j0bgRWC+w$P3v_;TM?FJ`l*i?to63p3 zvD;|ku_t-Ysq?Z%eD$SZ^y&aw(K9~08&OFA= z%z9V@ez&%Ku{&9@k@%$u+HzwSirF$d)Mizpcv4i{srHayvW$_$dG zr*fiHgO4InJF*hOA2OSqMjGWe5=3U1bp^KKQ`D~6rp?g$)EB$&Hb1uvog1jLeJHV( zYq18pWLNipWhwWlMy#EbA_7TDUcAM_btn)dYVuXSV@p zAkFF%!Va9#^5yaOmk!V#I^w3DF38e^6D??_GpTiCqIh7i*d`dOjp=3CK=}IFbm2zZ z37w36a!x#Ji%_y9_^=eDzb#{EjasbE!MH)NwB_ z5xi_JHZ)knXjVA1ID?_mvWc-tCiWWgn+fbR<#n7UH$vvE)}PZ|)Cp+2K`-zNxo7X# z51h6eOGe??N%8g&D8ns+w5$?y^0qmxsJJ1nDksNI8<0b| zAhkdd%z>U@rKW9c%TPZ(eYU&*)X!eO?T2j3_88S6hyo*a<00QFn!#Lpje>W~zbX}Al2)~>d=J8Cya{Abf z%=QC&KX|1~&2BM1kmbcv)(KxU z?pA(~{VBfZ>U85_H{^1AWpO(se220UxZTi9m3vJXL`3^ejxC#Q5#;0YS+)*@&F>~K z%nW-dziS%zOes;ssGz@77FNS4y&>AksF<~^o7FBlA0K^n$iMw|IfGkZ@BshU&=ffe ztIZF;2%+mrqMt|5s3i5iyFOjQAJu14wF{w*M-_b|iDO1x6qoh!6nWdIl~}$r+-VEG z)l{HyHvc^noe9*cKuP;O^hq3rNhZ(WCv~dL7#zN$O#V?QqlUJ9^anHf?QbjTC$V%I z+3|hGCz4Qe1*+LBPhnp~K|UPc4a(_9B2-7bORjBkz|{esxzu-Q={unmq_+Nv)Atu5 zNj&Ch0GcDq6reRJ?|ZSD&>;Mf5%9LZy?Hj80Qh;Cp0siR+}$a@9q;c~Bi1iK9s%{8 z4K7tiCEZRfzunzEzwY>>(BaO`#LC3ydr6j#>FU2s2k6HM@bCJZr^Kp8e-eImpeyJ6 z7}`8Sqr9@UYh}DYCJ^>)V-na4WF<^Da-QLd3j)4Wsn$nf(@oW|c=GYf82NoU2=u?$ zo1TwWvOO_!)PrT*FYMhdrhFM682q$bf5JY>T}mx$dwJ!kr>}T+#QAlUWcoTlr54rwsjk+C7#<`IN{LQR|qyzqH9BJAZ-TmOD74&n@ zP)S>db7#wLqj_2u&xw~`1?q+kKh#jGX-KdDAp|>xBdAZce66vspXr$u zfYLZ!qTQQ6BOx#(r}+5x{Bf=A=SOr+#m1T$2)Zi230X=l(Bh?%Fa2T7gXc@&fAy8a zU?;Fldt4VL@;gR$O(i|OkX#6w%PWt896hF7=(vxztP=b?(^CG#ltEbkBchC)Rl5hP|KSCO6IT=5zof@@C04^G`yVty`FH8V!610+^xhC?ijni!d( ziV$g(Y=TzZefXdkc5`;WSa~m%@5^%U%fjDr6~;1?%HD`3LQMt7DK@Hx6yOWJuSD)M zI-&DuD;Qe3lI9Opyd>#^vN9hUc+4DM8&_B+B?=GMR)=QcPY8V&j|GOkkRoFP9ouNm zd>>OE_!q||R9-NGJ;QL$&?W`FT4SAAwUQ*kfSOZeeXpeQq^#S&k$G`PQnK**^e0h1 zkhfvMGnZ7?au9OPXnYbG3PfB}g!qd-+c*W%1B2Q9Q-wQaKZ2;2I}=svMK-VtG;K z#kDNrT9*IVhazt^yc5s6z24Y(_D?ksb8~#sEhsa=yX2S0gHU>(L)sg%lx^ajj>l>6 z<7lDxtT{4P*p`zYXECqNr0=WIbk@w|vwnWWmlI}5d3b;1a;D#XeoB?$z~VD$lh3Zg zsTR6Nx9Zoh@F!`*7{ag#_dRR*3XsWp2K|;wj$a4D_7>nIhj9&vRpDC$v?aN({}5g^ zC>sak*Zgocf9!5d^!l$GWorPIy;_*x>KOyd?pF%zjlLbEr!C06mYjutXQ_eM$&sB z9w*+C`~(jS&?6-a@AJ?247;T(^&R4?shr|b93n-ksVF3^OFe0*YNAbC&^n2uYl>o> zQ|7~|oX|@vmThtLO+V>J6|gV7;=Ox}*MFg#Cl||ci0&6eJ7*T_*+&LfQ7z(`7q=cN z*{E<$Ds$M3A(T>tX>w02hf}e?zb6;_c6^K65^hh?IkS?Z$I(t!^xRIYsua%_ziS^w zkTh8dNLwoO*gp35h;77D+C#ACrxqfq9f|{xzAtivsnBqsYOx^PWi)x zA_~sJVj%}ySRjr?s*(T7uh;txXW@omO-H{9{im<}oJ*EY-pnLw7z?G;Yydv-ro$u( zjfpvuWY4N0{5O{J^yTA7PBP(c@B99DHlko#K}98y6!xg_ObHSmabcxTst`g8@yN)8 ztAf)d+-w%h6jcfebFZW}5-`d%bdv@MC+(mDf(iXH2zXGKL(grXTe34L5_lT)AiH^v zZD_+0^MeL&JNG3@?weF{4z^JHzyeTM6nOAR6w8$TOx8-EzPi0_n%M#0n()nNUZ=hc z`)2}fYTjAMV$wB70>mdG5SZqb;L>M+$PmQmEXRU}Ll3%&-{W33B;b3mAMkYx=+IUC z@(Vcazx98;$c9wBZ4DH?V5ff%VD)#*n^SnSvIiJB0T@H9tN@!*bJT`NrddkmF0~19 z(WX{V7Kx&DcT!WyKXosv0nO<|HtkXU|%%YNiL_y7d^5|f9&0Z4F7Uw)3XF zlEq-ntCw?&&>t8DUV5%t$E{JCv!#l>V2CfjG|J1T;lB zb**hwEegBMRWX|>hVDB4+L$H2sa1&D1D7V%?$r|Jg6R4&PMfM$n{vS$VSBxCEY6FW z3f6&c)EgTQ^r3#sGSFMscVI<4)vZ`JJLcQ6A+%1$qkW!9nw)%DMcNH%diailIweEb zI!2Q+XYP)W<1pV#5*7|c`7$Jb@y~?+iizQ%R2u%{kNsi7hP*KLXhQzu#Zk{CJl;5| zsqOl(D*qOM!g>fp_Jf*Skv(SchV7{Ntkm04J$~5X{k9)nYbcjCGEZD!ju;MRvVU%d zN%s+apz=;01;KQu<8=0NUT>waUvP@*8R=?ZEQS8Ouz}q)Yr}yE+WgdJNBlb9>uCzH zmj9}!I}qjcVtWHHNnv~oV(*6lPBj)7J^^s|z2R?$qF?pIKdVRp+eknQ>3wfckEfv> zNf!KluRGVz>e476t1cSw{PP^sMo+?uJWW*?s7=*8$6>5QE=63~-cKUode|;e3%n^| zU;~o^MitLKw15)FG$KYMLI%lJCS_xF6kVWxYX}&Pjb%NKvBQX9&v@$+4L#w2Wxr zz$4=w^!grKbN|4uzx+7F-u(f*A_2^K&wJhi%3)_iAm8?Y1v~?HNfGa^-(#MRV3#^= z-&^sTKi!#b`}sY!C~pL7aRAptUkQkZy>?^{qkot+qCdF~BPkY4uyq6V<+-lsYl+~j zPZyj&(|PBAh_N>S94g63Sya|QoEXAp#3`Ze)dyHs&W0%YWHT_SEds?%_w8Z3gYoE{a%a`I2a1KoH4 zEH;tV{TCPv#liaPT{UM`ge{G&)OV|A$F6JqACHy=zp_fhI2+6 z4U0DB;TMABUXH~%^u=m`V~#R+>n6s89252*KlX5sbP|B`49^&9(&76q(b$5~RNA?= zBVdy&j{4`w_~&Tm(W^HF6h90d9mDQ#4JJeXRxp7j^+;;mw`o-r(n1dV`1Jl1@0NMP%%$^1B*zgEAq)3Qy{Jh%2v*0iSQ*iupk0LT^-DwB8S!)Jl`5Kaj*go zqiQtRi*ANN0Lf4T^FBL7EEN0`K3HXtDs*1v-XM@;q;#N5-F{I#>fHxGvHvzO0Y{V_ z>LKAMxUWFz(vz7>FLce3O6>=c$?KV-W-8iuW70LC076ep{-B7pz;HCO+CA|Ws5gji zdV;^G79ISE0K{9wVX#A}2w@JsIy;=GrcQM#4sj{4yuzCAyOz_YbI6T~zPEG5Ef5wg z^l(gK43reEYMk`~ER=%)2IS@5fsT6W&bUu?i7oGfU42#rpOl5N=2BI>Q0WWVPZ-`a zI%`CgACo=wh%>Ax+~zvF=%hD5%0U@4ugKy~tv=t)o0_&tm=IhFvj!6|mZ(%fP8#GI zxD&e!4lbMnB_1B5VwMOCCSaY1_`e9(NXx*8-2xz~b6zx@q9v=89$?YWGg3BDAYf*h z8e?%z3N|T7F3>FyLN1doJ`q1P98SbLFY^G!7Rx>*RbQ+-H1?2kBdotZ5N}n@I%C_4 zpt0fsr4)UOc8NNbzzQ8ByNcByMf1@I4pzn@#quu^z>3POo;2tEFp*+FJzWe`UC4+1 z1NZ;c%a^B9ov}CgZ=)Lw#-tQTWvB`I4%x`p zr)XCqhdXG5SrGu$zy^d*xOV}hB$4=v1jj`l(max@g!*4qwtWJ23->|TcWA6}<=#GP z!_C~k!2ezS=*<2_Vk0QA$OjrP{?6Ib7YFg{-EY@^V;&9S%#&%b{}#k)R;*Q#`|k{= z*z$B*uso2MK?_XOx}Qm=fSk4X6Jg;|MF&MZ1JQ|%U;OZ0Q5qo0$K-3D;GdNLT7NYM z5sZvu-@%wpscW~LS%gyod3fz^fK;^u=Q^%|R6Y0T$54lFQwoS7UFRF_y7WP1NmzlP zD&L8+punlJF*;(!ALfM41$XCxiuK}~I!!`Ud?4ajxmxv)tc%l|r=u`~6f5P7Y9nKM z#fM8r?}1C~iNz;+7KQ6K6T9QmRsl^Dr8?;g$8th7H47IFEm8^h@eRUegvx?A{zyd) z2Hu86)4{H?K{dIDY^B=N-eY7YBH3Gq92pNfQ%$mviK4Jg-G@>wpeRCvk+YC#E)s2R zz&|Ma<5j%4s8)eO(z54G{Me+nN(eMWL0~JPQ{vPcLeLFKKYA;>Fy~Yl!uxR?Rh&jf z3XIrt0^upJ_q_ZqRbPC@6+$V$1g5eV;@zU#;EwF?YYLAYKd&_RDh`C?2fykTuJyBZ zC(CkG&HiI&vpJDpnK1!~>TdYThk}ONJbetrGYd2!8P{QfU3xAEI-rQKJf>pbKLhN=FTa zH*%+}S|Y0fY#Il!@XFg(R9yfte}9IS_}UDDGD9Up^~P4ehdTA0YP{nQ?ekAxId=T(J;F zu&8ML`&ct1v0|u9lZ{>;fno3A|#F{*G4xT6&JzqZ!VlaE)U*B zv&L|7(QqOCa6znafj-e_$Ds!rm@)sR!idS)WnjvHO_>FcL*yjILaUsloEZd@K12xw zRuB;f(L%~ZU0h*L_s!1IQM0>%+y5pv-Ifn(4!<5Ck*&KcwewkUys zIw!H|GL?mjA|akbnR%e{yf5$%FR=m}(-wk?UB!(ngAQT1}+fF{o=fxOzvYCvbX;q6rDID?0B>~MxElm=O+TiO0EOOsfu&P?DS~?P3xiEk{@|Z!? zN2gdsCh6QYCPg>eL?>-ZB_5QZ-QACY+N@@lGeiO<8G{lCA}wOA#GlbEjYfgRWXKek zPexaFhn=LwrM|*K4+GReW>m|D;qMxN$M@Y&-#F&GZTLq}wUGX07vpo+sB!p5cPQe2hJyq{>so;B zRj;>f*a*0^>xG;xU}j0G;u47vzUKw zS9e*3Y_B%iS9>AO6-~j{U#~3z50mhao2#FZHNW?`E39+QPuX`8GGX94KwqrrOlTQB~#TA z3DtM#sOhQc1s#j_*1`r<(;f8M{Xc#8Yi-+Z(6>7bHSQ~#zxK(= zWyKq_Um4f)QoA@gzwgfddJWcmzI-iyhD9wI^4ry1KQ5-fCdF6nx9NLyKinqzi!tkR zY3X`Y^i+K7uN2Nhq9>}VMiZ*5tMmE19zJmnNqWca8g13L9SkZWWYf7bs|WrB>!ssI z#oWo@rTNYRcRBIrbohA{9AeOVJ1iO&q}TrY>)rPhVLHcv@a7<=!QRhA#d#t;E}O&Q zUk7jJqw^7;+v$EgzSikr8-bv3z3W%~cnOJciqGwR^;S=*aFWmCcXHM7hzY}B@YnbF zqGf=!8vlB;^?I#wecR_%c9I}PGcd0XWZS@Q_29UUfO?XZqV2|Y_mlQBpyiBB`|$qv zXgK<(Wmi-jPkM*(aX)wB=2KlBuBQ34#}b9F^I`sHZ}inVBgDj7JB0@`zW<}%N?D8l za$~&yOY0UA>)x15!uw3Vg+shx&q_e)DoQ;)H06q4m-W*775(MI@0M$8U(lt8O$^cm zO5dy|_WNHpXQ@}@JC)L>i=(MKeEGk#^cr}}hVK~*CP5M0694id2sYadriQrSccoXg zIdr8pA>sP%&%Ma6KBjd}pK(}x>bDvG_4#^ovfoHM_(Bt~tW^A1*|cm6!!#U|SEQ$2 zV|`D(>CvZs>0a8t^r0fP_BnqhrR`3CzmfA%^0iq!3m)WMq?KW~$)4YKSp8JaO}zC6 zr{TD+scQEjx6ItV(Fas|Yw74Ew)uFtwdm81#xT?GYGHA)T}Jq08!tu{#r)=N=Qa5F zXz3?q^m{Br^RSj#tth&XRV}2BPcMItj5DR|Zk;e)Xk*ZgVVDg>yG;lRn=+#irJVo#n^?2q@$h+4(tsKYIJpJtC)&CSIu>7K2{Dh0|#rTw7inE0k z$UabOcU-%3*tI6DiDJ}4Ykrp4KbWH=EnN%9U(z>Zsbl*22zHd0+h54gm=T}s-SPSO z_~YPBfmWL#{ny~ztF`knPJNfqs#v#MNv6GV#KH3=u4S^^Y_whRbd86B4IBF9nSChOfb(hYd_b}?QHf6cC%fW68kB`Rckl5L2eq`{bdq>xM z$m8jnz8G@0z57{D?JHv`Ms;RnHaNAN-D}g>l);`t#qhN#FgnQ9{>g2uZ zCMr8X>7@t1aqV&NHL`>7J&xD{5$22N;iv)8h4itTvXxeFV)~uvpjnNd^+GQHXzO8X zZ<{bQA68Z~f&W&IiI$!A?@@O{Fr%OY?~O_NOV8$u;(6WM>+!iCLR{y<$)M(_<<#RP zhBtky$;jJ)WPilytsYOKuGD|M8>lafzba$GAMWVSLAL z4Ze>@6#4UNUXE)!LlqV0g4J@=8$z|C>$TtS#<$a@qg7o!o^v*PIk^#!q7?CU?Q^y# zyq^rUvR?_kv%%+_7lpWfZ%S!9)D zXz>2!xJ7IGCTAo6T836i>NXvjPf($#m5$J{UbSf6%wX%-3~kft_cCV#$%P280-{q!V+y+^loQ!@AuGcpGVRIk?IRH#0|6=mdz$%+XLDjkcNwbP#r4 z&)E#G1(+kscW(T87+$_pn-$edU(oKPFl)Jk;wS4!`|&(Vdy~0Ts)t`R(eY2}2$!3l zfRAU;_ien^`3uu(E8ua<`?3jh{#7%mY+WjQGo$zEp9a`Z5a>YNRnV z*P`CJFwxrgbq;=YZx^O3+?+)vu1i``>(Jv^%@ zd|#(*E8~}f%Wb*&9kmE)m)B`I-M-~ENc-o}LtQ{h;E&|#lBvpL{BC-w+@toa+YGl` zAN$4g$)cW4t8b~_=qiJ~UPh-uk+T9}Ji~5tm;S+6(2iw1J2EF@shP~**2lUk z28ymXP8yr@y}vG7w}$o_xh)yh(#mhv1EfmJ8h8d|tK1vD z?tB-D4E?nNgF)?4TOHBuCre8;CA%rjJJe;sO|o6N41T@^rDzBN0L zJoQ*T{3okr^S6dp4MkA2=Fxf?Fd{RTE3>` z?RLNCe$ZBHzIc1xai(l32VTYBl#jwWj{W-&w z5+{6Wd)eb_ax?rWS4$3mo&9VpoYS7`Gpizql?vR zA#Jy%>xqAI+sWz#cIk7LVDr;tzlGOg*YI<{F#4&fx^l2Q)nNf)CHCF;x@6E0Ka0h9 zI4|8lqx+_%UXwAy(d;F|C7V#^RsPy>vys1kdei%6qZsy+fy;ky<$W`Pkk^I{iz0Mk zJeIHf<=hbAeIZpvzTQri%Kmq&GfdpMQ8PHM(NpgKs6h><- z!2GM3_HyE6s7%SwXW;(;YaHzADas7wqKNc=2HZgUKjA+=75@LnF!7LN2L7W)u3{{} zq?v&)<)bXXA!PCB7}zm?EX_{Q!z%RaZ`4W^kRcV07Jti~r23WjE>`g4@jHen*AI0k zwn;AMew-5i^_W;HH3#!9hRV5+C1HX$unyk7MXKgGl9p!9Ji3U+q5a^M zkThLmkh#|{u+LjBA}bGhpL45s_8r2FR@BjV)(8X>si$bha!+{OjMZJwD41{uEi-R= zAMS5Qk2wE(z+^vc?7OIe-S)&9B&Vr(gu`mjZ_LB1a}PM$v;_VG=YrmM`*+-EYhnnD zL!a31D;sX4Ryj7|+8K)Rue*#wJ$pK>!u_*va79~jb*j*xKngFNRBajbLKNvgVq-!Y z+~Mh9nGKh{<1Ju?2+GSvzeLqaxiF{_JgP?_3jcIXtb005f#o~>)r1^bWn-~NxAc`K zJ=EZ(Xt%yvs2cdYoVsj^%Y0=(2xPBr9#Un)RkEz$KB%DK%CoYJG^Uj4g^yT*(hK75>bn35R= zrjrgCnt_J7K@nO35?Tyupos2HJbYYJIp&2mR74CO0uX~N4Jk6-uxwx&cvh)dIGS0X zTX#^gec%m;#yTsj{74On>dI7C(N>rCdf5P->0G!*ytT5L&H#E88F!!yo+3yxCb|%F z%9u0>3aZ5phy^N|6P zML1JsjrcrbWD*8up=5Dsb>QJgp}+vLC^Kkb3bjhmA}PfhK;UB_!aE_`_TY0bRL-L& zfHoO0PdeKx{mtlOJZ~uWTz`jdb6!YeWZ)4|SpRg`Rs7V4cXDC0Ph%_bEak@J7rcb8 zuqRS*VFb7_?-HrrQd3liTr77@C#l@8Lcnj3Xy0CVT!U+Gg(;t&4Z;~n9Cmrl_Lo*SqF=Sp*9*5yq|CmZ_{1)w zOP|w06fXTqSr^}4qz!BGlO@eHj;h&!ec!#>wrZk~6ek`Y7@Ojpc(8PUp`BQRbVJg2 zi#Wqr>&?j!yJ)bPYtGoD9+m-l;~Tc$_38E5xrp~bF~U+*E_9L;x`h(A*}wYrJzvvP zXly2fCkjxgmHfyJFqO`V$pJhMEq)#bTovLc?d97;0Kj^BZ!MUV6d?evF`oR$!UQ3X zBU4}?OJPI>dzhUSQ*q@|gN81F;6_x!h^6u4FPW0zQ!1pJdx8bBks{l}G%0Ylpcv{Y zLCbkRl-d)(F#fF*Y0jSrly*h%;@4J3Yjo$RcG15fX6G~-so*XEZ!&@AIw zlq` zea_Cme+VLg-5bc`*;G z;0{sLQT!~Vn>jHD4@$?*N4=1_A;$<-U){}x^g(%E4PZNzDmXBGzgi}G4Qo!y7kEBr z@tPSM{w!-zK-C~w!SY*U=AvtO;A#QV9Zmr8UX$})pjHhjUj_&X{oWrUWx9T9 zwrS|(fkPp5Ds5vewU1U)JQfk5Bp&2~HPd7gPrYNaOd@gxWAhvgFQP-bavB*Tur7r+ zp(5b%eUh0)pu`#&E*Qt)zNXNUJ+ea&Aa?a-b`Jao>nu!bqCGa^1CYT-G;wD%@+Q9N z3A~8Oq_uN{mdZH3zl68nf-vA5>Of=9N(R7g7=Y;p{F?x-;MgmG&%ychC!kWt?88+a zk8~3-+4hYnp9E02mFQZBH=L^q(HLwrHu84^$E!uBWt|lj`0b9XVh7AI?X!?ZU)?Q1 z^;eGi*(_dFB9Rq*cwXm*uB$qWmS*ZvNtu|*P^<-Rv4O!29!kl99D1_0ioPvv5WeYK z|7?ETBo5t5oP^#{(%wOPPuYJMHM!b1^}92Ewq1B9WSh6JH(<+u-%DA;OcD`q^uctW zFAZ3>1O9JnMVWb6E(_PW`P@R?S#9yP#L@9cji;!x; z=1_4xFxTuhwKLNH2WLQ-zlA_+w3=1+VSCMWm*}*Y5X}^! z2R7T8(YJ5UK4ngjWYUjrtpVCUv1sz)c}N=PPovyN{HvWXx1k`-r8xsRQWBesfJ6v>_MKL9<(>F zszF_CIVb3t&to+nkGxyxv!buMd@HNwpIV_8Ta^m!t830| zE{k2RqB8f28Q47@RjYXq<;~7jYc-I|)pCtYRMFc~4&1}h{B0x%qQzpKXVuMi2nI5v zqQ>z>*D4N$9eQXrP-cGz-}2|ixLigF*yaILB!8aSxs>|MvW5gQ3x3EO3z8zghSwhe z#2|lP?_djkzFb{nLB+}yQR{Hw4FS%$O|z*LJC5$^iYskWmAz7wUlSVoRQ zd+AZA*ZH5vz(a|nllUKKQ3;RpKL+*xWSB_(haP#BHnOp#WD)8^P z_!#(q^IhrN;g8r-;|!z0@ZrG^W)_q1_e5KEvCY|A!eCU)67=;e#ZpiJM5XTTU0@>o z&>i{Hi?ZR*x3<2MeB+Dl`@Y@y%7^bC{;_4%v6ZdIH*P<>@ctM6ap=^p-TOX1@!35~ zKX~w&)6I_`Sh?=}3$2^m+SVRDy6?h;FVCL+{PgKhvnLA&KHO7QddKzG4lxx^%t*VT zvTWAHix-c!EhHd<>um*jg%^W9hPM-I6AXr!i@B4HMe`3!%d!k{@ynh~GsI)c4T()n zix)30E9sYEc&0dc?9DgdJU!+%Lv(ZMqlVaoJH|%EV_S-&6EbXTW3l=#B>1U!-yB?T z$b5Nn6N^6a#OUPY4Qt?gBbE&qx?=Refz5;C9?u+_mb0pPUHmpRkYramV806-oGSi|0<8 zJ7QE!QT&xN;+j*Ir;Bl;3Y$hO8yI^Ck~47sUo#3)M>V#_PM?+;T`*$R5@W*NgsDXT z)&avtY)_fe9u=FgXyga^Wo6rn+F}N+N^BaPbX`gPjR|+J8J$qGePDiHY;)YI0j*Jx zaBOo{QT&KenX8U3Xx!ds%j}`iP0x*Jt62GL(%{UJg1AvB1Bb;dPTUdS{P6Pa2~Um8 zFc{w)y(4kNb2~<7jEzfqENb_!8V^Sej$S)@)V32R3I^v_W@58Sh}`BmnFHg0g$Y8v zVeW%Ov;m8cuFJ|AoON-bn*7_ml{XoV+*&lXefjx{KKzP1Z~GVX(8N=N3mZNw*!A2a zqrVxFkr8zrc0BG+yRVRlm3O~s96IQsgyNj$zR{Z+ZfrQ1xx4_Y>latGA~wG%YVXNM zqpva0#w)S<`v2NoUw_TW^ds1?m=yzTNh@wiNo{|#&+MpQM-Pr$Yb1{xNtlr^>qz7B z<&BLe29^*jN0$(Bkih6E69-TU@zL^c5_XhCo#_LT<_>GdCiiK-B_VYHPyJzi+b5fn zDu&IOW5mYAvyIu)e&1)+?GRtai%-SG78e&|bkm?u`|r-+6WIMFiSa`Ul=#dI^>l8( zG3)K;y`q`X`N7?;f0xQ1Y1Cx8JVzHCYeD#U&RTZpU}UuUnrr zP|6?|KN;1U)4z3CdrM3_Ry`&u#nAVwM(jy^DIL>1CS`P=f^GZyZHygNUu4)_|9soe z(*4&&NeyG8tcjl(qW5RSafUW5{{P-x)A-&ulho%wd~9xh?);?O4TJuY{K$jt&C993 z_W$*q6&Gy{ci#EY!P44s*uCkq4Gq&~8gGv+iH#X`;|-7W`Acjff8qRjKCyo8lquMs z3a3nq8?}9B{r;W5-#_S?5fDprL&K7xZEXYS!GBvE)&9w+efk;3ZF}Kgbk@zh%*dPlNZG$+-UHxj;sDK8h&7SFukph zGAJdDyIw1Nc_v!;a@Vz5 zODNPT!J2@@Vz%fgRV$DJtpb8qIYt5m%W^nRA*m6qyl77 zkZGA>Se_+BiRA=EkZ@Aqc~%U9!CVQAkq#8JL`kYBvZ4q?K;fc7b28v*lBalC!6hj$ z3awigR9LGHEUZWX0hdIERXAB_twG8((|REWC%U|*giRgn~AfoBL@1sv36TBcc= zB2l-rK+}V&rRbR%Mdk&H#%UEwKGXyOXGK+^a86)oNg#u)6Rt8WdK6jU6ap?l3IRvJ z@ghg?qC`?6#0Ugh2*PE1uD1@+6i>jph$&-;GrpJXp!bfQkBs93{57X3ciM>^Ywuw zBo^f>(3C`|sw{DUVF-o*yevuzt8&3eN2oek9h_Mb1kcGTCkjwhC7J~AJw=4v4HF8kfDftlg(HRQ;ayk<_5gb_I;&<%9|x*G#@dn}E` zMry9eQco?_Y!cOMvP#V+lZ*Il_^OqHaY7a5)L|-+0cSDKmDa|1i*w^7UnM^=ABG_6HZMWTjlLo~?&pn(exdgqJ=e4s+Z zl(y*Q;)DLZ&AA>Tz&CMHNbq*0L|`;M!Fd2ZKoAqG)V9T*#_Nr8bvlVrA(Tc~aD{Vf zC5G`+E@uRJn){}Cv9Yg5x0h{Z#3`h6n0UjW zO#)-YE%rFKih*C}anm?KyxhhERRlRDMDT#4IX57^2K;s9tYMbWCZTd&H=T%2-LbvA z81ygvpiPfVcn9_opiXgT!Mjt=>kx7ea>prJc~lH~^tMIYmb+kLD1ackLB;?h);Sg> zH^9)*hPFcwAi#NZ-Nr}=2xX#2Z4^Xn;7WQ3b`XLv&|&N}S!s%(kIO;NUBngF7F{3$ zPMsH=C>SCPz+okWA+r!3Q;ucR5Ow?AHYf$LA9vaWm}5&pBN&q2hMZ9(5x7jUp>=3- zTtXpO(+hhwSnC#5j=kl^2Z2I7f2gQ8pdrW$01~2Lu2wqs%bg|PxXr+MDH+Fv3WBXt z#$zfOn21~ukFaW*o49n|sxA$a)(a0%NWj7o4|5^C3JzS%9Q^%;*86GN+YFY5nMU9$ z;hg2pK-j=pumQx^gKr5!*VMs!pRCdiM})#w1PFn^TthfQ34>{YFvT!Mn}9t&p=r}R zICdV8#Cyt7u6bO#fI!4aq$rHPUWylr<~J!swL}CkC#)cX81SX71e|gpR1jM!Ot7#k zocY+cUvKd$&mE9KM!Vx2<>2P!(s=+3r#Mz2pjGP?lL?@!wryPD0HOgNu-6Lw6K^0W zCqhzXt;oR-T)9$_T7N$n4_ZZnR9NsQEe|{dor7LG!96(IN=dwOkzz7wwOAxYG?)-7 zgR5mBfDI-XZ~zFzPT+zq1yGxPcnXm)r(EW-tdkO6V8CaoC(XJP;er!=72b?L3MiFzVELc=E`V+)g_!N=z>E`APl%J!D1BGopg{5 zh6Q5BwV`%-nw}A5BnQngV0tB{8gvHybWlyDa^loNX|2tXcIyUbi3Q?Y1-dzivL}G! z*vFIE7Az7LG30ou*MF;^mh0>YSBzMAYIZqc#^%M4KpgcTkn+kmqQu_1zRO2MZ>FRfUl zmPh0DX1`hhumTJ&h6qJV51tHC0VxKqH#h^}ZmwEso=j3Yx;BJEi~{JUg#&6K%#85^ z&SOXm*3t^Jy73Jw7ghMfz_LfH1!htP$%zDniYv@MhMHKf7QvKTu(!cSDXAwA_!}_A z0@%nkcwNlqL?EyY;8I$?WDxGR@P5l%c)#eH+yA3eHs;$+{`_y7_y0iHy|Dj>`%OT9vQ0qo+BN6cV_sL`c=BRUf}VigBo z(utGqD4o#TPu<+){Jt(%UwbJDNrC?9&+NPTd$_)bmku`0oH+gKqvFcqfyO_wN1u7^ z?oN-O&XGZCGDrgrk-FX8=?Tok@^;XA$)ikh8 z<50{*_G_o}a%Y*#5??-VD0oc4zi{}ZWxE6`!o)3J8yU1-gq>cXizl`Y7GtPO5LZI-?IIK$158| z`Lsclw{7s^;sRb*w^zdpIJph&?WQX>)p_*jFRAJMN1d$v{HE7xI%+6GxRH*6tInh9 zpPl$m6q|$`2MLIuUS9YAG09E_gRATiyn)I8_+j?I|9<6%-2~9RhlSLvrlZC()QDx( zXvAwL+ll|i>oW&rH61mcp+-C_@$|QHy7v#@`pe@DsL_ZftLdmQ4K-p~h3h3DGh{p+ zTuoB6l|6X+FiRTz)VpEVW8L>sHG*0}$AQ#;lrxjf~TxsE4f$Lr{*!3{Nn+io=* zGEoBm?d%*J?8Aq;?;b-y`(fa^VG?_~?pMi&#(wx=dSv#+>D%lCVobQ#Kt~O5s1e|H z3o0r~;NM^W4u1n3g`3(d^G{?aUF-WJpXpI?raPS~E>m{Ix zoWDJN_UeU}I*v$nWH5W44zEWaZZGrQbhNrOLm8X=6*p&AWCT)_%Wt1sN`)lZ^@f0`XY0}h0LPbcVL?6st`}_M}qA$3{ zQ{0TFiHf45__DuW^jf~`7oUES-r^ch@fti$`dR5^RMc7@U6sG$a&YC#tS#dr)rRr$ zJbt+D?Pc)I^>oyDir3)jFUN0wdiC~Ac6jyYJH>_W^X^Kl*}{?uV;h zOu6tW?yl*NCs9IQ9-Te?3BG^$5;38O>8 zD!`8aoxja$6=7>tWGC}|h}2g0!D^XjHe{%riFKA%1g=XSFu5W?OTs*J_MswMH?Xl~|C@;9Oi~*&6K?<^F@Tx6N4# z?vP>DE3Bn*p6ft_)W}zr4`YL%1Ve4dvAYM)k57)W-MuwEtgO~}aTS04@cRWOYSm{8 zs$Xhge9qN*@^R3eW|*A0Hgic_u*8tKVZ$rqfy+Es3RxOB{EzclE@A$zDlX^8bBXL4 zT9~{GvUQLaGmj0$R)cfJG2xyDf-O^m@wv%~X%S~@VlL3Ww}!rMzdDt^+wyBmBT<7J zxZm^lc#Uj4U%XcX7GDckH^Y2hBN<<7y{EJC&xHnRxZ~t=(U{j*#n;;N7G6*4C0q5y z*&Ni%uF-6&*qMZ*_q$~NjJst1yw}qHAId;-Zg-nYp0CaShcIUg`+umw=zjmt*SK7_ zNJ9G}rC#>#z0ZCPgZ{Vx+qj-|uKT0TUi>Tp8p`)lI?z>Ln%*eC`S|L%xsqK6Tyr68@rlcF-FDHl?h>oxPOC zxcn$)2NtZeS0Qha;kc8bk=p4BV|c05I&w?qjap1?r3DM}uD1 z6?YbRowkpsELCxxy)jpxE+HgZVruX0*~t%`e@|XcSzCLVD{?nnkttUxR=x|C#FV9f z-W!$MyO!|33@&c7kM;PE1R{(1-&oGYJ^p`<>s#LcIUC+)=S80EGavlW_wD^w(9hor z+PstVUs)jP#sjd1*fvSwW{9pv70aejyOVt^-zK$-_>=7xvs^T~)YRGh&&*&v9(?FLX&UR& ze(o@el;_G*9FS2wI3IIRDQSacDEGeeBsx=tEKQmDLT+Lel{;VsN#(dxRw?*HQKd|9 zSmv7KUMVaU45J>6d)vW`62xO7i8o9*tPL~Ph&(2=Fac8^QyC3ru6W z6O4njDC9Vox$%T49Cwa&W0BkFmv03>0xQIVbChXDzzxL63K=1cV&iDs*;6FB0c_j~ ze!MgSq|76wym8v(f;)`4!h(q08knC{%Eh~jWG8+fFLCuafoxh+tWPamlzViF^|*+X z&(a6rfIRafJM1Q;Phgp9!puD?7-v%%hrb3xUl#Z&H;#a9GebR`WR;bQ3y!IZ_0&+t z`XG~3%qCW;84m{8hq!Srei25x*rAomS*NXAcJLv#{=qvvi95{_CqP+YSF>jt+{S0K zM>`6->!F>`m$MmK)0oUz(ZXuYo6&=V*j{w_LW@R$+xI|9XUU&~rXhI!&{_I4mbDpl zrY=WeE9={-^XhKAKdj%xw{GdX(OT^`p6+aKd6owuE$Y^NNAde^=G~OCS{Rr893T@S z$xi7=oIVbGiS$Hd z{(;#LRK98<7RYHs2wQAr2$4Y12zW%vi<)%=OP6Y;7;iSKZN<1Szoj5=Z1x)vWEl93 zV%);(STP8DFqwSP%%<5L+c9xjT_49;! zvwPK6sHY~XlQ{tR8vS?!k75_7?*8*V2v6u6kSDn7Z_( zZftCMOLSxN2sMnu9qC4tkxXa%Nht>X+L?)ZQQsdGC)87=&<8Os({*qB@LpTKOj|Yw zf^D^B8ZegHva#hY(U#34)G!Wrq%H3H!&Py*EwLZh3uBLIK1X$p(92@6vY;j|LdJKG z>$kBK?`Y2Od<#nTEvUriwS=}Rv9RV)D#ph4w?r{EkJH-GxFhulgJ>j*S|YQBQ=`oP zkUc_EDbMnU|1WI^!Br!O#(Z`$ui9|rH|Wac@X4E{)F5#oD&+<#%j?D}x6{JZsl@F< zW#nkP52hKHZ}uSNK0ns|&cAKFmiB)L`jz*8fZ8Lnod1j7@BjE3*SEa?qkKG2JjTD@ z?Qy@`V+(hCOePm8Gv`IO9|rRh4R@7C<$@5?D9U?(b#ndRmO&NJ8mcaZuK{NUDNWbF&javuf{4&ox<;X!~M10L1;(-P;m zIVC&AdHUPraayM-U=b^~ynFZh?O6lU`Bv~~3{jMT6vGU&Sb^J0rHR){kW|Gw@_2Io`r`EH=-JV; zZRS)P??ey|(U@b1dMhc>)=?KV*~io`$1hG_HO(ewax1vBh)Bz&&PA>)6UMS27#G@D zfGQbFY8^js;!te`hq)HH_qjFE?g%1{r&du;EW^rr0oL^B@`O%tyOi0W{ z{qpd?npk98!J=Rayj>x4i?NLr>~oB;MS!;&V;n$3pB^2bH24IV^Q~YqcZwjzz`=J~ zX{#)vSO?^}v(D&PoxoYr) zQmJa-@bt~mi=!sbKx~Ke9d_wYFHXn6h*C?}N;Gn!)!6D+BuOoMY9xjkvY?RL09CTN6=^Z{!d0+z%%su9OI zQ^2@N+@Ae-cKGyfM@>GE*bX1aYUB)&jG>$fW+;hOnS*4xHX6bdk>+&+r`zEQX_GUl zv_$CtsJpt}I&LKUzQ5wmn*ulh$s$?g0>MI-Z!&`Q6jr6$=rFk19)|19Nnnz~EZY10Qn_bpWMdC-Lb*t5F;JHzB2{4? zZNFavxeh*LQfVYE`@}u89#Rmj(i{V(*BB86`Q0+ebxtIF14u)%@0n_E)YA2!Eqie285FV5H9{zCn zVo8MNbr2)*F*j35l=;Qjs8=4z)u7yW*oiY7pDu0a=5-JwtNHOnu91tW>4mABVZm@r zVp`PeQ#ZfupDco02Q4a*OfNoJ*9sFTgBK87OCH{LuxSc%@i05DgAqZY_^8)sz;y9_ z8H1&l=Ce0BjXp`TgVW=)C6w!6M4EEuT&$gass#)od1Km$+@M5mdHnvXSBKx7XzX0V zx)NGsFr&`;Qq2g(*Pbw$9AgS&^y2C#j{BI<&g)=AzGFJ|7Py{cBV0-sPBtXTnLWjH zM|2;>x(+tPoH%AnQHC9Qo>UP+y%Q&JQoY*yMBx#*(B`Xvo0{=#N@N)nvS~d4tXIAZ zdeoRcvxP^&u7ett(0ecu!pnPTHtlO+QX?{ur5q*PQiey7u7e!KL1r*H$QSNC!-QQW z4_=sn*ipUZ4UZyS2SdtHs;{tOf_m{iC46P{kSUZgB#xOpJPLFjEXhc2oO8t-`dk8J zTI#t%rj8ck)FXRl5RXD#2U#lKCD*(sf!*3zz$NrlRBxzsX?2P>M~k$V%sR*tXJDQ2iNvQ3p*F+O(@Xf!KaYmlmaS9NhNo`#ZH2RX{RNAE#feKJz@aByT3InpSI zF}X~48qdxTPtOl87Pe8yu7nr`s#HgjD6YCOVkT)lS({up&2>$Cc(Hwc`Q4f`9!&N$ zLP!M>q~;n%F#$NaQ}j8uDLZR>etvqciA&ER}`|%&0}mluB@m==$*0^^5Jn(f;{TD$_cYj_cq~!^RA#-9hY3ea>67 zZBWh{cJBecIETPn;*9IS%M$czNA8(iAP|fedl$I1EYLu@y#~C8|GB+h*mU~v<{ifC zvYC2+uK+N3RplbdiHE{-GJHmiDrr=oyfyg_Faq-7@#XQuu=n;py_T;wU)!%%fjq@w zI2#*>wF3g)fRKbdKrv|~@l&$xwZh%|_1%v@%UA!5diwq>!e0i=6-|G2>`*x7kUS01@vwPk@czL~lbaZ;~@Z!C?I==mM1&D3Q(gM_j zP&NYjkX&#T(4lsl8~hpZx98gh?sauFf3^a++(Qrq+QvSl;f60G`{G^H-E+}1^)Dv) zaWDOQPrd^Dfl2Rt2PbKmWLh>XdO^koX6TEe_>Uj4?O$&TW2^vbOK{D?)HFBMsz9d1 zqgUHo7itsKWt$#vdtU|2(ZmLL;ZcANQ)!58ixP`zEyuZ#$86Ex?VtSt>(Kg&H)FFm zmsa_|lt}?i*{p=8cvE{Ny`0d7BU2zgU3awxpG_{Ie12iiuP(OJ9kIQWbwHCCQmod8 z8k$J!zC&Tc?t_F}txQq+;Phm;_GZK2P5HR`bs_JsKVgaaR$agTr>~U_kqX!B zcv8P7)7I9)Rn)MK6O$2q>A8mlQqfx@r-=;PcD}3+pc4ey#Z87IkPlM zkv*pZ%S|>$&%N@rS9NlJd9+=CY3({D(*Yh=EXGm_7;)9I7YXar7)OKit6IG0jsn)i4{jprC^+^L(r2>gsI&;Ntq^@MNKe)z>RY z;S0u(QouU18^ohE>v_b~lUQquohbHnO!XMnbzE%0;u$7{9!Q!W63P%2)WH=mwrCpP z$B+H(+nZk&)a3N3)_VQ$Zu8B?tizOpnbcAys&Jc>QuBU<93iTt8b7Vs_PUq1KfhUk z{fA+vYn@FdR`QS<1e=qg<-!UWu~Qy_5q>Ifr>+3%aJI*17gy_edp%^EBYa-e=u%8n ziS66SwH2uB$pcSt7T(?0ZXGzO+D_3WfE-#C!ceJNDhrbe_G9CO^K@bPufx$nvT%u^ z2CX7xeFdjayMMT_!}1yNTJTDWrX$o8U!mVxNSZXM`B<7k znf)XH&bJ4rKWxtrPo{fQdk?YVKmF-mL|=!WmeI<{>}w+K)JL-f2F^X>-xZu@DgeEI z@bdEPc1!e^{^r@{hw}PEUkN}52VL!yAL>Oa)o4bS9!zbR+9?oSJhFV(af>7bH(U-b zgyax#HABnVY8)ojYDK(TA9ZlLm^-;-jzr_VVxRuwtKrP#T$}YlCh?Ak%Uy5<3s_vlUOru@J@kmq%0d z-8-0jt32CGZ($`TGy&XSGR0Q7$3{Ntp&eUTcTH``bXs>k9b6oqo?M@u-&Xe7(}ph3 zHb*z@k;^12QCOxI^4;WUv?x317SXV=mKbv%Zock$v|Xsc`tjrI{$HEDbs!y46ZVto ziL-Mf8yEes#p7FG(^{b6>gvTb$CFan+kgAxO5&;oGd4ohDim@VEkg)dZ)+jLvCy<& zuU}mqKR-RXXT%rUkLuY*yIkD{*~z4*PEYH=%_TS+c+_sQ?*v0;p!a=nFl8{$xTo{S z&#<3Qe;l}Pep?4hpNseqwJ1&sn!;bCbf1&pf0^dvoa^)Li_3%UJ(%YoUay2S^=gAj z1=E)x@g(}@xZ}&>0+FfHvE1Rw;l&Gx+dnT5ij}01Lb!uVxJb=wQb>oyNxG+1y~C86 zcDwig2vVyzK30KM;9{AnNp1#K>SA?$_y&CoZENeaV{vwRHZ9NFTOAMXTK?nRZ=0{b z+2G@6(0T9f{`IhNKhO(E9UNfpxEav<`LAy7&L(t|@JXB;-d`SBz(>qrRm34D1nmr$ z@0^L#u>~IH`oqs}-lyH>8hirz?x&l#@AdTMN#e2u1S!Zt*8R$qrMK3g2u}ED6rd+1OGB0mJG@U(BQ)Pp@t&p>%8JVT=Q>8nFcstzLxK z`%+!z`&0P{zy}ub_RWW1wPB@pl-un>?)b|)?OS%|?6qMtSNK8GwNjRhAX$bVMAnxw z^=p2wTO6MVi{JEyZUVHCA67YxZt{h^|48ZRX}V^N4u|BW45QkR?qeau7*V)oi`S&@c$L z+D772Gn;A5Xm&6rghP%2YB{u`J=?&^f{~1OJ%qWWyXG?UkXDD>_52FxgJWBB5Gb3L zwULIFkVb3>P&oC$?l1H6xE;KL?t}N$VuiEj9(0p9QlOGao1KmJKsT0oaN5P32k=A} zj2`%M4UxGzN12;8*9i7=ca(WZzk?x#A(ioYiIS6*4nsGZQ`8x2D^$MgRx%G6o?^;9 zx7Y~eN{i?~xQ6CKfo|7MIPkyWUOSQbDdG-*r(`0TT(qG_8Z}F8-E-CKD(g9o`|UmE zQF#ZWngC5}DGy&A5&5KxjDa|~T&=de|I}_{9&;DIOMjB5$`RH3M!8@pXTVV)Qf$#G zK8N>E=BJq9Q1G%l%tzoav!NQ3Nj;C)ne+*>q-YwcB%@a#g zacVp)z7Db6nz$ak`?3MSJZ{**xHgOTY+?42d%|xbnsbdKaJ3D;_+>+YdE8w%wGl%m zCcRB#A*k@`4Pr=5KE~*3@BdVwe;%5jV%Dk0Qkv!p#G)n1u?(A*#NZ+Wez1H|L4SUZ zU3fbzc^O*Ov{SWkvM$-trn5PN7^=4s?^U#)husBTE7RrcpjmFllI~SjVP~2)QGzj~ zFDlGW!=_z$I2oo{1S~=r7Xw<%5q9PRygsau`WF@7=V70OwTXMxg1ukkdwz^vcs4&^NZ^N~+eXBA@38ge;N(~x%jZ&rpNHKAU#kh4 z9|M@$5VA^Yxg(^Krm!0LtMqUU?0NiMc(Y(31!#Cz;Xr*ALPR0>cD-vcu)-g%Nj;DM zBuvhR?41{cNi%})utrNzq|qpu%R}xJjh>z&@50OVrnlg%jHdURRjlML7QvLgw>^d5 z7jd3P-UWwi-MG-yx>w|Q9`s3wTPpv<-nI9}aU}Qu?^A3PAdn97x!(^*65t1Q5h7U%Engxe0nuIE zEfc1=1WEbKJLJ2kYG!A-G>4uhcUCh@Bmwb~T#VwgCEVGl)eL&!3Vl{wZj|xDtSl%E*<4lyZpR$MU-KHpH7Sfb3Qu06 z(^ycuBH#(#Xb@quN^d*rDBc}3m%P3 zBBFPO+nb4up&Caa2a7KJwX(J?FJmaVLT$4!E-^U@oZ{ z83cL?MLTa;3|X)sxZqX^bl!DQzPIcv4KLXknk{O<0i4xbS{^dj+BWB0l49m4H}uPI z2H(xu8^)@UJF1hV(VfgW(kbrD=vc%kRdz;EJ1B1eS2v;xrejENep5%Z9e4~q=dDT1IofU*9pX<4 zRjZ zNf%sZ#R`Y>M5zI)Gp)Ttr`{)ZrBGx$>`weQfl5YdYrJz5wM31-s<@@z%@`twe65mW z!wdgiU8g6>+*FP_V&eksTGO>{=4Nczw@&43YuQH4+|t3fqqo3hk-12fGJ0F|Cg~{u+N?)g$6&k{ zXhd!ob8^;VR4BQpchMNU*y6QL0adD_xQ5R&F9mFKrtKu3zj(Q~_~YZ7i{kT!^6G=jlSV=hPUyp9uFQEjKZM1uHUR0f zV9+Dc=z~S8(L`zVn=$Z03!$>4jh*t@`RPYE-^Bjn;=|ed$MnW?(LT5QoptJIRYnAU zp>hx>k5JL0SXHr2%g{t`|PLp;j&#JmfyO6IOu9Wyt^GN)LIT;YEhbC=CU zIk>cmPZuMWlxS7+ZVY|k!iIu^PO*zEvBbccq~5ApwUrRsIod_z1@(8M&?tI#kq?h@>( zN=e{Gxtv3jc%-sg90O0zqr*r(Qf>X`D)trvw0W`;I_eM4~I@*QuIaz4t42mUs0+i#D zAZ&`4W{>7|lF>+f7#*_R%&ag|fLUX?K+B+Xu$Dy(P(4@DaXN}x&Fq&hTsk;fLO8-N zM;5!CO_A=caVRR#O=y-hT6x@`z!G-=o`Q?(Q#|}7FF$@N5ANoueJ9HyZP6jn`2)j{ z%Q5bfa?02Up=ft$Kv$fs#Ps_gU%njue62Zz8f@=#`#O0$Ik>rPlc8}#xcj$Y45Z33 zW|=T{3b7c;jJE}iII2>hldg-4Q~r6Ss09es%>J~I{RN!zln8YatZfg@OMo35qTFV+ZeK2OH)j^;R!X#XrkGL!Lm^Do zKd|s}mW<1B>(xawQxUUP7ksF6$dywfJaWui@Yz_C+3z#X0sO7zFS_ht; zFV99_t6inJZqc*v6GUb`IrNJcVWqf9a4z8}Zw44pG{ z`!({flnbDY5LT6J8P$e&jTJqn_Ey(s^JSw0pZ(#3ihk!QzWAkgs(3%f>1m;wnD4_T7_HG>iD{ zMf2xLGwF>V(@fSsrJtW(enDTRYrnfH^}lHN?rEW5%*N+w!T+%F)tdU{@_&i^UgJ6~ zarF?SlLo2wH=4ibJ2&CM0-~N7#G)g&(&4g!N3Bk8g&|u}hX+*&Sivz!a7J(t+kI%T z$0Xy24~cnp!85gsk$eTdkp5HT2OXs$U~I0i+a zBY_bb3*JEVG381`Uhl8q7^F8RI9~7fVZo=u!dl1yTrz=ND706i;9qo&!C6qc5{nmW z!!bl|Mo_%yl?p!<62PSc;{vnHgSHWLvD(-Wfn&UxV%`bSLrjail3}N z9;7)ZkXz1sP_~nKYSN1m9o3CeHfyTA0>%X90xv>JQR%6@`uaascns2;5gy2OpEc4` zVd1?ng|0Iw$5OP^-HooL8d-uzuPRhy(LG7(WMqi$yfEpwzmARMlgUYnNkh!mWTtG8 zKC>WIVNOE|*_2A3?bVC#SC|aan-eB4zVDM0H5C>dqjHbR1W=zihz#RGk1Llr28UoI zufw8wBfCOlkm8KcX!!2I!%v2XDUuZ{g-XF@RQNHAD5=pBW6Yz7I>3!63jeR4D1nT$uB zBRP=X2~7E%5^5ZtY>b+Uf7PPXynOD2W{BpjfN41IlbFfkP;Rm^I(rVnVic4L29P;` z@``y^vaZME)tk<^43V4}B(L7|Ny&64`^kg#KBC@NO&!kUvX2I!fHq9Z+aR)OUIyvT z4wf73%VZHt5`pR_08nK!w9^s8i{zcx%0&E;tHtJO5w6Zf9wI&~fUZuVM}pjBI!#)E zOUMlK(%B4jPg2Hg1PBa5k}cIJHKlaAK!1qnywGV_@6&5yDpVX`Y~cgxUVrp7o2-TrCQLlO0}5$dGFskFJOq`tPnxI`|y}7z7#?+ z8wAJYV_eECSaz8Sn}v#CV`bK6U3;~Yk|C<|!ldQB50}aOvTQw5Kn*vX)frT%|bL<>6{=|d(ST~ z4>AWy&I+5Cy(gKHO%`j0BEV)ZL1NIZbrC)!0HbA2E~Qj`lKFCNUj`}83y^;MGMSHT zz2GI6Xo30%B_XKLExNZHRCHWbpY*?6-&-1_I4?Z28;VS zSpdPnrCXdQH#Ofo2^pd}GerKq-_}o-eZlaX8?L#5;#4RRyuCxLFkBO@dF=Ptwr$(C zZQHhO+qP}nwr!vO{!R~ibcc7glU+$ws@B@6$&)?Pz!sZjSe)Or*pkjH64bTt`=3bY z{}aiOF(Ze9M#p$Mvok1RL%d^StW{cfn`EZtl&{9P2k12Z!3Us|67mHZ7o60jyS@Tx zN>Bdu_TcMfwSri0S^@@6xcC8CU8Z@lV+BR z&*GA*)*X!0|0(@sl&St=mK?akdk(}&69c1XQQ3?e+Ct&ueiBO}P2`{pc#@#;Nzin} zJ8xRrJ#1U!sDn8I${^?-!BCYjg17?Nr^U>>MEmbk@B`pRW6-JSS=!ZX`aB=lW$kd# zVpgZXDG`8|>?CJyMYsR0uFDE72-z$I=5dFNDd_+~dI@jU0dQbazguz}i&jOsLS5D4 zFP#(H8Pzm=zk2`N2lS|{>&8-186iEfJx#?G_HQH-UNKBDv0_%T_EW~$O((2;7A6s^ zW!3n>xHZEHG~+UtzDj_MJQsJOXls~BIqyR0FY6`Z0boKSKrs4EBq=FJ(lj*%VRMB&byl2V^oB|%L< z&5SsUmXb;v%wiTQE%b@^AFGb;2Zd{9g>|3n1ep08T!Af^54sHMM-{2r zI7~}aKI?pFraky2M@og1-AM+_i`ktlZ5YHX1iE1tT+9SBrua?CQGVpJB$?&?C5tA= z<$$S7`SXOTOiI_-q!6EP&DAgY3~Jwi zex+nttJ&ri1qn(n6>J@8$oPunQyTe?wVqiFEMhJ`?f4H~W74P>8mjzeH}ljKDM2by zL9mNtCC+yBk4hA>x6`Yip1Zx@sa-faPBH8F=kEE9bbdTRq)&qZNAf_YnJ56Va{zS0 zd8*swD+JG{&ymlEUHlmhfhGIhu!-On$#hp<_SvYCqLJ&w7v(@s6tqgY@mbnewwh`D z1&x44zoL|kYiI%lxzY2yv!=K|pbWkg*x=&_tot;1EvifMzeA_%%jqL3;ocB!r)gCRMIG^%Ez4bE;sO< zlPCgDDrsC_b}zql+!;Vj;1x07`|1n@=<|7SO)y`-<4gdS}=gM)*}LoJF4HM z72Ut?53U}JX*eAWSqiMiY$FD?qw>}5@p*23Gq-2?98!vc$+HKi&yh~G?l6f8dE1lL zP&a9Ab-f-xkCU%>#XB~CZDD7|PJ4vTacF*!Vt86)MHb-nSRU)?d*nb3na^a2VWt** zGwM_Td^7qxtRH>^H`=W~-LtcDe1jfT_i<^_(}1VqKtgi8xy`HYfn1>V|^%AEuw zlU!5+jjMSGLS91De{}!R_2Ud{7UiKQ47JLiGAU3kpg`$hC#z z0}={}C6>Ud%D7jDi9TO9yIC(hwFHGvf?WnbrtN@_6Mq=pN&)iSDhm=>Cbaz|Nvo!p zedsC`sJC|WHs1|Y18m~XH-OZBvtv|Sd`MAyvd3>WA~h9uW^B`==BIDD8AD_ZCSO%# zdZT7peX6oUUY9T-(2kCoUcFwfh_PLEM}t2u9+{I1k9BalB_~OA7hzaST~m2~gB{!4 z;|3RC9_|!s^~J2zTQ0m>+&-P?rRgnayTTSRqHCP=z#`(HBVrI5#!@yjuev=RU$q1u zatFYc^q+W?bw%FNM)zWUd@m!1cUrW#KNwy%s5QOr&vRV+$E-P<;Yq3{JGn_wQBIjd zgcCi^t(UHlW9|G2#B zoLf!oY^xpmbo;izhG-)Hte+B4;8&5*W$A{*uxd%&Y7-TmL>pvHR3VN`mbw2q9BF#c z7^9>HM@2nFDfUd~bqTQM`t#@>5*`banepWbrrR6H;_>)7dpNn8{H|2V|COZW%5n5v zk_5cf?(uY<+{2oyeMl-n8zQR*)k>z6+6M{rFB4Uu2M0o_thzE{$RRptQLGTo@yWKV zQmyj&ad7<8a;GvDj>dKx?k~Z=qZp!vGE0677du?C4D(_tD9pjRf7s8@qYKF*Nkbqa z_PQwHyNjj=n$~EZpr!!P0HX9!1PE+7Sopr@f^Jfh5Ec3O;t=&h+a6f)IEE=UM+9;u zgJBCODa+~}%SOZVQoHi}vZUwe%+gN_+2NU3rgGO4)cZdA{Jy04$eispm(s;nxb?{7 zwX--@rWjK{*3=*E5vjg^2h#qrpw}0;LOQ@+hLy0C{fc~=3GHKSQA+kYab{edpA%_%x7$IR zQWvkYara$$ii26pZm&B_E6&NH^&i$XSqxQ&`^YxTy6%P&(Sl0#Sx`nIK#nIV4?P2J zV{})i{n*p6A6r_JdvC2ZI*`$XF-HpIS`{XT78sRA(~#J zyx&U*Zth)yE`jTlM5QJ^rnN;SO-bH3t{O;B9X=&8kj_5vRdUBK*h~ zG4#?QuY5Q*JsI~3wx;2a_f_+$cE3Y)rU0#lrYV!rd zA(WZ06ZIpbo;1Ktgo+W#W3%#zQBgN^pF=+%%h537vXG<*y%vAX?Oq^57t0IKIN2zw zV8rA@!=aF~8_GuE(PY9IErldOd-nJ$zqXq2xk!$L-@gt|t_Q$V zn+bK1VN3um0>Z}zz=bV_2QdK$)QGF=eF3yFyK8$SU=7=fx!iwx?Uj!1`aI+Q&_y&# z+sh~gH!;WqbIK4LH!pmGfunxo~&1cYAtezM9sRAM7Dc5fU!KM=>+NGMV*X*5lK>s4CZtCf&v9 zr_HVE+@N)bpIbnR++a%;g=6ti3f8HcM{u7FqD^b)998Dv>$tevwXM=y zRhT9_U51|s7+oi`GNaQ}l!>Ftl83zCoZsJ=)30MKhg4JV+m_%uJ#sm(4wA?e>2f?! z5`rFZC-U~xOSOZLP9A#R3Gj)my)gK}nwK3j68Vfcb31u@-fkkon4(f6A}j|mL^8O` z-#Q=kGa3R>`QXyl+`bt0&_K5u6?*iPZify;{xCquPgT&Ax+_OalrRzO%qIp(8kjVUV$a0BgR@L94sewsM!BG> zCa|p|`1ejaP{wW)4L4cZHm>Y{4~>9XLTd|wjwAE6)S=!e-$jy&aYMxlZE+`ne;dJ{ zC>VZMzAW0LA08QqX~B{(0`5vwKNYm_jT3{tY&&5h`W3m94ZcTP6AT-uZcmKMAqv_k zE=k;QLaRt!LfHIHe^%ee<->&;dr5muy)7%@A^Y>?==*pN=h(s&O36i7EI;37Bz&n= z%TfR0A*&{9Z~3_f=~A_nMLNf>`bzcZ`%(LLtWi1Vx6;+ok?r@!@fLAzUYrUhCQe_p zgjyzKaN02sghUZZ_k)cq2lh09f)T&dD9Z01cFCm+iCpg(ssWLOt)^*V%Q3P#1gGxc z%7JkmtM`v|NWq7V3A()%2ZsU24Vs)0_hvJc@5kbRRcJ`*{ORRhFs8!t)TM+K+?m&x zS7pubJaSf9ihMEcg>&(J;|K2M(iZVxHjeLmxp|Y(s^lTk-P9PLml3Cko>J4^5*-DP zQ5gvg_OmVwd<@);F5eDphXTC0-CyOfB8>d{Id^}RR^r5r$C{w#V+e>NecB!ZDX2~=b|OegDWCi zU;F|<&w?_dRMp?SS}c-L+q=(hv}hvV)5_U*g$um<^+8N+^k4?VpW##d= zuKjDYZr!7h36(sJUuD-#p0x9+NIZl7z=9N*lZ z-|XtU_3>rsVNDF)#pA108;X3HX(bW{cw#lo_Yd)-tAip{I0Ib+uVkXdm1fjAaANdg z&Vmb>47e%Dw?&=DXZJgc8R4U^fuN)33`vU?1U{l01x1}O-}trhsb3>c1KlPE-;V1o zP>$njveURgY1UG!VjGR%KLmb5j{q1@Hp*T;UcfDlJS1u4?<78Eek8&5er;xSOgF@DmSxORPK1&1tF?9o)`LCg-+ zKvUW6cHfF?nDhp_G_F?`0$o{l)L1mo8I`Fqbb688P~Aeen6!02v+uyS$fDx~%}X*t)B5j^cfgFi z{2hIeA5#x+8oHdASmFN&P^%=>N!K+h_2uQc*UJ^mSb?OIavcnvtcJqNL8OOnhv#?e*KOTG_lBw^vU(xp`_+*}>X_Ur(&i^w9^h7?=f~aD+U=Xd6yuHKA@1;6Uo+`+5O%Rb}U@E;A1grl3R^xYfgGmb60_1_{Z>wH^g3(m}9+LXe^4oMe z>+4~e`^1%}oNUsAIF)oZGwJm6+$f*`vX5V1=yU4WW`0c09PCmYr1{Rp@^ zh!PYvPM~Hu6giTfABQgGX&=%@7n0q0evC~bK)giXIJW}(5*zu97it<01!;2-MGtA- zmv*>~MhIr8VSmJAX7{9+8STFu>7M>uP)Gd$(8n?hQiD1qwq|*Q0xcs6@?S4M7VQu< zHnRD)U-a{sm*dg@s{2eT5==E_plv+HjU3%TLN}W>6n{6i+<_365a3|REX7iGIO_PM zxfxOmdU$A#=g{z`N@o(9?`G3Brl28EmJ-8m#kQ-K!i5nVi6sd#Ngx1d z{rE==ym;?L)UCP>ZVy1dUg7v?b5 z0SW#D`}ZIVk81-5=Isp%BVnXzJRHjYs9GKhGO~FBytUqoL#Ue5UAlIRTQk$I~`Wc>B-D-Js(DN=^k8c zXi0+_>H(ozDg*NzwiE}_tYVG$JSGf|8E4E~5~2PP+iquj_r@Q<=`lPllUbk4DZ3Z} zH?u4}phPL~2rH`zdL$ynL7xfpS(k+0TbO`_e5Q!2oRw_>+br@_Fd?a_&N2u@sOA0fOQS85A7|xiwW>p3P zkOl)ILN^a5W_I-3*tf9~NFCHIM!C~{EHmhTgXn3tFpx+8UiMjX+62Xqh=#MU?u4{= zuVdk0KSQV|3^h$9Ks!BL`%hzo6>!Q&;Ej<&ilCW=!|)OIxSf6;PwinCR4KR|(^EGT z{_8Gh#p(N_GXa*tJ3{NKR3NrWY=7-seGy+q^q(qb>M=b{QxVXPHwrOf7{OIBBYvFm zu%dqf5w;>CeUNj}KMp^(_bUg7(zKE0@mQ_-nXKi?J*{!^gfQpr2LEEY-UP03e%80p zoW3o*@0R8C(|c+rU;wr`D4UW{KEMD4p>Y94SfJqnbcv7{tfROmH@Yc}grTPC$TXUI zLI?jUW=yZ5Wuxs*^{1N?YoPd0VQV5HpC>}pIdTbOYq9}_DER^%pCM^dGR*BQF2|k+X!-@2rXx^2!aD}1K-fpSk)rcdX+?cIW#t+ z=vqpE#PL;4sugCUyBBnJ{P_F@Z<+ZcEo)J|$%S9?*Jw z;slwr@o9Fvp~d~BX#t&61!hY~FF0n<-{cdwPKQn9XbJtJwDpIhRRJm#?+&n;O1~{W zw$$zqk&UCZ6R$l>*}o8ARK>N7E8=0yP2lAr2*)7q=aAgCkxmsuvQ+|?xVzl6^Be>>0YMzF7-Q`$PEGtp=(Afa<$alc4BUeM}s|89@96B1NrJ6xz`!jQuxY|4ma&*EY%1@hy8LA1%VQZ@*S3y{V*kD0em~!QT#U&78769xvF8)^frkws$FheI z$sU9&u^;~5J)${7OaC7u+vDtqM|onJY}D*~J9}oQzSzdJdmv>7++njPikkrkHxxlf z@#)G-f{*pH!dKPoI2YH_PK-#ZkT)(R-_**?$Tsxy%t%5$V(9K4A5H7ty6K)iX09dm zKA#^+wbp2?j-O_p>ZSICV#Id7Z@>CiUS@78gD0P8+&pco^d%n9oX)bGo1TZD{Psjj z08-IXem}Ncxje6 zOiCHOPUO2X%}&==1W%~mroPgi+%h_8wZk-bXlv8vny9j9>~akHv^TdloZcp8zArsZ zP^_6_Y0&FQ?Sn|0# z?*>&$5XItm^_Hy-lpWG$?51Cu>Ka2Gy#bC$dpWE3Le(;I=mZhC{nRGvG_kp$KC-m_ z%v@h+{Plo8S%CPv$8~jRQmd|;km`uerLK4Vo?dRK`H!~Mo9NeSDeihc(TeO}?xtU8 zD2&D^M;t6rqdo@RYR-Tii6Hrz-VPUOqdT-a2L`@RHuNb6?@Fu`J34zcbvPD&=j1h; zYvJI@7bz1k12{tc^Dt{6+fy@DIL+Ks00L#{8(4E^@1uEnxlF&SQPpr^rlvMl%$VN7 zaiu}u6f({%PjS;AIg3k!AYaz_^mM|ob&ZNUgb2guR370NozVL(@|(t=ck*BLYhJ@S zt7Tm8OYZ08+S>I+cm#Z zKj4LkVOzB#KxW>rcNe_Ih>WW|-(pgKlT0|4IT)WtbV^No`>L_!dq!XB2*DcXcjtE8 zGqbW(J~|gx^30rmJ}iB^vUhw`0vl8h%+n~fTUA8Q3Ec9Yy;WCTqiY50RZ%;XoY+hi zw0$rOE{$_~()|=u8qt$e*qV>Ul(uKL{oAEj4&kNR^s(iF(s)S_(%SfTlL{W8#Cg3~U;<`UF|^ ziO^^LVaNCr-)us>m!odz!CB3_t*p2nDZPavl zqRK(@N1yoEB^5vC??b#3jkYy(T)KHc`5zimEHZ$2P|_hNCE`v7^q zb#20T&a!=U)9;z`fujFCWz|ic?VM*N@R~tjycPC%{~f%z+0D`J<)kg_5S3n`OUdnr zy^;0VVDBDQU{?x(o+To}lu#xEDmzh8&>)v8A}2o7R2|CTXnyV#0m&?KHxIC(@>zL* zo=@KEn@)0R2W?O_mK=8aW1_{|1H`0qgRdJJF;GOeXc^sPj^}3R5!EIkQ)zq2-=M4v zpgWN4{VVqI@oiHz)`bA;Kt!#;MixECKCRVJu!T$jgVk1!kdG0USmX{@N%l|7vEF0P zcg3sfiRVKn#gwGeCAXTXi;&>F*4U1^okgR2{(kMG4|!{^p00yz6Pa2IDN4IsdC;JT zX+1`YdD*q3{FSIdRqJErX02dJCPnGPsh1cT;BMzu6!wLy?H$!j#&gZIQm7&6~M&EU5Lv5D0=_E_G0Wv5Fx5w@x8;!;2{ZvM}4ZZO!|4@@g8*9&fFro-X$^ zH__6AN-b|aAN7QXm=oBK%kIb8QT19<^;kUG;jad>a`Jtrh5cK7rLhL^4|8owm-u%J!PL!b!Bzeeb zYjvFRZ&s>FGPZlByE~(;`W+%7B6c{C%Z%P`bzkRG9PDfaJ*_vW00ZB+B%XFo?)P_S zDyg)|K;9IA8wG8Qt`9HgjhAlB-%?VUk@xrZ<|AF2Wb7!7F6V;2J$slczeUWcJ=Kkc zdh6lNWJNcIob+KsR=4lzYYE(}(4@32=mS3>p-!D63zxwaK>_G=C8RhvdOm$UzrfXnCE**&9CpE>QDpUv;M6qra`H*2 zN6cgc4icPwMC3VZ!_3VH-9qyTVay-P=)jw1+ZsCF4h@R3$5N0hxH|ZLpZ;i2Ul-9F zjf!Xb2`iaM6UPWAsso3dEFWYtz=8mVxOQgoXPs%uA)aep_E>jjB@Jgah@cUfW@`&)q%JqfL4>J!Zx0x5!m&7CD}Rkn{H9}EGwATC(|y6CWVtu@fup}|&HS+nNt8I$CN1-#$yi!raNQj{hufB~z( z=VA$DPrioXUe%N#SP#}Y2Z(%=P~ZXlR?-ihi}XnZGSJliv)fM-FuaHNvcY7Rk!*>u zEX_~o&&yJ}*KW#&Kh=a3)P(Pc-}9V41go?%^9FHEdnFqo;GMP6>w4Z2#eI`G*|L z(gOuTF$oR;)c0pQwLWCnL~7F9fZe%u`b~!i`%0Gt`njQZsWL7-7u973w_4}PKodwtQ``&suyc6U_2F&0`~tlO z^ADW^_|&uav(2ZVOdm?UyjqYkEl^PZUs-ZeHhmxhPJ5QS5g$KFdP1Qu`n?2JuLZ-4 zZNxf_KV^`4jr;0$>4csX8EQv-I)LF0@raBjvHm0~`n%4pW}!o`;T=KwvO(l6;C_eG zz8chqg@TLg)ivr8gCu9>Ya0QSSK1Yl9AcmFBao#$^1KBmEpnKkMR1B0K2Zd=8Qkh+ z;p1dUI38knRU@3kG)c&6n~(LFeXYt9EqzavIYG=0_4vk=sDd>#SVUjL^m_KGGBBqi zQtE6Wr75|{2Y^2FE_iA)@e+^?q}3aISNfi^m<9-{M*LFvhN*%sigYqyU{D}u(z;BQ zqdb4Y8KN~$xhF6ZRu@H8gjwVSV82oPMOx}=t4~Rn%@@<%rFD+N;qvs1;Lo>&N$y3$ z(dT;6+1+X=$n>c{6RbikOF^Vle#{~wBK7|K5bW(9jdn&d1*=?1Uhzqb&)GB4EArgy z_*2g3r0r*9DmqFwCICo*FhXqnitk81KbR(mJ!FTOndddJ#Aid&_w$_37emr3a9}22 zA;vQgPhSP8mBM=}1y#ueVH>VF*cj1c>!Qa)=>% z@Ird+0YOIMp9kNethwVpiGt7K<1joZcS zRRRUV;9;i;y7}T@RFVV?`CWN8NUzsrQ3~E=pH-6GAQt*lz@V5R!a^$-m|!*i<_JPq$J*nan>z@3GJD%~Cb0{1;pIr`tCwlY##2EUUnF z^LYssX|_qo`v|5^qtW{;3D$vrBFkhHy+Yt6doFWo)FTxBz>kU|gGnRbAT-{hKDg9N z3yOuX^G1}W#(1(=7E4;G;h;2{X9O1tGZDIy3}+SrfXaZz90zfw+B;zkr>G2mLeq7u zs8X5HOZ2mo2&vJ2zYx9*xIqSj@54f*`e{ z{?J6RrSNRMhm_hlciO8-d9cwu!Pj6GT zR}_M^gCxddQr;V#7r&{|@N3YNb7;-UE=mdIph#my+OTq-4z?-o{km@H&ze3K9DlxO zuKCRDoq;1#rpvw|nZ@WTaEP!y_ ze&IQlV7(H{ofWlTZ(rTNs!clqL+E&wj-Wpp(j44fQItDXFR2J|sdajH>Z5LSury2< zsKE_H6nx;IUD`ETNvuT_Bn`Js_9IgsOkglGYDnKx2xMf^JuwK|D$O4T+kAjYTvCXG z_vd|zmOg8eHqes5r9pj|jF&VqOLF4r5^Ude$04PZ;*YUb!$rclL+?OSX|XB15CTrm zkXX;>4gMdb&PN68ia0?(nBD85)CK>+^3Y3?woE~1@HXvx4XF&=7BHeud+_=u@rbNm zbZz*F6xUNqeOO`HD)sC$p*q>_F0Fn`-891YV9#YV^%2>rt*J*y*D_C(>K@Gv-RAAo zWoVw1h(%4%*eEpz77AJ~(K4Ht;mR`03&>{OCz=Rzl153w0!tKYexR?U$a$VRFT~|M z}BLoQ%@?U;UNSy3tsq_`k!=WT!L2qltx+fLroSq2mMCGfIh0ER4e$_xu39o|= z&D0wiacSJ@1(c^TuhVeGq44E(b|!y*{dng-M;3dw_9a1b%V**NzE)AW|F=l1XKGrh zHnewxy{`A*Dm*H|_LLSni#l_+R)H0qa>MzodDth?g3k&<5G}kmq}8+*ts&W!O-Kt8 zbLct{0(Qa+<(iyksby0~y{Z@k-d&5oS|lGv7RRdr1(jtFNcrp;Z; zuu2D3x8cfREU&g!U&@7e)-+d3zKmc)GuGEJCn}!hN;b>YGOKjeO?3-(B~4X=&bINY z_Ca}Tctq)3hf>I9k@}5^^<6)7t$H6pgEUam>uzQ{Qz?U!xk@RbSXFuhV~YK6UXRs} z4UyR6M|PiJSy!CI^cztU`aNfEb-k}Kve_wY&`=;Xs*M5igcU{B6V9z)pP`#ns&z}w zmc^Yka1lTPwM&z_F^{i`4sqM)9V!YN3VYROhsuS_4*V7Yri?}YDODm>z;PBIn;o3s zch_JGO}tEB)`3pR^GNK4T_yNk2)=Dqr=s=LBj-DD@bsS{VWwvegXCPX(=nQQa% ziRkbeOp~S$emkMHOs~wURvUpNtqt4;Q~OMb!%sXosglUuE`6jC(O4$4Yy|3rv)T9o z-=~C(lp$@A(zuolBIGBKjjyq=Zj9NzBSfkT<=90}Am>QXnszW!nm2TzXZ>D}h?Pgq zX;hN{OCqMY)-9q851`|(_j)^+3p+}-8ML&uppoOgDcg<`db$!TZECQnlbPgR%BeuT z(2HZkS5JGMj&^Ndu{CPmunXrup4rLL?sTxHjeRmtF32@tf!<#hr@9iNy?zfD?EVAh zX|RVm%*3F-qs78U=wJ!xJ&7}T|U*Y?ii z%4;^X(y14=6S_;>1}=$;^%nL%S&?83nmyoO$v#GAd6&A2s?4E5zm2JeZZylUxxAkT z&qFl~GsFqY?zhNUbTOyC>tsmiysw_JI_8dcShcjEHx=@j3m|a5vkz;Hud2H`1inNa>|XLc z71D_OcV^-2+fMTzA*T~RUoo56aeLm~(?dq>gDp>`*~?a?&KNk~+Dvb*YB>@g7Y=WS zh>_DCle*!kx}@grV!2Du=`yEAItR@Cw1X&tTr}SJ-oUypPi*YQ%JQmX53{z zf|!KQ*k7yJYrN0DIrpBAG&i#_6P>;Nxihk{Ah^6=XKqex7`@w@A7Z$-*WH}HDnI!; zbiC{|?1|#*GOSWBFR?Nb9C^@7J6eX~AGSOP3^0<2d&Iw2lgGEVAtA>qcCB9SzK%hI zjrg{2l`?wDh_Bk~gqHr3ExEJ3KIf8-6Jw5%pTs;23D^I|yte(%pGrQ8H z4LX@i!<1-$kr(Fnz>Q-=w6yT4gZ$$t%*K<;p_76K`510lrmv#CF?Rwx%YD_nEf5ec9AtF2P;x*?u}O5dH%v z`Ip!DGUU73vUZaM@XV!EeWXn3z6I$n8n-lRy}JtngpK`{Ru>1E0cSFoZbl}J)}qHh z-PBXHtp9TTI>4}#oeg{9?1he1ScF{?Us&~60kUQ51S!P~tN%(7LQd}r8P=S!B93)` z_Fg`z3KeK`dT>$$&(!fmyK@abyRTARavht8=f=_{AWfg@nEk7=byFO%Q_o&j@=_rD zGE!(-tpKaBde)ZRzgpS#XwUNg{HkKvI=}Fv?&#%Ab(-GmDlA*1aMhwpC|bo?w}w#) z?26#C69E$?IWz+{;oijV zv_-rHK4?+hXw+awAxxWAx6ae@uXp^7V)*~!I3&?;{m}8c`8e2lxwzSXAN0Q)VssYZ zTy@}OO$wT(Qq4+QV5don$nlBkCfBZGeYrWmoOeg7uR)tANdF z@+V1n%l)^zP*>{KllP1-XoP5LEX(GD8<~p&&k0HzgpUOI*%>Lk1&UPpfYrwazylmJ zW$Xj7Z*1WQj~5q&i4`5W*+^&V(oZC&ZC|CUL-G29*9wng%LF0|6?=UDzF%8!PnO(( zrcq+nFf(Ozof~q@5fLKkW8_{4W;wNEB_SldT$6wT7KOIw( z%ZQpSb4LB}^X8I~NR5Lk1{!I9Ttjw%2?|nJi9vC2^6+{3Er-Hb^Yz1#;-kP6$4w6p zTcDOCPa+Cy7 zf&0?h#`Xnl`S$0h3vt9EHbKNU*)x)$v?EA+8E&g>$Nn+%vVTu0V1YIM^z*~JM=n~- zWVCWpYPgNW_l-USm+<@a2 z$}?HTMl)sj;{$P;@H`P#!V^c<=Ps!7egQ^^8;hix2o%nux^u*%3lQ6wK&_Ihynnkp zGjeis@mdKzwBogo8_wefCTc^4AQC$k8JFbaboJ#5I)SaMfIv_7NFnwfK{?u&{dXC)vfZ~I|ALzBnEsz}nII`zX1Bw(F_DPIlYBcj zMow$f#(x=u4Nye#3E8U(NS!@6{b3AYx)K12 zXrg=CjyK`~<8(w|A`gSd{pOSj-~K{<;-P$OH27-b@q9!;ZCVtKJ!=ePQY}2wFJFAZ zNcrT2a}ENXPu>%2BrthhhC4=8f{lZXi7-~$uYhnz4M9?A;VNyIVEAl9n8pVF1o5CF zI9^}u9zL4hrkJ(denL?u%66y(6C7n>HQ8N;(Ti+`@b88V~AA`#+Q#N~%VpGXMt8aTCto zxY2k+Qs5v;Q{f!j$MA$836_H_$?EnqC*fKu5lBt9y!?_C^<3WI5mr3y^tG)28A*m zU-kF29pzPW6|Ua6XCK3@nO@F;RkVh(kiN`p@x@uCz((ezW0Le{c! z%Hl>el0Pq~c5#g_8$0@Man$s`q8^Y-Bw$Gtp`|^fBMg~yt)n?bj4V&AeK09C`1%v* zI6Ot_RX9=&J=oKyAOl2C`FTgfDoY=R+?`o*bJ~g(i0{DZ6^+$fjxlvs`vCzaBfN4YH=q zaOyGzEIXE51g^S6!SZaRi6PY+PbsdBl~j>=l zM0rGqucm`$OypDqo$wQ%c0ESNs}|9+?P#|#x@pGj+tGr~`cfSqUv3CU9@ANr;h$sx!i1V^#jo9OIPztmN1!j?1A5I9~mMFuCAIEqYA zJ5-0nVgJ}%_{cOtZ>iKas~}^f09^nlAW~ZtWgHb4KZ|1hKfHKTcqTm5ZKt+vP3?AS z+qR9V{nobq*0yci?bLQVwXJ`?|D3yXf9~=mD{E!%?44vs_pKCYL||DrNr4q{QEc%z zpK>HA)08-ux>li9`)0&bZ_#il=;Tr~R?OYcgx-%nJ43J6(CF4xGSityIJpgrT+9d; z$P1IHzK!L`p{cHWQE^mL?rt;&LcUfDB948hAs9qpTz@7HYkk_#*}U}2>=nJyfItG@ zshp*0Uc2GE=pccqbvE6DKArL*jpee&H>1Udd4272r$4;$CGTTnVWOqc%%r5- zw9C~}8>K+k2nz6q!^2TwY6bFN!Kj2A@l^4PMwJ;YR}xsuv8wz>%6tASPAm-rxA0WV zU}QuUTk5XXaxHLe>YLb**`~~`4{B@6qp*->LKrYX8x`!;V;u~1x)bo6Ty#=)yv%{a z%kfz-a_YH7iu>x17IIHgiaN2T3+eS*4WbO_=q#C$XI7EL$gkoa=37w=vbs<6o}MU@ zK||Q_M8)&F*nue&=JiSpT4RpV|(fl674he0QI|D7qFeG=gQ9c z5Hpo@@Q52DaYSWpT=zs*WYa?%W;(mduNsOC2>qxTe+p1K(Dtg`KC*VzaxvNHiFy=W-%A&tD ze>n4(#(*|dVD-S!h6(Qeyh+Z#z}E}Jh>J*KZI*U)d9xGJkZXs7hZ+kOXDR7Fosz9P>mEpo-4N`v*y~_@p^SeL+bW>L{6^wO_ z`ffeLhI=|>IkJ8VbgN4#LG`%+Z7Nl=VY~uIcrTKP7J=gwV6JZd2a>H7L-^M;!%fCY zQH_++VuHtAhM)<>xinf1w0ID7CI-*1CHXmA5G{0hNmW#7_bJ%Cb~Rn}U1DIDfso3A zFY3P=87fYk0tF^J0l*r7Ug40~)DRrIj~c|xghErEL>vPXSfl*v zJ1!;H3AafRL|hc#d>=aO9|+M8(JGA$SkZdT{z)9tWvZvyQU(F#pzdttAz0H~eW%+n zG^Lb5@Du0PZRvQoQWb7{VY#5311dAAl=&1(>Y@p{yEVmGjf>H>w>U`TSi!fzQ%!fP zBmVg8&L_3Y+Mx0ATy}f`l@i}6i1Q~9p~fI>e2R{VlkG(|+VLXmQdZ%rZs#+y;ZU;0 zh9$wq$`Q6B;U%A@!Pi^0UQ;cPk3y8Bjkf; zLB<5;4@MpMhRGP4ey2*E>E;M`8b!Tu^x7WeGKsfw)kX+3XeiAGitWowTGeyG0*?8! z3&NyLavfVl8Tb)_YAoAw-udyoT5(EF9{aLD2&XKY=ABJFDp_3vHC6Ob-7u>mVM^A% zOo^?f3og*#2RtgX8LRL2A0-;Yh%lI1<_M`_sczGaNYYX016i`9VE8wfM)7qX3pTU7 z#ZsCI&X_ct=Yrmlx-sO8A!?K5-zexkxO+p#jz7@S&k<_vmNC1WtM6TqnlIXK57!G$ zMp|g!r6iMXd>lElI!~JbC!fTV z65H_H-3hC)dfVBU>$_&6*%-!W^M6<+`~P}9kaF-8W~#mHcwhO~oEO;t%IR_;XtiFp z->2tvCAfuUkXHX3hDa z)AiTmW)p&!$v<>~Qz;9o9yb37cz$d=Z@$2OjQ~it#27L zN$_0KG)$ZQ+sSl5F$(*F6v)U9u!0xm2z*daIjWsZi4EjX@o+DsjG_yqMN@+@;!jvv zzzP3ZX?Mnu9nakCI&CA?4AJX}BWMv)Ev|;X=lROQBh`BJCmL$lf3_x%Kmu=R&i@KJ z7|?Wkb!pQ9B&@E8rMEWb^S1G7cw6-4_W~FhRK#2#?|BL>UuEEvIO=+C!+vO;E=9ft zy>Lth{Gj~>aY}FP&sT}gK3N&Kw7*w_a~Krnx_{)r3G)PvxN*VFrf6ZwX>IqCSMTzQ z4rr5nf{rsAJV%!55FXOApMXnHz~aJ}_w)%oSP&z?Y@?;ybd~k4<210vXK>;R-0yNz zFVZ6+$!>n=iU*{T?UAogl5Z~&3-O2y=ylG+MO-u}#fB!C=FW}b>W4v}!=kv;lQN2? za=*ksmR!A{E^T}{olgPAN~_Pq_>S|J zSQKLC)~pb&Au*l2#aQeoM9#8V4{yQaucI9vsIDO)JP-{?m}>#f|MZOG=Em0bf+W^) z2(K0sw*jUWJ0U`UNjEqY8%9=&oyhb^4rY2TBBmy&(@hS@HyLfzr)x7gwzBg$Rlwi! zliE=tr49<#Xbl@uS11H7VA0&w-3(;;y&2fCu*P$Q?)IFw=uWTjx6_Z7i4yLf_KP-n zG+VA1v$g211~`3JRqdNFXd0pbwICI4`R0)IGs|r5pI8dX4PMkC`PZcDj4ll&E7jIU z8f9(w7XpwecN51&nyv<8)?~6~@9ovlT!)QL09{Zo zFz}n1X|3E_^|H-8edeiZ_2et~f=tgVmeTpk(PFH~U4OHl{Zv){DHmy2{G%Dh`qZby zK1r%dKAM2s3nJ1Mko{|It-MH_J5nT*4gzO_EMLns34SCRx6tFS4^6xDwNl@H!GBS( zo|v7z*I9}4Zj@9^KIZ87=K_O4Yw}#Z?&^akI*g8m&(<6^bcv%s#v3h{~>+t!UT6C1=_R~jfW@`44GV!VEJ6Q zP?YFz*+UO6f!PF|tgg2IyVdhm+0$sCv~Zf}&>PXtkk)gSN$AD-;hdD*54^Q>P8_va zMu-L7pk`|i+^XD-2IQmC$l}!EZ26?5?A3`zPsXrm+){)g6MkLv$;^~%Uwfc2wIU^~ zIs!uC;%sJh^b)cmY{DcfiFM&($*g-gOWJbI26Sc&e?Emv7X!G1xfcfkfyFS)C9A=S zAx|KhuvUd_DNhnqG7&w>!}x4o5OT|R+_KzLbb(ZjzpU$|F6Il&X{3HeG_gc`<;G*A zz^J#2;fs1fObjpUl{DU)8lh3amB@`1Gn0@#vD3tgh^lCMDPN~MDQ%hki_fshRJ{^b zF9TYu1s&R)0!=C#7FICok!t${Wd)rE?TKQ}0hfd;EbiEUD0`N_iuokmvC6+uBYyqL zPt7lYQR0FNGq}KgvALVO*ytV%)@O*bO3Q`UZbJyZ||3P8@R(-7sHByf5R(XEELVaPn2b zV7trblMpjue?L9RH_pH6beN)SE9Bj(Ah_QVmSxe1+_pm`aSR*XEU}~~HcOd^k#WY4 z%P;)HIpLa8(Sx$1k6NMV!_CRP&_e6$a2ItsV6;fp?dRl^9yiv)PQc#a-D%MV7}KvY zdP{An<&sW)*Pc(;2h|ubuI~0DCr7u6-CoUpzU*#rVNj5UYg)sUNl{sgiT$8h(DG4s z=5~C!8XLR2i${758n2kD=zHD6CG>;0TOnHJslX zbxcxgYQkU^V7gR>#21kDSneKfloHy)oEC{~BXj{4)vw3u)rmdvOAz;-8jh54!N*Xk zjn?CORciu*2$!|OhQZ_U1`KXc&(OP*NxIb$w~;!^SnJQnT%ZFc*G|6ATkL-;fAV;l z->vEF5rIzOJ&WN|BUeKA5@hDjO{<#`4oq#2o*TNhH4`a0yB{+w&8PXj|uAUD+a z_a!c3D`%!c&?7r`6n13M!K2rM`8hJR%%_kX9WzfAm@SAMf<~=YW_5@xJ$$qSRGa4H z>e`D_!4QK9MG!8|a12&1LPf#LfTr6Mic{LBMW(FGV0Hoo0D&dsBne9B&T}}*0eusw zbdd*~=$@q{t*64aQ`Iy{7_UK5A%B6+bqsxf581&A=+Es~l__;`<~ZEnm@8XN@ti9n z$;o^Gj(vyh?8zEv0Yc-5IPA)3w&b89Syzh&l`HMI{~%=lAeZ0|pws1~>L;PCb;uLy z!!7kcn9d3IsdlXGr^;z!qaXGZgy0jgtK<_cixiC=PzQyvl$oRqamaaA;(t%fk7P~k zk4X{vN;MBpDrI2@q5}_D{!l5o*%zVGA$KoaE67F9NKB*f z!TdFybK*6D*>4hDw^k^P-ZN)I~S` zFp~ygs+e*{?)@0;P>M9PpDLq4l6k$6n1IBr=QI~Lk&*;0#K!c(3H$@pM6f!+)R9A4 z0jj9s;+ziZw9=)bX9NX3R?wf${R0X91GRcv;f5r@q5)6X{?wrx8w;b7dC_Iyj(*+8 zFO@RqR;c>l?6n$Owe4!+P%Go;^lDdNKz8y*kXEhDB(20e7{;Vm(=&2C4ieG)Mps7g zWV2W_1iopOuJ?@?DoP`7cyRZs+ZHlcHb*4Q^MAyU*acA=j|a=PGh;ggH}VvuscnEg z)=+PU=PizRT6n~{+z!8;QVb)E2MdB}Vcj63t)n|455)iU=Yl#qQO^4_DK*OQA2=EzYDTC#Lw=7*pD@9b6v>@ zg+%Cn%1}|j9OJ5Fm|{^zbl($)rzJjN?{U5^S^eG$7l%oNoia?ej!c&OtT1v!4~6!6 z*5r)EU1?zEFmK6kbR|n(w50wOBT6Hhh#V3gTR*K2|K=9#26bqk%xO1eBjR;#iHc(t zOq^iuXnGG-Tu%-SH#c;-bhubP!1o)p9Z-GlNDz}mt{%?Zc~?B3cL`y|WN5kl zWae`>wEqfQa5w@hve&ECaH6lT*Zq%$;n(8p*Mg)CZ3jW2o*=Lw5`0H!3H$++Fo&W4 zzfC?uIQYGA5zc+&Sk7QF#Q(RsD#mGCE`I>ffSECPu}NOi_ZB^sldkd-`d3bJoRY>a zj0NXoI>JsA-!XJ^LC!@Q|6xevE9-bI%NWwBbpB)JD&Gp9cE=?daPSdxuEj+38JA7g z(kMOs;7vG%^=tyL&i~f!8arN{G-U7S(Dz2#N#D7-eYud}t5@S|hAm0j)p&Ufmb^>}XihxcdlH0CnueZ*g;>A9m{2-0b1ydVPC5uP0#8@O0wM*2|8jkp51W zd0IRDdrSkIJ*+I;r)^E5#YR6EJ|lRi(E+s+myR(y=2b}` z&}68)HrM_hqP#CWdFr;2H-7M*3L#wav3eBxn*M$xw3IKI2s-}A*g4Z+r8lZEjq?c} zb-2+HM=e1$m=gCRoGd(9S(ks)_{-`2=$Z zr@Z&R9NEdXS*)+ps*2vF5Op z_9`4BvH#-fZlI39=z4tq>w*c-XU&Gos`;pB^KRZH7a>mD7NGk3#fGhY-D1+JlD@Pu zRYnKh>)(KmE#PC$Vbw(8&g$IKce<(C{_{SUal4oMZAI3nf0Cem$b&J+PmJ9v#ioIQ zk}GrOnS?UAW}KRudr12d*$Zgxv!O*^6+aiXs|C+6(SW~9rj2hJ*ayIw?IGpDfm^+U*IFD(e7zb&1=dFO1s z@cEGKv`~v+uRgxSWkiGhQyuV&|c5-_WWA(GLKBV78$XD-#W~xu z`bF{AoVED*xjf$IbHdCh)k;?~DjOH@x_1Nk#Juvq-|ZeoD+^bcVjfLz_feyPg@OzQ z^s_e&D9_zpEu(c&8UhAAUj20K!V@om<|Fn|9Py*UWj?ZseV8z@S$ryR-HgJ3a^^vorD4A~%*T zC2{juT=s2|js6}&j% zqAj-n72O)qg_KJ9udwR=yEcjY*MAHjxGvNa=tfyOc|Olu%GaCYn+=tRJAO`#rx<`c z?Z5iM4^qQ)6{QhEjQOPXK0VqToR&XBf7nP=+7J4rcW%hvohe12DFvZ&-*?D~HzETy zGnns7{0Q)#Ou?0_QLi;xocws4-~gx}Fo1WD$;WF*JeenGb_{H9$u+3YvR-R!iO{-F zybAAhtw5$$j6cwZ*E#T+<|GtWu-?U;N~-a>S_d;!AVr)SGk33D*-iWk=_QU4`(67Z z5gMiZUT{*oL z0Z~3@!yqr>Hl{kH4ku|&Lj=l6hugljG=LoEiI?%L`qiYO`hP)wFT1rqhy3~lIvlAq zQY>jn2QZEXIYco5H7cysOIg4JLPiltt~_`h33S!Wgi3IQW>0TkVe41hGFo>i10wVu zoEdLxP%$Fh8M?#+eXQ)gddmeSm2+6iVEbTC(G(I%l9DlI1gytd1Tip9CBbwS<{T*(As`MgoZPMK;xBYb2 z>1=wH7?go@4ca`UotPw6;fqWY`g-NvZ4X47>OT&;%w-ImCv5|p=2SsyfZzabu00N% zLDhxrY{?$?x1P;(q*rCL8cbcKiuV3~&x6(P{oXrBLlXG-oXl*^W&FmxkvgrO70~^- z*}FX2h{~;kENH@!bD0N!A1+2s+lm1Cx#MRs24L0=TM+K$Ctl` z&Gd3a&0JJ_;re^kYnhNE_ORz&1Nj_@lB;3sIxLaZp{ez-K_ph4*6dYi-^sk9qO#(AenBr}tTo(E23fh51gKZDoTomCQTCUE zi&>@>xuw&LKLmQ!Zo9AhS|~+-Q}3HCx284;QGPqXSm+H}xjhr|`*#DZeZkt)vec_Z zyefkM#W8sv*SrjxV`gJ@?3H8%S{kE;2iC-r`xZ_TKD(l4D-?sp)+n)Zdk_$o$ke1x z+R8qX4A<*s-wf|5h)+sFIQlEk-ZH!%4*r~~5K9crtVwt*4oB_c{d0V8UQSza28rbk z2<6pUoc?_))nO(%xWbW}#$#tSG(%R)L%3#F!fL>^wY=4=Q+DA9yqG?FEOP3}G;>=a zzEMkB(eUD@eB56m7f{Jmd+C;&iz=dGY`m{#H2>irrSKi#Av5wyv*oe`IN?}mb@g^| zZ7oxms;yWGVp>y9i$F94TvIj<@7pPh=!G!7k^m8+Y3aVf_4ziBu}Mq0VI%q77P>EMFopw~uHGOX4ULq%vwSdgRu7?`jBhmG*XG;-K@E=>K->%_ z9&tfMDE}<4J|r@hsN%xo0=!C#`GJ3wUGS&kGSirkk^wH;#Z=!9X`0xpBqeNu-R$%4 zd^7@YWQ8x9sP4ZWTb{mHRJj<4HvPsWn(M1sCr=($~U|d5rg;F z6kzbQbvuhU`(GrQ4CKH*Y^N?y1+$Uz5mKY zXDub8N<=8m2#e3(dUkk1ryxvbr4au1*8L9OLWxQp`GGJYtl!;^j zayk#MX%6Z8>*0~>~BIX$Sk8PLD>7D6QPC`07J;;COUAEeuoZ9P6-K6}#u?q>KQOtJmmCwUX`x2Vz0yL}4bX&(;P`mhd7 z!9}g}`>QZg)B~|>6*Hbc?}M1g5kwJXNo1{vsRWzkOo^wstsZY)m0%s{A|5z6@wG^Y zp*K)Z-E3)*W#e&~M>&}dae_?5OVpDL5v!l!m23M4X&^Z>$WCpGIazF2RW1}&$Zg;Z@_<_d$g<3V+xaTH1HOj#Rj_9u_Xc0+5DiS0|$GoVv z#6Ln_vAgcRqU+JY@a1s3yQ4-^#s6EVFVCrnG+5+z;FC$1Y%#PLe;Q0j9S zsm}pomeE+PkTvGxPl*IL_En6c>t|WZus#OzPR8KEe(4*%)KXE#{k{9ze}Yq| z*Lfa5u42Y#c%%R_p=48d7d8x{Ae&&}r^+^TU%-qGe4U8H7D|;V#z@h4A&O8Wt5CH$ zZ?`5~u(YB&udn>v&Z(PCl1}6eGL*~_LvbRgvTt83834mJ8zCC7Z}ofl*9W~Tb07Os z@0Z)1o<)A}+XhPSr^5m1sv5joS?f`BIVc&OaXNvFiPgW82SNeMOR2{jhP&1PlYPXwd&3o zTHE~3eERom+b=hNp>n0a&?p(=u%x0S5jSi_^!S*dbcpwJ#6VADfD?vkUsijb(43^x zXm=EDKRCEwNDy96*}uqcN((NgYyX#i{0Q$)6eQ9$OfpXDDvcyA*0a#KMuerkZ|l5yB7yPjenfLisYZo z;}e;LxkzO`$54xZ>N*~CEA=`|_BnmNq9j9CgWhKE+Q04#y>sqfYlrpt|K93?yg3WN zE*pTnwbAHm|LEALF;{dwsi1lQsHL<9ec(^fEOZDhEKpZ=EnPB4(P%W6P?#*Qiy@ro z(j+L+iv99KOorlTn%h$9WR~ct$y;7(jtwo8C?{&hcl1e?^pHr0#y2*wkB9joR!jn1 zmX_J;x=?oP=ARgj8%U7k42WQTMBfFCT=>+Vk&3evKV&au8mUrzFC;vDNT$FGS$9y8lu^@F#JZg5ly7A zDk>H?jBERe=ylKxuL%z4y;VqdqzI>RdrO_hRx5#3-U=Npv7T@H>zI?YG@ePb+_FH( zt1xO3xuTx$T-@`dKYWOUrLvp_sCY)F0_4W0%3pos<4#4+R^6O*ol|)cc!fRI`nBU` zAfFaoORyOqdGo2xywOiKeU#aD;hI+Nn%|#QrvS^=`3p$RfM#__z_6@n>p?@QnKXL`{L5hL90hZB3$lc3*U{+IJ z1-q}Vv-fUQKs(16XN+B&VHB1$ngL%FrIx;nPjTc*=HDz?4DOt;d9}EX!Rng<0kYw= zS~>Zw)6;|}s0~?1!rGU%^w)Z&@OtrYW>@&+u&vr9Ah4(Z0?)hP@Z+?@$2BAxM>zNZ zY)@LP|JtQrd!SVi`9Nc5E93NIs-dB~{>ec_4dPHvZH*s1rv9z$_%zG#pbt1&Z{d|L z(Hr1t{8V;4j1twfj$2RxX=N6bm<`Q`Nv#mE*yhHfSDMll|GW8QpW<9MhWj~K^Jiu~ zOr`E)Q~A9ug*%)i$UuV@?&jJ+;W6WEMgsldE$Z^)o!Jt1pzGu1a3xb&7 z5I=IKWbw+UtNxj9FChr*WssA3b56()(+|5wd6|tP!M1Iv#KqnnO*iQNccvCl zd!5;Ym{-NZ&E8lS@jD=9W`>)w&kbJYCY=o5sUS<74gRD~jJtyaHda)e{`z};(5^x+ zHsDu=woh!x?CWm~ft6b5O3)n%pGCO27mmJ`v~nunGnE7x$8Hb|j}&c=suDNIZM#dX z%*V-69Al34E-d{Mto&;`r}la-&NCeqFXtB$XPANuI2k)6n5&&FI&}hR3XWr2w0n*R zUh_qRzZ>%Jot&b9@<=vUPW!w&5**Uy< z5=s*lS>f%T*-(nZU@JGTKXiBA5=8-zj(mujA^2g7tG>T~gdqK!wIS?@={WU=0u!+}Y!qLo8GI3v zt)S&{5gdqN7t$`p)Dq6>quwV zi3maNbAIfPT&NQP;K%Xuy^>=V|965zLH9k8tl@+A*8wv>xnecMK%EZx(y>6PVall5ea>qf7sdO%f$;cwdko8bz-} zxKd?EClT@TM`wC%jehZtQ=R{OWqQ4l+uxGQkhhud4-0=Tg;73FqZ+#@y_b6y!L!qQ zlimRnz?~Q5nl?n2rz@H==bgm^g2$uX*$T%^Ot(|i8mMk>HqP_tQf1c5vOu?1sMq*j zD|ek#T3~Mm`C)dcwr1}agC9xK&N&b95RkIUtp&!*MMF^|YHd+N<4L?7LZ&6C9EmcU za3b|;S#x_!c4e<$kq}j0;%C+s^mSIso5Mq+(y0Z~U;9|Q7|y`&Ptn4$*v}mXpeW25Z(HCsiG!1k*1D=Dzc(=Ni@%+ z6w9mwL^%sqkq-}uTP67$A|g9pj7oy$it4zNV9VT^_H>B@XrycjswF*sSn;Q*=~u|< zOY#|@XLWz{0hdjoj2Tw8g_N*3k%7yidcs?5N*sKmTZ=*3r5w7GD(K5{Y*Kv#CbA;i zfk-y!!cIS#V`3fijpg>vzLpuxb;Q+Qhg!e;!1qFgGL_%?U8 zrI3~%$5aA+8v_B13w>!}kciB;L=Z(JBg9aV%Q8iv974E(Y(d|J$_YlUnirGq5av?i zr_h)~PBmP8PHeDHe>C77nPePi=`dmeDdJt+Y{t;5QByxplz$hJYDx$Ci=P?0tU4Lj ziwRvVq!4p34#2WW$>2h(F~uoM5Y$O7Yo)jNIOD;Jq!80&FssFUp))Yp69;2mf z7nOyXrgl8$t*JrNSP5&(Xov;nyQ4wIh%sKr38ALYREktw)YXAt{p*e4mnrGx72f0> zSmt98d``=lz3f=Bv27O^n^@)$sGmq+8cMCLVt%|9m29r`d6Eo zsJ0dYzuI71mr|aiIu*VrHk9R`NWC9~B~+vd5*Y<_*hvk`?_&Y3y1`>wL^;RLa^rdA zk@{#?)WE%PY=uyqSLA+-(j40>au)X_1`Na7KQu%s8lf-{>IT~20*V&o9NWb#%anCR z&BJfTKPpsV7X7aW31u0AQE%KAf1nA8s*1iPl{q;iAg7K;C?PRZ!z7QX2C4!e5Ar3Q z;ZV}JW2{`WXMJ!aRd!Mh8xwe79DmeB)7}tF^b`H@jHEZGvyJ77v8~riWmO`Mb7~s_a_0o=bcAuI)`+UFq*((~S`~Ayf2kOy)*>n5*o+`KW++OQcSAquFAbaS6s1VXwAJ!PrGQ|8m)r zFZbf>=LOitV=nA11nuUANvT4}@fXJFjQ&Tdu-mt>YvcQOx#DIo)jF3o6T{l{Yxarh z>4H=$_w9G)+CawI8F%{_N~8b6tv~{{!0PwUQ|FKGe2&$;^(%(XgU*zqZuIglY(W67}+(Jf4^+WqVN z2>q%e60Hm1QBkVvGq>vbLx^Q>eL!Gdm@W{b{xrKf;IGz%OB4H#OZ(g9BBXiJJq!)V zKnI4Z1ZHg#D&+}M{6Wm!8ZiCLCyXIH-=s+1EQ;QdW6(ptR8&Hs@Q`I_nLNV2+U~j` z?Q>l=G0`u)6!fIcQVudm$Dt;eb=GL9UHQHpua8wqBB!tOtj{#&9joYg5|jqVE4md< zW$FO$1J3&?M00-F_=aN4b#&~#K*>y0s%X)(O?D+B6W?dxC-p?sJCqF)<72}11+t2` zn6cbp4ofH#+&W7HX^0~TdvDNR#0CBA8v!w|m6QPLVro;ecsrZ78(biIz9(M7F1{uo~WHS*YmQPLF@DJ&EcJA(pFY^ zj!!BShL8os3T=v{lmrvRL?xukB4W)IP!hH#&YW4_)#zsb7E#j>K;QSZi^79T%t(c^ z$dG{I_(qly($sBNwodPQAUH-rKn6vxumK30mBuA85}ma@D%B$UwFV!K%X>1{DN4)m zw_NVxn7NsAQRCGlDjJg{2NICeS$}Pd<;cjy>1Qvj#cr;Z8422wD^MtFRhT6_@ES$F z4f!1ZKKHnfQgi!(p_cJ{ZizW6M#Y>gcJi}cDFi+*ksRf`oTHwO$FgWkm4ydS+%!X~ z-vkj~wr?M@3X0wk#6>1Z@I^=4bD>HuGKb3?*D1W*<@g^mnSsizg6j~@=ANDKjxB_z+h&qU$+a573r8FdQ2w?x6iTc059srUn7GpB2Wa1GiHhWCdUSKopG*qo;W&#KypUPf2Kcyx8l*ixUnccrz4mCp$s z&%_TXdW~;p+ckC3J3iK}O{*sCT+Lm_)?)}=La$=0oNA()ybv}dW+nlT`%Y7rhYR4* zn_WdckoG;qr}`ZaHW6?|4Hb-p3>Ac<4$6_;Tjxb-Wm?Grx6KqGgeho?(zt-4l@Ta! ziYW*ujyDqw=McItB>|k6K*Wf9HNXspOlIPN_seF8ofLjD8lgOtDlel*m;*o7!OS4J z^as)L=G;Cfd=zz%5)Z=_`6(ZvOpHeCGoUb6s+MSEzV zz*o>v1_ls>VB{gfy?M9Xo6%xINlI!rp`HuhC@_9rDARC0LcyDP>3*vw%*b4Kh(vyN}z@ zPUKOQG^koflP)p~=^SOj3X8)>4~A>yLX4?4FuPDqTn)&@EqL?em4p@?hC@1PW1F?i zmH01#-h*;xG+imPcJm70IP=h@v02Nqut<@ZDbm3(QHi#sjJv*8Gc`A)I7ic{Ht3s+ zHJFokC_k7eJ4S&*fbV25%wnin+&{Rnbn+72^%-duTTA>J87@Rs?xT$75)Uk-q1B+- zMYKKI8v$ktJ5I=yiz%9jMg66+2MQ*k0nfUG%1E zV{?1F8&)S+B@^OfDb)O-U6_&+K$l915z!;oQo2(&&=CMBb@+I@AQk2+@~dhi;KrQj zl8|q@?0I%R$!@L~3xOR7o}}3Hp~76{6R&& zgG4-)`Jk;hUGFLDPTo@N@KP+WF-~KwlmTDTnb<$3=EpDh;r2%l8N(oQ!m)?LCvaW` z_U%yf^?$sfATB~|JHm-cd@4F?vN)oGgV8bPRkW-HJ)(gm7pRX&cC3oc*9RHXV;~cN zazMm2pl+I*nqZ-d5D@W7x=Q3>KrFB!=fNW*IZ!e!lK?FD1H`O;v_;?iwTX-LB)exa zb?Q&PPY&1t^5YZ|H64O7UrwkG#DY*sn}c~Y(2*~KPc2V@V(6!pnfFnUshZ|nv`uo? z85PF7O`4m5S>Re_b58K_rgkkYvn)BHEj--kVYkS?OZu#NR>IH=|G-Kwh36>FI{k~i zO@}iNb_)l%xnr&ivX(O%}-%Ul|;+?np^rPna+BVpAo2G|}cD zxg3HU49;DfZJgl>KvTt zyQSN~fKFzN-iG~R`+*MxyYBq3LqUsd?Lft4o=KTF2w9q9A-A6k{=;?zgF;zG9oj=M z&`=H8rP?SWN|VYJ_~v>NSy@O>w|Q0L6HHU2oK?Jw0YUgLXi$f+OU$b$2gs?A)j+Da z9>6{W*-gOS4|D=CM%X`y++O^kMhHMuP364?DH8PNJhQ;|JAMq5^@JuyD1lQ$<$Qir z5R|B?BtFOxoNSa}%-_mkncLG_vBgZZoU%7P^N>dxsz3JhNO>l73rL4E4`1vIUV7Km z!#b@eU2VT5BA}?hkxvAWeOkW{THB};kzfR%(kGJ+sH{Zo!jJe&#)gh|HhMbG2lYAj zbJuh>Uz^+9F1|qzZ<=4yqP~#aKYRU>&f~hit=k1VJ^4Gc!c(UzY0({pZVQM^{oDNg=sv`LwxqkZ|bRe(- ztRb)K@-^MReVe;tD{M9N=xF3RXh*L!J0|Ur-F}myjBog|6-fjmayBo}PNz z-47@F%y2SNFjixKgzR%XnO>Tg_H=0`Wk^I*C+KO4TzcHb$av;T6!Ul#oMdwBOy zT6s2Zi+pY1kO>5yW%X);FjD7OCzH9A=PL087{H0qH zK%D2cs(*nfbB~{M=rJwqGjBeI;-3t2jGOT~>I$C7@)UrLr?Y~HL5+y-t*wIWMJe)L zs*K%-R_sajGLKaaLUVfL<@9~W*(3;6d|r#k@PkF;gw z&6%n32s5T3rgBQlW`KX3eQZC21x}%6z~`gIC$(#E&%mSYUziQz?q@Xo2leB9aOc)y zwVt?Q;jB|eV7Lgt0(1Jnt9I4JO`Gd~S0iu1Kxygv9@N}6#_f2^|GN_K>D+`WyaN-tV7jo;PeOh9M*oWk-|?_bB&9yC0Uf$&Ux8 zwt56^|2zDEfjYugW4U=I}RUfd!PDxWMN_{Y->?sziG`T zkrw^#eW~-$y1f?B%1t+hIZ5-{wiPS?f3@9j7Ld3F08yn~cna41T|07N_WiM#3LZ!~zH!tJ z2@^a62-~eYAD?-z?|usMCur{Rownz7{~Xbil)F8#WF+ywGwmPO^@;B=72CG~`a?SL z2j=%)^fxyMyIh&2jjwbd66W{avseEEYCx60O)|J*t{y!(dV2iL(Tit~|M&Rot)_?; zLj>s)xqKkkqZGhjdfE)p+9HOa1GH}Zb{pq{^}3;HWt!?IInCL*e|~-O$#$`A*a|*e zY`Z!j%woE>o58MiKwO<1TU2!0(1xrKBW`VVI_=__RJZoniwf4TXkTYej2LfwWB zn~gb*57#%}blcEIm)MLh(MFfpj4shem*|hKl06r5J$`h29L}bf=jFeTx0)l{2$Q2D z?5A|~ZZ?m5pQWEsQ!I}Wye?(2WPDn0sDz{T9_?+nqm4O9fsy~*_;wpqaz{|5Q&gne zb+jQQdqZgZZ?}_QcIB&w_y2mE_`KbYHb~^J%U9nm?zFT}UiFL~pRZ&aO!9ZlSF(*L zxlsT#6STbW+WYM7Y!a7Kbj#Hp<-=P!g>7x3iftb?7`6Q7*?y0qlhb9(zmGrJxYZUQ zq^UM#4!@J#9kAB#r0v&L-^viftNXw523wSq_JfY)&Yo!N9%vd*yvIoXI(MiRofX+g z2&zR))yq=GB?Q$Xt?EVEmHYp-A)rNBwS%a1L$zwbR`oKC0mQG?Qf>ReHQe6H4y!f9 zc?hXZ1LzOBHd5cMjl7lX+WMbmpG)%dt)2oyNZG|I7Z*<1Fdz2YuK7d4!;U!~W0f6XM?L825!*!iuvHOG(7_{PXWd7kUj-TX6A7R)KXiXsnHMv_s&vAGxaw%SN7~) z7egiX8$CIFJ-{{Dp%gU<%oat@7E!L zY;~jnph$5C+Bi*(^Nc%aOjg*QQC@VC8?tTLb4+_oq2wgbQPHvq-liO6ke=M^RkM3) z?v~hP^xGxVKAukArrG5X7m=ua=@;xuU&^vyx%4s=fkbLTuw{w*0By72rf>TXFJBEj zQ8^H;G-Zf4A)VI5C+95{+|aG9vcG$F^wl>Ozhbc(Q5pw~vmV{O#!3^C4C%%aAawq@|5lkV&URh(ao*K6@UtbAktC-`-o-R@(~{^!3%rP|#8eRuxfZ*;}U>$y8SslNKtKT+YN_&QZT zWK=VY3ZtwgeC|%q_x8(Yb+}QoKXoWlw*AoR8_iGt{S(MMoy7q%&rjT0`gFm~>R)?` zU!&Czwa8ERn(lCW`zNV{^QYv1?Z2DEixd1w?1$NOhS2d-7k=8?FV)nv`RMgLU1^EW z8ek~jN^!3$s;~XlN++uxe6~~`C-YA|zPnTq-TbH7Je*7-->`lmJ-V`vzVSmb`fYQU z8+X2@Y`R^lt=l|Wvwe$b({J%T@@5cPUJAd!?`g_~`X;0z* zEgOB56F67ttMCLXP%Cf;D^M%&2`f-5a11L@EAS30P%Cf|D^R`t#B)Kd!a1x!t-wR9 zK=pPLcbm8?@*OKsYjYs?s)9WQ=kK)1`TPCi>YL?Ve>(d|m;BodqtGN_&IYY?oxrD8Pt?CbF;@xA-<&N#vfHM9 zF451sYj*$7+>ZS}XSe>}#D%C&Z9fiC5SsxPlu*IjkL`d&)CI@&Q{%V0)_YavzuFU7 zaT_i3-*J##&;JS{VK@IbaGks{VAQ2Wk{ucm&ZNzu84wsE8SxmWlVg(Ho$$W{!XG}# zh69MBqDhiw#+#E@uRdP0e92&)!-~RaWNj6Cb*?5Q_ z^d<)*sNnEl-4L3&rMFo&(?E4;T2`JvYagOT!;t2~FiMW(NXRyfNivr23M;WP6xR5c zktLjCjMoABtNFnf4}x>_2<+n$fnP_$mMm}o6dqA^J4%LB+!Mw#1&6WB1lu?kXQ#Kx zJxgV8%N`w#6Sd;xnuJSuYEO;V z))}(GkJU!Lem=WuABqOniG~UJ(K=4UnQ;B=VC0}JcjekipgC08zVo4`bvvV%bF`Gi4Pr$D-5s}*u}T4OYIqv#5xyVe$!#56F_>~h3LGo^RJ+$E zW13rS zK$P2Jd<;kA!I06Hu#v0!c-lY?4kTm3wYyi4YhgzQVwkR z07*wVFR5>;n?*f^ewgTG8<06uwjq->Jb+RSMH?pIaMm`L4Z?=Q+=?i^gC&}O2T76g z*Z5RCk^f7JpTOV-rhB&sIa>IjyuGzc&gP$+UXi`KV|N!5c6Z5*Kj@>iv z^RHs+%6h_voOu%J46HBJ_oTV9_kNz!!L+qhY56G@Ie7}47xuGsyRWjN6A9JGJKPuf zRT3z-PhLl^O$hb;!1H1hMZ`2i>bc0ZF%BZ)(h3sSlesi}3VIlC)-z66{M$H2PI5yK1LBW1I+0W*=|4xGGiMNE3zmF zNsSWeU^KawLpe>E7@+;%E-ueScCH>nD`|Sj1?l8qb-cDNB867$S}s%sMRx22F0$Q_ zAdk3kfXp@P?2?M~TaP2n3aQe+@wH63fcm}{V1j*{xq*j$%kv!IJ~MO)b*pIHi8Bn6 zh|hpQY=lX`JLE8*a*=8W7+Vo?BN|&!s=me`P-sDRZO0d{`I45{goa_rEJ|ZUEgT{o zdU5DSa8|sE#xO~KOvlR-@6donl=0@p5z)6S8o7=WP$w`$9O2MrG3a><6ntHZb6as) z3W6|`G!(M?xd?C*Ihd<=W)Ws`5{3L$5EfcdNSMt$M197%P>SsuZD^VLcR9XM;=0Z|Ct^cEgx~4QV&kJ; zJW?!XUd;=zY+p`^6%=d%!sg=y-<;+de%|dBdpV~SoMDGC?f}`q=?%wcZ)O9L!{_{T zw>R_aI87$WUa?Upw^Pd7(4*om+)v9d@RiOy`^XjUnZaJ{CTT>i& znsBQ??nk|67=MYN>WZUmBIq5OKLm z;2)HE^}Y#2TQ3@sKA78+*$PhDJ(7s3W+(Vgrv1_G^$$ARa1*HMy1TV}MpnBrf<_ z26flCiJdY`ALM%+-3gcTlW95SU*HPa;0Z@G}(y-Rwgvd}j8HPc8Sw=1Ym{29R15RDZ1t#Oey- z{kPk4T$9+0Y_1{b8c}=My%=VKLVQLftPR_te`U$;k3_nP!wL4ao^UqZA3 zZ(Kq=>2d*fzm0l#4DFpwt^j)5acZH40LB@Fo8Qhdsh!Bq=I*o%$ z(gzW0gllG6;rrfBn?oCf20hqpXK5NAh;h7mz1K_Ubd`B?_0IA#&khTnnkR+@g2^WlYsF+FAkz*4=nfm~0=a0rAiTFQ0wk@XxklBCM0 zh;(H|DG2#qw$YWarU`$HlAi?!Y`aQ)*Elxh`#OV2&=;0-&B!pMoBE^TufEprO6FQ>ic8PrigH0BIav zmJv`eerW_uDn>vw9Sp%?J~HHUTq9|U0%#-rr`Wg|+_RCi6DGGQ%YiL&vE5u%uW4bT6Rg|#2=D19U zlk0$6ltWuBTo6qC(gIV4IG~zkV9^$8F%mlWpp4t7M!_C-=GN8*mi5@ zk-p#O?fGnvi|=hCDc5ptB(=6MH-hr1gC?8oBh@)Wdv(jhA@haPHkcZ{aTnn+FU-;? zSg6I+D77}%F-bbO8I16-h!e_94)6>MohMUVl!ZEV4{=trM5N2mP+6kHJJ5(;6gUq} zIuP=$UTD|Y&zb7rSZ!PI={~5MM`6UF5E+!1MB&hYDD^V@cAHhtv)M+6O$*=&Q0#n&w|xVB z^Pyc@xO7lEjm$Y^<9_J&Bq@Ehs|@;9r)k^3EA9H66{+m8p|!D$BF&Y>LLeItWX-!a z_iRxfz$#^N9>gkh5-$v875tqs5X#~p5QBA)Py&?2csiVbAeypFY>JL_Zzrxx{4$1C zw0kU=eJ5C&1xsJ)(4K~>_c41&Rh0{eR_IDNsH9dEK-(2KFZ%UZ5g;v0+1uV0Cgf{; za_e}r>wp(yMN96PCuPN5DPr@~tI`8CPq^;Ckv|^5&T7IR1lBP2;s1wRd}i4o8gel` zp~-Y|u$@+K!OS&-Q>2*v$qn|Jn+?oPK_>R-1B8nWZna<$p*0JuV`l0Nmp}oG-6fb+nXc>RVklnMF zsN=L5P-?r6vi3-}DwPJ&7TEZSAHW?lF(zDS(kz$F(-Bu&*@T zKF@Arh*356#UFvCtf0X$`9Y&NC~Yb$XiB`iq$SmwAhfR~C6kCM1F8-D{Crm1yU3P3 zG_<$2JS1alGF0u>y5*j2*b-b&ar z^}k%i$+X%sS0Dry)qnMoSFiu<+y1Wp*CsAHkX3?y7sdD(y?T7rg?Rd`x>Cxf$ zFPHE3{zIr-UkbL_E;;Mzk~1?aSTE_-p1ee{B7YkgSATC{_}SAUpI3Fp-qtQI+4r&VK!o>ABL9g#<694E{&cV zzumRoYi9oEa(k6+ES~>-vFD-L`p>)d-$t&juKz4dlU?=afBWjs&3w>Y`*}JVWD~lc z;?HxpMJ;WM`=r>b5PRIKs}C)(dMVVov-HZV`mMS&q9TifZ7+1g$ni}x zwgb#?WFyDI)C(~UkgJm=k8_Y@sgBq)=xJz?7tTo-2Af zdRqBw+m-cPr_kJ^fCT4f_P%~dK8ySz(}_%Y3bV@?6;U!=2~6)sB4Uf(v-H8Z!;^II z%h;#W6ymM81tJ5Z0PIg@OfzobeYiZky8d+bkL!=;pTGT0gozYCeLnkg_UZiF`IoN% zld^a)VhSicC^L`=2WYmX0nx>nH^n&dd*bLlr!f3gBO!W7xarp|pvYcjAhNGHxGg2; zikt;GhE><}GTG5>1^Y1v%v;rTAIX<1a&@}A4R&K3bD`0nR039|lrhuA)yTpnW0(gc zE0Le`;(EnznTiDlWs!r$Qp0HZ z)ehlAcs3C%mk{ps|`|1>Y!k4WFkBxEFnX%UNAM%!1 z4hs~Zecs7#+Q&w{Q;;msJ{>hgSB+!4r8Wag_zn+7%O0p~TM_ipHTs&NI8)iuK(nb` zTU~6C;jQ=4(B6D{>-+ho^Mr8J;XO{bB1hOV_z&(`GMyAXcp>UgXYrX;6XXxgDw#ca z_Xp5MW(-7P(ZBE?;ND+UmQe}H;KHNG2gRE?%u{YjQ3pGwf*p>4ny?WHznoNms>QRe z$12|ipw10Io$>!6XXEjoF0y9gKP_+P|J%g%OyWP6jFfy_@aI}$KC=nsmO)#@Re^YG z$W>#E=UPHLIp%|8ort5AB91D|bF#5GH>AaJttD<#c{o=-5J-z~TU+>K>2O^i{{Bkw z_p6Mwd?872`PX4jO( z*|qu0i&qm0+!FumJCri~H?OfabO&0WSHH zcp3b2i8lvo!Fp@xO;gKf!(o?ERAL%-@T-`YVXWPuz)pMx%AacUzYi2q%2I~{Qy%n4 zA0TWry{iB@=Rd$S>)R)GkB5zblJpT=BJ^Sf>_-vjwN?fx8+|P#z;&b=kNQwVsdPsN zMHDEq3@BFz#T2Mca;Of<(?P`wRJ;tRPzNRaiDtpnAyz1**cbQw3_e45$j9Jt$BQ zk3aFE+=t+}ymj8s3-c((`^ZR)BiSB2uA*I%@!8eKSEqBGsd?go*Op15&~a?y*j_*) z)3L(P3|wkO)Fhr`?Y&pY51@@#^G^&|Zcl*Xd`yY!`QN{vT`od6hwsIX8T*cnDE1i( zNyO~PL6};BX9l(t)!;8c81)25bcDZtz4-m=)A`l64m6H!&$4YVVm=BY?08XtOq0Z( zPwc>PsM(vwodN1J{_w};A6H!n9P;6FECNG_O%yUpDdfcUqsXO^=k+IWSAe8~?WfOO z*w)W)F~aHxD@M0~15H1cT}gnZ2&@moP} zv^xW=pndV@#mDmwOzikJhiiIf=mb9FbK0R!#5|kW5p}5__h#bG0LcuxT{$BlCh|?} z`80Oi&?L-d$VNbv*l~#8pEEiG)JfbGTR2|h^Ko-1CXr(zhNCE?zD>9UH6yG4%M0|bADW0D*T#YGGJ>#AsmI6Cizr20^7lr& zGe8~f%Wj4bMs{EmgdEBhzU5)ANL>?0o{L;YNz`AUbp}{LwiEy2*d{&;9pZ5HSseL%-XcV8JMe6uOCpP)D6ml7{%e=K zodJ>xuK(R>reUt;X=r;fvxAT@;&W0^pAg$50bRy4>kLq*?5B&X@Bh!mG)Tm00snWVcrk$VArsOEt_oEBs@+J;yhuSgkS@7&$Fo89F$lA26;2jdQ{jc(3%cfYAD2*JWeU^Mh(JWh1htxR za7B0^RKieV({hEA1vaX1strr2q|lfOA8~{Ut}Xa~jCkTH3cBPR>2w&A%wqsE$p z(Hl41fGedjQ5<8424KfD4uUQQ&UL7t9tqJ~s=(?VPTDDqfYutOFmXmwBQ*2iLSf1v z9EcLR)~z>HU~N@X%|Hup!CgX(LQk-u6nuvwA(WdKy{HcXnwvqgz-lv?*FE}HvBPx= zm@^kNbOVyyaqpr=FnBPNad7n>U-QmQ7U=3Ko4S|<1d%tv%vcn;VKzWG%cKyB#~2K0 z{a`0qV0Dd;n$yvHWI}CW;3T0m!Veh3Fos-0L6gBPH@GWSoVs)od=4F%auLRzj?#J(Q7G;=k5v^3I9}r+54}t^2dHs1(`txM-=Sk$xlf&Q6^!+0$MDzt_=pdMyS-iL(t+F3wars_f>^rqW z!@g+wAT(${^8$RgVlNvOFFpB0_~78gCjfoL6M()(PXM}7(%__Y!8qlGiCFU(B#H0^ z{^gZ)jE6DgHY5s6y%=qF5LKZNsw6&J#vIj#XiJdi5JV_!hGiI4dgkzi8{TGm2`37X z;0@C>T49+XvdB>5#5l{DY`LKhQ{{v*NFwdHw2nu~g*4V-&Q)kV%P(1AuAxZolB%JY zJ-4TK)Qs-Is#i((f`Di5xy!8XlWP!PQ2c`iwGGanFMa&Vev{qog zjCuG09>Y_cTndNsOS%x||9}MPSYiR@#F$k939dK|R7nYD%d}y|qlV$qyXG#yqCn$Mkndo*AP!^fT+t^E zI?oa#y<@OWF=s}R-!*C~v>43%3()->{DtiFjwUTkEA zfpSbOlS~;FILsyQ!JtMKpHzF}T_grp|4111Fde9+I7B0uzy>U81o54-lX8YN_Qg>8 z;3#zpeypR01;bdFevzyCG_&!~V{Txkg@TU})=`b96$&YsV}Arh`yYWO8vlz3GVK0G;`01=LdsOZ{~8;5=lIaS+QITn#tUiNoPK>oF7Yi;K*nSvHL6W)-)tvxzGo)@uSbxrm|h$3OHn-*E^jku`Vh42AS!D+28xW- zs_eEm@i213_WuF1%&DWv{ja2)4Cj9?_x}kglllI)f8{OtpQrada3cTna64$s|2&AV zpThs#55$`Ao38&lGf8H_A2~iY=|OsAH-uYX^x!x|k{Xfy+y6L4(gCdUn!r6X+qFyO zm@XNjho8I*&|_j8ypRqN8^KdT%3|dyMb7ic8FQ$bMyGNdF-fSQ+ut*mQ67VL&^Op} z7c?+rf%9`0pW>vHUdK z&1ZaNKOUI?&@?<+ozi@H=_H%Y*Tuv+)`-f! zne4{=n*D3+B%;+U`Rp58+3+4J`Rq$R`zgg|-`sU>W%;Y+vu`T9*3%ep!)te~9Uk^% zb300M`;y##{QE{pZeNnyzcb10n+NEvY&;Ff?VBnX#raMM_9u~hUb5botoJ4BeaU)X zW>3D8%dq?pjwd?*lVMq(|G^{{W&X!Rlqr(`*?;mh%`!j-8r6=JHB{z+=FI^ecrDU~ zR*5nVbc&~e%J#HM?!**i)t)A)DiZ90gY9-0AgN#eRGXK-9rAU12#+9RH6^3j9CBOaFf&3Ky{;bkIsuCbTxZfBOSi^Hiyml1?spA?q$73Ml1^}tV`a_FZA?o%pPI8`?(MFsZhzl<4O z?Z-*L!edN>rAFX@wGfgkiD`6<3l;Y{w9i9V^u@lgtiKxvZ+Tj5Pu)Gy;8pk-t4&de z))uHEJYW==CdxZnu=CjvVsSrxGEDwSRAKPRVf&2MOQZrfK^lTIgRfDk$S|y%ur4o} zL>2Zb5EYGL+8Ko@CRkC5P}E#og;Ch&&|;CzUg5zj!t&-T{pPF2|AX#3Vex?{_QkwD zMic)JQ&fHb!z=zDm8JhT5oLDQ;YyqL&iK?W56_sfdCS&UU)!?zjW@Ub`t3L0+P3x0 zx8B(L<_j-xdU@04yB>b>p(ob;YVGq+tbb|sx)+~)@zv)x{@-g`wr<+|#t-g(__l{u z-@9tFQ2&m7pw1n^r`#)ckRP#o?G?I3y-dS z?%5Y#+3?DybFNy|dVR~AZ@sl`+xG3--+ue;u{GvX#s7-7 z%y`fCKR$onHTQh}h?#ruJL?NGj(*pkfqeMbE5ClZtwoq9T)%MU;HzDADMaU zU3=ZM==85Y^GEltfBm#i{?$HbJ$>d`U)kl%U3dNR7xsVuK6}iJ=j^)29-sL8#ryy5 ze*4W__7DHE`-SK2vES}{Uwpv(|NYVn|NOE`{$tsd|8@2Et~%$MtFE~2KmYs28-DQp z%fEZe4}W_5tv|W;$1Cr+_pWR2yXS%HAG-Peo6h;=-M@JBe}1%T^}`RY`q|pYpL}}# zx)*MF=CM0BtbA$B#z$U!{^d7b-SYajpTF|#)@{FW>8|sh{LEK(JNu*GS^0s-KD*?7 z&vtxgw+GhTdhUnzJ^Jy#-njS5MIYYsp%4D*pfz`#_pw7hcj;x<&b;gVkI#u8Jm7cZ z{a@Svmta5!xDf17pvb!U8%?XmE(lP>-^7AhF+--9|dZfK#)t=$Izjf?2U!C!n*Dbp7jJ=Z4o8ow(=cuRr(PgTJ(4 z{X-WWa>;wny5agid(@b3oImH=KYaetAG!4x-F)NeFF$s}*_-yRBi?`0;hmEB|6@Yy z9}_r#3t0Ta{-`ym{V`$Uj|l>QOo;bm0=Q4ZvmY}XU{m~eSKz<9M)>cuI=i}4AmE#! z!7}NDqfu9=vx7n0F>V5)oWmDxd3Lc@ENc2*gdU}HKw=`K{Yeq3n zo{7vX4&(2pWQA4W_>+=0VrP;vOb^O~roivh1gAZ9sxK*~`jSRdy$QO1Vzs>tNW^d?}+rGRZn5~3`JUu9Tg z8(4_WIz)zS8%!frp{s82{Q0o`&FP%GAj23(=Ztcg1WpBk#aR*;0%Dj*f*e6K z`xqxHtRCZ8J>5My<~~Kfa0{-(BA3XhZ`m|zGz;gc813PAJ#dmx3ieO9Sgcfx9U_Q!?3f^$cUxzQ|qZgo^ouQVKy3_--k_BSkvsTqq`0p z)n!lA?gAn_Xk?56Us^cWLSea-SVRO9OyzfClNGvQ&CO-mmJ{rpl11JL2G5Ce=?Mpi zx^S^A&3|x{tgw2BbG6n--Pj1WQs#D+q^}7_5u7PWhNkVRdU~cOI2v1J+h* zC;=(w5poi7s0$9pNGfb3`8VKHg*9#M?d({P#68wbJ%uRO!RChrr#fiPyn;;vDiNjP z)a2ilk`-3Bw`*?ZHQFjzH=aq_Ksp#FC@0niyLW|(N@U8QNW>Z+x*gW&sQY(;A|n|AcU?vZ$t(ts*2w6v6IMZQ=Xalz6}p2C@^*Cb?rS>dqO=5jM4 zqTVS=M6d=CQ#pO0jtXH2{1(f9#gnYCrpY~{F3HK~d(mL1fVk5Q11*ENab26+|sS0Zvys&#g*Szi= zC%C~yV-5DvSqSh+niYPIe|F#aoZP*qfk~DHGLjD*(Sz&Ecv&HwY8CpwOP=ZM(xfYHhY+)I7P$Auh z_&!x(wHeRr9^KVQP6|=r>Ig}Mr-2!dt%TqVY|J1qD^c&kW;kX~Rp{y(n`<*dh0ksU z^~7ojJds8uI1PW!f|J_jcbt?bpMAERgIf$zyEL#R~>s-{}n`)9jicMBnGrsdWdOPPXIHGfY zSB`zb*y5p`gLqnzpfyFBGp&oPYZ0*V`L9Hh6;_Y(yq>Ns85k5R9|@y6P>W%?B??Cu zXowE{anAEESjh^jTics!3JcKg7?s|M7z1J)DH}bO&Uq3z%Rjiu3Wqhf$rMh#J$4j4 zEaL0d`lxV5-1QOB9#tH_?7&J zQOOFc*RA=TbGmY+7Dd4|m6S!#v7xYdSR|#jiU}cz4f%7&k`>kjJtgu;iMc27t{?QiFkJC=>TYjo<)|MR=ZwlYukm92)%pL>uZU?1|#dzw^veuu~ z&|MrfND$Em)&WfWee5dLL+JT!A@Bf0>RZ}|p4E=MZ4d((Q+80V9S<1Vj@^As2xC=Jc(s()Ajhhth-xXVVUSfx(bZB~10}1H;;NY;;01E_Vq^EadmNtuC97-% zIJ*n469hOMgnn8?C{jmKc67h~s(NOq8H(i0=w;arWGog z98tkYW4+T-Ijd80N^xS0BQ!-sRo%7QH#fCuaRIlrGFdwKksPFO)G+4=Csw+o^%|hx zO8XMBs&EO~@Nqx+H8vKF&@wQRaGHrIZ7hSJc;JOs@O%T?9`b8`_!!I5aVDcMgn=j# zj`N!g_AXMVH~6th{>pwlwTp$l8brPGB_+hNWF5$;lO;`DYrtl`6hXMr)RRbEiCdgF z(CwqrxL6IW(PeH=F1Jvh1@o^*|2X~AFF*hG;r-Fc&mZ=+B(PcqBM73y&YeV)D+zH5 zB!_F743FC5QG=hNhj?lmrXP=g{qUCoI9TKXX!is-99e$?R69e6kqhv{e18X>*0TZWZItgcm_rbUeV#jClH$5@k?vtS*;G=cSur4yQf zmGm+30A^}^KW?9V)xH|O<%lKL1*cs}B~8Q|qF^K@*@T8^T~OUl`&pb`45A%dVpWPh zXsfs)QAH}P18pgdXO5>$+HYXOUWBUjb4ESz@UQmx(tMYnRUvI=a3|M+k}9SfCEEH1^fm#3LcsXT~gjl{36;g zY<5-lMjZ4Ysgec}7NVm`eEtsY;30HDsK}0}Qg`wQj$Qh?D^wPeJ!`L39 zjS-$%UV;I%Whp?Vl?AZ`Gv)B0j2bl6p`yh@U|JdPnmK zf>`)t*klAS-+|)ZYf4H$7bJmz$$}H1cy!aw5#@kwKZ+(eq%kOP8q9%Pjl=-pz&Y_j zCMkp`!^2lS6kv5B_ZEUr<6<#i3?RB>r2zFcNlOPtLTO?I362W*4`S!dw#6=%MRp0N z`7Y=|EYcK@YtTkTBbCRqNR)%gj=|f~Ful3MVH4YAHd#&Vbn<^=aDr+;#1M3#I#~&U zU?4;$h?bp&7*}m;b#CLF&U*sFCT0Mi1OXfqF{;2z2n`)!3UUqZ5?5Qd$!0J9{`lST z(f;7v)Z)OsFO`xMVr0RX0b46&5EepDmb7uz-DI1}vh;Q~i;MkZsB0eq24N@*)&cCG zJR~wvl1NHNoe9_=T|?XC70ThT=)V?i9+Kw}?Uulx(n09Uz`=s@3$TZ28l4_BJ6%w?XfOG~Ts7nbVaTXFKF*3i0YFrR(?BIUVYh1wFBot(+NtY5re?uX7 zqP&Fgj6;f{JGlBylT8o}$;g~w-V!k5jH?J~F!Qp6Y%Xp$P3ueJhsjFWm?!|vj7VNV zz(Is@-a&}u!DJaoIw;_}zKp(yepV+ykhVcuq9HtWkUa=i;(^ zpOkoEHsmX7fZOTr4dNTZrErExkQo8KM}%Z`fPjWV`nuAQjXU z@>-C85clXIP46N6V_co${gT6okKpa`Ton=sjgU9M+IU_!<`k))5$$7`FlpaEvYp3c0$DVCFgAv)RG5hxmpY z49u(33gT!Myl_?ps{~kE2uG8}aIV9RP2wkEKxv`D1?i;`c>Jw|1YP49r<7~(w0ICo z%m@CC5sE*EX zECP6p7f4H6hqB(eV891aDNK@JTQDP55wLL3Thmt)#YNCFNu)Dc*tJCCX|LlP-Z>qgNiXyVYnJ?6bR0x3&dEM12FE!djXN3@YK=Z zd!67Sp3grGGsZ-4i|H3c90WWrWZvLtli|sL^?_L*&3*yd0N4Zr zU=mUf`}bwmYiA{y_mDaor4q0SgM*+XUbJ8_M%bizor`>U|FK!OYP^|L0>oo^t;uHsTd0Xb=z0 zpZ}iCpJQ87*8cbO<{u!^Hz13WDc2J+QVR^bMaPZoD!)bG6lEVn{t+Q@RiRa}c828F8r zz<>LBi2w7z)RZ-{c4WLkkA6gY>PC=mpT`5Dqg`~{hF?DB@L7$lv*`DL`1l6CEezoF zF&Q9gWbH+%2Sg{k=(Y`?Kj!co-S4btJs>{4#@DQhJRmaDMz)RBk7@a6qt_dYG!KW7 zksBDdF~K|{6Ii3$?b6NzqGMfjTZS*lV-CO3?RLH90nv#rx^2T}w;ewGtOB4z-R3^) zHl6%GpZ`Ff#`!PokpDl%gLqjAB4u)Tcw2I^42erAN>xS@MEKJ59Uc$+xS{`AJ_-G& zhx*^6Jgg^Hgvf&=rBj6Zn5ar3Xr)b}lz(aZ4v&X@+|d6zMZZrR`}LoL;?vFgKhX#O z|0s{AT>oDeiK>-=_c6sqocVZI4fw`Z1N!UdyF~%se1o~<+wUebKfMgG_}z5%hvh0v zC+_9h?>?^n@a9#1|Bb^ea_dL&5T!w%Tuf#k2Yqx`io7m1`p#ig$elYtU6<4|)a%0g zCdg_>af{30YKGz*7r^F|8c~QB5#(#;uZrquI827u{C~Y=t^mq1=7T1lUC(9C)>~O^ z;p23A0a+}taQz%a!`IL8E4kj#N&1@-#2h~g*)n^UNAl*3wGX#|XWPD1QFk8CPge2# zT}+_Qv-xKjQ|P=x`vUzUq5@%;?NUiQUCVE&hW6Ky5i8c&6fV1k)7e;j?0QI zU%}Y=w}*AcR_{FfYKGUppRY4Kh=i)4f$kUISFiq1;1j#}`00lNqov~e@8OBBUjBY| ziHp?t$cbC1(u2rF?+)D#9aYbB#XFqKZ;&Cqn_4?`;AYutQQ9Isl~ehCGP}53t)I;= zSMapUymi_Atm}3m()E|P$dkj_?1TSf*Fh!yhCPRe7))arzp@`+*N3J2*R$)$e zj{$oc03I0tL_P0L)!GF-yAh`Y@(Ikq|HpT_A6tZ+WqSd|?;%9MhJ&itZlp73syBc-{o&Z(hOQ`-!eVzu1Z4 zZTGci6{`NbyY|zalrZfrV!CsQr2uZs_7ljZtpfp6v`cZzH~a{dOe=8LNw@Y?RA ztcrEx{Y%K!rbWGx?(LfZ|J>VOku7lr?g;{92SdS^L#O~vK(fD<(Y8gx>&Tbgh>YtL zskT~OW7OD`?yDQ~(6v8rf5~rM4*(AxaxpU?yzH*{wfKx3(#=6aOuQoU6(hvFF4APN zTott=E}o~w{Ji+nyZQX5g1n^SC4B+>!91@@@o-Ys$y!d3cVsGXXx+k z+aC%$3%eW64Xotz_54y&iER4)*lhq5pF|6atd$cc9!MK;$#I< z2;W1D#l;+~0GN&X48ZF!WM|~@5L&+6t>X0Bnc@!IHd(J<=bgz*P{7J74+5e#fw=kQ zEW~h{tG)kPjQ~Y9L3z7eP2&g%Y!gDxg|K&TI1pKG0zvWbk5f8?&`lWY32$4_FKn3m z%a`K~bFOjLcDWaRW0zai(61t$%Y(chBU}xAbczPN%4xw5#cs2@Z*Uo2)%e$Is-H?K zx=wz!LFpU#)^WbrIry7@+@I&F#b;MsdQk><(GVg|-$IQJ4y7_~LzP*PYoa6MCa>u(;bnH!r(+9rsq_?OHf7SUA z@~CLxxV<9=&W-j?$muWchUU3JdsF3(`92Ro%t`XGQ zjBFr2!de32Z6j-lxGU0Y_20mHGHd3kcz!+)lQgL^>wFJ8~b>9`v*-Vz^A!`p%ug@LQC_Dl)!!Jb1_BD`0H(|O@4*A!>XvUU?}&v(VzPc!Iksr^PE_F+9v7!!>Ahr36) zJ>m5_8JWy>G4URV*cxgdH>m4gf(Jm|(w3bZK-4uCZst;TIeR$)dBA=8wWC{gL=?nf zSy23Vg%AI_0GTiBXM5Fd!^l(n)%7`zE-LmmQjd>J>cKa4#XbyAv}LK8!q)e`ovx*3 zaJ`L7%lUa+OLJ$1WPcA+^Odi+jcIpMTW_1H@&f&=b1%q%Uc>gc&9lylwO?Z4{%|bH z;W*pzj~n~HiFoAw-$Ze8bN@H|I_&>`gvV3f|9y3JxuJFe^6Lt`>;|_vdFFox7bgyT@_K7v_Xz#@7HJHx#>KMDq2(E(&-5kO8u63|% zeed+kO!tHD%l`G!O((uMTCElnce#r9yg$3=XvyykH$Ikv`y@n6TB}kRqAA{D<+-!v zv$tuASH#a&oSm-jd%IrkJ-@^Isuhh|lMrK)#03#msW~NFuoQs`m`w<0C+X_?47`Wj zuK2Xr69J{ftD%^Si26OzlasmR~tn~E3 z{r41-L1y75Qy)b_z~Eq^IJAvSPKa|^vRa=kKHFvSaUBTeDn(w+pHHXr&saFY@aXlr z!ZG%kO#^WjH|2Y9G z*16Xq-T$TzeH+by+h6&zoBn&d0%r7RwqZV+PDk8ZbBbk)F6Gxpq78@g2{f<+$u_9ifEr|nHbJR2sMLT;cb%*27^Vh2X+TeIL#1zn zTFbyFm2E(UHmLIk)cI{dr8cN}18RN?P@1$sT{NIBZUc(7K`k0kd$eyisE)`k8&IR{ zK?ABIvX>30%iDnJ$kkN?>gw(#;wIzDNhg21t2D6|=-(HU;`bFk{CJaFp8UAy+SK|Q zqVKf!(Rve&c(@5n99blpC*%C7P68 zYUgFrQfccvmC{7F0e26fVkE%p+kj7g`uUgl`|jy&U|Sc1PC8IQh*TnaBe?ZJgyisA z>~b_$2Lo(z_2-ihCr9u0QCk~b%L7pyz``^+s*(zV7>Bn-2NKJaHmVRc^bb^>{`Ke| z1K@jU67!T&@5|DZ-l*W1)xir83gPV@_$T|W{%zm~5zA6a_}?+Dm?#xjf`b$aVJJ1b z;Bz*Rerl*8T5}SFxsozTKq5hX}#2r%Wl!4IO|2A`NU)Fvi)NSt%WX-rlLMXfWts6YPc z`27I2FKNK34AFD$4Uk->5(M75Btw$Mk5>D^0BdRwCAUM#?VEnw?Ef*3-v6VS-t7OO zt4G`BCklqEP>45Cs>3IjZ>l-jDxUHKq?*f#yfwu3TyuUjzDlr^-0mfcDxkQ&Zn2_P)PYQuGaXn+_Mz!O#(otm{Dzfa9iq8g zh-S+F=h4Hc|4P^X|0%FL+C_-fs|f4%;M%Xy|Hsj~{_{%OLyrHg^Z&l*xZgVeZ=L_Q&i`BI|J^D7Z=LV=Rr38Rr(Le||5lU# z*Z28<{aN{ct^N7gUs*y7iv?#K35R7YV`l_bhA0xL&{C-hUpiNme@PfPJs@7+{!*VixW4`6Yu^4cU#ZLPei`{zanbol%y2eQZ(VY2c3eX+UnsSxe11*^%YGyR9>_0ON4`R{?y zb24Rl4Pl-I^4;EklU}}D>$!fmQzsS+gE6%+RRUWa2@!G`V(K*GLV{D)F(7_lrJ!H$ zl{MoxVb?YwBQ23mNfv1(F~tN+N)d7qk79`tIIJGnzlotB#$f;CViO{1xw4@mC}Qw` zC#7Q;7EV~0Kh`^x>_&?PtZj_qS+WgnL^&z4E{^@<3*2JlSVW}JR7*o+Yn{K-|I#kH zEl6dK6L@gfs?!~0=l@B5iGKms?w59;`<<&Izr^48F*3lh$}k;YH|BDfFJ*%a)KiGb zUdw!);GXvtEjG^ixePf_?-Vwir86v~`~cD!Jm@`Hq=^*(tV9y^UmtUlYC_RPutY9I zR9piq*%;GpSf>`&^BDO$5#wL4R2QZAJ{^|u%fA1?Ubj8aEJI^*2%d(=-6d!+M#gD$ zOgpJKvy3eGgecR8}Kr%)44|r@!;<^s4p@BcdhIIJv&P=zUs* zRI9udbY>uTeZ;xGq2NAk>in0`RiFR*>prK?f64m%cNOg+pZ{i$@#^&r0N-~e@Zv+$ zQcWni1K`?pJ8`9F|KX#ZUZqd!G{yCSKct>Zs_Mhx&7X*lBqi5*5}MufkUOMTbsjrq zYv88UG74qrxQUH52*s2ON3}81DH?_0v`?IDQywkjskM{Z+L?QkmTlHO>s&{7zyR{1 z&c#u}MEVDpWgrOxZ>lz; z?O`Vl`n}J-$D7Lmy!9WCA7;7i5kQzxE;}v9I-2~@%`&di?+v!^Swni#sAuqy&rvWw zGxzOz!WJhwJ}8d#VX#BZfWL()4tjL zz5R0k?dj_Uk^j-}MkC*SyW84*vwynZI(b-O&v`LER$MNDcvNyYwRExGJDqE+qjc*i z-2-b=@jtfe=RXKW;ne+~{-t&NZw2iei2t1jC+X#MKKQc^{(W!3zaqSMp2qXWZYs>{ z*%mhyj-Rzn-&HswPS;l-E>cdxt(fs@o)g?n4kFU^EBQ6}Vf;N(yhoBj_<`J%{X;;&${Zc&5<58)zF_?Z}& z!>ds@V<#v)kfr1x3m)VGIi%euayZ*K+dNxZ8f8301rO029+H-HpZxeE*xq?IlORSz zf*4gL*lxGs=WKcfyudcSgx-^+c~TospZ+Z&z5R3}$X;Kz&E}(kGE7SONJq8tH2<^d z|9G`YkYgtS;=S{m%a6CgVXt=;?81)V_J6(eYrkCCekTFw?&DNzX7f>C87{@LTpGS@ z2Alq`Z+8^PY(5G+!=-qZ;prdQbZ_rK``fempizz{v-v164VPkCj_VmCBW&#Tu5Q!d z)}y`0L1Mvs*7Q3%c%cT@y_;@jJ_=C7rJ$Dbu_M)A*~|o+)7W}Xc@)5gOMxxpV@FDr z(%Q`VNMenCU(mPya$|S>S@rFY!ENs*&_JngO=pljq8D_o=kZa18!iR6C;4p1gcJC0 zb8}~B8(vhG<{7x;7d_K)x4x$v*uV9M;l@E8Kl}CQEI0%&8Qv@5qX0Nu3UE(SE^qrg*Aj;D#GCM@KPcuv&LNZa1tzK^|-0#8Xf zo+ezR9r+*I+i9=akL~o;d)X~1@RZEK)5Jb=yYz-y*rUl)KF@nsK9CNx19tPd)9nVa z4Q>Y3-E_AC_~d*(3Oprq@btHX)7Qsmr@`*gyWqFoR%`d@^xcoiu|f|zu%B$oO6TIL z+X2o#`%KBp>szm(Z}wYzui^8%FAfe5PT!UBQQ#?=gQuW|uMSR+_D@cNSH~^bEWX`s zogVC+9qzWkDQ~?!KG}zXU_qL)*?L&;)--baguezL%UATHq-y$J0P{dzT;5 z$m_M`K{n{zXQuy<{u~UJriaRF7@_SDIW!%(sDcvcodvkFa{gE^@nI%!O4y9 zn^LqDyy(GB1NwObt`2}Q#!oQ?r{wHpwi8;yM}enw!Tz*S{h$S&(sDda_QPA{+u<7c zDDafd!PDPB1+J|R`%moqwz7Y3XaD}CbJ_2xZCB1)2_FTX(uMoeT3QJo1)kD!Jgv3O zb`WU+s5G327tsRbsGNMS03JF4JXiksyQcw1di{;(n;i#xMVH^=zIS@uYQLVz3M(*# zp?M_pfZUu;gYmoL=k;132E!G4o%nWP=Zwr1Lr|KpH;Zgxwu~-8Hme$xR?aD>UKk@| z%Tv#zP380pBV)We{o<6;rx1>1vW=x2PTv4Ci-*F%n3&LAR_HvN)OnUa6j{y;%b(Pz z#;Q=Gm`7T~RxyDjl_HX%<DeSy-1-15UMPUEW&w@6dS z9+oT_9!FJ&XNgrYia2xF#SucWP@$tCc9Pmq`|WQ+Zu#Nu9Uq;XwssGWPERTi&mS@M zmCqU+c@|U!rgs4^mX5UmGCmpk=LJl0GWlMCHGC1)xNLalQM;|Lx;F#=-{aZr6d=Rr zg3K&|e6+WpdwsL<+}|~EqW~k$LBswv@pgd|T+AQ6 zPqT8f`zQc~hfA*^yjW)WEaMvHs%GPx_bGqCog3kk z$3ISpq5u#w9Wb`CkHqYSo+OgwWjjFCjxy^`An_*7;wn zXr_}sJND}j|N0>atodMr_x`rc6pwu@@kCt?Hn#k03F2Y2)m5?W&ic^sjqHFDpUbhDb z7I&5YxUuE)fx6jCANuw-11P8D$-k#i&-gp4_;k zbiX%fLQ*K2kQ8*?hyfOK!SAY-FrG4vYT~+sT@>?O?{)=~8Dpqo9QPVSy|#eq)EM$Z zm?Z6@`fgt zH#E7tcCh~U|N8*eRQ!jBE06zBj;G>3M6BaKt7zX!{3oyL_MJq3nvJ0}7yM~DhSF5@ z$M*Y|jf%Xf;7{|B!bYP%EA$c9F`9}on#LSaypjOT3f-TmnUx@FMpIW1_gSG2-B>(k zWm=5O7aZPWRGWYzIsP`}Cg4=g0>{J)j7ZzcYFk1V2f1h~cs zaI-P6=Cc4-kf+pqLg0$sT;7a1@b5MP{f#CcHWnD>s|#&66m;NChqfD!tn%ig!z<5D zLJfuAP&0;H(5*SZw1O%V*u_K)e>{#VgLWkOCB5>8NxB85T)FrbkmL|aYp*XD2Cnr&nD|DoH9Rd>)v zU&5%yDnRq?AMBoy3Huiut?hp$?IG9yNea>gZ<128gLUDb@2v38(gK*>S1N$R&fxkk z{AY+)LUpKmwT)&uPIkN9Dzloyw!a;2d?ZEb?dnuMfklo{`G@Lve7(x0sHAsRj8O3q zV60n;h`qeI7$dR|FL<+Cc1-q@>dqw8>n}sb^FK!BWpZ;^GwMF75Sxkdx8uCucp0wI z7ePm<=$wjPk_sQCVsk2$fMzMD%MSxz|M9y-lSjKw4Q|;mPA(FZc?5uxJZ|i^cH`=6&d7r_9si5|Lr!2 zZF1B9b#Esrr~T789l3*7UF!2*e9BT?4 zL`uamIF~3kQfxdQKHE8@4~*}gwqG0{R-hkZtz;Ba!G+QWaZVg&5sMTLF&8MFMIZQ& z)xcJuPPmA;R+MlcCL>~bEKC?P1p|U!O$qleTKl{IU4cB+njwGvHF)91Ni0MtW33S< z3|q-`8TqqU?URH5*{{%p4K2qQ3mdY~P#Pf{DxsYgoDxar_3&!H)!sjT)qcBw^zz{7 z*9v_ZkdTQ&jk%Qwx`A$$hW;2q+A4q5@4UW__J6CQPLzj{iJ50UmJ&x1<1&h9gozeR zluk(2$8qb;ZWXN(C^9&53`Gc8t%>3=JH$j(N=>jU)v6okY`+aIrT$oD`dKVgOch1K zUwIe{ftZOEla_@F`+}4Udud;&FBN)XG}J~L8A<_vBxZslfAqMDEyfxa4KR%m zY=a}|7Y-N^n5M&2Sy?8dvsP>W=ro)13jHV)QNs~ZK16AdFy1}{(g5>LX=|H28zs_9O&-l{$3Si0mVgFY2p-zUVvsCg`7u% zN)=mCs#uegkG$24p{(d!F=t^*|T%pezE`RxV7Kj-8(%vKB~}@ z21!ZSONdB0W?4)mL6iyjNCdlrFe(|F)m3N<<6>!%#S|$V#~>_i4EKwQ14NjKjxY*X z=-aU1SGLQTgkbcB5$znTAuwA=aS}(^m-Ikp=JGY!O;yB9vq&vD(#jcYDE}Jt{HP8Hn3(XgT2WR00CWwX#2mPwszY-idtn$ zDPR|2B7$Lw0bmhWQjK6^$+SaKl9_$L#5;AZx^3I<_o~?r?1#9Kh8w3~YZ-wFi7*tf zS%Oz!Q&zSad$oJId)VG@wT`RI3hY#+h-Hjo6cK|6z$Em>I6xU}FWpRYxx-jMo%H`v zc5S_J-AMYc4EA{!;Qg}uB+KoIW@JgwB^y6Aip63qtRfkbJQL5a->+KgOyZm)Q3w#n z9e_NCtokm+Vz=}Z!7A1ymjGlC`W;k|m_lCzoN)tt)TMp>c?L0qwG4u6RhTRd5sQVO-Kah*=}zT5Gkl>jcVjC73BpQ)B0MHn0vCS?c_4DX&*_9Cp&mV(LttQCfQd@d(l-~PPi zFLw_!8>2rQHnN2VMV16<@M%^uOtY^LKZ|q2xe=cbwe?YDMK9grnQtcMR;>Z{dY!v5&*D#khtoh z@ltGpSJ`8&rG_9xtgOA!>EVG2-0j&pf@7k(7#-(cVL>TNg5*sl58XDn>VlxO%hg3a zNS;Bl5eu}8zz_Nc3njpnB6V~z#em~hUgG0UsK5W)OdY6X2%GF7&KpCWYmaP)Ne8%@ zR+rfm&wslE$(c9?3p0RzI1^0=s`wNK4@h-MgCR)PCXjzV@A-^&&H_WslQCdq&^<3kl5WGVGhD^p zBZ@eKTa85cuofWtU@4J=@aAhi>3nnW{w<|mYBp30$Il?Z8W|vhsCCu&oFSaoROR{R z{ng=SI-x@)$jRga^jvf*z&i;9O2;47TeFbRyGbrCHS6}-clzPO#b$=NVgk^1TNuWi z!iXMfC}599OwcNEb?vb4Tg-5EHk0JoXA@dd3F(TB7W8gihVCCWm$rt57l+%+)9uyK z3|m3kM;}eggg`(bgLqxw1XeLzXf3?-!#AlFJbaDK8-|3;eqigvKt@{ITk>U16g^Gz z?NR2mN)ATCFklLZ2!pk95tKndmoOx^HSM^Y<>?zF=U!$+5QIaT==V@Ce5^HOJOVoO z4B%Ru27Z|Cmt^9Fr(LAz9$? zlWW5W(6<-g?cn7z7@g?)U$ULSmmXs-A)1(nEm?#i@=O+&Z3YI9)%d+UIQ;u`-e-!= zVg|@}ES4t#FyY~$!J?s|Ot_TynB#mV%?nHc@MKgW&5@en_G^Pc9W|D~YuZtJ_hwee z3D~b!5xrPM37FnPm0s{F5OK7|AiJl3UZv2Mb+Vb8y}?(f_kP z)8*zZV9yTp2Z_L)BitLLoN>gaQs`{#>cQmGJe$)GGqS;(3>jjo4TB@byy& zt0${F4Z7?9nW;`R${h6U*~exEY!)0>?_D}}3hcNx$5UDN@$O9y+rUPLLK#6@MhAP1 z+0)B^_w~erxiS*aYmjv(Q{Wn!Z_>*qu zP&h=glC;Ff9i|$XAG^1awd`Uju7vc#yVIBRG3=`m3=!Rc?v*Hr##q%7U+qrGq%UUs z!QtWNY-V&yoGHZ?i(zL&b3(R9a1i;Scc3()m(caWC` zlsm8J-FL|Hm*qm(yAB2{<dqOurJ5J7VEJ!;v^w!P3e*e$evssAiw3oZ-k&aX3VNV zpu}3eZyr(;p%WlEYqBBsw)^q(rQz>xA7(g++^~e~Y@#*u5TF8zb+F(9gUP&T?>~Jy zJU#m~6O%~?#dEgEy|V;W0cq@B2eGsqlkYe0u3qfx*mnp;Elv*Vsk`RJNY!JC0!{0{ zaVzQCWk4X!?5SQh1;$XNRHa!>qY^4>;mh-)u-J|M^WEd!lwS#%J;TF|GzLMo0%zbK zI(WG_{q^<5;UQGN^5e^JvtRoPZHg31(SsFplny|q;t=l!T(gu-SoCqU5YQvQn;jMXdZrSXO*;1#dB^K?!++2qq64at=?h zyh`Wiho|pflv{gbfLL%fx)_VIdZH#|EhHBh!1iR9qeu_9W>5_-UC*;btG(b4h~C~2 zq|rglS?XOx59}8)VU~Lh=5P@po^Au|0Wt!D< z1wMaxt>Rm4Bpl0l@Zsp><;Jwo7n-C3}>9hBp)mo5e63C zcr3=sxR<%Aa5kejJ>&`*>)#wjGjhtM_cmIm75DPtd^5A=Tu8$jSPYo4)nQeN_K;X% z>7JK!NYA%+N4RsM7|Y;$*W#(|2vUI+N;bpgc}wh9Y6d!o{0iwkcXUQELLC>?eHrR3 zur-hhh*&+5UhaB&n&bL*Y61f_;ER@0Mhd=;5`|ct_mKIe)J0|gG{KEb)>fd*Qih^I z3Ns_mnx1nPW5+N3o+64n-knCELQbUxi-x#o13cxCy99_PLBm7}Th%_ujAx|CxA@&s5>A4P* zi{2Y81T28&@xjH6-IN671c_tF74g8#?ui@^k^$->x46)nOEX18nAo%{?LzZKh8UvTT(<(V z@BOf;Q3A6J7nViGjr=;5HI-oHZS%;UY^){=1lfRBM*0hk+V>CsLIj4{5tko#yOZ*F z-=-eB!RwL4te^#8Zw_j;4-ksrqhVI?rx4*_jYG6qw9R!uwPv+~720pPobt=v{Y+&y2gG4UfEa@} zkcfz+9^hE7PEGoLs(m7QA1T z7)Ywbf;|;TF+6i?qYnr?IQ^9q&XZS9n)fOgqfyZl4v0LMrCdm~RF+c6(iZDu7=2f_ zpBdg^)Qq5EBI;7wD0ci70val@CnB2$DubX}n2JS4Rp#y1N&!@l9) z$lt|fIXgJK+@2hr%+w#APW8Is0Bmn2X9EKmd3c+1aekRjcOOl8c=!$Y80a}YGl#i@z*0TF1N zy>&(x{X#o$jZ1)@0f#2=IEoC*`}|6C_;00og7zhg za17dWZdEuzi=~?Mw$pO0?90FVTHmlv0eM>?#3GylRBF)!aF$9bBQdgD5hC|?202-; z1U1;?fR};Agi5G+z!l)VI4z6edpC8eqf5*#Y7<~>UaE7!8gUh$W?IIEdznAif$<8k zV~Bk}#KFkK3a7^o*c{+UR=V)cH;1P`Zq8r1!nlv0lE5IaltFQaW2vRa7QJm9AB1H_ zyqDcM^xQk7n4u>}()%nR7ivW{AOxBrj%}rH`TU2AIYH7~3wn1 zrZ-9ffh!jyALeT;oGMtWIG_%;qZWWRF~M*7s$ya#!5-dL0I{5t3*8L%;%UIXM8p&b z0!|m|Xr;mA;SB|l5E zWx>{jIz|E)wNQ}XOZ4zO$5dYl%q;S_O7*b%8H^9L-U+DMv39a-{4f5#Io@2Jo@`GJ zK2DYIO>a?w6qZGM4S?9qX@jlL@Ljwt>7M#NX05;oTF7Am`XOo|GlDZcCj=EJNb+*k z_jgmgVMDUS*lUdpjSWRG0*x9dxC9IVwk(0veyVq$=450rO`6wkQ9TecRI5OcwH8A) zmEy9od75If8f>X{AVwO9RnxH-NJiJXp6V*3FZUBY&G6TQvp1~P;BK`tJ4joP8yTN1 zr=G|#*R*n?{xs3~X4mgLRou>oQ!u3p{;PVu*8`~Uy>(Ok?&9F`EK|3gJ&bm%$bgCrR#MEyWASFo8jVBdfC&kg9s|#>G9c!O|7LiH1;0E6}xt&^HJ`9xxSsdfWqEs ze@7uF&_w|ftW~|%nMf}Uu9XfiXU|+a0H$Dgy@H6xZon=x1ng^o4t23;sLwyu{q7aI zwAFH_8H)BH*TBJ5Nky9$*B0m3$L*KLnd=R?8nP99;$ii=Z-q^3!H=H7DkiS9d+kad z+uc6ToaqKIptq!bYSOttMtDcs1A~2`m1_Cp-T%q$Ye4y&WZJnma)W<0Qjr6FMC~gH z19m(ReP5@19d4!v{KKN0ADmnq&oLf#TSXA)Uhgk6EQSJ`mYW>hUthMvyZ*+TS7QFR zbM!DE(BM*iFcbscNV&U;Uee_izpcxy?b$ZXguNg(^DxF)0-bV%V}-TxIRt9EYh5qQ zP-e78kBQ)sM%G4~QoFDMMK%zLO?df;Z#Ti$*>^C8UFHhKEZrc(JT}25E)_OEHMi_o zf16_FC30oJG1S_Ch|1c+5Ni>FK{MUCKb;^7`+ECj(jz&&LIPLZLUqO?qAGGW4{sg(d|Upi7(D+}8%YOkY0bQGqCNzs zvW5n9aCXE9S+)4+|GcL!lc#6`b6PU?QhH)(tc9{3)v^GE{#-)eeNWl`>&ZUf|7G`c zBmZIb8_;^cmxqV_53ne@{ukX`|9t!3f4SG6DES}#2DD%PpS>q-Y8*-SeI0&9Jx{z{ zy2BXVmJLk=3-p5sx~GF-cHe#?bd<27Wy>qc(CkG2_g7hmRFdTr+t{p4A6Tl&y0Y@B ztV}10&WgaM@c{jU{P)F4kcL#dtJq!LMw+6kD2Nk?&N@Ku3yYL_a4KS~LHO71@$vKX zb4x^Ljg!Y?IeO{AY1n^6Y2p<#)*%UPYt50!C-l; z)zf3vYx0PV5XR5Lw9*K(XZyszQ$H|A<@~>!&i|=ux}lHd|5W$+e>d{kk^G~&}Q^fsKmx3ix8+}Th*(GBMBE%IotmPQqDSBt8h^{4$@ zdt%*U3@gs_sckN`ZZU=x=M>f7F14<{rZlPgnzop}E<7p#uU0lyjkn9KYpiK;jWsQ< zv1V4kTG>4ZtF9KVT2Tt-5pA#6rfg+BT|4`L83?jY6aOM1*jFIj1-_&kT;Tp zT1E0m0cr&qBn7Ayq>&V$7S1I(8PwVmND7ClxspG6ko?iBOa6Fqb#ptdgN%Gnd ziBW^hgO;MHnx{gdC{5FXs$2SOck#Ia7VhE~x949UW<{gp$2Gs|rfowsWvr3ERwp0| zgzfpRZa_#q)%F`_;>f5B|MU6nRG&Tp9|xYTnI=R{@b$n5d_}daz}1OXqG88TCc*!5 z{(lb_zkU7v{_gx{`bBe1#3g~7Nodtqr*Ra{KW2^Sc}B4L`@+!3sF8<~SXzW0{b^ zz{HS9ukD*{+_BtgbNB81?)=Nu{nga`W@1>5qbq(uP)fCxK=n1f)7BN!(@e)UOb?>^ z)er0L>h|h=2)#`yCUjj^P@fVs{|Gh^HxSOD8Qk*ft$k zEq8zKIQpOJI6CJ4si~_m`beMY_Mf(5w%Zl^kEtqq`_D!`+id^gN1`4AjU3(K025`# z!+T56JF^5$mxoV#>e)n0An#7S*vDr?5ci^ykI`SE>_j-&{^c<{IX$NDPu+xosx1m0 zt#g$0n2BR9n9SL9j-r#;xWNz5&Pu)kFpE{7Oi_@g&VLyIj$)#89o+Dyd_2SiX$Ia4 zV(#9+hsC6JYv!K-Ninr0HH!72cRD40iaZ=eL&87FX!Gx6xjp_Jsw8Kp8QCw#?4Klm zM2GXF z)9PXqdzKpbrtg}zA9QMFZH05S!UJhsw!`Lg2XMtST%wB`mJS(h44TT;(lk}kATWgjS^ng~L6~DUv^{!=86=vwsXI1N z{cNn*ZJ(&eMn_SxsX&OYz%F+qisSF2;Vb8`i9o7DA49@$vM>m7^6qBUx7(@%(c}WH zZTPlhc%FtWxZLZK{~>&k+zrAZm!8s(WV=#{aeP)8*$1hF{YHfI?>n%k4c)SRyJNeq z@7geVIwAc8O}&l+_pgKUEF`!eKP|tjrRm!Snn0FmEo2gMESi?uR(!Ix701;~#q)I? zVwRDI6?BC7*MKYAyv^4&QJMxJ!Y$QNHHfC{SiWN!s%KzB4;&qjPZVsgZJsCw`r|q# zi)>K40ft7DKYc zz;HZ`{PA4F?O1JFRaAo@r|w}$cE=`Y;8yVP6H>OGC>aoxU-v9Kuprodq42_J+Fr7|d zyO0vZz#Uf$G|eCg3IVLjLkkMqM$PDsscnTGzLYE>=rZ<3;2TVZ7`j;xCY=b+7D}lV z4s4cSEzO+AF6vVcr%#RC7Syc>u3!`m=75cy^Fz&W=Nm0Ui-r4N;L)3ppiEol>pqhzcd+A3 zZy>)2LV8vQV%8{XJN;qeNXCDuZK)ul29;#CbUZLnzb}!BZbO03_$!Ep!u%*Cyo&P0L=;;nzQI zZ$C6?322yxPk9cb2)Wpc`=n$>dKe~YhH%8LjiB?QB!L4lVBruxdO=};oB_f=!ZZs9 zj{;WKW9>TtE#F9lDd3b8$p|A&u;ah5dZfFAIOA-T3{qNc7}M<6D2vBOK^ySmgiOIO z9>BSPC|0!7LZ^O23iTm$|JkWe{<>%1a=E5^dhC)#hQ~f#==x)a{Fp%-JBHwAOk7|n zTaN_$FF&mk#Ime#cHb-3H6CBP7Lr)`5=~cVSxw{8B9+^JCd=sn8;zlZukA=qm1?>G z2qp$iioLR>oQzCw35uaZstE!r3(=kk43C320VF4LkvxZKN%1LD0&r{*K5>eAteD4| zqS#%&g`Nn;kyVG8gVRxZE(s(eKVnQL+KqJX%M%gKY+7}8RIso+XOk^YG6Y4bGt|$5 zz>f(5f?~Ey5V~C%ujU0}DHR|C{3BbS51mSNVP~3a5)_&)t40}^v$io&-kuYHI#H3F z6M!~ZS8EbV?9Vrec4ZQU4XSl|JglH6bvl^XHBA6j4G0mNCmfN1$w%gh8Wq#)rwL~tSr6}Rd)0Rakp*WEd)Nob<)2Lz1X~SF6M=f&25dWze5HCew{|f}MO&1`8miPU z;fcj=-8?{Q3!%GC>)2{Fl$nS7%kX7NemP&B)xeJPWop=ws_psmo-Z%Kmnj;}!ae0W5LwJtcA)vigY0%72+gAjt7}YiUaI0VM-*NhC5Lj zmjoHsYgjnZpZx5HNFwBMV|T>|Aylp5;CtG6vycs`@f$Pu1>Tici!J#Mt7(@lD>!Ww zYkEkr6+A1@1L?~s${s$vNZ1i}5 z=@78v^-vVYL-NXt;*?4_FswWX^%hGiX&u)-&qYSDV7zd#WYXAPB{&qDq(*XJiz&pU zyvc>F8=vR1ZfuT?&AvjsC>vw$ah!+E1iwR8^;g~@VDo~cHum;`y$OCnw#SiZk^w%& zPU7{r`&5ZnFxRQ7pCxGcVd1 zqdS;104IRclO^7EbNl9903$%$zr`dkYryUa-0 zh>_IBGK`cni>W|1?ikC5Hu1_5cZg-Qm^;M+1;o=`V<~>87>F{xUxYz1qD;WYfisFS zAVedaQj_UGJ{xta6uD=La{SH9%Uc4QvlA9xgvYg;GEAycCVbrfdopY3BUS^;&jHEEf{6ND)cf&!vqfH{NK^f4ZS@g1(`1FeVq;llDCjlAzKaQ2Zl(Id{N7lDHyJhJ2U zaH~a)S3DjwJyU_u+C10}qf6+Jktb-2a#iTrbDVr<$`LhHrD)P@rF#axHU|F6jud;g z(vPnr;E2><2kL7|+6-bb0c6&j(m7f z^+k>ldgW-Ii$n{Y9hPw(ipHlpkJiHJ*-YS^p1t)Axb?-Zl-gbaT3>JnqCqa3aQ9U1 z>9SN{1ltfyS9l!_!Ym|m(!WdL5oR2Ht;5JYJFezpxS5ON96e{k-x2hDRs7L)V`$-V z@IH}rc2MHQkhJRCI}`qnAnB`uH?JE>$9x9g8IsP9Exj0$7S|7i<}#~+9l_Gq1>s&d znikiIb{$XmIYzfD$7m`4r<6o-m2H5kIywKRrdp~Z<^MDx|EFnb`~07q`26j+%YQbn z)#kO%;EvqK@)E@bX%P=kmVy zFnAQ5lnSdBFRfLes2YEvS6?XX#l`uz`m&6XhNOMxZCQ&jA&J^Q$qoN z7H!`XEF8xs+Nc;aReQQ9%m~Nxil;(ALR@;HD3VWK7d`jL_9#djo5$*!YD&%8D>*Nu z6!1HKDZ?I@CF-br2`LZ)nWTyrFg+D{g7yK`6lYV5DyYdzlgG*!#*RPcO;&+$(D~yj z8?BfX>h3<*yp-4P{Z7nXtB?EiGE@Dm1Pc6|0KR@}f$PR7axT+hL5#~19hAHI^1r2$ zCdcMW?md($X0|BR2KUucsVII7y_yy&tb+j$dZsIijf=%tyg|dhfw>5^}Y5L zbh`Ehv?AuRcCseE<*iM6OAti72S%}5;$94 zE_=UR+qYczxIc{cJ8b5Xm8X6yR&2k^c52C}<952=VwpNN_KW`{$r)6Zx1zpxUH-iwp~lcW4s^bg!N=wTO_xQ?hfwac@7 zPr{fMbD{XNYQR(_ErdFjOfX*fCRQ=o2-O3&Wrv-wTb=1_-l-7Idq8C+KDJC8KV&`Uf@kk^Yt54RBdJtSo81&s#6O2twM|H!09n;aBN zgYd$N0EP%?3^w=yk*=k1rwu|2;tc(j5#_&%Xdes?*;+%05EcHw5n?6EpjrYIN>kcO zpB*p|G9Wp4d7GId&1G z!I-s^2+*v$n<&|wV>{8hui8=-SaYobExF`6(7H>k1+6!8J>JX_tmOX%?tN{w)%VSn zwlUrRi{7Y_{J*UKQdGlI%)S5DCO(Gl`MT?wAm@2Tpiqz3j?oSby<;kx{?`55f7bgc z?f=IpcAY4FP<~h@b%$L|8#DI5WfC+i?|;i^@Av;kKBxbE`P;?)Kfhg}>-#Ua=-VHE zyS=$Ujick^f9My-$Cvk)?1j-%RCJ#Z$vgzX-ieNnufBq}H1%UXg^&tor+uOeAn>t1 z!v7kDPoEkWEF#j;Jx!v=<0CN-Z;Ejza12SL%1?jXe?GDS9F=p=zUmS%c<~;Eh3na@EXn)4A&%v+;4?ZMZE_c%r*6 z=#q7VyM0$LIuOl2e5C471BE^hK>)D=q%!}{-qSy)jU@Yi_Fpm2TXlh~L(m5Zvbj_d zB5&BW!3Fs4@?Ku4^f9va79$seczIX%zrX4E&=(RKIoQeW!QJi}G1JrP>FMe2>Fxn+ zL@fuX1i%gop>jYRyPghGe+z2ryGx>&u?Y7oqT;@NO&`*H4k#&51jAku#SXB}z@c=; zQ8@sCC9h+CngE1K5>W;i)Q~6!#cCYDe`yXtZ2}aJ#RzZ_MC-@k&m~?7)R^@S_BQn} z87vkuvns?kWZY%nB+2=chw_E2$P5&bU0e$az1b}d1w?>{{aQfqa&wmfVv+}##q-qz z^u=Bj0t#1kzySUkFdwiVET4$o(+u$gUHq0K#&zmoO?GoF4aF5u+^<+MiH^XbVgXf3 z5T&4W(@=Z?#jgpapN0|$C_zmqZW>BF%e59Ef#Rj1+zBXmHKF)vD4~E7)`McS(@^dO zl>3@c)HIZpfKqGi5GWZgj0BWg3zfYl|Gb2gKTb~GlqT{ieC64m;$$$$b2JZoiq>r_SnEO-xl0rWylS~H1_OOD zGxvek8R)icv@veGj^A+;$mQjR6h7-p$L;%u-w4tcYKzQbTOFCt;@lD_)+GS6ua$ou;bc}?_;gk z!+r8U$5FdV-&K5PXCS&Tjyav*Sx#r2Poez}dQKv+zj}=Q_P^3LR3&Hs8@kax+W*h- zIokh6`~PVFKb!r3wD-SXd%xP|{TB9rGU!)10r-|)-xE*{>Hy}y0CfN#fBM}Poz z0B?W*bpV%u0CfPrfY9#_;2aR3YI_LeR@;Hx1_IOpd$GjhcClg9 zrmr->41KQ#Q*%83XwF762`U?H-_<+)Uc2k-Jx}fEZPmuE*3)}>$L=|}HkG9Trm1{2 z8IAXnm}9FuwxPJbN^D-mSKXd!cWl*#D>b^lhaZ8hG{7{rQ&|?aopz_!w|k1>8@{S) zxaS#tSJUBgRzj5e@UeYK}~9^tvJ+V1qpJof9;R~ldj zVM!L|V_?r!ZQu6ne!J^W@X>s(yc8;+BXFgLEuD~`V~);i7LFOD0MGU_THj4 zUD~VEeGjxSuDG(t4Wa20?l+?E0(Tmue3|51QKz_cuE>2q<&pbhFQr@kY4++LxRxY) z;ZF|GG~0<~e3swA!MDpF`f3;JYLA$@UCp=Kde3nk#l@~~bb3zTRYaX!L28TN2}L*e zM&yR~gjZ8P-zT%eZpq8k9d4%Ragr1kzRi-Z&UFyg`0ptco#LN2#jhFPFIzE+xaX!e zLB5l#Zu0MqQavAk-Aw^C>fi7p`hN54Y#wvNUaso)pW~XE9cC%JV-}(=*cG#J9~ND- z4$=LFCHS$*UrEVuB2zbaOB!K>zu?st-PvU8`W-dA4eVf`jIsObV1NgnemJ}sjIGPT zKdcYt)%+t(|BD|Hb9QiP&duozV0!fALjZ+_UueD)HNv9r^y1p=8YsAbj$O@`5E*hF zAw84)SIiN8V;3$$|GN9s0@4r*Ac?3&xYZZq8lvv4!hnd`h1FBy?lk1tI+r1ualPTp~XpSd3(~DeMIBIrFjwqMW0_G`grzf zJh_6?@RqYWXP;@Yd5FK37rBY*jld~w<1 zm(1r;1i$dL^AABM3SBxR;PYrWE28?xh!^0>Cii8qyx*+jZ{cQ5zKSsk%g`|i|DP5+ z=1*ZQAjWNpD>*&i)ssyY({8UacOv}A+=-M-RN1}5cThMA6k9us0QkeePqnOB=5jY{RuK-$w6X4;cAv7K z?NT@3BDf29slCvr4MwvG8lqmGIxGqFRn&S;LUZC4@@v5oP1a|g4JF*(np!$-n?NKkFV{Uv)m63)WgG`MNRA9*ZH4aJ6bPr{wbAZ;Bn3W0H-l*8D*d6 zURIVvc9$RBGsT99q;||K({Ko7>-3&2ESNd&Y@pfM<($&EUxhbB&NX3A3Q0?v#oeHo z-G@;WI19paYmW&0X0>P}-2i(UyFf$(WQi}~q7$3*GkHKUB+?Oa1!b=|eYg#y3=DK@ ze-TnvKzb@Uo9DsjXEiw~11wjtd!x+ujk5bUN;dGkP@>>UMH2i<1yf4UNAxw|J00XT zgB>UQ+q4M4Espnz7g4+&z?F*#FX%~B1TR6cZc>>90xYVMasZRQQ}WmiSFoFeOOF;I z4H;InbsDp3ZU%A!wa4+{6jQ?K$rKbG1(5It2{Qxs&}9JfiXBlV%|!R4ImHaxkCp;2 z)VK@1fXHkrTWH|~PW)zS&CvItOD1`veLbIRjXX|HQ&kQWm>q>==ONoNcODbXW9J!v zm;CcXi~kCR3v?o86QEL~0Hv$~l$Ztil?k9qkIyj|`|M6H5c*4@hlwQ^maRZpofjBx z9*@C_<({Q^Ket@sg&i!*hCbU_I;QBvmA$>47_qXWLMJ}*t}Ng?V-$E~3cYwr))`{j z9+7bhH0S5i5Q6}D+V+FJO>4N65YMjYm-1RXKoR$dA1hV-D7?clu9^LNzqT*B{Bafj zh(&@-%?oodGtZLPkiVJJ*=RDZq5Tm{c(7SR@ENmwlOq>X#KPgLPmpg8#!Telp(icObJ6#=S7}5o>3e#}QfY-Uc@6_?J>7 z`0pta3ZLV4OFNb0nTo5FLG}r-lJZRNuuUFxA;Tc{H`CwU5c_`M1~}m%M0CyN8Vs|H zR-Xo2rjy-pt%0ldEcz5~T*Xm*{Rs8%02FF83x6FL&b&Q!{N35V2gG)w;UbheBBqv( z&lGw)9c9Zd=wP`NpvMJ%(wvt5qrtT{ye3@Jv1XM=((jL`k1~$u%>2}dFy_I&!fdDS zaTPAM7lDIT;RB4gS;Dm(|0&^lVsju26sG>sOGUT_DGC*`b}17)g_Ysyt6|FhGL^#Xd;I*|P24TE( zQqLhWOe~+&Z*Sf}ha&Aazs9~xowrQ?JK*tumHwx8lwJL=bIkvImQPy$JLvJhfcf;N z|2)rbkHWX36F!5gRJHSEH@^BO#mD{lxE~+)<3HVg{M?_N{hu4h&$s`pN>?q||GUTi z|2aN%{}*$9$o*fy{KosgL}*}%JE&gZpV(u;mv6-zMLGg7fCKQVEqQ^z;6-IvU3#z@ zL+lHKOSjHFO9j)(Vzv{ccrauZVffqTzEbHb)3IufW_w=gP%o+SLQlx@qp`UJwq$?7 zjwDOE6}}6H>0%cKgYBOhYvWZ&?wsK{Hq(}Ve*I6)@$TA~f?pNU# zf)2evHDy>3yT{+{P1@tT`}LNo-pw<9WA6jA3LYR>(ZMbpJ+qia(6sp}ehUqfmSF36 z9!*^%s%t>w9PsbNngFAS!{ULC5nT40&}-yS!zE4oq!O6YR*Y727CK|aNf-_q>&V4{MADc;pSoNsND@QZy@DDfrM$4ULcttmPy=E+Kf6wdGU~b z60iUC!&qFUA13msz+R*3Ta~?*iRnmb8C5DqZowZQEr!&yMe_HHJwiMq zUO}Y3V2xhnWp^S==_TqATbLRxVB*w=*ghf&5;6Kpc|s4-UO|}Ru-}&9Lrk})X0-xI zBki=2JytDZLn^xu!iE%*3>(shM>ed@hI|kB=4@ED7wxhk=R4paVl@<*47Kb9Bn*Ze z_r<^x?#sqwI-3A8SZs(6=W*33T0_)s#N5?4!54^71P09py=KA~qczo7iue+UCAcRb zs$q6oSpZ`cu80ch5-l*L{{<^1W|+@E3NtH)VNG5A9G}D!{Q@4pcpRUKm9tlGOe=k2 z>C(L!Go4uk=_Wk@BhiDs2I%<7J2dF*&_f4e%14{U+A8&)rz$d?XBa!zPD|QdlG$M= zErEMR)*`xt2Snu$n7TrPapNLUU>%j~>j13te{Vki|WC1E-; z+2Ja<36}OEISOGb2J}73HanH~QhHyMTS!bvLcClHD93L76GFx>w00LX>%Wg_2QM0VaeBmn;nq+wLtflf!%Rle-8bx+c?QqZB@<%W;}hpj=_m<@=IdcMVgDCe41y=eqJd*Er2}4%rKVRIV!>w;;vf zJD8U;M?o&LRN|N; zJX$G2O3rBRY^`W=Q&5v>{vgtR4m6jbR@;c>NkIS$p@kQ5@gDg1I!-6)o)B>&>bQ|Wz>?$8GU9(jX}`Y$|b9U5Q|7_KNN!!f}N$5 zCP@8zeuMODRP7y}E?-FOkg@t)rIwK7KvTl7RAZ<9TlZN1?O8sV`fmqK0E~e?cLv~{?XJRTC!TA_ zD%+OEdQ*)iUvY+jC?%TC?9#Da@V1HtS@ddVpT;fVwZn`7m|tic9hwqE6dk z3g8{2(py}6A}$FN|4|gH&$*#o0jZqD(n$o>Qwl;ELs0<7%5&dW<+)>Vv}19!V{x?4 z$Kq&D#%jmnXvgAc$Kq%OTjuv!9PJxA5q9&xTzk312TcIqZ~q%=+fa7w|MoHe>sdZ5 z|4YpIK@-3P(1Y0jd(*h^YPHp8oAU(i{r=uNx6H|K-O zcOwMs0eTE>c)o9HJ(>aII*n#s3DNXbmsTHVv`b5CYO$J5)l^J?&TIS>&NJ2#-B@6k*9DlGT z=hpk{^K)}bUW7&I{fMfVAEw0oy9Fi#!)3dLC{gk@?9Bq2v4pCjWDu~19|u#}X(nB) z+33Ic_)1sn>5_!V_G~m#z+f($JpMTJlUZ70k-OQfcqeo6-Wm+&P|9sS8ef}Kpi8}z z=*dZv&{mP_cQKgF$vT`5KgwoZN<={e!fJrB^M64@9|IzqoSsD(nr&E(`_zZ%K zEX($=F8(&SxHdE5B~e~n$gpevcfoUO9a0zn|43}v*Rziaesn@Cf3b;fIl#saQdJW} z04(tX?;gW+R~Qxwds+#A*qRpgk=n$#ra9h?AWA=}#sNUEaF~Wo|ElJv0eQs9$qeJ{ih7~?ch(dHenVPVGnIa{z6<%7?YqE6Nc-?B9EhA%jukQX{ zQ}Y*d$akw1{$HZ*TW}>dncKCs4A+*2*W?-Ys%QfN`GVN&+hgF6cetcP`tXaa6quT` zIdlqWb2z!YB+MfvX3mKYlWAWqT+DyWrvnQvq-8y*C%jtK zn3{tRxm~WO^eculhaV@btrwzyLb!Cpe^>=;+{p0snb--IH}sprAB4=2)@-7G{tNw! zm-cS7t5@V`e02>3X%M+_hFF%!8C1Qp(p3ZYtiIJ2v~p8h6o6lZ#e+Z7(chg@>yKB9A3@xew;>!Wzx2$+f71TfJpL zAJ!Ip)-WT#m*4M|+wBO0{L1<|L}vf?Q#D5sfn$*cbbS@8p4T%XEt%Mo;N#Jp5NvdD zJvF6xUtZPt^l3hLPo$v*ZWadn1>p)>RpQ0hL@Oi~0u195^1|lSs|-#Mwtl)7F{>)N z2hKajwWKfK|?&7+ULN;wqWx7_Qz0XO*!Z#9aOqe?Rz(HJ^0LQ-6BpYY| z%<8C~oxCmZHGw6u!IX+8p&oS$4k7l%e*hK_|KHxXKecrvjqcC>D`s=67I0*&qbE3F z_aipWQo-N_oLyg&qJ(sebuDyMdf4XM%Kv_6x_h3d=bR&uNwOu&*YajwmEdvt)w`paSR{7U z-D%()oY^FgGDe3L#IP@H=@k4Vh8+JA2rfriZ*Y$WfP!a*fz@xGvDI0$l9cenkvPQLUF)Pf+c#wgc=)q_F~4Mgmi63!JbgasUa?_))jQNtf1V0 zUgS>FIIDyL;EZ+{mM&Nj40WS4W${0mrk{q{Vpe^D#qrIjw~8}Ek-Ix89xR!SVroG> zmNKh$Dm8g`p;g}n4%3#OZ^^{H`=xlKZAm{IK-4K1z6V_dN_Js1fx;fc&b=OGS3R^y zjds@*QRnnP9y`^?BNxEVqxf;1TQT>+K{-0!SQ7ca_m3skE0?Nn;+X z3nar(R&|kQuH+?45LfMo8Fhw()?-um_b*H zN?#6SxewWBaH)RtLz^SYV*s8NLc6=~vVRGylg60He^KN71E91o-rZ%o4E$hd8B4ry zWaG;;d(ZdHu0ylg_gFE8+xxhnlv<&eiOPVcC8Xm_)*Hyxl0;Bb= z(eB&_%S}3mljvP*cR4hEw-j?sow^qudHAgY%@~h|ca6@y(DXlitbiuYJC1s@InB7_ z^^3JT@;fak-JfKUZECl`d*qmip(*qPO7?Qol-&LBsBMEhcpmtIF*vm)jV*AzO~hq_ zEgxNu_R!D#%l)IXgYtq(?~?rM^PSg}QWqF0#|)OAcz5>ve^y3Cs7J2~ zjo&}oRI}l+v0LKek%)f&mWO{ArYNp_>z6__&%h(n)}!tB!)l}Bixe@%kvm{QC^U7v z2!$eAZfw~#c6a>=rdz9Sv3jlJpX!)3;XVh(S5BxrP_%a3eY~fp=xXwvGwpctsrv_B z!M0%S^e5s8!fv_1o9?Yhp?eIlE(oT`tc{EMMp%|EJk$_b5Z6}FJ6|)6G!~dq$SaU7 zv6I7H9PDi+<>e;Rea^JBC10EK5X@pRaw_L#pXs9W(p>h;%rztEVbD9>W#%D*Yjj@c zI8I#iTE+rZjAO8&Ua=shViw*iHHoSkO$;8;K8ULx#5R=TBcp@}4m)3$NpQ6K-%J{a zt<=VO?Cl%x?u@UcklJy_R)^hdZ(vgj1C+1ftEgj9$ic10PIQHrsM!JWHO;hoE zu$YB)oY*B?g8|su+S{u;qk?G#L&CL2e}?Zjv1PD8ByV|I%!ZU>)Sp#MMEF5&vI5|* z1uz8@p+Egm+M7x^9NQvDuA*Nr9$m19pkqlQd@~Y;lsVeGs5QgDXf-;)-{d^KPQfa5 zGDx*1xF}Ks=gKKpn|woDJx4)Gjtq>a=q8Mo8w<(l14dwtvXfvmotOgJ;$R7L17_q& zn|0H>Cb6fFyPJUY{W*UYiLHOT{2g<=i%oW+M%n8jRd5&Aq94Rk&-v!c9@u zi2w0$1~d_j3#q+=V&&%5M9YY*=C-7Ol|N%@=k(3Zsg|fUHbuD^ldKY`_Cb>L<7U zfEQg-pFPiB3mq>)g)Hig2wdL!ByC$J6akb|7p`+tr}BRSficoCghP4T>-UY5Y&D9* zd3xhSfT3qwKp_9Wkgdr>(R3=neKQQMFDZX?BVKcw^{4gLvfI7{EG@;$=Mk=&n3AUNDGd4S?<3N z=C^QOnY(B|yQMkJAy$RGDnh+Zofel`NB~{nQ7gKtD2@n^KgELfKVaNh?G;WPcX_w) z?3B+g``Ku5Gmfl?87bhhGtQMzKI1607I``+kYIRdlY>Fcr zc_z7;iSDMKhhE?4@DjUO6 zLh)@1tSy|u{+q@QcVJ$21?R?lbfNRO~A58E`7Cs$b7AQr%{s)*CT)EM(XD2 z{pNO0!`t{0I6f3GlQ5t!WVnA^-Fof%+FS7+t31B|Sxu1&%L{Kv71tMCr}7Jo%zmma zrXF3)RMHI(xqZ}-KNpCKrkD+p;+HN)dljh^i)9I$6} zS;gYAp`Dbud#`ps? z_>*~TZE)Nva@NL_Gp~B+E2B9kn0ZjT;%IY858%gi?vN$fhO~FXU0{aeT*KgvhQp;Y zY>-qPOcsP&9BKugM-G=C7QIFYex>mg+ZIeuGb2;-%abSUcwg}vq3{_>uI()g8)SND zyTWRXnk+r*9*BPwGIxFU)wq@uUAcO_bT`8!?Qyz9I7MqX%n#bC0;Zu8^Z~_6L*ePf ziILm?SW|*j74#1R>zdO|N4UO9``HZ@m6TK!FS$fJTm0T56f>DKS7JtrQvI5#hcToj zl~0n_N^)h#h7Q!R4wS3LLJz6Vb;r|-<-8q8?17Q+LTw-=cE#@HOoZ=N&TC55D;Ia! zUwUq%^XNW{#^qw}^`!hbBdTr=5tq&vUdzKpQ(B49&oV-6-{(wl=*;Yyk+jekdk(swVL=<`y_dllslbIxeYC(8(WP{r+E*@eS+q%%=Q@vDV zP6eM$eZ7JB8|43xWuvq=ex_^^Euduo z;u$EVVBC6#tBKlwM$A7Y&Le<>M@Af(>cd`c)M};x%G1D#zfqH`o0Nk^IlFQt;2{Ra z#M`5%`11%AeT1mjjEYI8X8+dtza7Z!v}!KAM$mLJ+gHL27md2@NULqf zAkx>Q8K$%VeFs`261xr>P91J*lCV|}y=_4PvyeCgL`4y>W&e-4$&Q{z(*#W4En14~ zUmw8|e|MKckmOSuEP@0Fw+^X}=4w^n3g8oAHM`q3wgFSqNZQU)?LrFt#Tmv`*EV|# zlasCjNp@RiLt;AR?l#R*B{U%dwcQ0RI=^TG{wDCZ?jUIT2nc*<*KW%WthWxNbYZ}| zZb#}Ig8W}>e6kD3cGRdO9gU_Ef}+3v80_HRCf|;omR(jm0Rn*|zpMJ1)M2pd(Cm5} z{=)3kcgtEp(+G<;!R_j-j|4Vk0=u4I8iqV1K)n(mQ%N_mg<8-8SV##h9vr>|R!O3! zQDf+~Af;`Fn{WbYPk=@yUBKCahO`iV$2P%DZrZ3v zG-#)7*A1RyT{}sNwtGiienIM0jB6Z^p(Nb<>^-=^1rWRa&*0wLQ=$kAe6Hm%Rs0jN z82i0RuRomMV(>G#Wfy2hI1-i$qRFowt)&I-3z%3eUfk6;7fotXOZyHJw(0Lm#6dpL0yros5U3a0I z)qI+POS57DOx)X*hKjhvtJbw>2UuTrcOmu6LBhNHijTw6ZpW575Lhp9%1PX6ZXo)i zx$NHp1P$jerZksBz=7Lz{nsF9GMQEWRz%>nBfgET|HgYR?TSA2N>~ftd*eNJh?4IX zxdP2qY~6}7b?CR-{Duy_Kn4%Uu6MP33o7uR^eStqDx?1r%8Idn{ouHoaK2t#jfQ=( zKc7#BSBrV6LulX|E=rt`7WoiWp}j}Lt4j>_dpS|?J$cZ5DF(;DzX&dA@-pDl&llhw zmU9vMDg_nO7rl9}*fQ|~qh!kAe)h~6138TQW2K*)UQ0BP0YsfrW>p@b?6{d4g10tf z4+p3RvW-gjy&86IyiGmMz++Ejf_el_zbI80Se8pv;SRd(ik&R%Njg_@p=GmM$$0>Jjdfl?@+B5^GQ$tDnutPn=kSPY<5WQw8SC@ciQ zqs;-q!vfuZM;RI?+8?NSoE{tz42KaG^MciH{Lc@E=V$+uix9YkGjg{r zUPE$c7U=5GOk9$cd(OG0+eW{EOW<3dhxhvA=zm}tw2FhEg#Necjc!2yyUj*pP5&R_ z1N1+b^Hm-M0qXdPu-uK$m8m(_mt~hfV-8vYkc?D$$WTMs79rzYrcA|%InD!tYmip~ z*pDq<2;I|R#0#N}8GQvnG{-LkbS!C0ak{3x7I^6!vLpU2GTbc@Du-5(tVNpp789{U zj#smU&;7!BymfoeilWP$H`$KY$suQ_+B0-sNgoQTVK!I=>%F+c^x~>=+w*>lt)Mb@ zcYnRn3#h|uboK#?`u%J%o)>D?ELDw5Tc{dLT4_Z&+Vs`thaqiupQbery#Cz%ljHyO z4SR(Wpc4MS-EJqL{HN1tulfIn_yGT}=X{lnzs6Zr1~eZGvl7uyk#xw)kctFE8Y(B1 zsVumu9PJ(?7W5V{?_FPloF5zqgbxMaLxqi}%DgDJXlHUk4i+OF16&vUM~(_%blc7 zXp{7M|5R>-^Mlhf<&uMBUep8yh${??TW4F_;&3i*vVnR$n_0h7^AD!TWSV^%4%C@G z6J|ilZ6UF=HZ3MxvOP2`*2kqg@)}(B*L8Jc^2wp59A?^YE*3jm5i}M+yUkHPK_gBx z>y4-NHtRIghikMf+<4emu6V9xfiH5vHYb-#wG1P}eD0wUtz3jd<50w8x^^XMZ&858>odCjIHGKOJ77S7ogWV9Zo{ zMnw_TP83dO)9BT>}%pDR;?I?t%$jO;zpN*qf+W?}}h$!3m{ZMnAv-CCAP#IKw@i2d!NC)Zms`e!2YD+^BQ+Kf8hZtGWV~>Ho)(kb(XrCe!%$kPyNDky@VyGqzH(Lj68sEwNRa3FekAhu~w=J z=zv>5?UtI!(TZ;nzP&(D93X_B;GmAU5X1{Q4?J=~KS~A2?&;t&IM@XBRSgNex>B_< zOvs%)R*n`&pL$v_{CFg9$Jt`8Qtrkt1y$KuD4zn)rC)AHqT^v0Di^q%mx7!AADM&d zqi2qDkV9sZLXK&L+zu~{Z{jtMnAm8jght9g;6w>q?W(kL zB_-v7GzF>Dmr%HbXeq{)BNqe@va?&Y7zup)K9f!*Xyq%0j}apap(xL9hz(P0HCcFp!gBZE6Ft5w7K9|nSvJOus2eA#i8e)cx`G1X!v6y zD{zy`B3mC~{D-yw)cnbc&VUm7-)z@g;rmY~S-<~0$j8`!>N#Jv6{z8$tDOUZ_2$xs zLDqz4EN?4?HYWYvY#uWi(vG+FHK-5@Za{R!jYGk!wOnl1g-})PY`EC8C{RxPG?$2OxgYoS!PJz<>K^>Q#3Pf|2&OfV2>k8m|#2~Nn^dHbM z@+NErU0tqIEX~qglVn0p0Xi~s-#7odC+V4Ks;IMJC{{BqYX>Uv5AXluLErz9M!S>q z|Iu0Ve-HApje1p39bmI04#C~s-4E{W9^9RS6YQYDEjWbW1h)eOcbDMq?(XiJ`|rJ5 z`?6JAHPtf@^E6e{^?lv*A*%iI5rI#(^phA`~8*-wb3!!TTK~b$UnJMw+X`Xf2+Q@q89oom4Mk}b6Ur* z9+0iSNyI0ML<_P(FJh=31g5mO1BA_9T)y+*nZ3}Dim=j}oy6kREsY1+_Z1PCK72zzAce3tPu)(>(}aI0-L!zju83%+QX z0nO>pT8W5ekWs#5f^w($SBHCDItv4it|~i&U@q5zS6!W*Ax37ha|RzhGzs{RL|osn z)SX}@3iRujfH#w;?YFLBqHf)m3Q#UM9Gbc9bMf@|hjWv$Gx+%*liPkedrs(_y^m8G zr(QPMMkcBryFY#KoYcg!amR50Q*ktmfF7H(U!eD`AaYcIR{}p87$Z3zC;;L6@o}cz}ndgRY)hafQpO55Z zcc0?lIyKP9L%-pCFbYqU9Q+<8ef@lo%n}%S2F~N?HKw-8tWQ?j%{QUU_t>X?HZ0SNc-U=pZR)1_)E6BYkZD zefw#AdRiNWTx%e2RQ3m8X$<9%E0owG*p%K-dLg_W_FW$mT{tG}Cey(ohC{Y(aBk@Khe4BoNC` zFm1c+ql$wO&2Mz87@(a`a=@ z6F{p3yh18nI6J?YCN9P4q&JV5-EC!fQmM8dvqULV`ZVDf8W6aFNY|w%dbLo>$RBmx z%ARI(GvOLwqTh{`&7SJH;ABB5f`c)%;S@__h6GA~p54A+LBI(bO$$VzIxKxUW23v8 zEKr=Tisi*7cpB&n$iE_nvg$x8soUaZ5k(3)~S(c!lrIAU4S0&RUT- z;ot1CgKi`Acv6`yP27S|KY6n#)78f;ow-NbNkYKkbbwdB&g8@Btd3tgCq03WDU2}P ziwcoKXN!Br*u0G5wQrJ^I#U(-0XSb5zvG-?hO@MDVGW(*-4YVF9Abc?gv<|Ww7mPc z4F=kWk9X=V?vkxH$UfFh038vEkJ7UQ5GN-KjkJ$-D7s1$7db2PTBsW9B#idisG9t0 z%lIZQGsd6LBJICRWZ%UsO%@q1SkOUdL{J6rF`VZvE#71gQSnBOR=u$8LhHG*F3P|;+egwUqYeD4Mdq+t!Js!;uSg~a+n6%^a?3Ew>g$9f?uLCeDkBI z&1}3J=ik4)Jok zoX$s8Ep{Sx;lxAYVhKNAZiyWiAq$na0X=ak{`4oBR`v6GpxcY+p5#u?nP`$v$?Vu_ zVEy7l7upTvJDKod#oXsKpHBX#ra7^O<>&9YfZ|(B=!E>gHxL>Wrhcw_AP5Ezt#E9& zW4^F?;hfY`ah5?~t?(*9X1hl$QJJXPOKY9vb+t*9I47IfMC-arr6x_3EGviPgp(-t z{6I#pr7jmW4t2sxy+NpK&9QoO^CAt`|NWpogX^)$Iex;}gp`c9ozGjntb03th>p;! zphFYtO#}J@7n&6R@HSRO9@;o33-~uFG0?yDbGO3ZM$gk_pnu| zu6eAY&jMwcF=*{GE!-ikd0CWC$mh42AdQ8ayPF&Ed)q*F3H+-pVZFl#@V@Y#e@Zf?6zL-lV(T5r$S7paNtaMtww z<@1l@<6+S+J|&hv>xO$oH+~g0YI1fg?;UNC5jI+C*A2(xHd;#1Y$OL}q_${sW@6T@ zksji9S_;$+pBC`?a9pG)S@Zn+he@OQvBwRd-w^yEBM8Ci152x2-M4DrykmN-T3cY4KI zyQ{>Ke_R>vmRl@SSs&x6<6}vDUmtMZ%C)cdk9&exOFp`!JU+Z%EDXaBQfE#5&KQ}@ zh{{t?D*(4c?~6T!OxZuqI+iS*3fu@HZ#=$7273FV_B8UuDEobQ!R$T>fy~DjGR4sjAt9c-#yyw>yvcX26{U0SFZY435BQ~s*DB|j zC(J$ZlYrc>65=#x$3#RO%nY(D@P~$dyo5!2SFu7z#v==wK{o@>)x2=6PykWUbx{$) ze7%2zHEG^9x}oM3DGcnQL-x7mH4NNpRt6y?6m80vn)Gv-Wf}@>RzK$E{@Xs%S-_|K za;g}Q4hfP|V$!#_2cB$|y7>B#t+XUM7Hf0WImHz(-&L}r4hElIysK{VWRbhA0TYzL zo{GgoXGOs;YN0#w1;lTARs$h!pU<};i}kQobs$=&RCl`UG1-oanOf1TEI8@vTD#OF zmqK5fc?4Ca6u*{0Z*1I3wX?ge=cqk$)OeiPKVMF7Cj&jLYu%*+6Z((F?F%i)W?hxv zDzRY|VzLE=S%g<<&Tg^3Nixu}mjsITaarEp^;Oaa^g7agcHLi;m?&hz(fwMpcuf-3 z;maxbsjUoA>(+|OfjobHq2U(ja=hgCCB9u&Z&Ubs)HBjy7;?D4$yxRoZv$@nko31q zLqG3h$>M&p7wF+(9*s`6@%N!5!o3UXNilo!l!NzP#dj1H+K{sd2N9j26@Iezbv7n~ ze%?tmhwa&cQa>CLQnH+oOgMc)t3^8UKPo{|!UU-^)5(id976MnGyWOM{mH@aTeACJ$ZKieUsSO`!zyPOD)}!`XyXIAK{%EC~S;Cn_unZW1T|YU_(2zB*hv z779QaXhvSneolyix)1=!`pF{!RFu>&qbzK)@4Q3D6l@SvKqy<+S0Y4M7Hs%6hgR!l zpX2U~*6-U&DjN+?&|0mn4?o=6Mx7eMy>5h=E|zgoxsKS@nya4y7uA~EIfq=^I??QX zThq3S8kgHZbT>5axNvG*^48w}Fg9tsbn#4}JS!{OvF|=NIW6g88Bwlx`D@+{IODz< zTaTdOg>2rol6h~WjB9v2Not4>v=?YBw)hVOx(Lt)SUt6sUtezV6u4|lN1CxW$YQj9 zKsl^^i8u@lWww%8_K;_=s43W)Q+~Tq<94UBpbRy>%2AjL11;e-o`+zknq-HsZETEH zsSo2n?-Oot{IIwA0-5oU%;NqzJZB*@&C_sFiagZ!T*FKF!M1EIX;u{|5b*75|H9g; zeSDihK=G1{RYhNZ2X}JU(1^WU3DF?bzMQYmLgNzDi#g!*anPbcE~TjdEh&F2+N(=T zpLX!xl3BuQ1AC0AMDw{9?*}DVQ}>i_Xc1OiMUxY}7v$)`h1Q8^ZBa5XiAY%1y1Vy; zSG8o;)PAa1Vp?PLIN17|KzfDweCA0(nkeV%WlC^Pp_`xc&XJKf$&$TinO3pvjZL8- zENn#XjDvbDuwB^Uj~eHLs-Ek>FrFI8nr6;jP!e&XyJeS_IG6H;UZ-o<%}8mPNzEaM zxU)JSN>X0`GQ!gB(pu?a6QSm!jSR76=#}h}m#z-P6JyS9L)w9UWk8OcNdBnD0dDUg zVUmA@B^rhVsO)}})+eAl$;)7b8$Jw|sTU#NqMG2(cNs1y z7R;xQ23M3!qsHonZ(ZB|kWeyf?;)V+MQ_=|j=i8xE@_dwb^jT{FT|stVMgjQEE69& z4jZ>rTER|!Kx>-v{YI=Cl4u{5^)vOW;7*;RU~>=xo4U+r3}onNsQO4W@9)J81i7NeM6WWq%=4^#e>N;6YJ2mW2G7s~_bKKE zmX4HemOU$nkj0ug?)M!b23e$JpJ3V7sz9#~ zoYjw7C$>Ed=UvITLP?x}w#l#quuJ+#cGJk!Z#M?+325N)DMN_vD1vzvl*89Nt!^MT z^R)3CaO*4KPqC2rj~2W@?vt=w+sO)Ar?-!3a;(Q!Lm|u&*#X*{K=a9?h{&!tSkj>( zMwVs9LGu2t%VoIxX-D*>ckt!KcX5tlMCiCRBlhl7`lDfd5-MS#uqSS~*Gd+iWEy=_ zjw!^}lY3EC+EH?H*II!N}%xfUkb;rMovy+PW#H+G2aVqBsgZ44NEyN zV}=KR659$w=0VoYb+_PbIzNd7LL5RX6lpmuG&Pbsc99+MwAB8CRcts*(9d zQ8;~z8Kz+TjF{p>T|xv3q%0`OdwE;Ml*zs~d~m?e6>bXUq)zkwR%)rZS!TZD`zPu> zD0efU4JQRXy4j&48PxS%Niz=O<0Y=T;KY22rd&zXHXms&WponNj*tLQK!b`#y(VMg zoSsC-<`}|=C$Z1*8!&W(gq?y9Tix^PlHb9g=lD?Cv>`meojLU+=kMt`$9IJgorISQ zOvya%!Z7vtiCtm8ZN^l#prs>|FJQk0DYGJT=K6qZ&VAIBUp?wk2E~;Ht3wPA{s7d$ z3*mvGtwF&JMpNApjP=W>8;;?YlIf)tI8~ao5pa}}wiMw!11zH^Eo-;eS9UYqHYg>8 zDA}Pg5z@JW<1E1LwJgDtHhiwPCiu9z=rM^)sgcw zDtE4}emM7Hh6ikoqs1Qze(#FRCbea!BDN<$Jut~ovQJ&4i7e((j2w2H&X+{sJ~Vaf z3752mMumd_^I(U|6hhUrV^|v3O6|ttgig_-k75@KYS46ST3vPW$JRk>(}?EBPhtm2 zlgxTf_O-$31=o4UV5=W`m>M=oRSTyP^xmfR%-M_&huX9@DuscPxqFrhSYk1LwDTYl zgex~#k{Z-;KF&KR`Z2i+2XHB*XbHj8mh?eH?VU`eiOZ=#25b?Gj|* zx1+s*Wr@Uc6F#+;gjSg=t(1VdA}9+9_Q)ZhZKv_PZRu>JRs31^utVu-O7LZGk=@lW zAKd!O0rIgO%5$-D+T*ujPCLAIeC}5V>;i+Yv!IXiIWA0lFR2xsuOySl)*}W(NQoTk^Kp1G zhX_ZkF-NDbT=GGN_hCn}=-c)TTFy5FRs<^{}&pTS*9hPzqLzo5x z;^N-q8W+wfHBszLXE?|EU>?oQAsC;zSRe)e+z6k62=)A1d3_WKxG)QcmBNY&&p^%6 zQM1*wFby8H`s?%6lqkIRi-xB$*DWhFhOxG$2?9B2=>2>hT)3y z&yv}mn9GWj>+;090wRs!W z_7HEvU{a%Od2w~<7CjNdzqz0k%?MHWL4fWh@$how-g z3SA6GGVN!58E_nDd^MYg+)k@67{Vmbo%IIy4HoXLrFi5yR4i{z?GX7kd&UB*0PKwW z*Wv5#MC~$O7~K8KQh4_OYUQb(c<-C$^CVIE+Eu~<`4%n9$rmA2~RO!wuQt?rXpvM#qLXYYPt?Q@X z`qnaFiQ96i_zqLyP&uu`Byx_Raah4g3>z%WaSZ8`2A%fb(bg+%oyT8bU!|n;41u;f z5-ChAOZ4`g!2$W*WUbHx7q;DK!9c-6#8k$VcBO_B`uE<$uXLnUOt6wIjL+WQk4V0& z<{VOMPEu-ed6L9}$h>C^VZtxGcF;6}fTxQso%Lshlo;k)EArEgYHejE`gsCm`Ct>2 zH{cFlzOq1MM@-j>bfi+u5fXY7+yO(p9U}C{3V;PjZLD~mcC@3DSymWAo*k|-XHkE8 zKYSi$%L!f5m2nTDj>V*!(2|pKSAyE%zoSh7$*+%w`OcKzpi82cf{SZAb4KkKvvOgK#p0k_uzMynE#Zekcoru! z*9&Q@0Y>rat1m0<5?U|HoTI913_;oG={er2X3al0H^)oU$0M2oL<%g;uu`6wdl)$= zq@h#%MV-fSqKz%ZDU`H9my8)LaH6YM@EX4;0Y{#1T;pD&@<#C2pWy?d0$lJh1G&9| ztL*6WgO~DUp@LI z3Q#3{021hVj>hbkt2B9XMED5glLOA11*0BN!2%sz_mbch(;>fhSEw9wpN=5!$4__pux&3?kwv$-vUxk*TeSfTqt?yQA2V6f@tK{w} zuU@rcU(?rezsXkDYptGBkWdxxA9A*D8pkKFipz?+j2{QGEym1h=1uFN#z_UXC)Q8!T_fV zIrt)wyg@1@9byslSj8xWNn-j3N3~y`L6j@eLxqE4)Sio45_Jp4*1>Kj<$UA%9p_pq zCSY6=mx~Q&szPrGW#?3a z2K*0`0I(17)sq7y0t&F!g7JC*14EOGOOE9<);7kCDbrIYzeTQp>RyM3rtv1K1s4{& zrVp7Ir9&nK#z-@Zj(X@(zoBZ~hQxRfPM6?(e<&lgbr-$EM`-2pvN7Xe|4$v z@_KMJ$)&wcAO@xXK-pF5l?kCbb>=hhU&hE>H{4OA$`AedIA8T;1?^s_wPS z_AP3*N%z6NX(SC7Zi+(xF4fy4c55_^@ko&Obw0nErqRhl+CXP&f2OOL&XDvScp?>B zdW^H*`Q~d!KE_Q|#AMpFBEHW`d8d`kule2d*N2xdP6oB==Vqns!%c;w7ql(Y!AaL%bQ>kOGkE@GwM2s9@Lz~W#1~XgN zRgC5Um|Z;McE$0*jRv5pn8uh${Y)$%9CrKmef#diu&C|bY6t<+d#BiZqSO?Qm@Q}{ z&X)$c)f7K~#rt8P$Xiom#^R}0!H#)M(rzP`QIT;%RHm{?n5<`W^Bb)EdGYo|F#XwI8#Y8@liIB7j!5RkFs+iZV(5nv;6{6T#!g(~G7T?j)H*Rrwhw zo>j0))9kaR@G-aGy=c@6u$=9K*)pO;;>|9J<%Mhpgk8n_iT1KA@+k;>oXrZP%Gk*a z_of*tR98)M?&lRPNDnV{_G&!6Y0|IRjEr&aPaab3_s-}Dtp0ekZR16!8s75%4$dQ% z5q6u3j-i9%oY)}EZ5I&~>N_IoW)k@n?Q;#R$1mJ@UG`%iYZQIMd6H&l{l=wkb6WPo z8usVw?e~-C6NVF80rERFZCu=Oq*AM|fB(iQCB`bt^dO&6xdk;crc>&3#Tq&~eAOOB zi{%uWMPEFkkDtgO%Jw~wQ8@hK7+VQPVH?DF+dV++R@`@r)|pXqGXt+Jd0gV|!{pLE zKwC!V8||K}`RA8B@OYJ_dzQi?FV7_@6JMenVww+v7Xe*c{jNYcTemdV1!=Bk94k;=!#wg%fODTM;XUFQ+Md+Y&8L`rS{ z<2`+&G(tj5)rQE9{|*kh!Nx_TvN+9?7y$4G{qYFR+xd^pbRx5~ARaw(O>~tMg+l3e z+AI}Dqg3cbvRQ_{B6YPu@eA>{vZXVLK{>=q)DsImrU3=FG!z~-8W{aS7Ri9~x5}Q2 z_@9|*j@8JW;GHg<-cz~VVDktZs7!>t;NDssi9@PnBt&iocJF#Ccd)5oV_lJXa&N z(t(-(HjM76>XD+Cb?kDoH1Lh8do4j$3Uo`ccU1+DKb13e^4xQ>|6U3FFggAoyNKq; zqOQbO6@bIBVdmdk0X|dtK9q)`gsg$HP@*#9whA_SaZ-Pb3=1Txef-bP$O22dy^i;n z0Yla~*FHikX%Kwn&ZdZSEBu(<_)T6yjlnn2xUeaYJ*w>iVL5cs8z=bIH0QRVC z2n^tizFTpHwu5WWgoUzaA!2Gzd)8_=`8hJAkat(_YGKn(pin$)x_s;)^1ZC5-knik%Ke~%ZSHefZpfROP}Wo-@L@s_bl*)DF0eG7R{Z*UV9 zNIQLv~&9G_i0?qe1F^j zNZ$+^}N)5*0z^TQ}GyPxZD1;f+#9QBaq z-Inp)+xuXv`TWfGtXnG6WT-PnC7R}gr7Bt+Zq_TU9LzdzsKL@PN;%iNjFe{J6knjY z#27o;`ooDmPo{lH zRTW6pB{XH%@Y7fNW?bz2=JxlSy!~(VOnaN)%Me!!aFO=^R$q_k4Uk4}TI2{kpPy%P zavF%K&>*Y28sriu8!ZMV0WY8h%n0_)M@_b)C@LtcwRI#PkuTfbukCq{q3oK1I(XEa z6Nd$Dp5i+vej=bCJZiRh2>QdDV3-Hw$kR6CsZnuKWRiZQq_D$VRY%R{77xEIBp(M; zvEE`Ar0IJXHn}shULimCVvou!5A=xt6QX|T5rA}~*j5a8vIk;oL+YM$A`$mg~8Q zs&8^smN6|Z>0s`Q^N;U~w(9^WQqfz+?=V>F46?#YD9WLdd}em^kR78Hg==eVy5ES5 zFBqcLct(8Pb$Sj4{&Nqz!j7sQ1-e{$>WL^GW{s;Qc)0OBh5q=@Ijlok3!~9$8(8#o Z@}=&h^8Yj4=Ds|CBEfe2fWRk&_+MkSukru@ literal 0 HcwPel00001 diff --git a/clan/doc/images/basic.eps b/clan/doc/images/basic.eps new file mode 100644 index 0000000..0cc0497 --- /dev/null +++ b/clan/doc/images/basic.eps @@ -0,0 +1,402 @@ +%!PS-Adobe-2.0 EPSF-2.0 +%%Title: basic.fig +%%Creator: fig2dev Version 3.2 Patchlevel 4 +%%CreationDate: Thu Nov 17 16:54:54 2005 +%%For: bastoul@ulysse.futurs.inria.fr (Cedric Bastoul) +%%BoundingBox: 0 0 445 301 +%%Magnification: 1.0000 +%%EndComments +/$F2psDict 200 dict def +$F2psDict begin +$F2psDict /mtrx matrix put +/col-1 {0 setgray} bind def +/col0 {0.000 0.000 0.000 srgb} bind def +/col1 {0.000 0.000 1.000 srgb} bind def +/col2 {0.000 1.000 0.000 srgb} bind def +/col3 {0.000 1.000 1.000 srgb} bind def +/col4 {1.000 0.000 0.000 srgb} bind def +/col5 {1.000 0.000 1.000 srgb} bind def +/col6 {1.000 1.000 0.000 srgb} bind def +/col7 {1.000 1.000 1.000 srgb} bind def +/col8 {0.000 0.000 0.560 srgb} bind def +/col9 {0.000 0.000 0.690 srgb} bind def +/col10 {0.000 0.000 0.820 srgb} bind def +/col11 {0.530 0.810 1.000 srgb} bind def +/col12 {0.000 0.560 0.000 srgb} bind def +/col13 {0.000 0.690 0.000 srgb} bind def +/col14 {0.000 0.820 0.000 srgb} bind def +/col15 {0.000 0.560 0.560 srgb} bind def +/col16 {0.000 0.690 0.690 srgb} bind def +/col17 {0.000 0.820 0.820 srgb} bind def +/col18 {0.560 0.000 0.000 srgb} bind def +/col19 {0.690 0.000 0.000 srgb} bind def +/col20 {0.820 0.000 0.000 srgb} bind def +/col21 {0.560 0.000 0.560 srgb} bind def +/col22 {0.690 0.000 0.690 srgb} bind def +/col23 {0.820 0.000 0.820 srgb} bind def +/col24 {0.500 0.190 0.000 srgb} bind def +/col25 {0.630 0.250 0.000 srgb} bind def +/col26 {0.750 0.380 0.000 srgb} bind def +/col27 {1.000 0.500 0.500 srgb} bind def +/col28 {1.000 0.630 0.630 srgb} bind def +/col29 {1.000 0.750 0.750 srgb} bind def +/col30 {1.000 0.880 0.880 srgb} bind def +/col31 {1.000 0.840 0.000 srgb} bind def + +end +save +newpath 0 301 moveto 0 0 lineto 445 0 lineto 445 301 lineto closepath clip newpath +-153.0 333.0 translate +1 -1 scale + +/cp {closepath} bind def +/ef {eofill} bind def +/gr {grestore} bind def +/gs {gsave} bind def +/sa {save} bind def +/rs {restore} bind def +/l {lineto} bind def +/m {moveto} bind def +/rm {rmoveto} bind def +/n {newpath} bind def +/s {stroke} bind def +/sh {show} bind def +/slc {setlinecap} bind def +/slj {setlinejoin} bind def +/slw {setlinewidth} bind def +/srgb {setrgbcolor} bind def +/rot {rotate} bind def +/sc {scale} bind def +/sd {setdash} bind def +/ff {findfont} bind def +/sf {setfont} bind def +/scf {scalefont} bind def +/sw {stringwidth} bind def +/tr {translate} bind def +/tnt {dup dup currentrgbcolor + 4 -2 roll dup 1 exch sub 3 -1 roll mul add + 4 -2 roll dup 1 exch sub 3 -1 roll mul add + 4 -2 roll dup 1 exch sub 3 -1 roll mul add srgb} + bind def +/shd {dup dup currentrgbcolor 4 -2 roll mul 4 -2 roll mul + 4 -2 roll mul srgb} bind def +/reencdict 12 dict def /ReEncode { reencdict begin +/newcodesandnames exch def /newfontname exch def /basefontname exch def +/basefontdict basefontname findfont def /newfont basefontdict maxlength dict def +basefontdict { exch dup /FID ne { dup /Encoding eq +{ exch dup length array copy newfont 3 1 roll put } +{ exch newfont 3 1 roll put } ifelse } { pop pop } ifelse } forall +newfont /FontName newfontname put newcodesandnames aload pop +128 1 255 { newfont /Encoding get exch /.notdef put } for +newcodesandnames length 2 idiv { newfont /Encoding get 3 1 roll put } repeat +newfontname newfont definefont pop end } def +/isovec [ +8#055 /minus 8#200 /grave 8#201 /acute 8#202 /circumflex 8#203 /tilde +8#204 /macron 8#205 /breve 8#206 /dotaccent 8#207 /dieresis +8#210 /ring 8#211 /cedilla 8#212 /hungarumlaut 8#213 /ogonek 8#214 /caron +8#220 /dotlessi 8#230 /oe 8#231 /OE +8#240 /space 8#241 /exclamdown 8#242 /cent 8#243 /sterling +8#244 /currency 8#245 /yen 8#246 /brokenbar 8#247 /section 8#250 /dieresis +8#251 /copyright 8#252 /ordfeminine 8#253 /guillemotleft 8#254 /logicalnot +8#255 /hyphen 8#256 /registered 8#257 /macron 8#260 /degree 8#261 /plusminus +8#262 /twosuperior 8#263 /threesuperior 8#264 /acute 8#265 /mu 8#266 /paragraph +8#267 /periodcentered 8#270 /cedilla 8#271 /onesuperior 8#272 /ordmasculine +8#273 /guillemotright 8#274 /onequarter 8#275 /onehalf +8#276 /threequarters 8#277 /questiondown 8#300 /Agrave 8#301 /Aacute +8#302 /Acircumflex 8#303 /Atilde 8#304 /Adieresis 8#305 /Aring +8#306 /AE 8#307 /Ccedilla 8#310 /Egrave 8#311 /Eacute +8#312 /Ecircumflex 8#313 /Edieresis 8#314 /Igrave 8#315 /Iacute +8#316 /Icircumflex 8#317 /Idieresis 8#320 /Eth 8#321 /Ntilde 8#322 /Ograve +8#323 /Oacute 8#324 /Ocircumflex 8#325 /Otilde 8#326 /Odieresis 8#327 /multiply +8#330 /Oslash 8#331 /Ugrave 8#332 /Uacute 8#333 /Ucircumflex +8#334 /Udieresis 8#335 /Yacute 8#336 /Thorn 8#337 /germandbls 8#340 /agrave +8#341 /aacute 8#342 /acircumflex 8#343 /atilde 8#344 /adieresis 8#345 /aring +8#346 /ae 8#347 /ccedilla 8#350 /egrave 8#351 /eacute +8#352 /ecircumflex 8#353 /edieresis 8#354 /igrave 8#355 /iacute +8#356 /icircumflex 8#357 /idieresis 8#360 /eth 8#361 /ntilde 8#362 /ograve +8#363 /oacute 8#364 /ocircumflex 8#365 /otilde 8#366 /odieresis 8#367 /divide +8#370 /oslash 8#371 /ugrave 8#372 /uacute 8#373 /ucircumflex +8#374 /udieresis 8#375 /yacute 8#376 /thorn 8#377 /ydieresis] def +/Times-Bold /Times-Bold-iso isovec ReEncode +/Times-Roman /Times-Roman-iso isovec ReEncode + /DrawEllipse { + /endangle exch def + /startangle exch def + /yrad exch def + /xrad exch def + /y exch def + /x exch def + /savematrix mtrx currentmatrix def + x y tr xrad yrad sc 0 0 1 startangle endangle arc + closepath + savematrix setmatrix + } def + +/$F2psBegin {$F2psDict begin /$F2psEnteredState save def} def +/$F2psEnd {$F2psEnteredState restore end} def + +$F2psBegin +10 setmiterlimit +0 slj 0 slc + 0.06000 0.06000 sc +% +% Fig objects follow +% +% +% here starts figure with depth 51 +% Polyline +n 4200 1500 m 4200 3900 l 8400 3900 l 6000 1500 l + cp gs col7 0.75 shd ef gr +% Ellipse +7.500 slw + [15 45] 45 sd +1 slc +n 5400 3900 75 75 0 360 DrawEllipse gs 0.00 setgray ef gr gs col0 s gr + [] 0 sd +% Ellipse + [15 45] 45 sd +n 4800 3900 75 75 0 360 DrawEllipse gs 0.00 setgray ef gr gs col0 s gr + [] 0 sd +% Ellipse + [15 45] 45 sd +n 4200 3300 75 75 0 360 DrawEllipse gs 0.00 setgray ef gr gs col0 s gr + [] 0 sd +% Ellipse + [15 45] 45 sd +n 4800 3300 75 75 0 360 DrawEllipse gs 0.00 setgray ef gr gs col0 s gr + [] 0 sd +% Ellipse + [15 45] 45 sd +n 4200 2700 75 75 0 360 DrawEllipse gs 0.00 setgray ef gr gs col0 s gr + [] 0 sd +% Ellipse + [15 45] 45 sd +n 4200 3900 75 75 0 360 DrawEllipse gs 0.00 setgray ef gr gs col0 s gr + [] 0 sd +% Ellipse + [15 45] 45 sd +n 6000 3900 75 75 0 360 DrawEllipse gs 0.00 setgray ef gr gs col0 s gr + [] 0 sd +% Ellipse + [15 45] 45 sd +n 6600 3900 75 75 0 360 DrawEllipse gs 0.00 setgray ef gr gs col0 s gr + [] 0 sd +% Ellipse + [15 45] 45 sd +n 7200 3900 75 75 0 360 DrawEllipse gs 0.00 setgray ef gr gs col0 s gr + [] 0 sd +% Ellipse + [15 45] 45 sd +n 7800 3900 75 75 0 360 DrawEllipse gs 0.00 setgray ef gr gs col0 s gr + [] 0 sd +% Ellipse + [15 45] 45 sd +n 7200 3300 75 75 0 360 DrawEllipse gs 0.00 setgray ef gr gs col0 s gr + [] 0 sd +% Ellipse + [15 45] 45 sd +n 6600 3300 75 75 0 360 DrawEllipse gs 0.00 setgray ef gr gs col0 s gr + [] 0 sd +% Ellipse + [15 45] 45 sd +n 6000 3300 75 75 0 360 DrawEllipse gs 0.00 setgray ef gr gs col0 s gr + [] 0 sd +% Ellipse + [15 45] 45 sd +n 5400 3300 75 75 0 360 DrawEllipse gs 0.00 setgray ef gr gs col0 s gr + [] 0 sd +% Ellipse + [15 45] 45 sd +n 4800 2700 75 75 0 360 DrawEllipse gs 0.00 setgray ef gr gs col0 s gr + [] 0 sd +% Ellipse + [15 45] 45 sd +n 5400 2700 75 75 0 360 DrawEllipse gs 0.00 setgray ef gr gs col0 s gr + [] 0 sd +% Ellipse + [15 45] 45 sd +n 6000 2700 75 75 0 360 DrawEllipse gs 0.00 setgray ef gr gs col0 s gr + [] 0 sd +% Ellipse + [15 45] 45 sd +n 6600 2700 75 75 0 360 DrawEllipse gs 0.00 setgray ef gr gs col0 s gr + [] 0 sd +% Ellipse + [15 45] 45 sd +n 6000 2100 75 75 0 360 DrawEllipse gs 0.00 setgray ef gr gs col0 s gr + [] 0 sd +% Ellipse + [15 45] 45 sd +n 5400 2100 75 75 0 360 DrawEllipse gs 0.00 setgray ef gr gs col0 s gr + [] 0 sd +% Ellipse + [15 45] 45 sd +n 4800 2100 75 75 0 360 DrawEllipse gs 0.00 setgray ef gr gs col0 s gr + [] 0 sd +% Ellipse + [15 45] 45 sd +n 4200 2100 75 75 0 360 DrawEllipse gs 0.00 setgray ef gr gs col0 s gr + [] 0 sd +% Ellipse + [15 45] 45 sd +n 4200 1500 75 75 0 360 DrawEllipse gs 0.00 setgray ef gr gs col0 s gr + [] 0 sd +% Ellipse + [15 45] 45 sd +n 4800 1500 75 75 0 360 DrawEllipse gs 0.00 setgray ef gr gs col0 s gr + [] 0 sd +% Ellipse + [15 45] 45 sd +n 5400 1500 75 75 0 360 DrawEllipse gs 0.00 setgray ef gr gs col0 s gr + [] 0 sd +% Ellipse + [15 45] 45 sd +n 7800 3300 75 75 0 360 DrawEllipse gs 0.00 setgray ef gr gs col0 s gr + [] 0 sd +% Ellipse + [15 45] 45 sd +n 8400 3900 75 75 0 360 DrawEllipse gs 0.00 setgray ef gr gs col0 s gr + [] 0 sd +% Ellipse + [15 45] 45 sd +n 7200 2700 75 75 0 360 DrawEllipse gs 0.00 setgray ef gr gs col0 s gr + [] 0 sd +% Ellipse + [15 45] 45 sd +n 6600 2100 75 75 0 360 DrawEllipse gs 0.00 setgray ef gr gs col0 s gr + [] 0 sd +% Ellipse + [15 45] 45 sd +n 6000 1500 75 75 0 360 DrawEllipse gs 0.00 setgray ef gr gs col0 s gr + [] 0 sd +% Polyline +0 slc +gs clippath +9615 5160 m 9615 5040 l 9395 5040 l 9575 5100 l 9395 5160 l cp +eoclip +n 3000 5100 m + 9600 5100 l gs col0 s gr gr + +% arrowhead +15.000 slw +n 9395 5160 m 9575 5100 l 9395 5040 l 9395 5160 l cp gs 0.00 setgray ef gr col0 s +% Polyline +7.500 slw +gs clippath +3060 885 m 2940 885 l 2940 1105 l 3000 925 l 3060 1105 l cp +eoclip +n 3000 5100 m + 3000 900 l gs col0 s gr gr + +% arrowhead +15.000 slw +n 3060 1105 m 3000 925 l 2940 1105 l 3060 1105 l cp gs 0.00 setgray ef gr col0 s +% Polyline +7.500 slw +n 3000 4500 m + 2925 4500 l gs 0.00 setgray ef gr gs col0 s gr +% Polyline +n 3000 3900 m + 2925 3900 l gs 0.00 setgray ef gr gs col0 s gr +% Polyline +n 3000 3300 m + 2925 3300 l gs 0.00 setgray ef gr gs col0 s gr +% Polyline +n 3600 5100 m + 3600 5175 l gs 0.00 setgray ef gr gs col0 s gr +% Polyline +n 4200 5100 m + 4200 5175 l gs 0.00 setgray ef gr gs col0 s gr +% Polyline +n 5400 5100 m + 5400 5175 l gs 0.00 setgray ef gr gs col0 s gr +% Polyline +n 4800 5100 m + 4800 5175 l gs 0.00 setgray ef gr gs col0 s gr +% Polyline +n 6000 5100 m + 6000 5175 l gs 0.00 setgray ef gr gs col0 s gr +% Polyline +n 6600 5100 m + 6600 5175 l gs 0.00 setgray ef gr gs col0 s gr +% Polyline +n 3000 2700 m + 2925 2700 l gs 0.00 setgray ef gr gs col0 s gr +% Polyline +n 3000 1500 m + 2925 1500 l gs 0.00 setgray ef gr gs col0 s gr +% Polyline +n 3000 2100 m + 2925 2100 l gs 0.00 setgray ef gr gs col0 s gr +% Polyline + [15 45] 45 sd +n 3000 1500 m + 9000 1500 l gs col0 s gr [] 0 sd +% Polyline + [15 45] 45 sd +n 8400 5100 m + 8400 900 l gs col0 s gr [] 0 sd +% Polyline +n 7200 5100 m + 7200 5175 l gs 0.00 setgray ef gr gs col0 s gr +% Polyline +n 7800 5100 m + 7800 5175 l gs 0.00 setgray ef gr gs col0 s gr +% Polyline +n 8400 5100 m + 8400 5175 l gs 0.00 setgray ef gr gs col0 s gr +% Polyline + [15 45] 45 sd +n 3000 3900 m + 9000 3900 l gs col0 s gr [] 0 sd +% Polyline + [15 45] 45 sd +n 5400 900 m + 9600 5100 l gs col0 s gr [] 0 sd +% Polyline + [15 45] 45 sd +n 4200 5100 m + 4200 900 l gs col0 s gr [] 0 sd +/Times-Bold-iso ff 390.00 scf sf +2625 4650 m +gs 1 -1 sc (1) col0 sh gr +/Times-Bold-iso ff 390.00 scf sf +2625 4050 m +gs 1 -1 sc (2) col0 sh gr +/Times-Bold-iso ff 390.00 scf sf +3525 5550 m +gs 1 -1 sc (1) col0 sh gr +/Times-Bold-iso ff 390.00 scf sf +2700 1050 m +gs 1 -1 sc (j) col0 sh gr +/Times-Roman-iso ff 390.00 scf sf +8025 825 m +gs 1 -1 sc (i<=n) col0 sh gr +/Times-Bold-iso ff 390.00 scf sf +4125 5550 m +gs 1 -1 sc (2) col0 sh gr +/Times-Bold-iso ff 390.00 scf sf +8325 5550 m +gs 1 -1 sc (n) col0 sh gr +/Times-Bold-iso ff 390.00 scf sf +2550 1575 m +gs 1 -1 sc (m) col0 sh gr +/Times-Roman-iso ff 390.00 scf sf +9075 3975 m +gs 1 -1 sc (j>=2) col0 sh gr +/Times-Roman-iso ff 390.00 scf sf +9075 1575 m +gs 1 -1 sc (j<=m) col0 sh gr +/Times-Bold-iso ff 390.00 scf sf +9450 5475 m +gs 1 -1 sc (i) col0 sh gr +/Times-Roman-iso ff 390.00 scf sf +3825 825 m +gs 1 -1 sc (i>=2) col0 sh gr +/Times-Roman-iso ff 390.00 scf sf +4875 825 m +gs 1 -1 sc (j<=n+2-i) col0 sh gr +% here ends figure; +$F2psEnd +rs +showpage diff --git a/clan/doc/images/basic.fig b/clan/doc/images/basic.fig new file mode 100644 index 0000000..7fe0a97 --- /dev/null +++ b/clan/doc/images/basic.fig @@ -0,0 +1,100 @@ +#FIG 3.2 +Landscape +Center +Inches +Letter +100.00 +Single +-2 +1200 2 +1 3 2 1 0 0 50 -1 20 3.000 1 0.0000 5400 3900 75 75 5400 3900 5400 3975 +1 3 2 1 0 0 50 -1 20 3.000 1 0.0000 4800 3900 75 75 4800 3900 4800 3975 +1 3 2 1 0 0 50 -1 20 3.000 1 0.0000 4200 3300 75 75 4200 3300 4200 3375 +1 3 2 1 0 0 50 -1 20 3.000 1 0.0000 4800 3300 75 75 4800 3300 4800 3375 +1 3 2 1 0 0 50 -1 20 3.000 1 0.0000 4200 2700 75 75 4200 2700 4200 2775 +1 3 2 1 0 0 50 -1 20 3.000 1 0.0000 4200 3900 75 75 4200 3900 4200 3975 +1 3 2 1 0 0 50 -1 20 3.000 1 0.0000 6000 3900 75 75 6000 3900 6000 3975 +1 3 2 1 0 0 50 -1 20 3.000 1 0.0000 6600 3900 75 75 6600 3900 6600 3975 +1 3 2 1 0 0 50 -1 20 3.000 1 0.0000 7200 3900 75 75 7200 3900 7200 3975 +1 3 2 1 0 0 50 -1 20 3.000 1 0.0000 7800 3900 75 75 7800 3900 7800 3975 +1 3 2 1 0 0 50 -1 20 3.000 1 0.0000 7200 3300 75 75 7200 3300 7200 3375 +1 3 2 1 0 0 50 -1 20 3.000 1 0.0000 6600 3300 75 75 6600 3300 6600 3375 +1 3 2 1 0 0 50 -1 20 3.000 1 0.0000 6000 3300 75 75 6000 3300 6000 3375 +1 3 2 1 0 0 50 -1 20 3.000 1 0.0000 5400 3300 75 75 5400 3300 5400 3375 +1 3 2 1 0 0 50 -1 20 3.000 1 0.0000 4800 2700 75 75 4800 2700 4800 2775 +1 3 2 1 0 0 50 -1 20 3.000 1 0.0000 5400 2700 75 75 5400 2700 5400 2775 +1 3 2 1 0 0 50 -1 20 3.000 1 0.0000 6000 2700 75 75 6000 2700 6000 2775 +1 3 2 1 0 0 50 -1 20 3.000 1 0.0000 6600 2700 75 75 6600 2700 6600 2775 +1 3 2 1 0 0 50 -1 20 3.000 1 0.0000 6000 2100 75 75 6000 2100 6000 2175 +1 3 2 1 0 0 50 -1 20 3.000 1 0.0000 5400 2100 75 75 5400 2100 5400 2175 +1 3 2 1 0 0 50 -1 20 3.000 1 0.0000 4800 2100 75 75 4800 2100 4800 2175 +1 3 2 1 0 0 50 -1 20 3.000 1 0.0000 4200 2100 75 75 4200 2100 4200 2175 +1 3 2 1 0 0 50 -1 20 3.000 1 0.0000 4200 1500 75 75 4200 1500 4200 1575 +1 3 2 1 0 0 50 -1 20 3.000 1 0.0000 4800 1500 75 75 4800 1500 4800 1575 +1 3 2 1 0 0 50 -1 20 3.000 1 0.0000 5400 1500 75 75 5400 1500 5400 1575 +1 3 2 1 0 0 50 -1 20 3.000 1 0.0000 7800 3300 75 75 7800 3300 7800 3375 +1 3 2 1 0 0 50 -1 20 3.000 1 0.0000 8400 3900 75 75 8400 3900 8400 3975 +1 3 2 1 0 0 50 -1 20 3.000 1 0.0000 7200 2700 75 75 7200 2700 7200 2775 +1 3 2 1 0 0 50 -1 20 3.000 1 0.0000 6600 2100 75 75 6600 2100 6600 2175 +1 3 2 1 0 0 50 -1 20 3.000 1 0.0000 6000 1500 75 75 6000 1500 6000 1575 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2 + 1 1 2.00 120.00 180.00 + 3000 5100 9600 5100 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2 + 1 1 2.00 120.00 180.00 + 3000 5100 3000 900 +2 1 0 1 0 0 50 -1 20 3.000 0 0 -1 0 0 2 + 3000 4500 2925 4500 +2 1 0 1 0 0 50 -1 20 3.000 0 0 -1 0 0 2 + 3000 3900 2925 3900 +2 1 0 1 0 0 50 -1 20 3.000 0 0 -1 0 0 2 + 3000 3300 2925 3300 +2 1 0 1 0 0 50 -1 20 3.000 0 0 -1 0 0 2 + 3600 5100 3600 5175 +2 1 0 1 0 0 50 -1 20 3.000 0 0 -1 0 0 2 + 4200 5100 4200 5175 +2 1 0 1 0 0 50 -1 20 3.000 0 0 -1 0 0 2 + 5400 5100 5400 5175 +2 1 0 1 0 0 50 -1 20 3.000 0 0 -1 0 0 2 + 4800 5100 4800 5175 +2 1 0 1 0 0 50 -1 20 3.000 0 0 -1 0 0 2 + 6000 5100 6000 5175 +2 1 0 1 0 0 50 -1 20 3.000 0 0 -1 0 0 2 + 6600 5100 6600 5175 +2 1 0 1 0 0 50 -1 20 3.000 0 0 -1 0 0 2 + 3000 2700 2925 2700 +2 1 0 1 0 0 50 -1 20 3.000 0 0 -1 0 0 2 + 3000 1500 2925 1500 +2 1 0 1 0 0 50 -1 20 3.000 0 0 -1 0 0 2 + 3000 2100 2925 2100 +2 1 2 1 0 7 50 -1 -1 3.000 0 0 -1 0 0 2 + 3000 1500 9000 1500 +2 1 2 1 0 7 50 -1 -1 3.000 0 0 -1 0 0 2 + 8400 5100 8400 900 +2 1 0 1 0 0 50 -1 20 3.000 0 0 -1 0 0 2 + 7200 5100 7200 5175 +2 1 0 1 0 0 50 -1 20 3.000 0 0 -1 0 0 2 + 7800 5100 7800 5175 +2 1 0 1 0 0 50 -1 20 3.000 0 0 -1 0 0 2 + 8400 5100 8400 5175 +2 1 2 1 0 7 50 -1 -1 3.000 0 0 -1 0 0 2 + 3000 3900 9000 3900 +2 1 2 1 0 7 50 -1 -1 3.000 0 0 -1 0 0 2 + 5400 900 9600 5100 +2 1 2 1 0 7 50 -1 -1 3.000 0 0 -1 0 0 2 + 4200 5100 4200 900 +2 3 0 0 0 7 51 -1 15 0.000 0 0 -1 0 0 5 + 4200 1500 4200 3900 8400 3900 6000 1500 4200 1500 +4 0 0 50 -1 2 26 0.0000 0 270 195 2625 4650 1\001 +4 0 0 50 -1 2 26 0.0000 0 270 195 2625 4050 2\001 +4 0 0 50 -1 2 26 0.0000 0 270 195 3525 5550 1\001 +4 0 0 50 -1 2 26 0.0000 0 345 135 2700 1050 j\001 +4 0 0 50 -1 0 26 0.0000 0 270 750 8025 825 i<=n\001 +4 0 0 50 -1 2 26 0.0000 0 270 195 4125 5550 2\001 +4 0 0 50 -1 2 26 0.0000 0 180 225 8325 5550 n\001 +4 0 0 50 -1 2 26 0.0000 0 180 330 2550 1575 m\001 +4 0 0 50 -1 0 26 0.0000 0 360 750 9075 3975 j>=2\001 +4 0 0 50 -1 0 26 0.0000 0 360 855 9075 1575 j<=m\001 +4 0 0 50 -1 2 26 0.0000 0 270 105 9450 5475 i\001 +4 0 0 50 -1 0 26 0.0000 0 270 750 3825 825 i>=2\001 +4 0 0 50 -1 0 26 0.0000 0 360 1410 4875 825 j<=n+2-i\001 diff --git a/clan/doc/images/basic.jpg b/clan/doc/images/basic.jpg new file mode 100644 index 0000000000000000000000000000000000000000..995b1d816207e6585df9c61ea65745d38e0db845 GIT binary patch literal 21180 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 o`^RDa{&AT9)*pxY`KgL;F;~nrBO=$x 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�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 EAG7bfB>(^b literal 0 HcwPel00001 diff --git a/clan/doc/images/basic.txt b/clan/doc/images/basic.txt new file mode 100644 index 0000000..e40913a --- /dev/null +++ b/clan/doc/images/basic.txt @@ -0,0 +1,13 @@ + j^ i>=2 + | | j<=n+2-i + | |\ | i<=n + | | \ | +m-+-****---+-j<=m + | ***** | + | ****** | + | *******| +2-+-********-j>=2 + | | |\ +0-+-+------+--->i + | | | + 0 2 n diff --git a/clan/doc/images/basic1.eps b/clan/doc/images/basic1.eps new file mode 100644 index 0000000..9ff60bc --- /dev/null +++ b/clan/doc/images/basic1.eps @@ -0,0 +1,332 @@ +%!PS-Adobe-2.0 EPSF-2.0 +%%Title: basic1.fig +%%Creator: fig2dev Version 3.2 Patchlevel 5-alpha7 +%%CreationDate: Fri May 9 15:48:25 2008 +%%For: cedb@localhost (Bastoul Cedric) +%%BoundingBox: 0 0 347 303 +%Magnification: 1.0000 +%%EndComments +/$F2psDict 200 dict def +$F2psDict begin +$F2psDict /mtrx matrix put +/col-1 {0 setgray} bind def +/col0 {0.000 0.000 0.000 srgb} bind def +/col1 {0.000 0.000 1.000 srgb} bind def +/col2 {0.000 1.000 0.000 srgb} bind def +/col3 {0.000 1.000 1.000 srgb} bind def +/col4 {1.000 0.000 0.000 srgb} bind def +/col5 {1.000 0.000 1.000 srgb} bind def +/col6 {1.000 1.000 0.000 srgb} bind def +/col7 {1.000 1.000 1.000 srgb} bind def +/col8 {0.000 0.000 0.560 srgb} bind def +/col9 {0.000 0.000 0.690 srgb} bind def +/col10 {0.000 0.000 0.820 srgb} bind def +/col11 {0.530 0.810 1.000 srgb} bind def +/col12 {0.000 0.560 0.000 srgb} bind def +/col13 {0.000 0.690 0.000 srgb} bind def +/col14 {0.000 0.820 0.000 srgb} bind def +/col15 {0.000 0.560 0.560 srgb} bind def +/col16 {0.000 0.690 0.690 srgb} bind def +/col17 {0.000 0.820 0.820 srgb} bind def +/col18 {0.560 0.000 0.000 srgb} bind def +/col19 {0.690 0.000 0.000 srgb} bind def +/col20 {0.820 0.000 0.000 srgb} bind def +/col21 {0.560 0.000 0.560 srgb} bind def +/col22 {0.690 0.000 0.690 srgb} bind def +/col23 {0.820 0.000 0.820 srgb} bind def +/col24 {0.500 0.190 0.000 srgb} bind def +/col25 {0.630 0.250 0.000 srgb} bind def +/col26 {0.750 0.380 0.000 srgb} bind def +/col27 {1.000 0.500 0.500 srgb} bind def +/col28 {1.000 0.630 0.630 srgb} bind def +/col29 {1.000 0.750 0.750 srgb} bind def +/col30 {1.000 0.880 0.880 srgb} bind def +/col31 {1.000 0.840 0.000 srgb} bind def + +end +save +newpath 0 303 moveto 0 0 lineto 347 0 lineto 347 303 lineto closepath clip newpath +-152.1 333.9 translate +1 -1 scale + +/cp {closepath} bind def +/ef {eofill} bind def +/gr {grestore} bind def +/gs {gsave} bind def +/sa {save} bind def +/rs {restore} bind def +/l {lineto} bind def +/m {moveto} bind def +/rm {rmoveto} bind def +/n {newpath} bind def +/s {stroke} bind def +/sh {show} bind def +/slc {setlinecap} bind def +/slj {setlinejoin} bind def +/slw {setlinewidth} bind def +/srgb {setrgbcolor} bind def +/rot {rotate} bind def +/sc {scale} bind def +/sd {setdash} bind def +/ff {findfont} bind def +/sf {setfont} bind def +/scf {scalefont} bind def +/sw {stringwidth} bind def +/tr {translate} bind def +/tnt {dup dup currentrgbcolor + 4 -2 roll dup 1 exch sub 3 -1 roll mul add + 4 -2 roll dup 1 exch sub 3 -1 roll mul add + 4 -2 roll dup 1 exch sub 3 -1 roll mul add srgb} + bind def +/shd {dup dup currentrgbcolor 4 -2 roll mul 4 -2 roll mul + 4 -2 roll mul srgb} bind def + /DrawEllipse { + /endangle exch def + /startangle exch def + /yrad exch def + /xrad exch def + /y exch def + /x exch def + /savematrix mtrx currentmatrix def + x y tr xrad yrad sc 0 0 1 startangle endangle arc + closepath + savematrix setmatrix + } def + +/$F2psBegin {$F2psDict begin /$F2psEnteredState save def} def +/$F2psEnd {$F2psEnteredState restore end} def + +$F2psBegin +10 setmiterlimit +0 slj 0 slc + 0.06000 0.06000 sc +% +% Fig objects follow +% +% +% here starts figure with depth 51 +% Polyline +0 slj +0 slc +0.000 slw +n 4200 1500 m 4200 3900 l 6675 3900 l 6675 1500 l + cp gs col7 0.75 shd ef gr +% Ellipse +7.500 slw + [15 45] 45 sd +1 slc +n 5400 3900 75 75 0 360 DrawEllipse gs 0.00 setgray ef gr gs col0 s gr + [] 0 sd +% Ellipse + [15 45] 45 sd +n 4800 3900 75 75 0 360 DrawEllipse gs 0.00 setgray ef gr gs col0 s gr + [] 0 sd +% Ellipse + [15 45] 45 sd +n 4200 3300 75 75 0 360 DrawEllipse gs 0.00 setgray ef gr gs col0 s gr + [] 0 sd +% Ellipse + [15 45] 45 sd +n 4800 3300 75 75 0 360 DrawEllipse gs 0.00 setgray ef gr gs col0 s gr + [] 0 sd +% Ellipse + [15 45] 45 sd +n 4200 2700 75 75 0 360 DrawEllipse gs 0.00 setgray ef gr gs col0 s gr + [] 0 sd +% Ellipse + [15 45] 45 sd +n 4200 3900 75 75 0 360 DrawEllipse gs 0.00 setgray ef gr gs col0 s gr + [] 0 sd +% Ellipse + [15 45] 45 sd +n 6000 3900 75 75 0 360 DrawEllipse gs 0.00 setgray ef gr gs col0 s gr + [] 0 sd +% Ellipse + [15 45] 45 sd +n 6600 3900 75 75 0 360 DrawEllipse gs 0.00 setgray ef gr gs col0 s gr + [] 0 sd +% Ellipse + [15 45] 45 sd +n 6600 3300 75 75 0 360 DrawEllipse gs 0.00 setgray ef gr gs col0 s gr + [] 0 sd +% Ellipse + [15 45] 45 sd +n 6000 3300 75 75 0 360 DrawEllipse gs 0.00 setgray ef gr gs col0 s gr + [] 0 sd +% Ellipse + [15 45] 45 sd +n 5400 3300 75 75 0 360 DrawEllipse gs 0.00 setgray ef gr gs col0 s gr + [] 0 sd +% Ellipse + [15 45] 45 sd +n 4800 2700 75 75 0 360 DrawEllipse gs 0.00 setgray ef gr gs col0 s gr + [] 0 sd +% Ellipse + [15 45] 45 sd +n 5400 2700 75 75 0 360 DrawEllipse gs 0.00 setgray ef gr gs col0 s gr + [] 0 sd +% Ellipse + [15 45] 45 sd +n 6000 2700 75 75 0 360 DrawEllipse gs 0.00 setgray ef gr gs col0 s gr + [] 0 sd +% Ellipse + [15 45] 45 sd +n 6600 2700 75 75 0 360 DrawEllipse gs 0.00 setgray ef gr gs col0 s gr + [] 0 sd +% Ellipse + [15 45] 45 sd +n 6000 2100 75 75 0 360 DrawEllipse gs 0.00 setgray ef gr gs col0 s gr + [] 0 sd +% Ellipse + [15 45] 45 sd +n 5400 2100 75 75 0 360 DrawEllipse gs 0.00 setgray ef gr gs col0 s gr + [] 0 sd +% Ellipse + [15 45] 45 sd +n 4800 2100 75 75 0 360 DrawEllipse gs 0.00 setgray ef gr gs col0 s gr + [] 0 sd +% Ellipse + [15 45] 45 sd +n 4200 2100 75 75 0 360 DrawEllipse gs 0.00 setgray ef gr gs col0 s gr + [] 0 sd +% Ellipse + [15 45] 45 sd +n 4200 1500 75 75 0 360 DrawEllipse gs 0.00 setgray ef gr gs col0 s gr + [] 0 sd +% Ellipse + [15 45] 45 sd +n 4800 1500 75 75 0 360 DrawEllipse gs 0.00 setgray ef gr gs col0 s gr + [] 0 sd +% Ellipse + [15 45] 45 sd +n 5400 1500 75 75 0 360 DrawEllipse gs 0.00 setgray ef gr gs col0 s gr + [] 0 sd +% Ellipse + [15 45] 45 sd +n 6600 2100 75 75 0 360 DrawEllipse gs 0.00 setgray ef gr gs col0 s gr + [] 0 sd +% Ellipse + [15 45] 45 sd +n 6000 1500 75 75 0 360 DrawEllipse gs 0.00 setgray ef gr gs col0 s gr + [] 0 sd +% Ellipse + [15 45] 45 sd +n 6653 1522 75 75 0 360 DrawEllipse gs 0.00 setgray ef gr gs col0 s gr + [] 0 sd +% Polyline +0 slc +gs clippath +6970 5160 m 7215 5160 l 7215 5040 l 6970 5040 l 6970 5040 l 7150 5100 l 6970 5160 l cp +eoclip +n 3000 5100 m + 7200 5100 l gs col0 s gr gr + +% arrowhead +15.000 slw +n 6970 5160 m 7150 5100 l 6970 5040 l 6970 5160 l cp gs 0.00 setgray ef gr col0 s +% Polyline +7.500 slw +gs clippath +3060 1130 m 3060 885 l 2940 885 l 2940 1130 l 2940 1130 l 3000 950 l 3060 1130 l cp +eoclip +n 3000 5100 m + 3000 900 l gs col0 s gr gr + +% arrowhead +15.000 slw +n 3060 1130 m 3000 950 l 2940 1130 l 3060 1130 l cp gs 0.00 setgray ef gr col0 s +% Polyline +7.500 slw +n 3000 4500 m + 2925 4500 l gs 0.00 setgray ef gr gs col0 s gr +% Polyline +n 3000 3900 m + 2925 3900 l gs 0.00 setgray ef gr gs col0 s gr +% Polyline +n 3000 3300 m + 2925 3300 l gs 0.00 setgray ef gr gs col0 s gr +% Polyline +n 3600 5100 m + 3600 5175 l gs 0.00 setgray ef gr gs col0 s gr +% Polyline +n 4200 5100 m + 4200 5175 l gs 0.00 setgray ef gr gs col0 s gr +% Polyline +n 5400 5100 m + 5400 5175 l gs 0.00 setgray ef gr gs col0 s gr +% Polyline +n 4800 5100 m + 4800 5175 l gs 0.00 setgray ef gr gs col0 s gr +% Polyline +n 6000 5100 m + 6000 5175 l gs 0.00 setgray ef gr gs col0 s gr +% Polyline +n 6600 5100 m + 6600 5175 l gs 0.00 setgray ef gr gs col0 s gr +% Polyline +n 3000 2700 m + 2925 2700 l gs 0.00 setgray ef gr gs col0 s gr +% Polyline +n 3000 1500 m + 2925 1500 l gs 0.00 setgray ef gr gs col0 s gr +% Polyline +n 3000 2100 m + 2925 2100 l gs 0.00 setgray ef gr gs col0 s gr +% Polyline + [15 45] 45 sd +n 3000 1500 m + 7200 1500 l gs col0 s gr [] 0 sd +% Polyline + [15 45] 45 sd +n 3000 3900 m + 7200 3900 l gs col0 s gr [] 0 sd +% Polyline + [15 45] 45 sd +n 4200 5100 m + 4200 900 l gs col0 s gr [] 0 sd +% Polyline + [15 45] 45 sd +n 6675 5100 m + 6675 900 l gs col0 s gr [] 0 sd +/Times-Bold ff 433.33 scf sf +2625 4650 m +gs 1 -1 sc (1) col0 sh gr +/Times-Bold ff 433.33 scf sf +2625 4050 m +gs 1 -1 sc (2) col0 sh gr +/Times-Bold ff 433.33 scf sf +3525 5550 m +gs 1 -1 sc (1) col0 sh gr +/Times-Bold ff 433.33 scf sf +2700 1050 m +gs 1 -1 sc (j) col0 sh gr +/Times-Bold ff 433.33 scf sf +4125 5550 m +gs 1 -1 sc (2) col0 sh gr +/Times-Roman ff 433.33 scf sf +3825 825 m +gs 1 -1 sc (i>=2) col0 sh gr +/Times-Bold ff 433.33 scf sf +2550 1575 m +gs 1 -1 sc (N) col0 sh gr +/Times-Bold ff 433.33 scf sf +6450 5550 m +gs 1 -1 sc (N) col0 sh gr +/Times-Bold ff 433.33 scf sf +7275 5475 m +gs 1 -1 sc (i) col0 sh gr +/Times-Roman ff 433.33 scf sf +6300 900 m +gs 1 -1 sc (i<=N) col0 sh gr +/Times-Roman ff 433.33 scf sf +7350 1575 m +gs 1 -1 sc (j<=N) col0 sh gr +/Times-Roman ff 433.33 scf sf +7350 3975 m +gs 1 -1 sc (j>=2) col0 sh gr +% here ends figure; +$F2psEnd +rs +showpage +%%Trailer +%EOF diff --git a/clan/doc/images/basic1.fig b/clan/doc/images/basic1.fig new file mode 100644 index 0000000..caf0ebd --- /dev/null +++ b/clan/doc/images/basic1.fig @@ -0,0 +1,86 @@ +#FIG 3.2 Produced by xfig version 3.2.5-alpha5 +Landscape +Center +Inches +Letter +100.00 +Single +-2 +1200 2 +1 3 2 1 0 0 50 -1 20 3.000 1 0.0000 5400 3900 75 75 5400 3900 5400 3975 +1 3 2 1 0 0 50 -1 20 3.000 1 0.0000 4800 3900 75 75 4800 3900 4800 3975 +1 3 2 1 0 0 50 -1 20 3.000 1 0.0000 4200 3300 75 75 4200 3300 4200 3375 +1 3 2 1 0 0 50 -1 20 3.000 1 0.0000 4800 3300 75 75 4800 3300 4800 3375 +1 3 2 1 0 0 50 -1 20 3.000 1 0.0000 4200 2700 75 75 4200 2700 4200 2775 +1 3 2 1 0 0 50 -1 20 3.000 1 0.0000 4200 3900 75 75 4200 3900 4200 3975 +1 3 2 1 0 0 50 -1 20 3.000 1 0.0000 6000 3900 75 75 6000 3900 6000 3975 +1 3 2 1 0 0 50 -1 20 3.000 1 0.0000 6600 3900 75 75 6600 3900 6600 3975 +1 3 2 1 0 0 50 -1 20 3.000 1 0.0000 6600 3300 75 75 6600 3300 6600 3375 +1 3 2 1 0 0 50 -1 20 3.000 1 0.0000 6000 3300 75 75 6000 3300 6000 3375 +1 3 2 1 0 0 50 -1 20 3.000 1 0.0000 5400 3300 75 75 5400 3300 5400 3375 +1 3 2 1 0 0 50 -1 20 3.000 1 0.0000 4800 2700 75 75 4800 2700 4800 2775 +1 3 2 1 0 0 50 -1 20 3.000 1 0.0000 5400 2700 75 75 5400 2700 5400 2775 +1 3 2 1 0 0 50 -1 20 3.000 1 0.0000 6000 2700 75 75 6000 2700 6000 2775 +1 3 2 1 0 0 50 -1 20 3.000 1 0.0000 6600 2700 75 75 6600 2700 6600 2775 +1 3 2 1 0 0 50 -1 20 3.000 1 0.0000 6000 2100 75 75 6000 2100 6000 2175 +1 3 2 1 0 0 50 -1 20 3.000 1 0.0000 5400 2100 75 75 5400 2100 5400 2175 +1 3 2 1 0 0 50 -1 20 3.000 1 0.0000 4800 2100 75 75 4800 2100 4800 2175 +1 3 2 1 0 0 50 -1 20 3.000 1 0.0000 4200 2100 75 75 4200 2100 4200 2175 +1 3 2 1 0 0 50 -1 20 3.000 1 0.0000 4200 1500 75 75 4200 1500 4200 1575 +1 3 2 1 0 0 50 -1 20 3.000 1 0.0000 4800 1500 75 75 4800 1500 4800 1575 +1 3 2 1 0 0 50 -1 20 3.000 1 0.0000 5400 1500 75 75 5400 1500 5400 1575 +1 3 2 1 0 0 50 -1 20 3.000 1 0.0000 6600 2100 75 75 6600 2100 6600 2175 +1 3 2 1 0 0 50 -1 20 3.000 1 0.0000 6000 1500 75 75 6000 1500 6000 1575 +1 3 2 1 0 0 50 -1 20 3.000 1 0.0000 6653 1522 75 75 6653 1522 6653 1597 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2 + 1 1 2.00 120.00 180.00 + 3000 5100 7200 5100 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2 + 1 1 2.00 120.00 180.00 + 3000 5100 3000 900 +2 1 0 1 0 0 50 -1 20 3.000 0 0 -1 0 0 2 + 3000 4500 2925 4500 +2 1 0 1 0 0 50 -1 20 3.000 0 0 -1 0 0 2 + 3000 3900 2925 3900 +2 1 0 1 0 0 50 -1 20 3.000 0 0 -1 0 0 2 + 3000 3300 2925 3300 +2 1 0 1 0 0 50 -1 20 3.000 0 0 -1 0 0 2 + 3600 5100 3600 5175 +2 1 0 1 0 0 50 -1 20 3.000 0 0 -1 0 0 2 + 4200 5100 4200 5175 +2 1 0 1 0 0 50 -1 20 3.000 0 0 -1 0 0 2 + 5400 5100 5400 5175 +2 1 0 1 0 0 50 -1 20 3.000 0 0 -1 0 0 2 + 4800 5100 4800 5175 +2 1 0 1 0 0 50 -1 20 3.000 0 0 -1 0 0 2 + 6000 5100 6000 5175 +2 1 0 1 0 0 50 -1 20 3.000 0 0 -1 0 0 2 + 6600 5100 6600 5175 +2 1 0 1 0 0 50 -1 20 3.000 0 0 -1 0 0 2 + 3000 2700 2925 2700 +2 1 0 1 0 0 50 -1 20 3.000 0 0 -1 0 0 2 + 3000 1500 2925 1500 +2 1 0 1 0 0 50 -1 20 3.000 0 0 -1 0 0 2 + 3000 2100 2925 2100 +2 1 2 1 0 7 50 -1 -1 3.000 0 0 -1 0 0 2 + 3000 1500 7200 1500 +2 1 2 1 0 7 50 -1 -1 3.000 0 0 -1 0 0 2 + 3000 3900 7200 3900 +2 1 2 1 0 7 50 -1 -1 3.000 0 0 -1 0 0 2 + 4200 5100 4200 900 +2 3 0 0 0 7 51 -1 15 0.000 0 0 -1 0 0 5 + 4200 1500 4200 3900 6675 3900 6675 1500 4200 1500 +2 1 2 1 0 7 50 -1 -1 3.000 0 0 -1 0 0 2 + 6675 5100 6675 900 +4 0 0 50 -1 2 26 0.0000 0 285 225 2625 4650 1\001 +4 0 0 50 -1 2 26 0.0000 0 285 225 2625 4050 2\001 +4 0 0 50 -1 2 26 0.0000 0 285 225 3525 5550 1\001 +4 0 0 50 -1 2 26 0.0000 0 375 150 2700 1050 j\001 +4 0 0 50 -1 2 26 0.0000 0 285 225 4125 5550 2\001 +4 0 0 50 -1 0 26 0.0000 0 285 825 3825 825 i>=2\001 +4 0 0 50 -1 2 26 0.0000 0 285 315 2550 1575 N\001 +4 0 0 50 -1 2 26 0.0000 0 285 315 6450 5550 N\001 +4 0 0 50 -1 2 26 0.0000 0 285 120 7275 5475 i\001 +4 0 0 50 -1 0 26 0.0000 0 285 915 6300 900 i<=N\001 +4 0 0 50 -1 0 26 0.0000 0 375 915 7350 1575 j<=N\001 +4 0 0 50 -1 0 26 0.0000 0 375 825 7350 3975 j>=2\001 diff --git a/clan/doc/images/basic1.jpg b/clan/doc/images/basic1.jpg new file mode 100644 index 0000000000000000000000000000000000000000..55830d422b4b1ca0b6cd800fbcb8c2e414df81c3 GIT binary patch literal 18353 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 i<=N + | | | + | | | +N-+-********--j<=N + | ******** + | ******** + | ******** +2-+-********--j>=2 + | | | +0-+-+------+--->i + | | | + 0 2 N diff --git a/clan/doc/images/basic2.eps b/clan/doc/images/basic2.eps new file mode 100644 index 0000000..a3781fe --- /dev/null +++ b/clan/doc/images/basic2.eps @@ -0,0 +1,256 @@ +%!PS-Adobe-2.0 EPSF-2.0 +%%Title: basic2.fig +%%Creator: fig2dev Version 3.2 Patchlevel 5-alpha7 +%%CreationDate: Sat May 10 21:23:40 2008 +%%For: cedb@localhost (Bastoul Cedric) +%%BoundingBox: 0 0 260 235 +%Magnification: 1.0000 +%%EndComments +/$F2psDict 200 dict def +$F2psDict begin +$F2psDict /mtrx matrix put +/col-1 {0 setgray} bind def +/col0 {0.000 0.000 0.000 srgb} bind def +/col1 {0.000 0.000 1.000 srgb} bind def +/col2 {0.000 1.000 0.000 srgb} bind def +/col3 {0.000 1.000 1.000 srgb} bind def +/col4 {1.000 0.000 0.000 srgb} bind def +/col5 {1.000 0.000 1.000 srgb} bind def +/col6 {1.000 1.000 0.000 srgb} bind def +/col7 {1.000 1.000 1.000 srgb} bind def +/col8 {0.000 0.000 0.560 srgb} bind def +/col9 {0.000 0.000 0.690 srgb} bind def +/col10 {0.000 0.000 0.820 srgb} bind def +/col11 {0.530 0.810 1.000 srgb} bind def +/col12 {0.000 0.560 0.000 srgb} bind def +/col13 {0.000 0.690 0.000 srgb} bind def +/col14 {0.000 0.820 0.000 srgb} bind def +/col15 {0.000 0.560 0.560 srgb} bind def +/col16 {0.000 0.690 0.690 srgb} bind def +/col17 {0.000 0.820 0.820 srgb} bind def +/col18 {0.560 0.000 0.000 srgb} bind def +/col19 {0.690 0.000 0.000 srgb} bind def +/col20 {0.820 0.000 0.000 srgb} bind def +/col21 {0.560 0.000 0.560 srgb} bind def +/col22 {0.690 0.000 0.690 srgb} bind def +/col23 {0.820 0.000 0.820 srgb} bind def +/col24 {0.500 0.190 0.000 srgb} bind def +/col25 {0.630 0.250 0.000 srgb} bind def +/col26 {0.750 0.380 0.000 srgb} bind def +/col27 {1.000 0.500 0.500 srgb} bind def +/col28 {1.000 0.630 0.630 srgb} bind def +/col29 {1.000 0.750 0.750 srgb} bind def +/col30 {1.000 0.880 0.880 srgb} bind def +/col31 {1.000 0.840 0.000 srgb} bind def + +end +save +newpath 0 235 moveto 0 0 lineto 260 0 lineto 260 235 lineto closepath clip newpath +-156.6 333.9 translate +1 -1 scale + +/cp {closepath} bind def +/ef {eofill} bind def +/gr {grestore} bind def +/gs {gsave} bind def +/sa {save} bind def +/rs {restore} bind def +/l {lineto} bind def +/m {moveto} bind def +/rm {rmoveto} bind def +/n {newpath} bind def +/s {stroke} bind def +/sh {show} bind def +/slc {setlinecap} bind def +/slj {setlinejoin} bind def +/slw {setlinewidth} bind def +/srgb {setrgbcolor} bind def +/rot {rotate} bind def +/sc {scale} bind def +/sd {setdash} bind def +/ff {findfont} bind def +/sf {setfont} bind def +/scf {scalefont} bind def +/sw {stringwidth} bind def +/tr {translate} bind def +/tnt {dup dup currentrgbcolor + 4 -2 roll dup 1 exch sub 3 -1 roll mul add + 4 -2 roll dup 1 exch sub 3 -1 roll mul add + 4 -2 roll dup 1 exch sub 3 -1 roll mul add srgb} + bind def +/shd {dup dup currentrgbcolor 4 -2 roll mul 4 -2 roll mul + 4 -2 roll mul srgb} bind def + /DrawEllipse { + /endangle exch def + /startangle exch def + /yrad exch def + /xrad exch def + /y exch def + /x exch def + /savematrix mtrx currentmatrix def + x y tr xrad yrad sc 0 0 1 startangle endangle arc + closepath + savematrix setmatrix + } def + +/$F2psBegin {$F2psDict begin /$F2psEnteredState save def} def +/$F2psEnd {$F2psEnteredState restore end} def + +$F2psBegin +10 setmiterlimit +0 slj 0 slc + 0.06000 0.06000 sc +% +% Fig objects follow +% +% +% here starts figure with depth 51 +% Polyline +0 slj +0 slc +0.000 slw +n 4200 2700 m 4200 3900 l 5400 3900 l 5400 2700 l + cp gs col7 0.75 shd ef gr +% Ellipse +7.500 slw + [15 45] 45 sd +1 slc +n 5400 3900 75 75 0 360 DrawEllipse gs 0.00 setgray ef gr gs col0 s gr + [] 0 sd +% Ellipse + [15 45] 45 sd +n 4800 3900 75 75 0 360 DrawEllipse gs 0.00 setgray ef gr gs col0 s gr + [] 0 sd +% Ellipse + [15 45] 45 sd +n 4200 3300 75 75 0 360 DrawEllipse gs 0.00 setgray ef gr gs col0 s gr + [] 0 sd +% Ellipse + [15 45] 45 sd +n 4800 3300 75 75 0 360 DrawEllipse gs 0.00 setgray ef gr gs col0 s gr + [] 0 sd +% Ellipse + [15 45] 45 sd +n 4200 2700 75 75 0 360 DrawEllipse gs 0.00 setgray ef gr gs col0 s gr + [] 0 sd +% Ellipse + [15 45] 45 sd +n 4200 3900 75 75 0 360 DrawEllipse gs 0.00 setgray ef gr gs col0 s gr + [] 0 sd +% Ellipse + [15 45] 45 sd +n 5400 3300 75 75 0 360 DrawEllipse gs 0.00 setgray ef gr gs col0 s gr + [] 0 sd +% Ellipse + [15 45] 45 sd +n 4800 2700 75 75 0 360 DrawEllipse gs 0.00 setgray ef gr gs col0 s gr + [] 0 sd +% Ellipse + [15 45] 45 sd +n 5400 2700 75 75 0 360 DrawEllipse gs 0.00 setgray ef gr gs col0 s gr + [] 0 sd +% Polyline +0 slc +gs clippath +5770 5160 m 6015 5160 l 6015 5040 l 5770 5040 l 5770 5040 l 5950 5100 l 5770 5160 l cp +eoclip +n 3000 5100 m + 6000 5100 l gs col0 s gr gr + +% arrowhead +15.000 slw +n 5770 5160 m 5950 5100 l 5770 5040 l 5770 5160 l cp gs 0.00 setgray ef gr col0 s +% Polyline +7.500 slw +gs clippath +3060 2330 m 3060 2085 l 2940 2085 l 2940 2330 l 2940 2330 l 3000 2150 l 3060 2330 l cp +eoclip +n 3000 5100 m + 3000 2100 l gs col0 s gr gr + +% arrowhead +15.000 slw +n 3060 2330 m 3000 2150 l 2940 2330 l 3060 2330 l cp gs 0.00 setgray ef gr col0 s +% Polyline +7.500 slw +n 3000 4500 m + 2925 4500 l gs 0.00 setgray ef gr gs col0 s gr +% Polyline +n 3000 3900 m + 2925 3900 l gs 0.00 setgray ef gr gs col0 s gr +% Polyline +n 3000 3300 m + 2925 3300 l gs 0.00 setgray ef gr gs col0 s gr +% Polyline +n 3600 5100 m + 3600 5175 l gs 0.00 setgray ef gr gs col0 s gr +% Polyline +n 4200 5100 m + 4200 5175 l gs 0.00 setgray ef gr gs col0 s gr +% Polyline +n 5400 5100 m + 5400 5175 l gs 0.00 setgray ef gr gs col0 s gr +% Polyline +n 4800 5100 m + 4800 5175 l gs 0.00 setgray ef gr gs col0 s gr +% Polyline +n 3000 2700 m + 2925 2700 l gs 0.00 setgray ef gr gs col0 s gr +% Polyline + [15 45] 45 sd +n 3000 3900 m + 6000 3900 l gs col0 s gr [] 0 sd +% Polyline + [15 45] 45 sd +n 4200 5100 m + 4200 2100 l gs col0 s gr [] 0 sd +% Polyline + [15 45] 45 sd +n 5400 5175 m + 5400 2100 l gs col0 s gr [] 0 sd +% Polyline + [15 45] 45 sd +n 3000 2700 m + 6000 2700 l gs col0 s gr [] 0 sd +/Times-Bold ff 433.33 scf sf +2625 4650 m +gs 1 -1 sc (1) col0 sh gr +/Times-Bold ff 433.33 scf sf +2625 4050 m +gs 1 -1 sc (2) col0 sh gr +/Times-Bold ff 433.33 scf sf +3525 5550 m +gs 1 -1 sc (1) col0 sh gr +/Times-Bold ff 433.33 scf sf +4125 5550 m +gs 1 -1 sc (2) col0 sh gr +/Times-Bold ff 433.33 scf sf +5250 5550 m +gs 1 -1 sc (4) col0 sh gr +/Times-Bold ff 433.33 scf sf +2625 2850 m +gs 1 -1 sc (4) col0 sh gr +/Times-Bold ff 433.33 scf sf +2700 2175 m +gs 1 -1 sc (j) col0 sh gr +/Times-Roman ff 433.33 scf sf +3825 1950 m +gs 1 -1 sc (i>=2) col0 sh gr +/Times-Roman ff 433.33 scf sf +5025 1950 m +gs 1 -1 sc (i<=4) col0 sh gr +/Times-Roman ff 433.33 scf sf +6075 3975 m +gs 1 -1 sc (j>=2) col0 sh gr +/Times-Roman ff 433.33 scf sf +6075 2775 m +gs 1 -1 sc (j<=4) col0 sh gr +/Times-Bold ff 433.33 scf sf +6000 5550 m +gs 1 -1 sc (i) col0 sh gr +% here ends figure; +$F2psEnd +rs +showpage +%%Trailer +%EOF diff --git a/clan/doc/images/basic2.fig b/clan/doc/images/basic2.fig new file mode 100644 index 0000000..c6a4161 --- /dev/null +++ b/clan/doc/images/basic2.fig @@ -0,0 +1,62 @@ +#FIG 3.2 Produced by xfig version 3.2.5-alpha5 +Landscape +Center +Inches +Letter +100.00 +Single +-2 +1200 2 +1 3 2 1 0 0 50 -1 20 3.000 1 0.0000 5400 3900 75 75 5400 3900 5400 3975 +1 3 2 1 0 0 50 -1 20 3.000 1 0.0000 4800 3900 75 75 4800 3900 4800 3975 +1 3 2 1 0 0 50 -1 20 3.000 1 0.0000 4200 3300 75 75 4200 3300 4200 3375 +1 3 2 1 0 0 50 -1 20 3.000 1 0.0000 4800 3300 75 75 4800 3300 4800 3375 +1 3 2 1 0 0 50 -1 20 3.000 1 0.0000 4200 2700 75 75 4200 2700 4200 2775 +1 3 2 1 0 0 50 -1 20 3.000 1 0.0000 4200 3900 75 75 4200 3900 4200 3975 +1 3 2 1 0 0 50 -1 20 3.000 1 0.0000 5400 3300 75 75 5400 3300 5400 3375 +1 3 2 1 0 0 50 -1 20 3.000 1 0.0000 4800 2700 75 75 4800 2700 4800 2775 +1 3 2 1 0 0 50 -1 20 3.000 1 0.0000 5400 2700 75 75 5400 2700 5400 2775 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2 + 1 1 2.00 120.00 180.00 + 3000 5100 6000 5100 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2 + 1 1 2.00 120.00 180.00 + 3000 5100 3000 2100 +2 1 0 1 0 0 50 -1 20 3.000 0 0 -1 0 0 2 + 3000 4500 2925 4500 +2 1 0 1 0 0 50 -1 20 3.000 0 0 -1 0 0 2 + 3000 3900 2925 3900 +2 1 0 1 0 0 50 -1 20 3.000 0 0 -1 0 0 2 + 3000 3300 2925 3300 +2 1 0 1 0 0 50 -1 20 3.000 0 0 -1 0 0 2 + 3600 5100 3600 5175 +2 1 0 1 0 0 50 -1 20 3.000 0 0 -1 0 0 2 + 4200 5100 4200 5175 +2 1 0 1 0 0 50 -1 20 3.000 0 0 -1 0 0 2 + 5400 5100 5400 5175 +2 1 0 1 0 0 50 -1 20 3.000 0 0 -1 0 0 2 + 4800 5100 4800 5175 +2 1 0 1 0 0 50 -1 20 3.000 0 0 -1 0 0 2 + 3000 2700 2925 2700 +2 1 2 1 0 7 50 -1 -1 3.000 0 0 -1 0 0 2 + 3000 3900 6000 3900 +2 1 2 1 0 7 50 -1 -1 3.000 0 0 -1 0 0 2 + 4200 5100 4200 2100 +2 3 0 0 0 7 51 -1 15 0.000 0 0 -1 0 0 5 + 4200 2700 4200 3900 5400 3900 5400 2700 4200 2700 +2 1 2 1 0 7 50 -1 -1 3.000 0 0 -1 0 0 2 + 5400 5175 5400 2100 +2 1 2 1 0 7 50 -1 -1 3.000 0 0 -1 0 0 2 + 3000 2700 6000 2700 +4 0 0 50 -1 2 26 0.0000 0 285 225 2625 4650 1\001 +4 0 0 50 -1 2 26 0.0000 0 285 225 2625 4050 2\001 +4 0 0 50 -1 2 26 0.0000 0 285 225 3525 5550 1\001 +4 0 0 50 -1 2 26 0.0000 0 285 225 4125 5550 2\001 +4 0 0 50 -1 2 26 0.0000 0 285 225 5250 5550 4\001 +4 0 0 50 -1 2 26 0.0000 0 285 225 2625 2850 4\001 +4 0 0 50 -1 2 26 0.0000 0 375 150 2700 2175 j\001 +4 0 0 50 -1 0 26 0.0000 0 285 825 3825 1950 i>=2\001 +4 0 0 50 -1 0 26 0.0000 0 285 825 5025 1950 i<=4\001 +4 0 0 50 -1 0 26 0.0000 0 375 825 6075 3975 j>=2\001 +4 0 0 50 -1 0 26 0.0000 0 375 825 6075 2775 j<=4\001 +4 0 0 50 -1 2 26 0.0000 0 285 120 6000 5550 i\001 diff --git a/clan/doc/images/basic2.jpg b/clan/doc/images/basic2.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ab9f0579d4e0490494ff9d912d2a3192717528a5 GIT binary patch literal 12369 zcwX&#cUV*D*6$7=y$FJUlpvs>2uKGhp-2;tfYPf7f^?7;5D20OBB+3ZNK>RKO{9cs zq)2ZfJ@np5r~yLqZ9Ow{W}Gu~&OP^g?tQ*{XXjb}WbeJ6_qW!1*ZTe5gg8i?0FGYL z(AEGT5D1_LegGmGPy;B*$tlQ>P*PA(P*G7*(=yZ1($LVdGaX}K<~jl8<~qU2$-^%q zz{7ivkCRhS=FGYCVv>@QPysnbS#bps2}$v9P9RiNRJ1g-Y;<&N;wL#zivKTP#7_Vt zCFBT%hZMpKkT60>86m_5015!$ci%7Irwc+tN_K>tf|81w27I9OC_n-sB_$yvJ#vJM z47?iz-UrASk1(ASQz1X5Z$rWB$t-?1<~1dsYEdoA)h`%+i5s^=si=>$vaz2yby`61 z%vnh(X&G6$3u+hDH8i!fFI_V*G%_|ZHM6z5Y432$(aFo($JY<;A8_w}*n{whhmo;y z&z{F8yhwbR{w5Kd5$y3;G(7q%4_ke}|N63Bw_77ac04*s5OdcsC z00VaS1>bot4Z93y3|p9my;(Y%wdZ>Lrg%EG?euMm_Uf3CfbJu$g6SdDzcRTRqm~RT zDtw*c;Y_hskIxA)ADTd4&iCv`BJISQub)598f)i%;+7sRU6yy7PI>)kI&V`;lz}Pcy zA;3Dqd;Wdj3QtX`OG?~n-&o3#?002U^|XwsbigfrD+ZCb{*#BE`N8b)dxls}=h=o~ z9dyz%hs%sc)_lO8ewdqdT)T4;24tNFR$7xR^7{;K-TI^#omLzX19mlQ6T^FZe zZnk~;>H2k1{;lV81cCR(NL=59P_rw~vVoq0IMBi#~5Z<4=X{BUr6a`ZL~CLM|xF%R=)k!?rA%{ z78_J-!oCQ9Eeq#1-Qah79Dk+H+dOONV;x<9yxpT2iyPwN6>RQ-^EE(#x-se_@~h-> z(m{(tmAOf(W16G9zREcdIay$}Lm|r= zGoY{jTQiPXkcQF4O_L?;$h?fjrO(dBcpv2YPnpcX+vLOGy`csb^@7G4bng`dk>I*c@bZ#qHeE%_am%Q^>W))qrNFBctd_?tbGrG&I z*V&rExM7T^vTC5TU?>RJR zrsC+#?W;z1L((Gl3bTi}HZ0m<9Ijg*kTR2yK!ElXtYtLrWq)|A=>m|OL?r_hljh)R zU_^jY;2sfJFz6-%7)u5saLfR2J(+@NFg`AzgH;GnugQHFWj)m9IoHb2+EMdf6=UE! z`CuiM)!kGb@bG|(enzq~Y8Jxx|E8-mM%NMRcwS{Ej6$BhR=|dboNe#fhuwmWNI@Vy zQjqjfzXD&O)5mi?rLzOxgVx%2?m1BPj6N7juwjBKxSdpIwO8ny$(R4cHX8`CB&iu&*J59z>t{fxm$=oD8c=vJZbR1M}$Axrfv6F1;ooqaBl-U-j-Cql@g z@~Xr9g1Jyd?C{0Y$!nxHIHaPu1Mr=1o>*TVsMIBsG1@?nsB?B-3gdsQPFs+1J(Pir zvGMH3q>RN%sVeiufS}AM+Sy@w6QfhYA>yhb5+US4VSqLw$UVz(KxQ}A-?ywt;j2=Q zZ+fW7#BC4AqLnCyrcpHCNlD;+^#)&MRh6qH6TeN|$%g7!Wxc>W(ysP^opq(NCd>QC zkafvIdQ)vL|A0lBl?s!~o(^8gMUcBR?+g6t?~n*JDjmo1fxQ41eq?t?GR>j5{D3<> zH;5_Bl+Q^1eG}X;R_;8cMNgJ5gduAoJrWT7l?lPFAUE7g9hK^L+?7`CHUmeAfa77i z&YUey3~4{U?@)!yRW06HMw~t{id%u%Z?5(0%5;qHq>VIuw1?f}@O1^le+LyAA}RQL z&qUzKsyP9MnqEar&mUUvzd-d8fv+&@9eitd-l04JR_cx;fDe^|mbQ&px9V9D)V_oq7>WwNHL38E>NY(ksMtcA%9y| z5;A5Cn_SOTITt7w!&0E%h7`c%O&ZS9ezCI>M~4{2Oyv>?izfCtqMN zxMO}aFV#H>wF;|v7}$;=mtH}G%iBe;+%gJIai1A?>In*884DV2ncJ%(d_8!P(B6cx zb?ZQFb@^fS$isf`cpQ6}i)h-#2NmK2i9jw0mvujF-(i_Bo@mCBmW^oI$tMEPaqJEX zyGbZKyllOMSWGKC2)+r<*Iz2ylfaTxH!voO)yRD1LM5gV1=`KNAV zjUiDX8m2L~Y3^C1)oBfLAlNQ$YRhLwiW+7<6?EVcX!i{f55NFhBq1_VNohDOsc=kw zu8Q!hh!oHJ<*{s*T91#O4|WW8Ne<1)(_oLuZ6O>-wAA4S2;-=&e4!GoXg%E>Q*eUh zItDBCmfRAxLCdlfDQ}pT-LTk+XQw!lAA_ zcxexp79>C`Vj{3Q^NvSJSYQu#v5Uv}M?0+BgxgFA;o2 zO9WPvtoLSvhyZt*3t0bDg!$|dA^j6PgX$bUv?66C>f>2CI zJR|};&Z?0>7hwq8ZmGuO*u|YL942ioAgF6QZL4dY2o!7XbQIz@K7y;!EkiWjCjwqy z*ARK&21g(cUv{U5C=^b^9v23}CUP_)cYToo_Zm^RoV9JmRF`H}ef5~EpV4K{>uG;0G~=4e(wfT0@(TsrI(N?&83-d|?Wl7@mE51vYf>ydIfk>YTCN=I&rZJCLXtK;S_NX7v_ZQd7f2Of1{jPxW zMk}OiwCgp%4Q?7L-zP*sQG^IgkFUb8)8E65IDAsGs);`}48w0#fuIm2AXkX`jtUI> zj?!+am$x2;_Mg0LLD9$%(c`E@8?6BI@jSA+naV&D*|Jf>Z*nf&&e`DCzRI30)YO~nWzaP&46Gi2%`87^@uTBb3;cFegldiB}Y4A%3O zI>OCjRlw(K{OepAW4Fbc`Jp+mNs%u^U_Nskf9Eippy2SWp1`~m?bhVBc#DR8+gP?Oq7~1SjJ(fdrQ@l@DvI zG_CC47CO**6tTJ{yk-}_AnEpr>20jv<2UYdY%@#@CCim8;SpPJy;n7aF{rck52CBY zQyUNwa%7Q(7$Pt!5LS|Jd~ox6?|fy^GmxBe(4N}KrLu)+thfzRE!38`h60L0|2OKJ zFZ5;wGSZugEQT~ER$2py+Q@@kTT$k#@d#!j0EZ3{*}IAC$qAoH|F_`Z*$B{ zK6NtMRVLoJIw$}Xk;;-y4-N=SnsY=D1mJ|jH=px*2Guy$pc0wy&xsA(7?oC+9?r$zzy2VeEyhG?Zjk0JLv@smmsRcLs$(FSX_B-%Kg936 z@xG0`Q{tJGhnO-qn0+=Z0Z}6K3ZsiZQ;5@9K}<3efv4l^N*&82AHEj@A1WLAH+BcpfIFbT%kW6Rtp z%M$7chS6OSqBm=*4+33x^EOJC84{zwSQ<#B<9jLr-@ z)&d>nnwtt8V~90gOB?}Og@mp+)c8HG9j~8-KQcjl*i&+?gC)+nZ4v=bru8Pw;b=J# zuvJ_jx$uLqre07G0ILg01h8OXK@l6@#<2n7=W*<{-3`|zD7u3k(q#XcS-oA9YiDq!@}2An-1954G1#uGy@DO zHd^}!;XHQS`|OzV_ucx=EjGN7kc~B@azhN=U6S53U})Lds~0|F2Y&(DgJNC$BxNmkee{{qs7CqXz z(RfvpT8j)*FGuFbRm&3+AbrUF1jY_+Jq@jTKx8?rYY;kGz zC#)Zp$dyD}F-VVHF-!=5*rcg8^gwq`g^Ynge11NX3Ju6Bc{!smfHyH{#S7cOM2C%9#@4r6SA(w6 zfU(q)0_?%l{h;OsHNrZ<3eiUd-aR?gJ(Soc0`BeqWUK#TGkAw-A57(`{09ks`O83r<{#Z5tA{Yh1l?+rMe*w7;9)V~Y$5($B5Qfm71;nqFj4^c5 zv|2c5iU=?}nUNPBz7F!*(M3j#D2S~_$16s$Qt(K7bcD)#zoM^;oZfPecxkzl{!*!s zcAvh|L#Z|=I@Ph+qF!M1xlZgml{Qy?T4S5PJ7%dL$IE`e8olufnwB`ssxvmHG0BV- zbeU)w28@nm*gWu6#E_Fj&Ev%*H`NBJO(zz8*wAT4QgYtvMF`Bld@@XQVRWW?(Y0(YUsIyU9`mw4}w8fk^A1Vn<)G$Gr1N{aRZf5Lx zEL8f`YvdJ0Bd*xc-q00&`~rE7B%Syf(TwQUC2{i+|I=b) z{7*^L<{w-af5USWp9v$uTkA66o@ijQVkXNaIka#3*}96C8(j3ibk^S~x8fN|5REOZ z8o*%JTPiD=>ytVqkJRu8F&ozL7^+psb84W!FwLc?ew)BLurlATV75q~0o1Uk_GN+}YX(Vf=dq7gqWngaxz_7hP5HW29g&p->6LG1%Zf(UH>BU*C7 z^Vy@nidH?|U|?I60d7S8L8r>JFcKn<)=J{@u??94Vgpg$_z5NtS-vqL=%37l$}< zIVpI^;${!B=YhDpwcI`+$De{d+(NNC>PQ#oSefd2#BZXnY*@UF9w9%QC;(rQj+%e0 z!gHuIg`jl|7U`brk%B9r{pF0TxCOYl80^_$iDXB$6kzw2=y1CA1ipl;54eoxrgfk3 z!-myq)pz(F+ETyqm2oB8y6GnVDuhA#e}nQ%5P|p+Mr^?ezipS94x?D@{=c>H;Z`=%mUCeO;KKAltUgvjnl zwcv~z!ElYiP`9wol4VC555n6QU1(^1CbZJhieAw%a9P7Ipw-0SojTC>ZLu*H1-rJp zIvQ_8%P9_;#Va~B%_a%ZTLj+sSoNxfvJ-PL6J?tjv0u$AqF-RpR|S0&!kHwvP1g0O ztmB#`lR$MvP>&Ycm{gW7 zL|pY1`$;d8fb4pMKB=}E3tZJ_UnHx!nsCZ~UF4&b2$Jkk%Z{k|xBRi%7q~ev>ZouZ zc2Tt1fRuAqL_Nn6G7E8v>PRRpAj5Kb``})-9I*5sD~f;Pz_aAvI62Mv{UK)Y);f;R zhx$fP2M9{vX8hYnzs&f2>aMTgEhDg6*Kr5dI4}*yge=i**jCrTAxiuoXRQA{qT)PW zZK^|}-e|K8E;0uf9-f^lDUJ0t04B=1FJ520PV=0?*=r-&0T07AC@Fm@l+wAwF3c0U zy=rU9PuuzKU2P{h^HU<=C&0GkH2;_g%%s8-2(`x6`)6{yK!E_=6L=YZ7-mNVzUb>w zy#J8`J2{yppD?WK^5jClkyRFUJyq^9k!mD$gM!QRaccT|{K-4VU+2KHmY7rcf(*|K z+@17%ByZCyOMAhOb9+&lOZ|V^sqJrnllY9kj6MA*11Drvgz6LKsV@I|TFdpN{#>)A zDXUY^6pd%{_3LpVbRLM})QZfe$)r&x9UNcpxSs!;QorGilMm(ef_L|kof1)Y)4Vlx z|BqJrKePXTfIcbdKlw#LWy)mTW!riyT2<~fTrxND%h#3o#i!WDw%wR;tG+>fWlm5J zoHnz@?=Pp}cxylfA&IEFnF&(1f(jxKDl|@zumsyPxFLV|R`a)SNp*v+MuO$O*!zRx zG68OF_pb8Pq99t$2IW&b-0E@X=$+m)Orj%VbGZO95eYJasQw2jSwW!(MiraYU8^*u z6=)>4)yYWViZ0kvajMdeyxqe0-zcf#6NrFPAk`#tb4KRWSd{wE=HSR9k+q1(x0RM6z3DW(6guJw@hRlP5{8HS#S1T=4?E7T4w_n{#S4z}p9-unP_TLEvO0Xl zEA>GoiXt$mxVq;7rf}s%WCN2aVeCFeKjUc|0;+@DNxn*O4GE%J;~hY zJ6C&!={`p{KVE!e$gq=OaX*?-;_d+ZOw=?GL}3lXUn2r>VHo4Xa&TIi4|M;%ZR;Aw z?hA`dmNeVG#Al&>o=uXblEQda$YzT=A)f>QoWN(@uz?fwj|nnJEZ6o}q5HYp?0rERm%e#J4I|3$s*@9x*58+=Ls_1?n-brIPJxmG>(%<0O|5<@>F7cM?c>Jk!<-pWNk!dE%*Uc=<3cD{`VAGOomr92 zL9!ZUJ8rJ3pScISUjgZ!p{#2u)g+nlv&t2}nQ80+{h3lP)ts*vwY?oJ*W&ZgG8{?Q zHX%{c>O*oH3pkO}E?dbQT(Guq3V0G#xX!;RQjm#!=`c(_Z!2bd_fv~NCfIw!K2O$= zHkxe>&xUPx7PE|$F?KjRvzfTwczXY#X=Y2yk->?ZNn9+R?ZKU6{Ka1tG!d^mI9Gjg z_Ye-=disGG&(WR&d_33?1U0a4^;17(kib39zNK`kPx6uZI@IizXr_h#ra4WCw&~-# zDDi3AFbZcD+3}e5#pjzuU{#6;h$9cdN?kp%PxAZY(x2_Ir-XTH*@hQeq= zDm@iG#Sao7Jq%GOY_O)18fU_l4KyIF#6vj_bcI&x=y=G&+g#g1dXn)C$aY=p%aEnx zXZ*R6oe>JhMrqe$DKBe{B-`kSaoXaZ6mo%XzSSh;$yAVpLBFJ2o@BJc0q>Oi^MZZ` zsW0;P_Y$1BmE1f#&wFS-A_Dc|M4%U(EziaYXz-;KZYoR@{^Z!vqHd+3ovsgiX{e3r z8gz!kL4|DNiq9(8dVYIMWQD-AO(x)l(pGhGNgzQFLbVcs1a~3(4loX7UMO@X*fU=J z%roYQ03(5QEbwA=v194NxqKJoVXEYN5h5V_H}s2E$gFH#lmq8>;l+^4Wmw^cm=;-O zet36!v284Kta6u2a==T$S5&{AO2i@JU;m2y>tB)oNB09+6P}s(nskAj#$;tM-VWjLyYU}u>CNBO8wAwqdP0){J5K`cSF zujz?gKuVj>aIU;-)sHjF1tJ8{nOF= z#|(eOew$b5Z8mn^(YD9ejYd6P>0PYzef5sAu}0dl!;-#reifwse5aOaTHuz&@iHBkIfm(XC#2t~ zzdoAA55Au9rT$sFOFnwbBYz9a)vJ9W)vvPP^LM76LG)4$8y%;*L`dAssl#$B>(06w z9WlwX2tB^a>j5-uQkM72YnTiA^zSqKj;C?tZt?TE&JoH%ZZ|7jYP~pXp z@YOoq$mLCG*b@~=1r7=o6iNYVDii!@jBo-_Dp5HO(bS|tfPGO+ zk)RZ!81VH`DujM09ts1(fna}Bg#&XZ74G7P14@AqYLAPv0=OeR{(xa%N6-fmF^JJ8 z>P?H*pBALa3(_QpL9n}2gh8R2w0#NT5QvbV4mrRT`Rj~;i2xVK6q3FWz1e%BxIhFn z5W*ZZHfs@SfJgoesu_#9JRm2M98u0iiCR9q}aD@^=5KTNyifR==SE|Ht$0&gkVo+cY zL2nzOFySDn2#>--fm}US&)~I%a8Bbi;aUqCK?P42l^y3bk3)d`4l>zp4b0Zuf~N& zqx}b5kU`sg5Cod8mmn7X)JAdu5969h6?4Cn)v0D=OC4_FFE!!i`ZU_4P_p-B;(N>CbvXi9y+#0M}|&$(sbv4!wg zyd3+^IV^B;#7&o)Lh`xNe>A8c?LnYtlkGtsz2j#D@m9zaPHi?dtUNcvvi|7--~?=uh%xP zb4^mG)YMI%tV1-Inqw1NR?>b!{DwWfa!qwKdMG|5wYm=9p}bYc&7VK^5*^)PlWI~n zA>hR1l`F2=Ti-sbJk)GIzAlqIeZuAu9P7aEib&Xzl*_3vzqWqk5?sw~xZBwFsCZu{ z?66_=#^Mw0<8PnV8MZj`@Yc()MeUc(ru(##>{98g$Bg+R>pf??R#r3Tm!)+28B5il zm9Qb4Ve(Qrc45=32z_Zm0WHDOm|<9M8&9N|{r1eW>v)@)vDv2gslN&*8oyq)FSEJh zSb4$Oyy$bb$NaugE%eHpGx93w%4mTX9O`!0?N#fPDj#McvG!G4R`e3XeXrYo-xmSV zbqO9TDmrq@0*u{v@LS4bj=ZTjy{LT7tBgNFn?k(H7aj1vF>=b`%9sFEy8f-w7x4@H zZoJ(VE?Us!oddl-z}z2fv(enw{ASHVAG4hJ`0*0i>T8C}xA6_Cvb)=IcJFZ_oyxqq z&+tiy{fc2u|gr4O8jkN zWBcUC;fD@i4rNYH5_LWKQCq>Uts9NmOFJK@*qrhw-`rQU#^3TpVmkdwbA@5ogC82J zs$C1`zA0jkT5LQm(1}SH@_gs~OHTNE0_~v$1`8B6g$B`C42a1={)Q4b$X_Ty-Tg=j z6xt^!frb1tC1}V%O#%uzI)nolgE)ZkUpRot9>@Xcs>|N`vkYpUQ*g2Ah;_5qT@a49 zgPf$J5T=%c7CmLS^qcv^3k%!r9^deqm%cp3`NyT1xx;yp>-3iUe8cq5n&@$ZKVFL! z;Su)M<-&=C;9n4gd^f){A6s}Y(cHjznR%w$KK%ySwfikQuOB$ZRW3K(A3rUNdC`-< za;tyAjt3RT`G@uta~E39UZ>-je7{xRR-YP`x%MmL4H?hmt0EFr@3xfeNe{~>Ki?Kf znV5C5p!<0mT;`h6SS>l9IcBpTUREF0Wcq`3X**5`QdO4RXxfxwzDd`gLEnGLl zggv4x^l3A8N%?O0sU{!Nv5*F{rfH=c!{;B5dg$Hh_Wn;aZM9pJ1>FGh&p5DpyxG*R zBO?{NRQ{>o&$2wQHtEGd)~MDFKc#i~sCPHM68#imCN2ykB5VFAUMRc&@V0g7-HGM% zQ*$DqDz5YIQ<~AD6j{vX$zw2KxtU(bNSDC0>eiLh-kPv#*K9Lcil$VJCCGixGTg3I zPS;;hzVS|cao4G)^+iv1Ez!N#_Q5Wx`R7ydM$KC*9SehOrzE$#Tz->vb0e$dv3Ki- z%Ww6ACKmq09F6RKw|;}wiqTe9W2!UmRyS{uZqG2u)3Lw6-5z3^)Dh$Aq#GJ)`aEZa z*RQu97DU}WN=Of`UAtve$f26AH^$gm6{4qQ!ZTkf0ti+Hwi9-5pQwy_t4F$hX)3j# zq9*&@d)~bckBB5(54+ydzJWUTm^E|m>xVi@J=c-Nzu(`w?5&l{t@;^Dd@mSAmQ7#%n;h>K6#ir>Rz0R<3+V|5wh-lTQ>%>9(jon(5%V3`hXTKxQQ*aIV_nO! zS~0ZB5$2#W?>owV-1xzs9(}tWp>gQ_+umk|Do!AbL2)P&l}P2b#OIZ#iI7xeOAKOo zQas}v(J1N6Bqi#X)4XB$XhJB-WH027!XNHFfm$a5hyNsJN=w zxLA+|q>7cvF|Nv%sBz(fwpt7mA&m(hV@nM7^nq}NLKY*%Au5?eMo0+F8WJl3F(oRL zF%Uv#5uD^Vy~YxxZh2Vku^Dyg^E~M8Vn<33fwnPA4y6Ta!B15L@E++TOySc$)Ji50g1sx zX(R+e*(5+(6cV5=Dg~u8#2i*+-$-!-GW^R>Kmo?00SG{g3oc5c1R<)lCA#={KrT@V z4DT5lVw0H^BK-Lh0;~1+2?0gVXUznMbm50;lFmP)81bS@MKwu^ciG%^+P5#Yio89Eo0K@5^W78fO8*}#Jx zZQwx&d{#_6J^vY%*w`LmJUzL5g)ku&Jl0(K|8kVixOyUCf0}U#N||Q2i-a&LL)95! zAXNn9DH3wU3T3PS1Q*1`frqX@J*Ilgfdv6dT#Cz3o+c-I8Q#;7N!3GeWdgaxmZ&0$ zP_ZCEh7);_0!%8TlEJd|EPzbfyAm2t_+vEC680=tPe4C3zArLQh>9ZZWD21`rrz05 zm^rw#;fe$qS zn*Ynv1RnMYcocB>pUY~||58MyM8)8yi?9fk{tv`tFlY=&4E4$oDihr6H5z%JjKQGN z2g?vDg)>A(VGQvFQpQj_+E8C`*B&Bc(I|suG?2{@J34)cj7mX<_#!mc(0R})Lu6Dc zV@Q59Dw{P}MyD_ap;oeBR3 D)78#a literal 0 HcwPel00001 diff --git a/clan/doc/images/basic2.txt b/clan/doc/images/basic2.txt new file mode 100644 index 0000000..1cbde89 --- /dev/null +++ b/clan/doc/images/basic2.txt @@ -0,0 +1,10 @@ + j^ i>=2 + | | i<=4 + | | | +4-+-***--j<=4 + | *** +2-+-***--j>=2 + | | | +0-+-+-+--->i + | | | + 0 2 4 diff --git a/clan/doc/images/tree.eps b/clan/doc/images/tree.eps new file mode 100644 index 0000000..d80f6e9 --- /dev/null +++ b/clan/doc/images/tree.eps @@ -0,0 +1,258 @@ +%!PS-Adobe-2.0 EPSF-2.0 +%%Title: tree.eps +%%Creator: fig2dev Version 3.2 Patchlevel 3c +%%CreationDate: Fri Sep 6 10:09:40 2002 +%%For: bastoul@whisky (Cedric Bastoul) +%%BoundingBox: 0 0 388 312 +%%Magnification: 1.0000 +%%EndComments +/$F2psDict 200 dict def +$F2psDict begin +$F2psDict /mtrx matrix put +/col-1 {0 setgray} bind def +/col0 {0.000 0.000 0.000 srgb} bind def +/col1 {0.000 0.000 1.000 srgb} bind def +/col2 {0.000 1.000 0.000 srgb} bind def +/col3 {0.000 1.000 1.000 srgb} bind def +/col4 {1.000 0.000 0.000 srgb} bind def +/col5 {1.000 0.000 1.000 srgb} bind def +/col6 {1.000 1.000 0.000 srgb} bind def +/col7 {1.000 1.000 1.000 srgb} bind def +/col8 {0.000 0.000 0.560 srgb} bind def +/col9 {0.000 0.000 0.690 srgb} bind def +/col10 {0.000 0.000 0.820 srgb} bind def +/col11 {0.530 0.810 1.000 srgb} bind def +/col12 {0.000 0.560 0.000 srgb} bind def +/col13 {0.000 0.690 0.000 srgb} bind def +/col14 {0.000 0.820 0.000 srgb} bind def +/col15 {0.000 0.560 0.560 srgb} bind def +/col16 {0.000 0.690 0.690 srgb} bind def +/col17 {0.000 0.820 0.820 srgb} bind def +/col18 {0.560 0.000 0.000 srgb} bind def +/col19 {0.690 0.000 0.000 srgb} bind def +/col20 {0.820 0.000 0.000 srgb} bind def +/col21 {0.560 0.000 0.560 srgb} bind def +/col22 {0.690 0.000 0.690 srgb} bind def +/col23 {0.820 0.000 0.820 srgb} bind def +/col24 {0.500 0.190 0.000 srgb} bind def +/col25 {0.630 0.250 0.000 srgb} bind def +/col26 {0.750 0.380 0.000 srgb} bind def +/col27 {1.000 0.500 0.500 srgb} bind def +/col28 {1.000 0.630 0.630 srgb} bind def +/col29 {1.000 0.750 0.750 srgb} bind def +/col30 {1.000 0.880 0.880 srgb} bind def +/col31 {1.000 0.840 0.000 srgb} bind def + +end +save +newpath 0 312 moveto 0 0 lineto 388 0 lineto 388 312 lineto closepath clip newpath +-165.0 369.0 translate +1 -1 scale + +/cp {closepath} bind def +/ef {eofill} bind def +/gr {grestore} bind def +/gs {gsave} bind def +/sa {save} bind def +/rs {restore} bind def +/l {lineto} bind def +/m {moveto} bind def +/rm {rmoveto} bind def +/n {newpath} bind def +/s {stroke} bind def +/sh {show} bind def +/slc {setlinecap} bind def +/slj {setlinejoin} bind def +/slw {setlinewidth} bind def +/srgb {setrgbcolor} bind def +/rot {rotate} bind def +/sc {scale} bind def +/sd {setdash} bind def +/ff {findfont} bind def +/sf {setfont} bind def +/scf {scalefont} bind def +/sw {stringwidth} bind def +/tr {translate} bind def +/tnt {dup dup currentrgbcolor + 4 -2 roll dup 1 exch sub 3 -1 roll mul add + 4 -2 roll dup 1 exch sub 3 -1 roll mul add + 4 -2 roll dup 1 exch sub 3 -1 roll mul add srgb} + bind def +/shd {dup dup currentrgbcolor 4 -2 roll mul 4 -2 roll mul + 4 -2 roll mul srgb} bind def + /DrawEllipse { + /endangle exch def + /startangle exch def + /yrad exch def + /xrad exch def + /y exch def + /x exch def + /savematrix mtrx currentmatrix def + x y tr xrad yrad sc 0 0 1 startangle endangle arc + closepath + savematrix setmatrix + } def + +/$F2psBegin {$F2psDict begin /$F2psEnteredState save def} def +/$F2psEnd {$F2psEnteredState restore end} def + +$F2psBegin +%%Page: 1 1 +10 setmiterlimit + 0.06000 0.06000 sc +% +% Fig objects follow +% +7.500 slw +% Ellipse +n 5400 1200 237 237 0 360 DrawEllipse gs col0 s gr + +% Ellipse +n 3000 3600 237 237 0 360 DrawEllipse gs col0 s gr + +% Ellipse +n 7800 3600 237 237 0 360 DrawEllipse gs col0 s gr + +% Ellipse +n 6600 4800 237 237 0 360 DrawEllipse gs col0 s gr + +% Ellipse +n 5400 2325 237 237 0 360 DrawEllipse gs col0 s gr + +% Polyline +gs clippath +5355 2115 m 5445 2115 l 5445 1888 l 5400 2068 l 5355 1888 l cp +eoclip +n 5400 1425 m + 5400 2100 l gs col0 s gr gr + +% arrowhead +15.000 slw +n 5355 1888 m 5400 2068 l 5445 1888 l 5355 1888 l cp gs 0.00 setgray ef gr col0 s +% Polyline +7.500 slw +gs clippath +5355 3390 m 5445 3390 l 5445 3163 l 5400 3343 l 5355 3163 l cp +eoclip +n 5400 2550 m + 5400 3375 l gs col0 s gr gr + +% arrowhead +15.000 slw +n 5355 3163 m 5400 3343 l 5445 3163 l 5355 3163 l cp gs 0.00 setgray ef gr col0 s +% Polyline +7.500 slw +gs clippath +2955 4590 m 3045 4590 l 3045 4363 l 3000 4543 l 2955 4363 l cp +eoclip +n 3000 3825 m + 3000 4575 l gs col0 s gr gr + +% arrowhead +15.000 slw +n 2955 4363 m 3000 4543 l 3045 4363 l 2955 4363 l cp gs 0.00 setgray ef gr col0 s +% Polyline +7.500 slw +gs clippath +6563 4544 m 6611 4621 l 6803 4500 l 6627 4558 l 6755 4424 l cp +eoclip +n 7800 3825 m + 6600 4575 l gs col0 s gr gr + +% arrowhead +15.000 slw +n 6755 4424 m 6627 4558 l 6803 4500 l 6755 4424 l cp gs 0.00 setgray ef gr col0 s +% Polyline +7.500 slw +gs clippath +8988 4621 m 9036 4544 l 8844 4424 l 8973 4558 l 8796 4500 l cp +eoclip +n 7800 3825 m + 9000 4575 l gs col0 s gr gr + +% arrowhead +15.000 slw +n 8796 4500 m 8973 4558 l 8844 4424 l 8796 4500 l cp gs 0.00 setgray ef gr col0 s +% Polyline +7.500 slw +gs clippath +6555 5790 m 6645 5790 l 6645 5563 l 6600 5743 l 6555 5563 l cp +eoclip +n 6600 5025 m + 6600 5775 l gs col0 s gr gr + +% arrowhead +15.000 slw +n 6555 5563 m 6600 5743 l 6645 5563 l 6555 5563 l cp gs 0.00 setgray ef gr col0 s +% Polyline +7.500 slw +gs clippath +7802 3411 m 7831 3326 l 7615 3253 l 7772 3354 l 7587 3338 l cp +eoclip +n 5400 2550 m + 7803 3364 l gs col0 s gr gr + +% arrowhead +15.000 slw +n 7587 3338 m 7772 3354 l 7615 3253 l 7587 3338 l cp gs 0.00 setgray ef gr col0 s +% Polyline +7.500 slw +gs clippath +2971 3337 m 3000 3422 l 3215 3348 l 3031 3364 l 3186 3262 l cp +eoclip +n 5400 2550 m + 3000 3375 l gs col0 s gr gr + +% arrowhead +15.000 slw +n 3186 3262 m 3031 3364 l 3215 3348 l 3186 3262 l cp gs 0.00 setgray ef gr col0 s +/Times-Roman ff 330.00 scf sf +3075 4200 m +gs 1 -1 sc (0) col0 sh gr +/Times-Roman ff 330.00 scf sf +6675 5400 m +gs 1 -1 sc (0) col0 sh gr +/Times-Roman ff 330.00 scf sf +5475 3000 m +gs 1 -1 sc (1) col0 sh gr +/Times-Roman ff 330.00 scf sf +3825 3000 m +gs 1 -1 sc (0) col0 sh gr +/Times-Roman ff 330.00 scf sf +6900 3000 m +gs 1 -1 sc (2) col0 sh gr +/Times-Roman ff 330.00 scf sf +6975 4200 m +gs 1 -1 sc (0) col0 sh gr +/Times-Roman ff 330.00 scf sf +8475 4200 m +gs 1 -1 sc (1) col0 sh gr +/Times-Roman ff 330.00 scf sf +5475 1800 m +gs 1 -1 sc (0) col0 sh gr +/Times-Roman ff 330.00 scf sf +2850 4950 m +gs 1 -1 sc (S1) col0 sh gr +/Times-Roman ff 330.00 scf sf +5250 3750 m +gs 1 -1 sc (S2) col0 sh gr +/Times-Roman ff 330.00 scf sf +6450 6150 m +gs 1 -1 sc (S3) col0 sh gr +/Times-Roman ff 330.00 scf sf +8850 4950 m +gs 1 -1 sc (S4) col0 sh gr +/Times-Roman ff 330.00 scf sf +5355 2430 m +gs 1 -1 sc (i) col0 sh gr +/Times-Roman ff 330.00 scf sf +2963 3667 m +gs 1 -1 sc (j) col0 sh gr +/Times-Roman ff 330.00 scf sf +7763 3675 m +gs 1 -1 sc (j) col0 sh gr +/Times-Roman ff 330.00 scf sf +6533 4890 m +gs 1 -1 sc (k) col0 sh gr +$F2psEnd +rs diff --git a/clan/doc/images/tree.fig b/clan/doc/images/tree.fig new file mode 100644 index 0000000..9c202bb --- /dev/null +++ b/clan/doc/images/tree.fig @@ -0,0 +1,54 @@ +#FIG 3.2 +Landscape +Center +Inches +Letter +100.00 +Single +-2 +1200 2 +1 3 0 1 0 7 50 0 -1 0.000 1 0.0000 5400 1200 237 237 5400 1200 5625 1275 +1 3 0 1 0 7 50 0 -1 0.000 1 0.0000 3000 3600 237 237 3000 3600 3225 3675 +1 3 0 1 0 7 50 0 -1 0.000 1 0.0000 7800 3600 237 237 7800 3600 8025 3675 +1 3 0 1 0 7 50 0 -1 0.000 1 0.0000 6600 4800 237 237 6600 4800 6825 4875 +1 3 0 1 0 7 50 0 -1 0.000 1 0.0000 5400 2325 237 237 5400 2325 5625 2400 +2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 0 2 + 1 1 2.00 90.00 180.00 + 5400 1425 5400 2100 +2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 0 2 + 1 1 2.00 90.00 180.00 + 5400 2550 5400 3375 +2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 0 2 + 1 1 2.00 90.00 180.00 + 3000 3825 3000 4575 +2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 0 2 + 1 1 2.00 90.00 180.00 + 7800 3825 6600 4575 +2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 0 2 + 1 1 2.00 90.00 180.00 + 7800 3825 9000 4575 +2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 0 2 + 1 1 2.00 90.00 180.00 + 6600 5025 6600 5775 +2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 0 2 + 1 1 2.00 90.00 180.00 + 5400 2550 7803 3364 +2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 0 2 + 1 1 2.00 90.00 180.00 + 5400 2550 3000 3375 +4 0 0 50 0 0 22 0.0000 0 225 150 3075 4200 0\001 +4 0 0 50 0 0 22 0.0000 0 225 150 6675 5400 0\001 +4 0 0 50 0 0 22 0.0000 0 225 150 5475 3000 1\001 +4 0 0 50 0 0 22 0.0000 0 225 150 3825 3000 0\001 +4 0 0 50 0 0 22 0.0000 0 225 150 6900 3000 2\001 +4 0 0 50 0 0 22 0.0000 0 225 150 6975 4200 0\001 +4 0 0 50 0 0 22 0.0000 0 225 150 8475 4200 1\001 +4 0 0 50 0 0 22 0.0000 0 225 150 5475 1800 0\001 +4 0 0 50 0 0 22 0.0000 0 225 345 2850 4950 S1\001 +4 0 0 50 0 0 22 0.0000 0 225 345 5250 3750 S2\001 +4 0 0 50 0 0 22 0.0000 0 225 345 6450 6150 S3\001 +4 0 0 50 0 0 22 0.0000 0 225 345 8850 4950 S4\001 +4 0 0 50 0 0 22 0.0000 0 225 90 5355 2430 i\001 +4 0 0 50 0 0 22 0.0000 0 300 90 2963 3667 j\001 +4 0 0 50 0 0 22 0.0000 0 300 90 7763 3675 j\001 +4 0 0 50 0 0 22 0.0000 0 225 150 6533 4890 k\001 diff --git a/clan/doc/images/tree.jpg b/clan/doc/images/tree.jpg new file mode 100644 index 0000000000000000000000000000000000000000..7329268b65736eafa7d05bbd39135092db60da2d GIT binary patch literal 13713 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