From a35eacef37113fac3b4a9d2beca16e5b34c0f52c Mon Sep 17 00:00:00 2001 From: Jean-Paul Chaput Date: Fri, 30 Jun 2017 20:00:22 +0200 Subject: [PATCH] Documentation of the Hurricane Python C / API. --- documentation/CMakeLists.txt | 2 + documentation/PythonCpp/CMakeLists.txt | 39 + documentation/PythonCpp/PythonCpp.pdf | Bin 0 -> 171320 bytes documentation/PythonCpp/PythonCpp.rst | 1296 ++++++++++++++++++++++++ documentation/etc/CMakeLists.txt | 8 + documentation/etc/Pygments.css | 41 + documentation/etc/SoC-ReST.css | 493 +++++++++ documentation/etc/SoC-ReST.tex | 119 +++ documentation/etc/SoC.css | 536 ++++++++++ documentation/etc/definitions.rst | 176 ++++ documentation/etc/images/clipboard.bb | 1 + documentation/etc/images/clipboard.eps | 456 +++++++++ documentation/etc/images/clipboard.pdf | Bin 0 -> 12127 bytes documentation/etc/images/clipboard.png | Bin 0 -> 3105 bytes documentation/etc/images/i-core.bb | 1 + documentation/etc/images/i-core.eps | 456 +++++++++ documentation/etc/images/i-core.pdf | Bin 0 -> 8043 bytes documentation/etc/images/i-core.png | Bin 0 -> 3138 bytes documentation/etc/socstyle.tex | 89 ++ 19 files changed, 3713 insertions(+) create mode 100644 documentation/PythonCpp/CMakeLists.txt create mode 100644 documentation/PythonCpp/PythonCpp.pdf create mode 100644 documentation/PythonCpp/PythonCpp.rst create mode 100644 documentation/etc/CMakeLists.txt create mode 100644 documentation/etc/Pygments.css create mode 100644 documentation/etc/SoC-ReST.css create mode 100644 documentation/etc/SoC-ReST.tex create mode 100644 documentation/etc/SoC.css create mode 100644 documentation/etc/definitions.rst create mode 100644 documentation/etc/images/clipboard.bb create mode 100644 documentation/etc/images/clipboard.eps create mode 100644 documentation/etc/images/clipboard.pdf create mode 100644 documentation/etc/images/clipboard.png create mode 100644 documentation/etc/images/i-core.bb create mode 100644 documentation/etc/images/i-core.eps create mode 100644 documentation/etc/images/i-core.pdf create mode 100644 documentation/etc/images/i-core.png create mode 100644 documentation/etc/socstyle.tex diff --git a/documentation/CMakeLists.txt b/documentation/CMakeLists.txt index 0ed90c18..338c83ec 100644 --- a/documentation/CMakeLists.txt +++ b/documentation/CMakeLists.txt @@ -22,7 +22,9 @@ add_subdirectory(examples) if(BUILD_DOC) + add_subdirectory(etc) add_subdirectory(UsersGuide) + add_subdirectory(PythonCpp) endif(BUILD_DOC) set ( htmlInstallDir share/doc/coriolis2/ ) diff --git a/documentation/PythonCpp/CMakeLists.txt b/documentation/PythonCpp/CMakeLists.txt new file mode 100644 index 00000000..49281f72 --- /dev/null +++ b/documentation/PythonCpp/CMakeLists.txt @@ -0,0 +1,39 @@ +# -*- mode: CMAKE; explicit-buffer-name: "CMakeLists.txt" -*- + + set ( htmlInstallDir share/doc/coriolis2/en/html/PythonCpp ) + set ( latexInstallDir share/doc/coriolis2/en/latex/PythonCpp ) + + add_custom_target ( doc_HTML ALL + cd ${DOCUMENTATION_SOURCE_DIR}/PythonCpp + && rst2html --link-stylesheet --stylesheet=../etc/SoC.css,../etc/SoC-ReST.css,../etc/Pygments.css PythonCpp.rst PythonCpp.html ) + add_dependencies ( doc_HTML ../etc/definitions.rst + ../etc/SoC.css + ../etc/SoC-ReST.css + ../etc/Pygments.css + PythonCpp.rst ) + + add_custom_target ( doc_LaTeX ALL + cd ${DOCUMENTATION_SOURCE_DIR}/PythonCpp + && export TEXINPUTS=../etc/images//:./images//: + && rst2latex --use-latex-toc --stylesheet=../etc/SoC-ReST.tex PythonCpp.rst PythonCpp-raw.tex + && sed 's, \\& \\\\multicolumn{2}{l|}{, \\& \\\\multicolumn{2}{p{0.6\\\\DUtablewidth}|}{,' PythonCpp-raw.tex > PythonCpp.tex + && pdflatex PythonCpp + && pdflatex PythonCpp + ) + add_dependencies ( doc_LaTeX ../etc/definitions.rst + ../etc/SoC-ReST.tex + PythonCpp.rst ) + + install ( DIRECTORY images/ + DESTINATION ${htmlInstallDir}/images + FILES_MATCHING PATTERN "*.png" ) + install ( FILES PythonCpp.html DESTINATION ${htmlInstallDir} ) + + install ( DIRECTORY images/ + DESTINATION ${latexInstallDir}/images + FILES_MATCHING PATTERN "*.pdf" + PATTERN "*.eps" + PATTERN "*.bb" ) + + install ( FILES PythonCpp.tex + PythonCpp.pdf DESTINATION ${latexInstallDir} ) diff --git a/documentation/PythonCpp/PythonCpp.pdf b/documentation/PythonCpp/PythonCpp.pdf new file mode 100644 index 0000000000000000000000000000000000000000..a23b9254a040a527aa3c6f28ecc016f41ee06db1 GIT binary patch literal 171320 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
  • SzzQ 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 literal 0 HcmV?d00001 diff --git a/documentation/PythonCpp/PythonCpp.rst b/documentation/PythonCpp/PythonCpp.rst new file mode 100644 index 00000000..6225a1f9 --- /dev/null +++ b/documentation/PythonCpp/PythonCpp.rst @@ -0,0 +1,1296 @@ +.. -*- Mode: rst -*- + +.. include:: ../etc/definitions.rst + + +|medskip| + + +=================================== +Hurricane Python/C++ API Tutorial +=================================== + +.. contents:: + +|newpage| + + +1. Introduction +================= + +* This document is written for people already familiar with the + `Python/C API Reference Manual`_. + +* The macros provided by the Hurricane Python/C API are written using + the standard Python C/API. That is, you may not use them and write + directly your functions with the original API or any mix between. + You only have to respect some naming convention. + +* Coriolis is build against Python 2.7. + + +1.1 First, A Disclaimer +~~~~~~~~~~~~~~~~~~~~~~~~~ + +The Hurricane Python/C++ API has been written about ten years ago, at a time +my mastering of template programming was less than complete. This is why this +interface is build with old fashioned C macro instead of C++ template. + +It is my hope that at some point in the future I will have time to completly +rewrite it, borrowing the interface from ``boost::python``. + + +1.2 About Technical Choices +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Some would say, why not use *off the shelf* wrappers like ``swig`` +or ``boost::python``, here are some clues. + +#. **Partial exposure of the C++ class tree.** We expose at Python level + C++ base classes, only if they provides common methods that we want + to see. Otherwise, we just show them as base classes under Python. + For instance ``Library`` is derived from ``DBo``, but we won't see + it under Python. + +#. **Bi-directional communication.** When a Python object is deleted, the + wrapper obviously has a pointer toward the underlying C++ object and + is able to delete it. But, the reverse case can occurs, meaning that + you have a C++ object wrapped in Python and the database delete the + underlying object. The wrapped Python object *must* be informed that + it no longer refer a valid C++ one. Moreover, as we do not control + when Python objects gets deleteds (that is, when their reference count + reaches zero), we can have valid Python object with a dangling + C++ pointer. So our Python objects can be warned by the C++ objects + that they are no longer valid and any other operation than the + deletion should result in a severe non-blocking error. + + To be precise, this apply to persistent object in the C++ database, + like ``Cell``, ``Net``, ``Instance`` or ``Component``. Short lived + objects like ``Box`` or ``Point`` retains the classic Python behavior. + + Another aspect is that, for all derived ``DBo`` objects, one and only + one Python object is associated. For one given ``Instance`` object we + will always return the *same* ``PyInstance`` object, thanks to the + bi-directional link. Obviously, the *reference count* of the + ``PyInstance`` is managed accordingly. This mechanism is implemented + by the ``PyInstance_Link()`` function. + +#. **Linking accross modules.** As far as I understand, the wrappers + are for monolithic libraries. That is, you wrap the entire library + in one go. But Hurricane has a modular design, the core database + then various tools. We do not, and cannot, have one gigantic wrapper + that would encompass all the libraries in one go. We do one Python + module for one C++ library. + + This brings another issue, at Python level this time. The Python + modules for the libraries have to share some functions. Python + provides a mechanism to pass C function pointers accross modules, + but I did found it cumbersome. Instead, all our modules are split + in two: + + * The first part contains the classic Python module code. + * The second part is to be put in a separate dynamic library that + will hold the shared functions. The Python module is dynamically linked + against that library like any other. And any other Python module + requiring the functions will link against the associated shared + library. + + Each module file will be compiled *twice*, once to build the Python + module (``__PYTHON_MODULE`` is defined) and once to build the supporting + shared library (``__PYTHON_MODULE__`` **not** defined). This tricky + double compilation is taken care of though the ``add_python_module`` + ``cmake`` macro. + + For the core Hurricane library we will have: + + * ``Hurricane.so`` the Python module (use with: ``import Hurricane``). + * ``libisobar.so.1.0`` the supporting shared library. + + The ``PyLibrary.cpp`` file will have the following structure: + + .. code:: c++ + + #include "hurricane/isobar/PyLibrary.h" + + namespace Isobar { + + extern "C" { + + #if defined(__PYTHON_MODULE__) + + // +=================================================================+ + // | "PyLibrary" Python Module Code Part | + // +=================================================================+ + // + // The classic part of a Python module. Goes into Hurricane.so. + + + #else // End of Python Module Code Part. + + // x=================================================================x + // | "PyLibrary" Shared Library Code Part | + // x=================================================================x + // + // Functions here will be part of the associated shared library and + // made available to all other Python modules. Goes into libisobar.so.1.0 + + + # endif // Shared Library Code Part. + + } // extern "C". + + } // Isobar namespace. + + + This way, we do not rely upon a pointer transmission through Python + modules, but directly uses linker capabilities. + + +1.3 Botched Design +~~~~~~~~~~~~~~~~~~~~ + +The mechanism to compute the signature of a call to a Python function, +the ``__cs`` object, is much too complex and, in fact, not needed. +At some point I may root it out, but it is used in so many places... + +What I should have used the ``"O!"`` capablity of ``PyArg_ParseTuple()``, +like in the code below: + +|newpage| + +.. code:: c++ + + static PyObject* PyContact_create ( PyObject*, PyObject *args ) + { + Contact* contact = NULL; + HTRY + PyNet* pyNet = NULL; + PyLayer* pyLayer = NULL; + PyComponent* pyComponent = NULL; + DbU::Unit x = 0; + DbU::Unit y = 0; + DbU::Unit width = 0; + DbU::Unit height = 0; + + if (PyArg_ParseTuple( args, "O!O!ll|ll:Contact.create" + , &PyTypeNet , &pyNet + , &PyTypeLayer, &pyLayer + , &x, &y, &width, &height)) { + contact = Contact::create( PYNET_O(pyNet), PYLAYER_O(pyLayer) + , x, y, width, height ); + } else { + PyErr_Clear(); + if (PyArg_ParseTuple( args, "O!O!ll|ll:Contact.create" + , &PyTypeComponent, &pyComponent + , &PyTypeLayer , &pyLayer + , &x, &y, &width, &height)) { + contact = Contact::create( PYCOMPONENT_O(pyComponent), PYLAYER_O(pyLayer) + , x, y, width, height ); + } else { + PyErr_SetString( ConstructorError + , "invalid number of parameters for Contact constructor." ); + return NULL; + } + } + HCATCH + return PyContact_Link( contact ); + } + + +2. Basic File Structure and CMake configuration +================================================= + +As a first example we will consider the ``Hurrican::Library`` +class. To export a class into Python, we must create three files: + +#. ``PyLibrary.h``, defines the ``PyLibrary`` C-Struct and the functions + needed outside the module istself (mostly for ``PyHurricane.cpp``). + +#. ``PyLibrary.cpp``, contains the complete wrapping of the class and + the Python type definition (``PyTypeLibrary``). + +#. ``PyHurricane.cpp``, the definition of the Python module into which + the classes are registered. The module act as a ``namespace`` in + Python so it is good practice to give it the same name as it's + associated C++ namespace. + +|newpage| + +To build a Python module in |cmake|, use the following macro: + + .. code:: cmake + + set( pyCpps PyLibrary.cpp + PyHurricane.cpp ) + set( pyIncludes hurricane/isobar/PyLibrary.h + + add_python_module( "${pyCpps}" + "${pyIncludes}" + "isobar;1.0;1" # Name & version of the supporting + # shared library. + Hurricane # Name of the Python module will give: + # Hurricane.so + "${depLibs}" # List of dependency libraries. + include/coriolis2/hurricane/isobar + # Where to install the include files. + ) + + +3. Case 1 - DBo Derived, Standalone +====================================== + +As example, we take ``Library``. This a ``DBo`` derived class, but we +choose not to export the parent classes. From Python, it will appear +as a base class. + + +3.1 Class Associated Header File +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Here is the typical content of a header file (for ``PyLibrary``): + +.. code:: c++ + + #ifndef PY_LIBRARY_H + #define PY_LIBRARY_H + + #include "hurricane/isobar/PyHurricane.h" + #include "hurricane/Library.h" + + namespace Isobar { + using namespace Hurricane; + + extern "C" { + + typedef struct { + PyObject_HEAD + Library* _object; + } PyLibrary; + + extern PyTypeObject PyTypeLibrary; + extern PyMethodDef PyLibrary_Methods[]; + extern PyObject* PyLibrary_Link ( Hurricane::Library* lib ); + extern void PyLibrary_LinkPyType (); + + + #define IsPyLibrary(v) ( (v)->ob_type == &PyTypeLibrary ) + #define PYLIBRARY(v) ( (PyLibrary*)(v) ) + #define PYLIBRARY_O(v) ( PYLIBRARY(v)->_object ) + + } // extern "C". + } // Isobar namespace. + + #endif // PY_LIBRARY_H + + +The code is organized as follow: + +1. It must have, *as the first include* ``PyHurricane.h``, which provides + the complete bunch of macros needed to build the module. Then the include + of the C++ class we want to wrap (``Library.h``). + +2. As Python is written in C, all the wrapper code has to be but inside + an ``extern "C"`` namespace. + +3. Definition of the wrapped |struct|, ``PyLibrary``. It is standard Python here. + + .. note:: + For our set of macros to work, the name of the pointer to the + C++ class must always be **_object**, and the various functions and + macros defined here must take the name of the class (either in + lowercase, camel case or capitals). + +4. Declaration of the Python type ``PyTypeLibrary`` (standard). + +5. Declaration of the Python type table of methods ``PyLibrary_Methods`` (standard). + +.. _3.6: + +6. Declaration of ``PyLibrary_Link()``, helper to convert a C++ ``Lybrary`` into + a ``PyLibrary`` (put in the support shared library). + +7. Declaration of ``PyLibrary_LinkPyType()``, this function setup the class-level + function of the new Python type (here, ``PyTypeLibrary``). + +8. And, lastly, three macros to: + + * ``IsPylibrary()``, know if a Python object is a ``PyLibrary`` + * ``PYLIBRARY()``, force cast (C style) of a ``PyObject`` into a ``PyLibrary``. + * ``PYLIBRARY_O()``, extract the C++ object (``Library*``) from the Python + object (``PyLibrary``). + + +3.2 Class Associated File +~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +3.2.1 Head of the file +------------------------ + +.. code:: c++ + + #include "hurricane/isobar/PyLibrary.h" + #include "hurricane/isobar/PyDataBase.h" + #include "hurricane/isobar/PyCell.h" + + namespace Isobar { + using namespace Hurricane; + + extern "C" { + + #define METHOD_HEAD(function) GENERIC_METHOD_HEAD(Library,lib,function) + +As for the header, all the code must be put inside a ``extern "C"`` namespace. + +A convenience macro ``METHOD_HEAD()`` must be defined, by refining +``GENERIC_METHOD_HEAD()``. This macro will be used in the method wrappers +below to cast the ``_object`` field of the Python object into the +appropriate C++ class, this is done using a C-style cast. +The parameters of that macro are: + +#. The C++ encapsulated class (``Library``). +#. The name of the *variable* that will be used to store a pointer + to the C++ working object. +#. The name of the C++ method which is to be wrapped. + + +3.2.2 The Python Module Part +------------------------------ + +First, we have to build all the wrappers to the C++ methods of +the class. For common predicates, accessors, and mutators macros +are supplied. + +Wrapping of the ``Library::getCell()`` method: + +.. code:: c++ + + static PyObject* PyLibrary_getCell ( PyLibrary* self, PyObject* args ) + { + Cell* cell = NULL; + + HTRY + METHOD_HEAD( "Library.getCell()" ) + char* name = NULL; + if (PyArg_ParseTuple(args,"s:Library.getCell", &name)) { + cell = lib->getCell( Name(name) ); + } else { + PyErr_SetString( ConstructorError + , "invalid number of parameters for Library::getCell." ); + return NULL; + } + HCATCH + + return PyCell_Link(cell); + } + +Key points about this method wrapper: + +#. The ``HTRY`` / ``HCATCH`` macros provides an insulation from the C++ + exceptions. If one is emitted, it will be catched and transformed in + a Python one. This way, the Python program will be cleanly interrupted + and the usual stack trace displayed. + +#. The returned value of this method is of type ``Cell*``, we have to + transform it into a Python one. This is done with ``PyCell_Link()``. + This macro is supplied by the ``PyCell.h`` header and this is why + it must be included. + +|newpage| + + +Wrapping of the ``Library::create()`` method: + +.. code:: c++ + + static PyObject* PyLibrary_create( PyObject*, PyObject* args ) + { + PyObject* arg0; + PyObject* arg1; + Library* library = NULL; + + HTRY + __cs.init( "Library.create" ); // Step (1). + if (not PyArg_ParseTuple( args, "O&O&:Library.create" + , Converter, &arg0 + , Converter, &arg1 )) { // Step (2). + PyErr_SetString( ConstructorError + , "invalid number of parameters for Library constructor." ); + return NULL; + } + if (__cs.getObjectIds() == ":db:string") { // Step (3.a) + DataBase* db = PYDATABASE_O(arg0); + library = Library::create( db, Name(PyString_AsString(arg1)) ); + } else if (__cs.getObjectIds() == ":library:string") { // Step (3.b) + Library* masterLibrary = PYLIBRARY_O(arg0); + library = Library::create( masterLibrary, Name(PyString_AsString(arg1)) ); + } else { + PyErr_SetString( ConstructorError + , "invalid number of parameters for Library constructor." ); + return NULL; + } + HCATCH + + return PyLibrary_Link( library ); + } + +Key point about this constructor: + +#. We want the Python interface to mimic as closely as possible the + C++ API. As such, Python object will be created using a static + ``.create()`` method. So we do not use the usual Python allocation + mechanism. + +#. As it is a *static* method, there is no first argument. + +#. Python do not allow function overload like C++. To emulate that + behavior we use the ``__cs`` object (which is a global variable). + + #. Init/reset the ``__cs`` object: see *step (1)*. + + #. Call ``PyArg_ParseTuple()``, read every mandatory or optional + argument as a Python object (``"O&"``) and use ``Converter`` + on each one. ``Converter`` will determine the real type of + the Python object given as argument by looking at the + encapsulated C++ class. It then update the ``__cs`` object. + Done in *step (2)* + + #. After the call to ``PyArg_ParseTuple()``, the function + ``__cs.getObjectIds()`` will return the *signature* of + the various arguments. In our case, the valid signatures + will be ``":db:string"`` (*step (3.a)*a) and ``":library:string"`` + (*step (3.b)*). + + #. Call the C++ method after extracting the C++ objects from + the Python arguments. Note the use of the ``PYLIBRARY_O()`` + and ``PYDATABSE_O()`` macros to perform the conversion. + +#. Return the result, encapsulated through a call to ``PyLibrary_Link()``. + +|newpage| + + +Wrapping of the ``Library::destroy()`` method: + +.. code:: c++ + + DBoDestroyAttribute(PyLibrary_destroy, PyLibrary) + +For C++ classes **that are derived** from ``DBo``, the destroy method +wrapper must be defined using the macro ``DBoDestroyAttribute()``. +This macro implements the bi-directional communication mechanism +using ``Hurricane::Property``. It **must not** be used for +non ``DBo`` derived classes. + + +Defining the method table of the PyLibrary type: + +.. code:: c++ + + PyMethodDef PyLibrary_Methods[] = + { { "create" , (PyCFunction)PyLibrary_create , METH_VARARGS|METH_STATIC + , "Creates a new library." } + , { "getCell" , (PyCFunction)PyLibrary_getCell, METH_VARARGS + , "Get the cell of name " } + , { "destroy" , (PyCFunction)PyLibrary_destroy, METH_NOARGS + , "Destroy associated hurricane object The python object remains." } + , {NULL, NULL, 0, NULL} /* sentinel */ + }; + + +This is standard Python/C API. The name of the ``PyMethodDef`` table must be +named from the class: ``PyLibrary_Methods``. + + +3.2.3 Python Type Linking +--------------------------- + +Defining the ``PyTypeLibrary`` class methods and the type linking function. + +Those are the functions for the Python object itself to work, not the +wrapped method from the C++ class. + +.. note:: + At this point we **do not** define the ``PyTypeLibrary`` itself. + Only it's functions and a function to set them up *once* the + type will be defined. + +.. code:: c++ + + DBoDeleteMethod(Library) + PyTypeObjectLinkPyType(Library) + + +The macro ``DBoDeleteMethod()`` define the function to delete a +``PyLibrary`` *Python* object. Again, do not mistake it for the deletion +of the C++ class (implemented by ``DBoDestroyAttribute()``). +Here again, ``DBoDeleteMethod()`` is specially tailored for +``DBo`` derived classes. + +.. _PyLibrary_LinkPyType(): + +To define ``PyLibrary_LinkPyType()``, use the ``PyTypeObjectLinkPyType()`` +macro. This macro is specific for ``DBo`` derived classes that are seen as +base classes under Python (i.e. we don't bother exposing the base +class under Python). ``PyLibrary_LinkPyType()`` setup the class functions +in the ``PyTypeLibrary`` type object, it **must** be called in the +Python module this class is part of (in this case: ``PyHurricane.cpp``). +This particular flavor of the macro *will define* and setup the +following class functions: + +* ``PyTypeLibrary.tp_compare`` (defined by the macro). +* ``PyTypeLibrary.tp_repr`` (defined by the macro). +* ``PyTypeLibrary.tp_str`` (defined by the macro). +* ``PyTypeLibrary.tp_hash`` (defined by the macro). +* ``PyTypeLibrary.tp_methods`` sets to the previously defined ``PyLibrary_Methods`` table. +* ``PyTypeLibrary.tp_dealloc`` is set to a function that *must* be named ``PyLibrary_DeAlloc``, + this is what ``DBoDeleteMethod`` does. It is *not* done by ``PyTypeObjectLinkPyType``. + +Defining the ``PyTypeLibrary`` type: + + +3.2.4 The Shared Library Part +------------------------------- + +This part will be put in a separate supporting shared library, allowing +other Python module to link against it (and make use of its symbols). + +.. code:: c++ + + DBoLinkCreateMethod(Library) + PyTypeObjectDefinitions(Library) + + +To define ``PyTypeLibrary``, use the ``PyTypeObjectDefinitions()`` macro. +This macro is specific for classes that, as exposed by Python, +are neither *derived* classes nor *base* classes for others. +That is, they are standalone from the inheritance point of view. + +The ``DBoLinkCreateMethod()`` macro will define the ``PyLibrary_Link()`` +function which is responsible for encapsulating a C++ ``Library`` object +into a Python ``PyLibrary`` one. + + +3.3 Python Module (C++ namespace) +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +We use the Python module to replicate the C++ *namespace*. Thus, for the +``Hurricane`` namespace we create a Python ``Hurricane`` module which is +defined in the ``PyHurricane.cpp`` file, then we add into that module +dictionary all the Python types encapsulating the C++ classes of that +namespace. + +.. code:: c++ + + DL_EXPORT(void) initHurricane () + { + PyLibrary_LinkPyType(); // step 1. + + PYTYPE_READY( Library ) // step 2. + + __cs.addType( "library", &PyTypeLibrary, "", false ); // step 3. + + PyObject* module = Py_InitModule( "Hurricane", PyHurricane_Methods ); + if (module == NULL) { + cerr << "[ERROR]\n" + << " Failed to initialize Hurricane module." << endl; + return; + } + + Py_INCREF( &PyTypeLibrary ); // step 4. + PyModule_AddObject( module, "Library", (PyObject*)&PyTypeLibrary ); // step 4. + } + +The ``initHurricane()`` initialisation function shown above has +been scrubbed of everything not relevant to the ``PyLibrary`` class. +The integration of the ``PyLibrary`` class into the module needs +four steps: + +#. A call to `PyLibrary_LinkPyType()`_ to hook the Python type functions + in the Python type object. + +#. A call to the ``PYTYPE_READY()`` macro (standard Python). + +#. Registering the type into the ``__cs`` object, with ``addType()``. + The arguments are self explanatory, save for the last which is a + boolean to tell if this is a *derived* class or not. + +#. Adding the type object (``PyTypeLibrary``) into the dictionnary of + the module itself. This allow to mimic closely the C++ syntax: + + .. code:: python + + import Hurricane + lib = Hurricane.Library.create( db, 'root' ) + +|newpage| + + +4. Case 2 - Hierarchy of DBo Derived Classes +============================================== + +Now we want to export the following C++ class hierarchy into Python: :: + + PyEntity <-- PyComponent <-+- PyContact + +- PySegment <-+- PyHorizontal + +- PyVertical + + +4.1 Base Class Header +~~~~~~~~~~~~~~~~~~~~~~~ + +**Remark:** this is only a partial description of tree for the sake of +clarity. + +One important fact to remember is that ``PyEntity`` and ``PyComponent`` +being related to C++ abstract classes, no objects of those types will be +created, only ``PyContact``, ``PyHorizontal`` or ``PyVertical`` will. + +The consequence is that there is no ``PyEntity_Link()`` like in `3.6`_ +but instead two functions: + +#. ``PyEntity_NEW()`` which create the relevant ``PyEntity`` *derived* + object from the ``Entity`` one. For example, if the ``Entity*`` given + as argument is in fact a ``Horizontal*``, then the function will + return a ``PyHorizontal*``. + +#. ``EntityCast()`` do the reverse of ``PyEntity_NEW()`` that is, from + a ``PyEntity``, return the C++ *derived* object. Again, if the + ``PyEntity*`` is a ``PyHorizontal*``, the function will cast it as + a ``Horizontal*`` *then* return it as an ``Entity*``. + +.. code:: python + + #ifndef ISOBAR_PY_ENTITY_H + #define ISOBAR_PY_ENTITY_H + + #include "hurricane/isobar/PyHurricane.h" + #include "hurricane/Entity.h" + + namespace Isobar { + extern "C" { + + typedef struct { + PyObject_HEAD + Hurricane::Entity* _object; + } PyEntity; + + extern PyObject* PyEntity_NEW ( Hurricane::Entity* entity ); + extern void PyEntity_LinkPyType (); + extern PyTypeObject PyTypeEntity; + extern PyMethodDef PyEntity_Methods[]; + + + #define IsPyEntity(v) ( (v)->ob_type == &PyTypeEntity ) + #define PYENTITY(v) ( (PyEntity*)(v) ) + #define PYENTITY_O(v) ( PYENTITY(v)->_object ) + + } // extern "C". + + Hurricane::Entity* EntityCast ( PyObject* derivedObject ); + + } // Isobar namespace. + + #endif // ISOBAR_PY_ENTITY_H + +|newpage| + + +4.2 Base Class File +~~~~~~~~~~~~~~~~~~~~~ + +Changes from `3.2 Class Associated File`_ are: + +#. No call to ``DBoLinkCreateMethod()`` because there must be no ``PyEntity_Link()``, + but the definitions of ``PyEntity_NEW()`` and ``EntityCast``. + +#. For defining the ``PyTypeEntity`` Python type, we call a different + macro: ``PyTypeRootObjectDefinitions``, dedicated to base classes. + + +.. code:: c++ + + #include "hurricane/isobar/PyCell.h" + #include "hurricane/isobar/PyHorizontal.h" + #include "hurricane/isobar/PyVertical.h" + #include "hurricane/isobar/PyContact.h" + + namespace Isobar { + using namespace Hurricane; + + extern "C" { + + #if defined(__PYTHON_MODULE__) + + #define METHOD_HEAD(function) GENERIC_METHOD_HEAD(Entity,entity,function) + + DBoDestroyAttribute(PyEntity_destroy ,PyEntity) + + static PyObject* PyEntity_getCell ( PyEntity *self ) + { + Cell* cell = NULL; + HTRY + METHOD_HEAD( "Entity.getCell()" ) + cell = entity->getCell(); + HCATCH + return PyCell_Link( cell ); + } + + PyMethodDef PyEntity_Methods[] = + { { "getCell", (PyCFunction)PyEntity_getCell, METH_NOARGS + , "Returns the entity cell." } + , { "destroy", (PyCFunction)PyEntity_destroy, METH_NOARGS + , "Destroy associated hurricane object, the python object remains." } + , {NULL, NULL, 0, NULL} /* sentinel */ + }; + + + DBoDeleteMethod(Entity) + PyTypeObjectLinkPyType(Entity) + + #else // End of Python Module Code Part. + + PyObject* PyEntity_NEW ( Entity* entity ) + { + if (not entity) { + PyErr_SetString ( HurricaneError, "Invalid Entity (bad occurrence)" ); + return NULL; + } + + Horizontal* horizontal = dynamic_cast(entity); + if (horizontal) return PyHorizontal_Link( horizontal ); + + Vertical* vertical = dynamic_cast(entity); + if (vertical) return PyVertical_Link( vertical ); + + Contact* contact = dynamic_cast(entity); + if (contact) return PyContact_Link( contact ); + + Py_RETURN_NONE; + } + + PyTypeRootObjectDefinitions(Entity) + + #endif // Shared Library Code Part (1). + + } // extern "C". + + + #if !defined(__PYTHON_MODULE__) + + Hurricane::Entity* EntityCast ( PyObject* derivedObject ) { + if (IsPyHorizontal(derivedObject)) return PYHORIZONTAL_O(derivedObject); + if (IsPyVertical (derivedObject)) return PYVERTICAL_O(derivedObject); + if (IsPyContact (derivedObject)) return PYCONTACT_O(derivedObject); + return NULL; + } + + #endif // Shared Library Code Part (2). + + } // Isobar namespace. + +|newpage| + + +4.3 Intermediate Class Header +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Changes from `3.1 Class Associated Header File`_ are: + +#. As for ``PyEntity``, and because this is still an abstract class, + there is no ``PyComponent_Link()`` function. + +#. The definition of the ``PyComponent`` |struct| is differs. There is + no ``PyObject_HEAD`` (it is a Python *derived* class). The only + field is of the base class type ``PyEntity`` and for use with + Coriolis macros, **it must** be named ``_baseObject`` (note that + this is *not* a pointer but a whole object). + +.. code:: c++ + + #ifndef ISOBAR_PY_COMPONENT_H + #define ISOBAR_PY_COMPONENT_H + + #include "hurricane/isobar/PyEntity.h" + #include "hurricane/Component.h" + + namespace Isobar { + extern "C" { + + typedef struct { + PyEntity _baseObject; + } PyComponent; + + extern PyTypeObject PyTypeComponent; + extern PyMethodDef PyComponent_Methods[]; + extern void PyComponent_LinkPyType (); + + #define IsPyComponent(v) ((v)->ob_type == &PyTypeComponent) + #define PYCOMPONENT(v) ((PyComponent*)(v)) + #define PYCOMPONENT_O(v) (static_cast(PYCOMPONENT(v)->_baseObject._object)) + + } // extern "C". + } // Isobar namespace. + + #endif + + +4.4 Intermediate Class File +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Changes from `3.2 Class Associated File`_ are: + +1. Redefinition of the default macros ``ACCESS_OBJECT`` and ``ACCESS_CLASS``. + + * The pointer to the C++ encapsulated object (attribute ``_object``) is hold + by the base class ``PyEntity``. The ``ACCESS_OBJECT`` macro which is tasked + to give access to that attribute is then ``_baseObject._object`` as + ``PyComponent`` is a direct derived class of ``PyEntity``. + + * ``ACCESS_CLASS`` is similar to ``ACCESS_OBJECT`` for accessing the base + class, that is a pointer to ``PyEntity``. + +|newpage| + +2. For defining the ``PyTypeComponent`` Python type, we call a yet different + macro: ``PyTypeInheritedObjectDefinitions()``, dedicated to derived classes. + For this this macro we need to give as argument the derived class and the + base class. + +.. code:: c++ + + #include "hurricane/isobar/PyComponent.h" + #include "hurricane/isobar/PyNet.h" + + namespace Isobar { + using namespace Hurricane; + + extern "C" { + + #undef ACCESS_OBJECT + #undef ACCESS_CLASS + #define ACCESS_OBJECT _baseObject._object + #define ACCESS_CLASS(_pyObject) &(_pyObject->_baseObject) + #define METHOD_HEAD(function) GENERIC_METHOD_HEAD(Component,component,function) + + #if defined(__PYTHON_MODULE__) + + DirectGetLongAttribute(PyComponent_getX,getX,PyComponent,Component) + DirectGetLongAttribute(PyComponent_getY,getY,PyComponent,Component) + DBoDestroyAttribute(PyComponent_destroy,PyComponent) + + static PyObject* PyComponent_getNet ( PyComponent *self ) + { + Net* net = NULL; + HTRY + METHOD_HEAD( "Component.getNet()" ) + net = component->getNet( ); + HCATCH + return PyNet_Link( net ); + } + + PyMethodDef PyComponent_Methods[] = + { { "getX" , (PyCFunction)PyComponent_getX , METH_NOARGS + , "Return the Component X value." } + , { "getY" , (PyCFunction)PyComponent_getY , METH_NOARGS + , "Return the Component Y value." } + , { "getNet" , (PyCFunction)PyComponent_getNet , METH_NOARGS + , "Returns the net owning the component." } + , { "destroy", (PyCFunction)PyComponent_destroy, METH_NOARGS + , "destroy associated hurricane object, the python object remains." } + , {NULL, NULL, 0, NULL} /* sentinel */ + }; + + DBoDeleteMethod(Component) + PyTypeObjectLinkPyType(Component) + + #else // Python Module Code Part. + + PyTypeInheritedObjectDefinitions(Component, Entity) + + #endif // Shared Library Code Part. + + } // extern "C". + } // Isobar namespace. + + +4.5 Terminal Class Header +~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +The contents of this file is almost identical to `4.3 Intermediate Class Header`_, +save for the presence of a ``PyContact_Link()`` function. She is present +at this level because the class is a concrete one and can be instanciated. + +.. code:: c++ + + #ifndef ISOBAR_PY_CONTACT_H + #define ISOBAR_PY_CONTACT_H + + #include "hurricane/isobar/PyComponent.h" + #include "hurricane/Contact.h" + + namespace Isobar { + extern "C" { + + typedef struct { + PyComponent _baseObject; + } PyContact; + + extern PyTypeObject PyTypeContact; + extern PyMethodDef PyContact_Methods[]; + extern PyObject* PyContact_Link ( Hurricane::Contact* object ); + extern void PyContact_LinkPyType (); + + #define IsPyContact(v) ( (v)->ob_type == &PyTypeContact ) + #define PYCONTACT(v) ( (PyContact*)(v) ) + #define PYCONTACT_O(v) ( PYCONTACT(v)->_baseObject._baseObject._object ) + + } // extern "C". + } // Isobar namespace. + + #endif // ISOBAR_PY_CONTACT_H + + +4.6 Terminal Class File +~~~~~~~~~~~~~~~~~~~~~~~~~ + +Changes from `4.4 Intermediate Class File`_ are: + +#. As previously, we have to redefine the macros ``ACCESS_OBJECT`` and ``ACCESS_CLASS``. + But, as we are one level deeper into the hierarchy, one more level of + indirection using ``_baseObject`` must be used. + + * ``ACCESS_OBJECT`` becomes ``_baseObject._baseObject._object``. + + * ``ACCESS_CLASS`` becomes ``&(_pyObject->_baseObject._baseObject)``. + +#. For defining the ``PyTypeContact`` Python type, we call again + ``PyTypeInheritedObjectDefinitions()``. It is the same whether the class is + terminal or not. + +#. And, this time, as the Python class is concrete, we call the macro + ``DBoLinkCreateMethod()`` to create the ``PyContact_Link()`` function. + + +.. code:: c++ + + #include "hurricane/isobar/PyContact.h" + + namespace Isobar { + using namespace Hurricane; + + extern "C" { + + #undef ACCESS_OBJECT + #undef ACCESS_CLASS + #define ACCESS_OBJECT _baseObject._baseObject._object + #define ACCESS_CLASS(_pyObject) &(_pyObject->_baseObject._baseObject) + #define METHOD_HEAD(function) GENERIC_METHOD_HEAD(Contact,contact,function) + + #if defined(__PYTHON_MODULE__) + + DirectGetLongAttribute(PyContact_getWidth , getWidth , PyContact,Contact) + DirectGetLongAttribute(PyContact_getHeight, getHeight, PyContact,Contact) + DBoDestroyAttribute(PyContact_destroy, PyContact) + + static PyObject* PyContact_create ( PyObject*, PyObject *args ) + { + Contact* contact = NULL; + HTRY + // Usual signature then arguments parsing. + HCATCH + return PyContact_Link(contact); + } + + PyMethodDef PyContact_Methods[] = + { { "create" , (PyCFunction)PyContact_create , METH_VARARGS|METH_STATIC + , "Create a new Contact." } + , { "destroy" , (PyCFunction)PyContact_destroy , METH_NOARGS + , "Destroy associated hurricane object, the python object remains." } + , { "getWidth" , (PyCFunction)PyContact_getWidth , METH_NOARGS + , "Return the contact width." } + , { "getHeight", (PyCFunction)PyContact_getHeight, METH_NOARGS + , "Return the contact height." } + , {NULL, NULL, 0, NULL} /* sentinel */ + }; + + DBoDeleteMethod(Contact) + PyTypeObjectLinkPyType(Contact) + + #else // Python Module Code Part. + + DBoLinkCreateMethod(Contact) + PyTypeInheritedObjectDefinitions(Contact, Component) + + #endif // Shared Library Code Part. + + } // extern "C". + } // Isobar namespace. + + +4.8 Python Module +~~~~~~~~~~~~~~~~~~~ + +.. code:: c++ + + DL_EXPORT(void) initHurricane () + { + PyEntity_LinkPyType(); // step 1. + PyComponent_LinkPyType(); + PyContact_LinkPyType(); + + PYTYPE_READY( Entity ) // step 2. + PYTYPE_READY_SUB( Component, Entity ) + PYTYPE_READY_SUB( Contact , Component ) + + __cs.addType( "ent" , &PyTypeEntity , "" , false ); // step 3. + __cs.addType( "comp" , &PyTypeComponent, "", false, "ent" ); + __cs.addType( "contact", &PyTypeContact , "" , false, "comp" ); + + PyObject* module = Py_InitModule( "Hurricane", PyHurricane_Methods ); + if (module == NULL) { + cerr << "[ERROR]\n" + << " Failed to initialize Hurricane module." << endl; + return; + } + + Py_INCREF( &PyTypeContact ); // step 4. + PyModule_AddObject( module, "Contact", (PyObject*)&PyTypeContact ); // step 4. + } + + +5. Case 3 - Non-DBo Standalone Classe +======================================= + +Let's have a look at the encapsulation of ``Hurricane::Point``. + +Non-BDo derived classes do not support the bi-directionnal communication. +So each Python object is associated with one C++ object. The C++ object +is created and deleted along with the Python one. This behavior implies +that the C++ object is *copy constructible* (which should be the case). + + +5.1 Class Header +~~~~~~~~~~~~~~~~~~ + +Changes from `3.1 Class Associated Header File`_: + +* There is no ``PyPoint_Link()`` function, as it's related to the + bi-directional communication mechanism. + +.. note:: + **About the _object attribute** of the PyPoint. As the C++ object life span + (``Point``) is linked to the Python (``PyPoint``) one, we may have used a + value instead of a pointer. It is best to keep a pointer as the macros + written for ``DBo`` derived classes will remain usables. + + +.. code:: c++ + + #ifndef ISOBAR_PY_POINT_H + #define ISOBAR_PY_POINT_H + + #include "hurricane/isobar/PyHurricane.h" + #include "hurricane/Point.h" + + namespace Isobar { + extern "C" { + + typedef struct { + PyObject_HEAD + Hurricane::Point* _object; + } PyPoint; + + extern PyTypeObject PyTypePoint; + extern PyMethodDef PyPoint_Methods[]; + extern void PyPoint_LinkPyType(); + + #define IsPyPoint(v) ( (v)->ob_type == &PyTypePoint ) + #define PYPOINT(v) ( (PyPoint*)(v) ) + #define PYPOINT_O(v) ( PYPOINT(v)->_object ) + + } // extern "C". + } // Isobar namespace. + + #endif // ISOBAR_PY_POINT_H + +|newpage| + + +5.2 Class File +~~~~~~~~~~~~~~~~ + +Changes from `3.2 Class Associated File`_: + +* As there is no ``PyPoint_Link()`` function, there is no call to any + flavor of the ``DBoLinkcreatemethod()`` macro (obvious as it's *not* + a ``DBo``). + +* To use the standard Python constructor, we have to define ``PyPoint_NEW()`` + and ``PyPoint_Init()`` functions, I'm not absolutely certain that the later + needs to be defined (that part is still not clear to me from the Python doc). + +* As it's not a ``DBo`` there is no ``destroy()`` method, so no call to + ``DirectDestroyMethod()`` + +* Lastly, as this object has a ``PyPoint_NEW()`` (field ``tp_new``) and + a ``PyPoint_Init()`` (field ``tp_init``) we have to use the macro + ``PyTypeObjectLinkPyTypeNewInit()`` to define ``PyPoint_LinkPyType()``. + + +.. code:: c++ + + #include "hurricane/isobar/PyPoint.h" + + namespace Isobar { + using namespace Hurricane; + + extern "C" { + + #define METHOD_HEAD(function) GENERIC_METHOD_HEAD(Point,point,function) + + #if defined(__PYTHON_MODULE__) + + static PyObject* PyPoint_NEW ( PyObject* module, PyObject *args ) + { + Point* point = NULL; + HTRY + PyObject* arg0 = NULL; + PyObject* arg1 = NULL; + + __cs.init( "Point.Point" ); + if (not PyArg_ParseTuple( args,"|O&O&:Point.Point" + , Converter,&arg0 + , Converter,&arg1 )) { + PyErr_SetString ( ConstructorError + , "invalid number of parameters for Point constructor." ); + return NULL; + } + + if (__cs.getObjectIds() == "") + { point = new Point()); } + else if (__cs.getObjectIds() == ":point") + { point = new Point( *PYPOINT_O(arg0) ); } + else if (__cs.getObjectIds() == ":int:int") + { point = new Point( PyAny_AsLong(arg0), PyAny_AsLong(arg1) ); } + else { + PyErr_SetString ( ConstructorError + , "invalid number of parameters for Point constructor." ); + return NULL; + } + + PyPoint* pyPoint = PyObject_NEW( PyPoint, &PyTypePoint ); + if (pyPoint == NULL) { delete point; return NULL; } + pyPoint->_object = point; + HCATCH + + return (PyObject*)pyPoint; + } + + static int PyPoint_Init ( PyPoint* self, PyObject* args, PyObject* kwargs ) + { return 0; } + + DirectGetLongAttribute(PyPoint_getX,getX,PyPoint,Point) + DirectGetLongAttribute(PyPoint_getY,getY,PyPoint,Point) + DirectSetLongAttribute(PyPoint_SetX,setX,PyPoint,Point) + DirectSetLongAttribute(PyPoint_SetY,setY,PyPoint,Point) + + PyMethodDef PyPoint_Methods[] = + { { "getX" , (PyCFunction)PyPoint_getX , METH_NOARGS + , "Return the Point X value." } + , { "getY" , (PyCFunction)PyPoint_getY , METH_NOARGS + , "Return the Point Y value." } + , { "setX" , (PyCFunction)PyPoint_SetX , METH_VARARGS + , "Modify the Point X value." } + , { "setY" , (PyCFunction)PyPoint_SetY , METH_VARARGS + , "Modify the Point Y value." } + , {NULL, NULL, 0, NULL} /* sentinel */ + }; + + DirectDeleteMethod(PyPoint_DeAlloc,PyPoint) + PyTypeObjectLinkPyTypeNewInit(Point) + + #else // Python Module Code Part. + + PyTypeObjectDefinitions(Point) + + #endif // Shared Library Code Part. + + } // extern "C". + } // Isobar namespace. + + +5.2 Class File +~~~~~~~~~~~~~~~~ + +To put it bluntly, there is no difference in the Python module for +a standalone ``DBo`` class and a non-``DBo`` class. + + +6. Encapsulating DbU +====================== + +While ``Hurricane::DbU`` is a class, the ``Hurricane::DbU::Unit`` is only +a ``typedef`` over ``uint64_t``. The ``DbU`` class only provides a set of +static methods to manipulate and convert to and from other units. +At Python level, ``DbU::Unit`` will be stored in plain ``long long``. + +When a ``DbU::Unit`` argument is expected in a Python functions, just use +the ``DbU::Unit PyAny_AsLong( PyObject* )`` function to convert it. + +For example, if we explicit the expension of: + +.. code:: c++ + + DirectSetLongAttribute(PyPoint_SetX,setX,PyPoint,Point) + +|newpage| + +We would get: + +.. code:: c++ + + static PyObject* PyPoint_setX ( PyPoint *self, PyObject* args ) + { + Point* cobject = static_cast( self->_object ); + if (cobject == NULL) { + PyErr_SetString( ProxyError + , "Attempt to call Point.setX() on an unbound Hurricane object" ); + return NULL; + } + + HTRY + PyObject* arg0 = NULL; + if (not PyArg_ParseTuple( args, "O:Point.setX()", &arg0 )) + return ( NULL ); + cobject->setX( Isobar::PyAny_AsLong(arg0) ); + HCATCH + Py_RETURN_NONE; + } + + +For the other way around, use ``PyObject* PyDbU_FromLong( DbU::Unit )``. + +.. code:: c++ + + DirectGetLongAttribute(PyPoint_GetX,getX,PyPoint,Point) + +We would get: + +.. code:: c++ + + static PyObject* PyPoint_GetX ( PyPoint *self, PyObject* args ) + { + Point* cobject = static_cast( self->_object ); + if (cobject == NULL) { + PyErr_SetString( ProxyError + , "Attempt to call Point.getX() on an unbound Hurricane object" ); + return NULL; + } + return Isobar::PyDbU_FromLong(cobject->getX()); + } + + +7. No C++ Hurricane::Name encapsulation +========================================== + +To be written. diff --git a/documentation/etc/CMakeLists.txt b/documentation/etc/CMakeLists.txt new file mode 100644 index 00000000..ed7a27a8 --- /dev/null +++ b/documentation/etc/CMakeLists.txt @@ -0,0 +1,8 @@ + + set ( htmlInstallDir share/doc/coriolis2/en/html/etc ) + + install ( FILES Pygments.css SoC.css SoC-ReST.css + DESTINATION ${htmlInstallDir} ) + install ( DIRECTORY images/ + DESTINATION ${htmlInstallDir}/images + FILES_MATCHING PATTERN "*.png" ) diff --git a/documentation/etc/Pygments.css b/documentation/etc/Pygments.css new file mode 100644 index 00000000..de3dc8fe --- /dev/null +++ b/documentation/etc/Pygments.css @@ -0,0 +1,41 @@ +div.codeblock { font-size: 90%; + margin: 10pt; + padding: 5pt; + border: dashed; + border-width: thin; + background-color: #ffffcc; + border-color: #fc8676; + } +.codeblock * .hll { background-color: #ffffcc } +.codeblock * .c { color: #008000 } /* Comment */ +.codeblock * .err { border: 1px solid #FF0000 } /* Error */ +.codeblock * .k { color: #0000ff } /* Keyword */ +.codeblock * .cm { color: #008000 } /* Comment.Multiline */ +.codeblock * .cp { color: #0000ff } /* Comment.Preproc */ +.codeblock * .c1 { color: #008000 } /* Comment.Single */ +.codeblock * .cs { color: #008000 } /* Comment.Special */ +.codeblock * .ge { font-style: italic } /* Generic.Emph */ +.codeblock * .gh { font-weight: bold } /* Generic.Heading */ +.codeblock * .gp { font-weight: bold } /* Generic.Prompt */ +.codeblock * .gs { font-weight: bold } /* Generic.Strong */ +.codeblock * .gu { font-weight: bold } /* Generic.Subheading */ +.codeblock * .kc { color: #0000ff } /* Keyword.Constant */ +.codeblock * .kd { color: #0000ff } /* Keyword.Declaration */ +.codeblock * .kn { color: #0000ff } /* Keyword.Namespace */ +.codeblock * .kp { color: #0000ff } /* Keyword.Pseudo */ +.codeblock * .kr { color: #0000ff } /* Keyword.Reserved */ +.codeblock * .kt { color: #2b91af } /* Keyword.Type */ +.codeblock * .s { color: #a31515 } /* Literal.String */ +.codeblock * .nc { color: #2b91af } /* Name.Class */ +.codeblock * .ow { color: #0000ff } /* Operator.Word */ +.codeblock * .sb { color: #a31515 } /* Literal.String.Backtick */ +.codeblock * .sc { color: #a31515 } /* Literal.String.Char */ +.codeblock * .sd { color: #a31515 } /* Literal.String.Doc */ +.codeblock * .s2 { color: #a31515 } /* Literal.String.Double */ +.codeblock * .se { color: #a31515 } /* Literal.String.Escape */ +.codeblock * .sh { color: #a31515 } /* Literal.String.Heredoc */ +.codeblock * .si { color: #a31515 } /* Literal.String.Interpol */ +.codeblock * .sx { color: #a31515 } /* Literal.String.Other */ +.codeblock * .sr { color: #a31515 } /* Literal.String.Regex */ +.codeblock * .s1 { color: #a31515 } /* Literal.String.Single */ +.codeblock * .ss { color: #a31515 } /* Literal.String.Symbol */ diff --git a/documentation/etc/SoC-ReST.css b/documentation/etc/SoC-ReST.css new file mode 100644 index 00000000..eb5b2304 --- /dev/null +++ b/documentation/etc/SoC-ReST.css @@ -0,0 +1,493 @@ +/* -*- Mode: css -*- */ + +.sc { + font-variant: small-caps; + font-size: 120%; +} + +span.red { + color: red; +} + +span.italic, span.comment, span.name { + font-style: italic; +} + +span.keyword, span.name { + font-weight: bold; +} + +span.title { + font-family: "URW Bookman L", serif; + font-weight: bold; + font-size: 120%; + text-align: center; + display: block; +} + +span.header2 { + font-size: 140%; + font-weight: bold; +} + +hr { + color: #09550b; + border: 1px dotted #09550b; + border-style: none none dotted; + padding-top: 10pt; + padding-bottom: 10pt; +} + +h2, h3 { + text-align: left; +} + +div.contents, div.subcontents { + margin: 30pt; + padding: 0pt 10pt; + border-left: 6px solid black; + +/* Shadow explanation: + * The shadow is a rectangle the same size as the box. It is then shifted + * blurred according to the following parameters. + * + * 1. The horizontal offset of the shadow, positive means the shadow will be + * on the right of the box, a negative offset will put the shadow on the + * left of the box. + * 2. The vertical offset of the shadow, a negative one means the box-shadow + * will be above the box, a positive one means the shadow will be below + * the box. + * 3. The blur radius (optional), if set to 0 the shadow will be sharp, + * the higher the number, the more blurred it will be. + * 4. The spread radius (optional), positive values increase the size of the + * shadow, negative values decrease the size. Default is 0 (the shadow is + * same size as blur). + * 5. Color + + background-color: #ffdd66; + -moz-box-shadow: 4px 4px 5px 2px #ccc; + -webkit-box-shadow: 4px 4px 5px 2px #ccc; + box-shadow: 4px 4px 5px 2px #ccc; + + */ +} + +div.contents p.first { + font-size: 160%; + font-weight: bold; +} + + +div#centered { + margin-left: auto; + margin-right: auto; + text-align: center; +} + +pre, tt, code { + font-family: "courrier", "andale mono", monospace; + font-size: 100%; + white-space: pre; +} + +tt { + color: #09550b; +} + +pre.wiki, pre code, div.code, pre.literal-block { + font-size: 90%; + padding: 5pt; + margin-left: 4%; + margin-right: 4%; +/* + border: dashed; + border-width: thin; + border-color: #FC8676; + */ + background-color: #FCFCE1; + +} + +a:link, a:active { + font-weight: normal; + text-decoration: none; + color: black; + border-bottom: 1px solid black; +/* + border-bottom: 1px dotted #09550b; + border-bottom: 1px dotted #09550b; + */ +} + +a:hover, +a:focus, +a:visited +{ + font-weight: normal; + text-decoration: none; + color: black; + border-bottom: 2px solid black; +/* + font-style: italic; + color: #A40010; + border-bottom: 1px dotted #A40010; + color: #09550b; + border-bottom: 1px dotted #09550b; + */ +} + +a.toc-backref { + font-family: "URW Bookman L", serif; + font-size: 100%; + font-weight: bold; +} + +a.toc-backref:link, +a.toc-backref:active, +a.toc-backref:hover, +a.toc-backref:focus, +a.toc-backref:visited +{ + border-bottom: 0px; + text-align: left; +} + +p.credit { + margin-left: 10%; + margin-right: 10%; + font-size: 110%; +} + +p.credit span.left { + float: left; + white-space: nowrap; +} + +p.credit span.right { + float: right; + white-space: nowrap; +} + +img.addborder { + border: 1px solid black; +} + +img.align-center { + display: block; +/* + clear: both; + */ + margin-left: auto; + margin-right: auto; + width: 99%; + text-align: center; +} + +img.align-top { + float: left; + padding: 0pt 20pt 20pt 0pt; + text-align: center; +} + +img.align-bottom { + float: right; + padding: 0pt 20pt 20pt 0pt; + text-align: center; +} + +div.code * { + background-color: #FCFCE1; +} + +div.note { + margin: 8px 2% 0px 2%; + border: 1px none #ffbb44; + border-left-width: 4px; + border-left-style: solid; + padding: 1px 10pt 1px 55px; +/*background: #fff676 url('/dsk/l1/jpc/pictures/ReST/clipboard.png') no-repeat 0% 50%;;*/ + background: #ffdd66 url('../etc/images/clipboard.png') no-repeat 0% 50%;; + font-size: 90% +} + +div.error { + margin: 8px 2% 0px 2%; + border: 1px none #dd0000; + border-left-width: 4px; + border-left-style: solid; + padding: 1px 10pt 1px 55px; + background: #ffddcc url('../etc/images/i-core.png') no-repeat 0% 50%;; + font-size: 90% +} + +p.admonition-title { + font-weight: bold; +} + +div.problematic { + margin: 5pt; + padding: 1pt 10pt; + background-color: #ffdd66; +} + +div.problematic p.first { + font-size: 160%; + font-weight: bold; +} + +div.problematic ul, div.contents ul, div.subcontents ul { + padding-left: 15pt; +} + +div.backlink { + text-align: center; +} + +div.backlink a { + font-size: 120%; + font-weight: bold; + text-align: center; + padding: 4pt; + border: 2px solid black; +} + +div.publications ul li { + margin-bottom: 10pt; +} + +div.publications a { + font-weight: bold; +} + +div.tools { + display: flex; + flex-direction: row; + flex-wrap: wrap; + justify-content: center; + align-content: space-around; +} + +div.toolblock { + -moz-box-shadow: 4px 4px 5px 2px #ccc; + -webkit-box-shadow: 4px 4px 5px 2px #ccc; + box-shadow: 4px 4px 5px 2px #ccc; + padding: 5pt; + margin: 10pt; + flex: none; + text-align: center; + font-size: 120%; + font-weight: bold; +} + +div.toolblock a { + font-family: "URW Bookman L", serif; + font-size: 200%; + border-bottom: none; +} + +div.two-columns { + display: flex; + flex-direction: row; + flex-wrap: wrap; + justify-content: center; + align-content: space-around; +} + +div.two-columns ul { + padding-left: 10pt; +} + +div[class^="reliefblock"] { + -moz-box-shadow: 4px 4px 5px 2px #ccc; + -webkit-box-shadow: 4px 4px 5px 2px #ccc; + box-shadow: 4px 4px 5px 2px #ccc; + -moz-border-radius: 5px; + border-radius: 10px; + width: 30%; + padding: 5pt; + margin: 10pt; + flex: none; +} + +div[class^="reliefblock"] a { + font-family: "URW Bookman L", serif; + font-weight: bold; + font-size: 120%; + text-align: center; + display: block; + border-bottom: none; +} + +div.reliefblock-green { background-color: #a3c090; } +div.reliefblock-blue { background-color: #b2ccdd; } +div.reliefblock-yellow { background-color: #F0e5b4; } +div.reliefblock-orange { background-color: #f1d1b5; } + +div.line-block { + font-family: "courrier", "andale mono", monospace; + font-size: 100%; +/*white-space: pre;*/ +} + +table.wiki th, table th { + color: black; + background: #FFFFCC; +} + +table.docutils { + margin-left: 5%; + margin-right: 5%; +} + +table.wiki, table.wiki th, table.wiki td { border: 1px solid black; } +table.wiki th * p { text-align: center; } +table.wiki * p { margin: 0pt; } +table.wiki * blockquote { margin: 0pt; } +table { border-collapse: collapse; } +table th, table td { border: 1px solid black; + padding: 2px 10px 2px 10px; } + +table.docinfo { + margin-top: 10pt; + margin-left: auto; + margin-right: 0pt; + border: 10px solid #303030; + border-collapse: collapse; + background: #303030; + font-size: 90%; + font-family: sans-serif; +} + +table.docinfo tr { + border-bottom: 1px dotted white; +} + +th.docinfo-name, +table.docinfo td, +table.docinfo td a:link, +table.docinfo td a:active, +table.docinfo td a:visited, +table.docinfo td a:focus, +table.docinfo td a:hover +{ + border: 0px solid white; + background: #303030; + color: white; + text-align: left; + font-weight: bold; +} + +th.docinfo-name { + font-weight: normal; +} + +table.docinfo td { + font-weight: bold; +} + +span.ul { + text-decoration: underline; +} + +* span.smallcaps { +/*font-variant: "small-caps";*/ + text-transform: "uppercase"; + font-size: "smaller"; +} + + +span.cb { + font-family: "andale mono", monospace; + font-weight: bold; + white-space: pre; +} + +span.fboxtt { + border: 1px solid black; + padding: 0px 4px; + font-family: "andale mono", monospace; + font-weight: bold; + white-space: pre; +} + +#notice.system-message, .notice.system-message { + color: black; + background: #DDFFDD; + padding-top: 5pt; + padding-bottom: 5pt; + border: 1px none #55BB55; + border-top-width: 4px; + border-top-style: solid; +} + +#content.error .message, div.system-message { + color: #550000; + background: #ffddcc; + border: 2px none #dd0000; + border-top-width: 4px; + border-top-style: solid; + padding: .5em; + margin: 1em 0; +} + +#main { + float: right; + width: 70%; + padding: 0pt; + margin: 0pt; + min-height: 700px; + background: white; +} + +div#main h1 { + border-bottom: 2px solid #09550b; +} + +div#main div.section h1 { + border-bottom: none; +} + +#cmscontent { + padding: 0pt 4% 10pt 4%; + margin: 0pt; +} + +div#htmlerrorcontents { + padding: 10pt 4% 10pt 4%; + margin: 0pt; +} + +div#htmlerrorcontents span.cs { + font-size: 80%; + font-family: "andale mono", monospace; + white-space: pre; +} + +div#htmlerrorcontents hr.lang_separator { + border: 1px dotted black; + border-style: none none dotted; + margin-top: 20pt; + margin-bottom: 10pt; +} + +#embedcontent { + border: 0pt; + padding: 0pt; + margin: 0pt; +} + +table.citation, table.footnote { + border: none; + padding-left: 5pt; + margin-left: 5pt; + margin-bottom: 5pt; + background-color: #eeeeee; +} + +table.citation th, table.citation td, table.footnote th, table.footnote td { + border: none; +} + +table.citation td.label, table.footnote td.label { + width: 50pt; +} diff --git a/documentation/etc/SoC-ReST.tex b/documentation/etc/SoC-ReST.tex new file mode 100644 index 00000000..bd8ea443 --- /dev/null +++ b/documentation/etc/SoC-ReST.tex @@ -0,0 +1,119 @@ + + \usepackage[default,osfigures,scale=0.95]{opensans} + \usepackage{pifont} + \usepackage{array} + \usepackage{xspace} + \usepackage{fancyhdr} + \usepackage{float} + \usepackage{graphicx} + \usepackage{color} + \usepackage{bmpsize} + \usepackage{enumitem} + \usepackage{eurosym} + \usepackage[sf,bf]{titlesec} + \usepackage{titletoc} + \usepackage[colorlinks=true,linkcolor=red,urlcolor=red]{hyperref} + \usepackage[paper=a4paper,headheight=30pt,tmargin=1.5in,bmargin=1in]{geometry} +%\usepackage{layouts} + + \definecolor{brickred} {rgb}{0.8 , 0.25, 0.33} + \definecolor{brightmaroon}{rgb}{0.76, 0.13, 0.28} + \definecolor{bleudefrance}{rgb}{0.19, 0.55, 0.91} + \definecolor{babyblue} {rgb}{0.54, 0.81, 0.94} + \definecolor{babyblueeyes}{rgb}{0.63, 0.79, 0.95} + \definecolor{azure} {rgb}{0.0 , 0.5 , 1.0 } + + \urlstyle{tt} % normal text font (alternatives: same, tt, rm, sf) + \renewlist{itemize}{itemize}{9} + \setlist[itemize]{label=\textbullet} + +%\graphicspath{ {/dsk/l1/jpc/cms/slsoc/www-soc/admin/images/ReST/} } + +% The LaTeX Companion -- p. 204. +% Miniature display of the page layout. +%\newcommand{\showpage}{% +% \setlayoutscale{0.65}\setlabelfont{\tiny}% +% \printheadingsfalse\printparametersfalse% +% \currentpage\pagedesign% +%} + + \titlecontents{section}[0pc] + {\sffamily\bfseries} % above code. + {\contentslabel{1pc}} % numbered entry format. + {} % numberless entry format. + {\titlerule*[8pt]{.}\textsc{\textbf{{\contentspage}}}} % page format. + \titlecontents{subsection}[0pc] + {\sffamily} % above code. + {\contentslabel{2pc}} % numbered entry format. + {} % numberless entry format. + {\titlerule*[8pt]{.}\textsc{\textbf{{\contentspage}}}} % page format. + \titlecontents{subsubsection}[1pc] + {\sffamily} % above code. + {\contentslabel{2pc}} % numbered entry format. + {} % numberless entry format. + {\titlerule*[8pt]{.}\textsc{\textbf{{\contentspage}}}} % page format. + + \titleformat{\title} + {\color{bleudefrance}\bfseries\large} + {\color{bleudefrance}\thesection} + {1em} + {} + \titleformat{\section} + {\color{brightmaroon}\bfseries\large} + {\color{brightmaroon}\thesection} + {1em} + {} + + \newcommand{\DUroleul}[1]{\underline{#1}\xspace} + \newcommand{\DUrolesc}[1]{\textsc{#1}\xspace} + \newcommand{\DUrolecb}[1]{\textbf{\texttt{#1}}\xspace} + \newcommand{\DUrolefboxtt}[1]{\fbox{\texttt{#1}}\xspace} + \newcommand{\DUrolekeyword}[1]{\textbf{#1}} + \newcommand{\DUrolename}[1]{\textit{\textbf{#1}}} + \newcommand{\DUrolecomment}[1]{\textit{#1}} + + \newcommand{\DUtitlenote}[1]{\noindent\textbf{#1}\smallskip} + + \newcommand{\DUadmonitionnote}[1]{% + \begin{center} + \sffamily + \begin{array}[t]{m{1cm}!{\vrule width 1pt}m{.90\textwidth}} + \raisebox{0.0cm}{\includegraphics[scale=0.5]{clipboard.png}} & + \begin{minipage}[t]{.85\textwidth} \small #1 + \end{minipage} \\ + \end{array} + \end{center} + } + + \newcommand{\DUtitleerror}[1]{\noindent\textbf{\color{red}#1}\smallskip} + + \newcommand{\DUadmonitionerror}[1]{% + \begin{center} + \sffamily + \begin{array}[t]{m{1cm}!{\vrule width 1pt}m{.90\textwidth}} + \raisebox{0.0cm}{\includegraphics[scale=0.5]{i-core.png}} & + \begin{minipage}[t]{.85\textwidth} #1 + \end{minipage} \\ + \end{array} + \end{center} + } + + \newcommand{\LIP} {\textsc{lip6}\xspace} + \newcommand{\SoC} {\textsc{S}o\textsc{C}\xspace} + + \renewcommand{\headrulewidth}{0.2mm} + \renewcommand{\footrulewidth}{0.2mm} + \renewcommand{\sectionmark}[1]{\markboth{\thesection\ #1}{\thesection\ #1}} + \renewcommand{\subsectionmark}[1]{} + \lhead[]{Coriolis Documentation} + \rhead[]{\today} + \lfoot[]{\LIP/\SoC \href{https://www-soc.lip6.fr/}{www-soc.lip6.fr}} + \rfoot[]{\thepage} + \cfoot[]{} + + \pagestyle{fancy} + + \IfFileExists{./\jobname.ReST.tex} + {\typeout{Found ReST customization} + \input{./\jobname.ReST.tex}} + {\typeout{No ReST customization found (\jobname.ReST.tex)}} diff --git a/documentation/etc/SoC.css b/documentation/etc/SoC.css new file mode 100644 index 00000000..345b5f44 --- /dev/null +++ b/documentation/etc/SoC.css @@ -0,0 +1,536 @@ +/* -*- Mode: css -*- */ + + +/*@media (max-resolution: 150dpi) {*/ + body { font-size: 9pt; } + p#lip6 { font-size: 14pt; } + p#soc { font-size: 28pt; } +/* +} + +@media (min-resolution: 151dpi) { + body { font-size: 11pt; } + p#lip6 { font-size: 18pt; } + p#soc { font-size: 40pt; } +} +*/ + + +body { + font-family: "Open Sans", verdana, sans-serif; + margin-left: auto; + margin-right: auto; + margin-top: 20pt; + margin-bottom: 20pt; + padding-top: 0pt; + padding-bottom: 0pt; + padding-left: 30pt; + padding-right: 30pt; + width: 580pt; + background-color: #f5f5f5; +/*background: #f5f5f5 url('../images/flowers-abstract-grey.png') repeat;*/ +/*background: #f5f5f5 url('../images/layout-motif-faded-2.png') repeat;*/ + background-size: 20%; + -moz-box-shadow: 0px 0px 5px 5px #ccc; + -webkit-box-shadow: 0px 0px 5px 5px #ccc; + box-shadow: 0px 0px 5px 5px #ccc; +} + +ul { + list-style-type: square; +} + +ul ul { + list-style-type: disc; +} + +ul ul ul { + list-style-type: circle; +} + +h1 { + font-family: "URW Bookman L", serif; + font-weight: bold; + font-size: 150%; + text-align: center; +/*font-family: "adelle", Georgia, "Times New Roman", serif;*/ +} + +h1.title { + text-align: center; + font-size: 140%; +} + +div#header { + background: url(../images/UPMC-Jussieu-faded.png) #c0d1f3; + padding: 10px 0px 0px 10px; + margin: 0px; + height: 90px; + width: 843pt; + position: fixed; + z-index: 1; +} + +div#header img { + height: 80px; +} + +div#header div#logos { + float: left; + width: 210pt; + padding: 0px; + margin: 0px; +} + +div#header div#title { + padding: 0px; + margin: 0px; +} + +p#lip6 { + font-weight: bold; + color: white; + margin: 0px; + padding: 0px; +} + +p#soc { + font-weight: bold; + color: white; + margin: 0px; + padding: 0px; +} + +div#logos a { + text-decoration: none; + border-bottom: none; + outline: 0; +} + +#sidebar { + background: #c0d1f3; +/* + float: left; + */ + position: fixed; + z-index: 1; + top: 100px; + width: 220pt; + padding: 5pt 0pt 0pt 0pt; + margin: 0pt; +} + +div.iconrow { + padding: 0pt 10pt; +} + +div.iconrow a { + padding: 0pt; + outline: 0; +} + +div.iconrow a:link, +div.iconrow a:active, +div.iconrow a:visited, +div.iconrow a:focus { + border-bottom: none; + vertical-align: bottom, +} + +div.iconrow a:hover { + border-bottom: 4px solid black; +} + +div#langmenu a { + padding: 0pt; + outline: 0; +} + +div#langmenu a:link, +div#langmenu a:active, +div#langmenu a:visited, +div#langmenu a:focus { + border-bottom: none; + vertical-align: bottom, +} + +div#langmenu a:hover { + border-bottom: 4px solid black; +} + +div#pagemenu { + width: 100%; + margin: 0pt; + padding: 2pt 0pt; +} + +div#pagemenu ul { + list-style-type: none; + padding-left: 10pt; + padding-right: 10pt; +} + +div#pagemenu ul li { + border-bottom: 2px dotted black; + padding-left: 0pt; + padding-right: 0pt; +} + +div#pagemenu ul li:first-child { + border-top: 2px dotted black; +} + +/* + * div#pagemenu ul li.depth-2 { + * border-bottom: none; + * padding-left: 10pt; + * } + */ + +div#pagemenu ul li.depth-0 a, +div#pagemenu ul li.active-0 a +{ + display: block; + color: black; + font-family: "URW Bookman L", serif; + font-size: 120%; + font-weight: bold; + border-bottom: none; + padding-left: 0pt; + padding-right: 0pt; + outline: 0; +} + +div#pagemenu ul li.depth-0 a:focus, +div#pagemenu ul li.depth-0 a:hover, +div#pagemenu ul li.depth-0 a:active, +div#pagemenu ul li.active-0 a:focus, +div#pagemenu ul li.active-0 a:hover, +div#pagemenu ul li.active-0 a:active +{ +/*background-color: white;*/ + font-family: "URW Bookman L", serif; + font-size: 160%; + font-style: normal; + padding-top: 5px; + padding-bottom: 5px; + padding-left: 10pt; + border-left: 6px solid black; + margin-left: -10pt; + margin-right: -10pt; +} + +div#pagemenu ul li.depth-1 a, +div#pagemenu ul li.active-1 a +{ + display: block; + color: black; + font-size: 100%; + font-weight: normal; + font-family: "URW Bookman L", serif; + border-bottom: none; + padding-left: 10pt; + margin-left: -10pt; + margin-right: -10pt; + outline: 0; +} + +div#pagemenu ul li.depth-1 a:focus, +div#pagemenu ul li.depth-1 a:hover, +div#pagemenu ul li.active-1 a:focus, +div#pagemenu ul li.active-1 a:hover +{ +/*background-color: white;*/ + font-family: "URW Bookman L", serif; + font-size: 120%; + font-style: normal; + font-weight: bold; + border-left: 6px solid black; + padding-top: 5px; + padding-bottom: 5px; +} + +div#pagemenu ul li.depth-2 a, +div#pagemenu ul li.active-2 a +{ + display: block; + color: black; + font-family: "URW Bookman L", serif; + font-size: 100%; + font-weight: normal; + border-bottom: none; + padding-left: 20pt; + margin-left: -10pt; + margin-right: -10pt; + outline: 0; +} + +div#pagemenu ul li.depth-2 a:focus, +div#pagemenu ul li.depth-2 a:hover, +div#pagemenu ul li.active-2 a:focus, +div#pagemenu ul li.active-2 a:hover +{ + font-family: "URW Bookman L", serif; + font-size: 120%; + font-style: normal; + font-weight: bold; + border-left: 6px solid black; + padding-top: 5px; + padding-bottom: 5px; +/*background-color: white;*/ +} + +div#main_page { + padding: 0pt; + margin-left: 220pt; + width: 630pt; +/* + *-moz-box-shadow: 4px 4px 5px 2px #ccc; + *-webkit-box-shadow: 4px 4px 5px 2px #ccc; + *box-shadow: 4px 4px 5px 2px #ccc; + */ +} + +div#topbar { + position: fixed; + z-index: 1; + top: 100px; + margin-left: 220pt; + background-color: #c0d1f3; + padding-top: 5pt; + height: 20pt; + width: 630pt; +} + +div#langmenu { + float: right; + vertical-align: bottom; +} + +div#breadcrumb { + margin: 0pt; + padding-left: 0pt; + background-color: #c0d1f3; +} + +div#breadcrumb a:link, +div#breadcrumb a:active, +div#breadcrumb a:visited, +div#breadcrumb a:focus { + color: black; + font-weight: bold; + border-bottom: none; + vertical-align: bottom, +} + +div#breadcrumb a:hover { + color: black; + font-weight: bold; + font-style: italic; + border-bottom: none; +} + +/* +div.contents li a:before { + display: block; + content: " "; + margin-top: -400px; + height: 400px; + visibility: hidden; +} +*/ + +div.section:before { + display: block; + content: " "; + margin-top: -120px; + height: 120px; + visibility: hidden; +} + +div#main_content { + padding: 10pt; + top: 120px; + position: relative; +/* + border-left: 1px solid #c0d1f3; + border-right: 1px solid #c0d1f3; + */ + min-height: 350pt; + text-align: justify; + background-color: white; +} + +div#column0 { + padding: 0pt; +/*border: 1px solid black;*/ + display: inline-block; +/*float: left;*/ + width: 305pt; + vertical-align: top; +} + +div#column1 { + padding: 0pt; +/*border: 1px solid black;*/ + display: inline-block; +/*float: right;*/ + width: 295pt; + vertical-align: top; +} + +div#column0 h1, div#column1 h1 { +/*font-family: "adelle", Georgia, "Times New Roman", serif;*/ + font-family: "URW Bookman L", serif; + font-weight: bold; + font-size: 120%; + text-align: center; +} + +div#column0 h2, div#column1 h2 { + font-size: 110%; +} + +div#column0 div { +/* + -moz-box-shadow: 4px 4px 5px 2px #ccc; + -webkit-box-shadow: 4px 4px 5px 2px #ccc; + box-shadow: 4px 4px 5px 2px #ccc; + background-color: #e6ccb8; + */ + padding: 0pt; + margin-bottom: 5pt; + margin-right: 10pt; +} + +div#column1 div { +/* + -moz-box-shadow: 4px 4px 5px 2px #ccc; + -webkit-box-shadow: 4px 4px 5px 2px #ccc; + box-shadow: 4px 4px 5px 2px #ccc; + background-color: #e6ccb8; + */ + padding: 0pt; + margin-bottom: 5pt; +} + +ul.ce-menu { + -moz-box-shadow: 4px 4px 5px 2px #ccc; + -webkit-box-shadow: 4px 4px 5px 2px #ccc; + box-shadow: 4px 4px 5px 2px #ccc; + padding-left: 16pt; + background-color: #e6ccb8; +} +} + +div.csc-default { + padding: 0pt; + margin: 0pt; +} + +/* +ul.ce-menu-1 { + padding-left: 8pt; +} + +ul.ce-menu-1 li { + padding-left: 0pt; +} +*/ + + +div#footer { + top: 120px; + position: relative; +/* + bottom: 0pt; + margin-left: 220pt; + width: 620pt; + */ + padding: 5pt; + color: white; + background-color: #242729; + font-size: 90%; + font-weight: bold; +} + + +table.footer1, table.footer2 { width: 100%; border: 0px; } +td.LFooter { text-align: left; border: 0px; } +td.RFooter { text-align: right; border: 0px; } +td.CFooter { text-align: center;} +table.footer2 td.RFooter { font-weight: bold; width: 35%; border: 0px; } +table.footer2 td.CFooter { width: 30%; border: 0px; } +table.footer2 td.LFooter { font-weight: bold; width: 35%; border: 0px; } + +div.tx-felogin-pi1 { + border: 0px; + padding: 10pt; + moz-box-shadow: 4px 4px 5px 2px #ccc; + webkit-box-shadow: 4px 4px 5px 2px #ccc; + box-shadow: 4px 4px 5px 2px #ccc; + font-size: 100%; + display: block; + text-align: center; + width: 50%; + margin: 5% 25% 5% 25%; +} + +div.tx-felogin-pi1 fieldset { + border: none; +} + +div.tx-felogin-pi1 h3 { + font-family: "URW Bookman L", serif; + font-size: 200%; + text-align: center; +} + +div.tx-felogin-pi1 > form > fieldset > div { + font-family: "courrier", "andale mono", monospace; + font-weight: bold; + font-size: 110%; + padding-bottom: 5pt; +} + +div.tx-felogin-pi1 > form > fieldset > div > label { + font-family: "Open Sans", verdana, sans-serif; + font-weight: normal; + font-size: 100%; +} + +.tx-felogin-pi1 table.form { + border-collapse: collapse; + border: 1px solid black; + font-size: 110%; + margin: 10pt; +} + +.tx-felogin-pi1 table.form th,.tx-felogin-pi1 table.form td { + padding: 2pt; +} + +.tx-felogin-pi1 table.form th { + color: white; + background-color: black; + width: 70pt; + font-weight: bold; +} + +.tx-felogin-pi1 table.form td { +} + +.tx-felogin-pi1 table.form input { + width: 200pt; + border-style: none; +} + +.tx-felogin-pi1 input#Login, .tx-felogin-pi1 input#Logout { + border-style: none; + color: white; + background-color: black; + padding: 4pt 10pt; + font-family: "URW Bookman L", serif; + font-size: 120%; + font-weight: bold; +} diff --git a/documentation/etc/definitions.rst b/documentation/etc/definitions.rst new file mode 100644 index 00000000..e303a4c3 --- /dev/null +++ b/documentation/etc/definitions.rst @@ -0,0 +1,176 @@ +.. -*- Mode: rst -*- + + +.. role:: raw-html(raw) + :format: html + +.. role:: raw-latex(raw) + :format: latex + +.. role:: ul +.. role:: cb +.. role:: sc +.. role:: fboxtt + +.. HTML/LaTeX backends mixed macros. +.. |br| replace:: :raw-latex:`\linebreak` :raw-html:`
    ` +.. |medskip| replace:: :raw-latex:`\medskip` :raw-html:`
    ` +.. |newpage| replace:: :raw-latex:`\newpage` +.. |linebreak| replace:: :raw-latex:`\smallskip` +.. |noindent| replace:: :raw-latex:`\noindent` :raw-html:`

    ` +.. |dotfill| replace:: :raw-html:`  ` + + +.. Acronyms & names. +.. |GNU| replace:: :sc:`gnu` +.. |LGPL| replace:: :sc:`lgpl` +.. |GPL| replace:: :sc:`gpl` +.. |UPMC| replace:: :sc:`upmc` +.. |Bull| replace:: :sc:`Bull` +.. |Cadence| replace:: :sc:`Cadence` +.. |Si2| replace:: :sc:`Si2` +.. |LEFDEF| replace:: :sc:`lefdef` +.. |Flute| replace:: :sc:`Flute` +.. |MacOS| replace:: :sc:`MacOS` +.. |RHEL6| replace:: :sc:`rhel6` +.. |RHEL7| replace:: :sc:`rhel7` +.. |SL6| replace:: :sc:`Scientific Linux 6` +.. |SL7| replace:: :sc:`Scientific Linux 7` +.. |Scientific Linux| replace:: :sc:`Scientific Linux` +.. |RedHat| replace:: :sc:`RedHat` +.. |Fedora| replace:: :sc:`Fedora` +.. |FC13| replace:: :sc:`fc13` +.. |Debian| replace:: :sc:`Debian` +.. |Ubuntu| replace:: :sc:`Ubuntu` + +.. |Alexandre| replace:: :sc:`Alexandre` +.. |Belloeil| replace:: :sc:`Belloeil` +.. |Chaput| replace:: :sc:`Chaput` +.. |Chu| replace:: :sc:`Chu` +.. |Clement| replace:: :sc:`Clement` +.. |Dupuis| replace:: :sc:`Dupuis` +.. |Escassut| replace:: :sc:`Escassut` +.. |Gouvine| replace:: :sc:`Gouvine` +.. |Masson| replace:: :sc:`Masson` +.. |Sroka| replace:: :sc:`Sroka` +.. |Yifei| replace:: :sc:`Yifei` + +.. |ANSI| replace:: :sc:`ansi` +.. |MIPS| replace:: :sc:`mips` +.. |Am2901| replace:: :sc:`Am2901` +.. |Hurricane| replace:: :sc:`Hurricane` +.. |HurricaneAMS| replace:: :sc:`HurricaneAMS` +.. |Alliance| replace:: :sc:`Alliance` +.. |Yosys| replace:: :sc:`Yosys` +.. |GenLib| replace:: :sc:`GenLib` +.. |Nero| replace:: :sc:`Nero` +.. |Druc| replace:: :cb:`Druc` +.. |Coloquinte| replace:: :sc:`Coloquinte` +.. |Coriolis| replace:: :sc:`Coriolis` +.. |Coriolis1| replace:: :sc:`Coriolis 1` +.. |Coriolis2| replace:: :sc:`Coriolis 2` +.. |VLSISAPD| replace:: :sc:`vlsisapd` +.. |CRLcore| replace:: :sc:`CRLcore` +.. |Cyclop| replace:: :sc:`Cyclop` +.. |Nimbus| replace:: :sc:`Nimbus` +.. |hMetis| replace:: :sc:`hMetis` +.. |Mauka| replace:: :sc:`Mauka` +.. |Etesian| replace:: :sc:`Etesian` +.. |Knik| replace:: :sc:`Knik` +.. |Katabatic| replace:: :sc:`Katabatic` +.. |Kite| replace:: :sc:`Kite` +.. |Stratus| replace:: :sc:`Stratus` +.. |Stratus1| replace:: :sc:`Stratus1` +.. |Stratus2| replace:: :sc:`Stratus2` +.. |Unicorn| replace:: :sc:`Unicorn` +.. |ccb| replace:: :cb:`ccb` +.. |cgt| replace:: :cb:`cgt` +.. |Chams| replace:: :sc:`Chams` +.. |OpenChams| replace:: :sc:`OpenChams` +.. |Pharos| replace:: :cb:`Pharos` +.. |API| replace:: :sc:`api` +.. |STL| replace:: :sc:`stl` +.. |XML| replace:: :sc:`xml` +.. |pdf| replace:: :sc:`pdf` +.. |UTF-8| replace:: :sc:`utf-8` +.. |Python| replace:: :sc:`Python` +.. |Linux| replace:: :sc:`Linux` +.. |MacPorts| replace:: :sc:`MacPorts` +.. |devtoolset2| replace:: :cb:`devtoolset2` +.. |boost| replace:: :cb:`boost` +.. |Qt| replace:: :sc:`qt` +.. |tty| replace:: :cb:`tty` +.. |svn| replace:: :cb:`svn` +.. |git| replace:: :cb:`git` +.. |rpm| replace:: :cb:`rpm` +.. |gdb| replace:: :cb:`gdb` +.. |cmake| replace:: :cb:`cmake` +.. |struct| replace:: :cb:`struct` + +.. |KeyUp| replace:: :fboxtt:`Up` +.. |KeyDown| replace:: :fboxtt:`Down` +.. |KeyLeft| replace:: :fboxtt:`Left` +.. |KeyRight| replace:: :fboxtt:`Right` +.. |KeyF| replace:: :fboxtt:`f` +.. |KeyL| replace:: :fboxtt:`l` +.. |KeyG| replace:: :fboxtt:`g` +.. |KeyZ| replace:: :fboxtt:`z` +.. |KeyM| replace:: :fboxtt:`m` +.. |KeyI| replace:: :fboxtt:`i` +.. |KeyK| replace:: :fboxtt:`k` +.. |KeyP| replace:: :fboxtt:`p` +.. |KeyO| replace:: :fboxtt:`o` +.. |KeyW| replace:: :fboxtt:`w` +.. |KeyQ| replace:: :fboxtt:`q` +.. |KeyCapK| replace:: :fboxtt:`K` +.. |KeyCapS| replace:: :fboxtt:`S` +.. |Plus| replace:: :fboxtt:`+` +.. |KeyESC| replace:: :fboxtt:`ESC` +.. |CTRL| replace:: :fboxtt:`CTRL` +.. |CTRL_L| replace:: :fboxtt:`CTRL+L` +.. |CTRL_I| replace:: :fboxtt:`CTRL+I` +.. |CTRL_P| replace:: :fboxtt:`CTRL+P` +.. |CTRL_O| replace:: :fboxtt:`CTRL+O` +.. |CTRL_W| replace:: :fboxtt:`CTRL+W` +.. |CTRL_Q| replace:: :fboxtt:`CTRL+Q` +.. |CTRL_Down| replace:: :fboxtt:`CTRL+Down` +.. |CTRL_Up| replace:: :fboxtt:`CTRL+Up` +.. |CTRL_Left| replace:: :fboxtt:`CTRL+Left` +.. |CTRL_Right| replace:: :fboxtt:`CTRL+Right` + +.. URLs +.. _FGR: http://vlsicad.eecs.umich.edu/BK/FGR/ +.. _Box Router: http://www.cerc.utexas.edu/~thyeros/boxrouter/boxrouter.htm +.. _hMETIS: http://glaros.dtc.umn.edu/gkhome/views/metis +.. _Knik Thesis: http://www-soc.lip6.fr/en/users/damiendupuis/PhD/ +.. _RapidJSON: http://miloyip.github.io/rapidjson/ +.. _Python/C API Reference Manual: https://docs.python.org/2/c-api/index.html + +.. Standard CAO/VLSI Concepts. +.. |netlist| replace:: *netlist* +.. |netlists| replace:: *netlists* +.. |layout| replace:: *layout* +.. |layouts| replace:: *layouts* +.. |CMOS| replace:: :sc:`cmos` +.. |VHDL| replace:: :sc:`vhdl` +.. |NWELL| replace:: :sc:`nwell` +.. |POWER| replace:: :sc:`power` +.. |GROUND| replace:: :sc:`ground` + +.. MBK Concepts +.. |MBK| replace:: :sc:`mbk` +.. |LOFIG| replace:: :cb:`Lofig` +.. |PHFIG| replace:: :cb:`Phfig` +.. |SxLib| replace:: :sc:`SxLib` + +.. Hurricane Concepts. +.. |hypernet| replace:: *hypernet* +.. |hypernets| replace:: *hypernets* +.. |Cell| replace:: *Cell* +.. |Rings| replace:: *Rings* +.. |QuadTrees| replace:: *QuadTrees* +.. |Collections| replace:: *Collections* +.. |ap| replace:: :cb:`ap` +.. |vst| replace:: :cb:`vst` +.. |kgr| replace:: :cb:`kgr` +.. |dot_conf| replace:: :cb:`.conf` diff --git a/documentation/etc/images/clipboard.bb b/documentation/etc/images/clipboard.bb new file mode 100644 index 00000000..3bd31e10 --- /dev/null +++ b/documentation/etc/images/clipboard.bb @@ -0,0 +1 @@ +%%BoundingBox: 0 0 48 48 diff --git a/documentation/etc/images/clipboard.eps b/documentation/etc/images/clipboard.eps new file mode 100644 index 00000000..95427f8d --- /dev/null +++ b/documentation/etc/images/clipboard.eps @@ -0,0 +1,456 @@ +%!PS-Adobe-3.0 EPSF-3.0 +%%Creator: (ImageMagick) +%%Title: (../images/clipboard.eps) +%%CreationDate: (2012-02-27T23:17:15+01:00) +%%BoundingBox: 0 0 48 48 +%%HiResBoundingBox: 0 0 48 48 +%%DocumentData: Clean7Bit +%%LanguageLevel: 1 +%%Pages: 1 +%%EndComments + +%%BeginDefaults +%%EndDefaults + +%%BeginProlog +% +% Display a color image. The image is displayed in color on +% Postscript viewers or printers that support color, otherwise +% it is displayed as grayscale. +% +/DirectClassPacket +{ + % + % Get a DirectClass packet. + % + % Parameters: + % red. + % green. + % blue. + % length: number of pixels minus one of this color (optional). + % + currentfile color_packet readhexstring pop pop + compression 0 eq + { + /number_pixels 3 def + } + { + currentfile byte readhexstring pop 0 get + /number_pixels exch 1 add 3 mul def + } ifelse + 0 3 number_pixels 1 sub + { + pixels exch color_packet putinterval + } for + pixels 0 number_pixels getinterval +} bind def + +/DirectClassImage +{ + % + % Display a DirectClass image. + % + systemdict /colorimage known + { + columns rows 8 + [ + columns 0 0 + rows neg 0 rows + ] + { DirectClassPacket } false 3 colorimage + } + { + % + % No colorimage operator; convert to grayscale. + % + columns rows 8 + [ + columns 0 0 + rows neg 0 rows + ] + { GrayDirectClassPacket } image + } ifelse +} bind def + +/GrayDirectClassPacket +{ + % + % Get a DirectClass packet; convert to grayscale. + % + % Parameters: + % red + % green + % blue + % length: number of pixels minus one of this color (optional). + % + currentfile color_packet readhexstring pop pop + color_packet 0 get 0.299 mul + color_packet 1 get 0.587 mul add + color_packet 2 get 0.114 mul add + cvi + /gray_packet exch def + compression 0 eq + { + /number_pixels 1 def + } + { + currentfile byte readhexstring pop 0 get + /number_pixels exch 1 add def + } ifelse + 0 1 number_pixels 1 sub + { + pixels exch gray_packet put + } for + pixels 0 number_pixels getinterval +} bind def + +/GrayPseudoClassPacket +{ + % + % Get a PseudoClass packet; convert to grayscale. + % + % Parameters: + % index: index into the colormap. + % length: number of pixels minus one of this color (optional). + % + currentfile byte readhexstring pop 0 get + /offset exch 3 mul def + /color_packet colormap offset 3 getinterval def + color_packet 0 get 0.299 mul + color_packet 1 get 0.587 mul add + color_packet 2 get 0.114 mul add + cvi + /gray_packet exch def + compression 0 eq + { + /number_pixels 1 def + } + { + currentfile byte readhexstring pop 0 get + /number_pixels exch 1 add def + } ifelse + 0 1 number_pixels 1 sub + { + pixels exch gray_packet put + } for + pixels 0 number_pixels getinterval +} bind def + +/PseudoClassPacket +{ + % + % Get a PseudoClass packet. + % + % Parameters: + % index: index into the colormap. + % length: number of pixels minus one of this color (optional). + % + currentfile byte readhexstring pop 0 get + /offset exch 3 mul def + /color_packet colormap offset 3 getinterval def + compression 0 eq + { + /number_pixels 3 def + } + { + currentfile byte readhexstring pop 0 get + /number_pixels exch 1 add 3 mul def + } ifelse + 0 3 number_pixels 1 sub + { + pixels exch color_packet putinterval + } for + pixels 0 number_pixels getinterval +} bind def + +/PseudoClassImage +{ + % + % Display a PseudoClass image. + % + % Parameters: + % class: 0-PseudoClass or 1-Grayscale. + % + currentfile buffer readline pop + token pop /class exch def pop + class 0 gt + { + currentfile buffer readline pop + token pop /depth exch def pop + /grays columns 8 add depth sub depth mul 8 idiv string def + columns rows depth + [ + columns 0 0 + rows neg 0 rows + ] + { currentfile grays readhexstring pop } image + } + { + % + % Parameters: + % colors: number of colors in the colormap. + % colormap: red, green, blue color packets. + % + currentfile buffer readline pop + token pop /colors exch def pop + /colors colors 3 mul def + /colormap colors string def + currentfile colormap readhexstring pop pop + systemdict /colorimage known + { + columns rows 8 + [ + columns 0 0 + rows neg 0 rows + ] + { PseudoClassPacket } false 3 colorimage + } + { + % + % No colorimage operator; convert to grayscale. + % + columns rows 8 + [ + columns 0 0 + rows neg 0 rows + ] + { GrayPseudoClassPacket } image + } ifelse + } ifelse +} bind def + +/DisplayImage +{ + % + % Display a DirectClass or PseudoClass image. + % + % Parameters: + % x & y translation. + % x & y scale. + % label pointsize. + % image label. + % image columns & rows. + % class: 0-DirectClass or 1-PseudoClass. + % compression: 0-none or 1-RunlengthEncoded. + % hex color packets. + % + gsave + /buffer 512 string def + /byte 1 string def + /color_packet 3 string def + /pixels 768 string def + + currentfile buffer readline pop + token pop /x exch def + token pop /y exch def pop + x y translate + currentfile buffer readline pop + token pop /x exch def + token pop /y exch def pop + currentfile buffer readline pop + token pop /pointsize exch def pop + /Times-Roman findfont pointsize scalefont setfont + x y scale + currentfile buffer readline pop + token pop /columns exch def + token pop /rows exch def pop + currentfile buffer readline pop + token pop /class exch def pop + currentfile buffer readline pop + token pop /compression exch def pop + class 0 gt { PseudoClassImage } { DirectClassImage } ifelse +} bind def +%%EndProlog +%%Page: 1 1 +%%PageBoundingBox: 0 0 48 48 +userdict begin +DisplayImage +0 0 +48 48 +12.000000 +48 48 +0 +0 +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF383448383448384848383448FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFF384848FFFFFFFFFFFFD0D0E0384848182428FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD09C78FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC09C68784828684828784828684828 +784828684828784828684828784828684828784828684828784828383448FFFFFF585858000000 +A0ACC0A09CC0384848281428784828784838685828784838785828784838785828784838785828 +784838785828784838785828784838C09C68784828FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFF684838685828684828685828684838685828784838685828684838 +685828784838685828784838384848FFFFFFFFFFFF000000485868FFFFFFB0BCC0B0BCD0182428 +182428685828784838685828785838685828784838685838785838685828784838785838785838 +685828785838000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +684828784828684828784828684828784828384848383448383448383448384848383448383448 +FFFFFFFFFFFFFFFFFFA0ACB0A09CC0A0ACB0D0BCD0B0BCC0B0ACB0182428281428383448383448 +384848383448383448585858785828784838785828784838785828784838785828000000686868 +908C90FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF784838685828684838685828 +784838284848484868FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0E0F0D0E0E0D0D0E0 +C0D0D0C0D0E0C0D0D0C0BCD0B0BCD0B0BCD0B0BCC0B0ACC0A0ACC0A09CC0A0ACC0485868182428 +585858785838785838785838784838785838785838000000585858787878908C90FFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF684828784828684828FFFFFFFFFFFF383448FFFFFFD0D0E0 +D0D0D0D0BCD0C0D0D0C0BCD0C0BCC0C0ACC0B0BCC0B0ACC0A0ACB0B09CC0A0ACB0A09CB0909CB0 +A09CB0909CA0908CB0909CA0908CA0909CA0908CB0909CA0484858182428908C90B0BCB0F0F0F0 +382418784838785828000000484848686868908C90FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFF684838685828784838F0FFFFFFFFFF384848D0D0E0485858585868486868585868485858 +585868486868585868485858585868486868585868485858585868486868585868485858585868 +486868585868485858585868283438181428788C90B0ACC0F0FFF0482428785838785838000000 +383438484848A02428A02428FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF684828784828685828 +FFF0FFFFFFF0281428181418181418181418181418181418181418181418181418181418181418 +181418181418181418181418181418181418181418181418181418181418181418181418181418 +181418181418907890B0BCB0F0F0F0383418904838785828000000383438A02428F09C78FF8C78 +000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF784838685828784838F0FFFFFFFFFFF0FFFF908CA0 +908C90685868383438282428787878908C90788C90908C90908C90908C90788C90908C90908C90 +908C90788C90908C90788C90908C90788C90908C90788C90908C90788C90908C90788C90C0ACC0 +F0F0F0482428785838905838000000484868F09C78A02428A02428000000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFF685828784828684828FFF0FFF0FFF0FFF0FFC0BCC0786878382428684800484800 +483448B0BCB0C0ACC0C0BCB0C0ACC0B0BCB0C0ACC0B0BCB0C0ACC0B0BCB0C0ACC0B0BCB0C0ACC0 +B0BCB0C0ACC0B0BCB0C0ACC0B0BCB0C0ACC0B0BCB0C0ACC0B0BCB0F0F0F0382418905838785828 +484868FFFFFF000000A02428000000481418FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF784838685828 +784838F0FFFFFFFFFFF0FFFFE0E0E0181418901418F07828E05890382438787878F0FFF0F0F0FF +F0FFF0F0F0FFF0FFF0F0F0FFF0FFF0F0F0FFF0FFF0F0F0FFF0FFF0F0F0FFF0FFF0F0F0FFF0FFF0 +F0F0FFF0FFF0F0F0FFE0FFF0F0F0FFF0FFF0482428785838485868FFFFFFA0ACC0485858000000 +481418FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF785828784838685828FFF0FFF0FFF0FFF0FF +C0BCC0000000587818188C28480048380038788C78FFF0FFF0FFF0FFF0FFF0FFF0FFF0FFF0FFF0 +FFF0F0F0F0F0F0F0FFF0FFF0FFF0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0 +F0F0F0F0F0F0383418484868FFFFFFA09CC0485858000000182428FFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFF784838685828784838F0FFFFFFFFFFF0FFF0B0ACB028242800141818D028 +004818000000E0E0E0F0FFF0F0F0FFF0FFF0F0F0FFF0FFF0F0F0FFF0FFF0F0F0FFF0FFF0F0F0FF +F0FFF0F0F0FFF0F0F0F0F0FFF0FFF0F0F0FFE0F0F0F0F0FFF0F0F0F0F0F0E0F0F0484868FFFFFF +A0ACC0485858000000182428787878FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF685828 +784838785828FFF0FFF0FFF0FFF0FFE0E0D0A08CA0000000181400000000787878F0FFF0FFF0FF +F0F0F0F0F0FFF0F0F0F0F0F0F0F0F0F0F0FFF0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0 +F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0E0F0F0483428FFFFFF484868485858000000182428484848 +787878FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF784838685828785838F0FFF0F0F0FF +F0FFF0F0F0FFD0E0D0484848586858C0BCC0F0FFF0F0F0FFF0FFF0F0F0FFF0FFF0F0F0FFF0FFF0 +F0F0FFF0FFF0F0F0FFF0FFF0F0F0F0E0F0F0F0F0FFE0FFF0F0F0F0E0F0F0F0F0FFE0FFF0F0F0F0 +E0F0F0483428FFFFFFF0E078F0AC90000000001400282428484848787878FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFF785828784838785828FFF0FFF0FFF0FFF0FFF0FFF0FFF0F0D0E0D0 +E0D0E0F0FFF0FFF0F0F0F0F0F0F0FFF0FFF0FFF0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0 +F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0E0F0F0483428FFFFFFF0E078F0AC90 +000000483428000000383438484848787878FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +785838685828784838F0FFF0F0F0FFF0FFF0F0F0FFF0FFF0F0F0FFF0FFF0F0F0FFF0FFF0F0F0FF +F0FFF0F0F0FFF0FFF0F0F0FFF0F0F0F0F0FFF0FFF0F0F0FFE0F0F0F0F0FFE0F0F0F0F0F0E0F0F0 +F0F0FFE0F0F0F0F0F0E0F0F0483428FFFFFFF0E078F0AC90000000483428905838000000282428 +484848787878FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF785828784838785828F0F0FF +F0FFF0FFF0FFF0F0F0F0F0FFF0F0F0484868485858484868485858484868485858484868485858 +484868485858484868485858484868485858484868485858484868485858484868485858483428 +FFFFFFF0E078F0AC90000000483428905838785838000000383438484848787878FFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF785838785838785838F0FFF0F0F0FFF0FFF0F0F0FFF0FFF0 +F0F0FFF0FFF0F0F0FFE0FFF0F0F0FFF0FFF0F0F0F0E0F0F0F0F0FFE0FFF0F0F0F0E0F0F0F0F0F0 +E0FFF0F0F0F0E0F0F0F0F0F0E0F0F0F0F0F0E0F0F0483428FFFFFFF0E078F0AC90000000483428 +482428786838905848000000282428484848787878FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFF785828784838785828FFF0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0281428F0F0F0F0F0F0 +F0F0F0F0F0F0485858484868485858A09CC0A0ACB0A09CC0A0ACB0484868485858484868A0ACB0 +A09CC0A0ACB0483428FFFFFFF0E078F0AC90000000483428F0F0F0483418905838905838000000 +383438484848787878FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF785838785838784838 +F0FFF0F0F0FFF0FFF0F0F0FFF0FFF0F0F0FFF0F0F0F0F0FFF0FFF0F0F0FFE0F0F0F0F0FFE0F0F0 +F0F0F0E0F0F0F0F0FFE0F0F0F0F0F0E0F0F0F0F0F0E0F0F0F0F0F0E0F0F0483428FFFFFFF0E078 +F0AC90000000483428F0F0F0E0F0F0482428906838905848000000282428484848787878FFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF785828904838785838F0F0FFF0F0F0F0F0F0F0F0F0 +F0F0F0F0F0F0484868485858484868485858484868485858484868485858484868485858484868 +485858484868485858484868A0ACB0483428FFFFFFF0E078F0AC90000000483428F0E0F0E0F0E0 +F0E0F0483418905838905838000000383438484848787878FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFF785838785838785838E0FFF0F0F0FFF0FFF0F0F0F0E0F0F0F0F0FFE0FFF0F0F0F0 +E0F0F0F0F0F0E0FFF0F0F0F0E0F0F0F0F0F0E0F0F0F0F0F0E0F0F0F0F0F0E0F0F0F0F0F0E0F0F0 +483428FFFFFFF0E078F0AC90000000483428E0F0F0E0F0F0E0F0F0E0F0F0483428786838905848 +000000282428484848787878FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF785828905838 +785828F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0281428F0F0F0F0F0F0F0F0F0F0F0F0A0ACB0 +484868485858A09CC0A0ACB0A09CC0A0ACB0484868A0ACB0483428FFFFFFF0E078F0AC90000000 +483428F0E0F0E0F0E0F0E0F0E0F0E0E0E0F0483418905838905838000000383438484848787878 +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF785838785838785838F0FFF0F0F0F0E0F0F0 +F0F0FFE0F0F0F0F0F0E0F0F0F0F0FFE0F0F0F0F0F0E0F0F0F0F0F0E0F0F0F0F0F0E0F0F0F0F0F0 +E0F0F0F0F0F0E0F0F0483428FFFFFFF0E078F0AC90000000483428E0F0F0E0F0F0E0E0F0E0F0F0 +E0F0F0E0F0F0482428906838905848000000282428484848787878FFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFF785828904838785838F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0E0F0F0484868 +485858484868485858484868485858484868485858484868485858484868A0ACB0483428FFFFFF +F0E078F0AC90000000483428484868485858484868E0F0E0E0E0F0E0F0E0E0E0F0483418905848 +785838000000383438484848787878FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF785838 +785838905838E0F0F0F0F0F0E0FFF0F0F0F0E0F0F0F0F0F0E0F0F0F0F0F0E0F0F0F0F0F0E0F0F0 +F0F0F0E0F0F0E0F0F0E0F0F0E0F0F0E0F0F0483428FFFFFFF0E078F0AC90000000483428E0F0F0 +E0F0E0E0E0F0E0F0F0E0F0F0E0F0E0E0E0F0D0E0E0482428685828583438000000282428484848 +787878FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF785838905838785828F0F0F0F0F0F0 +F0F0F0E0F0F0F0F0F0E0F0F0281428E0F0F0F0E0F0E0F0F0F0F0F0485858484868A0ACB0484868 +A0ACB0483428FFFFFFF0E078F0AC90000000483428E0E0F0E0F0E0F0E0F0E0F0E0E0E0F0D0E0E0 +D0BCD0B0ACB0A08CA0282418482428382418000000383438484848787878FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFF905838785838905838E0F0F0F0F0F0E0F0F0F0F0F0E0F0F0F0F0F0 +E0F0F0F0F0F0E0F0F0F0F0F0E0F0F0E0F0F0E0F0F0E0F0F0E0F0F0483428FFFFFFF0E078F0AC90 +000000483428E0F0F0E0F0F0E0E0F0D0F0E0D0D0D0B0BCC0A09CB0788C90686878485858181418 +282418382418000000282428484848787878FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +785838905838785838F0F0F0E0F0F0F0E0F0E0F0F0F0F0F0E0F0F0484868485858484868485858 +484868485858484868A0ACB0483428FFFFFFF0E078F0AC90000000483428484868485858484858 +384858383448283438282438585858484858384838483448181400482428483428000000383438 +484848787878FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF905838786838905838E0F0F0 +E0F0F0E0F0F0F0F0F0E0F0F0E0F0F0E0F0F0E0F0F0E0F0F0E0F0F0E0F0F0E0F0F0E0F0F0683438 +FFFFFFF0E078F0AC90000000483428C0BCD0C0D0C0A0ACB0909C90787890586868484858384848 +484848485848686868687878382418684838785848000000282428484848787878FFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF905838905838785838F0E0F0E0F0F0F0F0F0E0F0E0F0E0F0 +E0F0E0281428E0F0E0F0E0F0E0F0E0F0E0F0A0ACB0903438907868903438F0AC90000000483428 +383448383438382438484848383448182418383438485848585858687868908C90A0ACA0C0BCC0 +483418A05848906838000000383438484848787878FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFF905838785838905848E0F0F0F0F0F0E0F0F0E0F0F0E0F0F0E0F0F0E0F0F0E0E0F0E0F0F0 +E0F0F0E0F0F0B08C90784838FFFFFFE0F0E0000000382418686868586868585858384848484848 +384848585858687878908C90909CA0B0ACC0C0D0D0D0E0E0D0F0E0483428906848A06848000000 +282428484848787878FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF785838905838905838 +F0E0F0E0F0E0F0E0F0E0F0F0E0E0F0E0F0E0484868485858484868485858484868784828D0ACB0 +784828000000282438282428182418181428181418281428282428382438383438383458384858 +484868D0E0E0E0E0F0D0E0E0E0E0E0483428A05848906838000000383438484848787878FFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF905848786838905838E0F0F0E0F0F0E0F0F0E0F0F0 +E0F0F0E0E0F0E0F0F0E0F0F0E0F0E0E0E0F0787868000000282418282428687878585868485858 +585858586868787878909C90B0ACC0C0D0D0D0D0E0D0E0E0E0E0F0D0F0E0E0E0F0D0F0E0E0E0F0 +D0F0E0483428906848A06848000000282428484848787878FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFF905838905838905838F0E0F0E0F0E0E0E0F0E0F0E0F0E0F0E0F0E0281428E0F0E0 +F0E0F0E0F0E0000000383418A09CA0908C90908C90788C78908C90909C90B09CB0C0BCC0D0D0E0 +E0E0E0E0E0F0D0E0E0E0E0E0E0E0E0E0E0E0D0E0E0E0E0E0D0E0E0E0E0E0483418A05848A06838 +000000383438484848787878FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF905848786838 +905848E0F0F0E0F0F0E0F0F0E0E0F0E0F0F0E0E0F0E0F0E0E0E0F0E0F0F0E0E0F0C0D0D0C0BCD0 +C0D0C0C0D0D0C0D0D0C0D0D0C0E0D0D0D0E0D0E0E0E0E0F0D0F0E0E0E0F0D0F0E0E0E0F0D0F0E0 +E0E0F0D0E0E0E0E0F0D0F0E0E0E0F0D0E0E0483428906848A06848000000282428484848787878 +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF905838905838905838E0E0F0E0F0E0E0E0F0 +E0F0E0E0E0F0E0F0E0484868485858484868485858484868485858484868485858484868485858 +484868485858484868485858484868485858484868485858484868485858484868D0E0E0E0E0E0 +D0E0E0E0E0E0483428A05848906838000000383438484848787878FFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFF905848906838905848E0F0E0E0E0F0E0F0F0E0E0F0D0F0E0E0E0F0E0F0E0 +E0E0F0D0F0E0E0E0F0D0F0E0E0E0F0D0F0E0E0E0F0D0F0E0E0E0F0D0F0E0E0E0F0D0F0E0E0E0F0 +D0F0E0E0E0F0D0F0E0E0E0F0D0E0E0D0E0F0D0F0E0D0E0E0D0E0E0D0E0F0D0F0E0483428906848 +A06848000000282428484848787878FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF905838 +905848906838E0E0F0E0F0E0E0E0F0E0F0E0E0E0F0E0F0E0E0E0F0E0F0E0E0E0F0E0E0E0E0E0F0 +E0F0E0E0E0E0E0E0E0E0E0F0D0E0E0E0E0E0E0E0E0E0E0E0D0E0E0E0E0E0D0E0E0E0E0E0D0E0E0 +E0E0E0D0E0E0E0E0E0D0E0E0E0E0E0D0E0E0E0E0E0483418A05848A06838000000383438484848 +787878FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF905848906838905848E0F0F0E0E0F0 +D0F0E0E0E0F0E0F0E0E0E0F0D0F0E0E0E0F0D0F0E0E0E0F0D0F0E0E0E0F0D0F0E0E0E0F0D0F0E0 +E0E0F0D0F0E0E0E0F0D0E0E0E0E0F0D0F0E0E0E0F0D0E0E0D0E0F0D0E0E0D0E0E0D0E0E0D0E0F0 +D0E0E0D0E0E0D0E0E0483428906848A06848000000282428484848787878FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFF906838A05848905838482428483418482428483418482428483418 +482428483418482428483418482428483418482428483418582428483428482428483418582428 +483428482428483418582428483428582428483418582428483428582428483418582428483428 +A06848A06848000000383438484848787878FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +905848906838905848906838905848906838906848906838905848906838A06848906838905848 +906848A06848906838905848906848A06848906848A06848906848A06848906848A06848906848 +A06848906848A06848906848A06848906848A06848906848A06848906848A06848000000282428 +484848787878FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD08C78D09C68A05848906838A05848 +906838A05848906838A05848906838A05848906838A05848906838A05848906838A05848906838 +A05848906838A05848A06838A05848906838A05848A06838A06848A06838A05848A06848A06848 +A06838A05848A06848A06848A06838A06848684828000000383438484848787878FFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF784838000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000283428383438484848787878FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF686868484848383438282428383438282428383438282428 +383438282428383438282428383438282428383438282428383438282428383438282428383438 +282428383438282428383438282428383438282428383438282428383438282428383438383438 +484848686868FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFF787878787878787878686868686868686868686868686868686868686868686868686868 +686868686868686868686868686868686868686868686868686868686868686868686868686868 +686868686868686868686868686868686868686868686868686868686868787878FFFFFFFFFFFF +FFFFFFFFFFFFFFFFFF + +end +%%PageTrailer +%%Trailer +%%EOF diff --git a/documentation/etc/images/clipboard.pdf b/documentation/etc/images/clipboard.pdf new file mode 100644 index 0000000000000000000000000000000000000000..5424a7a2998f957c968e6aa3e7375d84df82f707 GIT binary patch literal 12127 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 O+Jb!J#&17+ApZ{pTMDHB literal 0 HcmV?d00001 diff --git a/documentation/etc/images/clipboard.png b/documentation/etc/images/clipboard.png new file mode 100644 index 0000000000000000000000000000000000000000..aefb16daf0d07d5675ee0ea43afbc6512ee1d36b GIT binary patch literal 3105 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 literal 0 HcmV?d00001 diff --git a/documentation/etc/images/i-core.bb b/documentation/etc/images/i-core.bb new file mode 100644 index 00000000..3bd31e10 --- /dev/null +++ b/documentation/etc/images/i-core.bb @@ -0,0 +1 @@ +%%BoundingBox: 0 0 48 48 diff --git a/documentation/etc/images/i-core.eps b/documentation/etc/images/i-core.eps new file mode 100644 index 00000000..250d1dba --- /dev/null +++ b/documentation/etc/images/i-core.eps @@ -0,0 +1,456 @@ +%!PS-Adobe-3.0 EPSF-3.0 +%%Creator: (ImageMagick) +%%Title: (../images/i-core.eps) +%%CreationDate: (2012-04-20T17:48:52+02:00) +%%BoundingBox: 0 0 48 48 +%%HiResBoundingBox: 0 0 48 48 +%%DocumentData: Clean7Bit +%%LanguageLevel: 1 +%%Pages: 1 +%%EndComments + +%%BeginDefaults +%%EndDefaults + +%%BeginProlog +% +% Display a color image. The image is displayed in color on +% Postscript viewers or printers that support color, otherwise +% it is displayed as grayscale. +% +/DirectClassPacket +{ + % + % Get a DirectClass packet. + % + % Parameters: + % red. + % green. + % blue. + % length: number of pixels minus one of this color (optional). + % + currentfile color_packet readhexstring pop pop + compression 0 eq + { + /number_pixels 3 def + } + { + currentfile byte readhexstring pop 0 get + /number_pixels exch 1 add 3 mul def + } ifelse + 0 3 number_pixels 1 sub + { + pixels exch color_packet putinterval + } for + pixels 0 number_pixels getinterval +} bind def + +/DirectClassImage +{ + % + % Display a DirectClass image. + % + systemdict /colorimage known + { + columns rows 8 + [ + columns 0 0 + rows neg 0 rows + ] + { DirectClassPacket } false 3 colorimage + } + { + % + % No colorimage operator; convert to grayscale. + % + columns rows 8 + [ + columns 0 0 + rows neg 0 rows + ] + { GrayDirectClassPacket } image + } ifelse +} bind def + +/GrayDirectClassPacket +{ + % + % Get a DirectClass packet; convert to grayscale. + % + % Parameters: + % red + % green + % blue + % length: number of pixels minus one of this color (optional). + % + currentfile color_packet readhexstring pop pop + color_packet 0 get 0.299 mul + color_packet 1 get 0.587 mul add + color_packet 2 get 0.114 mul add + cvi + /gray_packet exch def + compression 0 eq + { + /number_pixels 1 def + } + { + currentfile byte readhexstring pop 0 get + /number_pixels exch 1 add def + } ifelse + 0 1 number_pixels 1 sub + { + pixels exch gray_packet put + } for + pixels 0 number_pixels getinterval +} bind def + +/GrayPseudoClassPacket +{ + % + % Get a PseudoClass packet; convert to grayscale. + % + % Parameters: + % index: index into the colormap. + % length: number of pixels minus one of this color (optional). + % + currentfile byte readhexstring pop 0 get + /offset exch 3 mul def + /color_packet colormap offset 3 getinterval def + color_packet 0 get 0.299 mul + color_packet 1 get 0.587 mul add + color_packet 2 get 0.114 mul add + cvi + /gray_packet exch def + compression 0 eq + { + /number_pixels 1 def + } + { + currentfile byte readhexstring pop 0 get + /number_pixels exch 1 add def + } ifelse + 0 1 number_pixels 1 sub + { + pixels exch gray_packet put + } for + pixels 0 number_pixels getinterval +} bind def + +/PseudoClassPacket +{ + % + % Get a PseudoClass packet. + % + % Parameters: + % index: index into the colormap. + % length: number of pixels minus one of this color (optional). + % + currentfile byte readhexstring pop 0 get + /offset exch 3 mul def + /color_packet colormap offset 3 getinterval def + compression 0 eq + { + /number_pixels 3 def + } + { + currentfile byte readhexstring pop 0 get + /number_pixels exch 1 add 3 mul def + } ifelse + 0 3 number_pixels 1 sub + { + pixels exch color_packet putinterval + } for + pixels 0 number_pixels getinterval +} bind def + +/PseudoClassImage +{ + % + % Display a PseudoClass image. + % + % Parameters: + % class: 0-PseudoClass or 1-Grayscale. + % + currentfile buffer readline pop + token pop /class exch def pop + class 0 gt + { + currentfile buffer readline pop + token pop /depth exch def pop + /grays columns 8 add depth sub depth mul 8 idiv string def + columns rows depth + [ + columns 0 0 + rows neg 0 rows + ] + { currentfile grays readhexstring pop } image + } + { + % + % Parameters: + % colors: number of colors in the colormap. + % colormap: red, green, blue color packets. + % + currentfile buffer readline pop + token pop /colors exch def pop + /colors colors 3 mul def + /colormap colors string def + currentfile colormap readhexstring pop pop + systemdict /colorimage known + { + columns rows 8 + [ + columns 0 0 + rows neg 0 rows + ] + { PseudoClassPacket } false 3 colorimage + } + { + % + % No colorimage operator; convert to grayscale. + % + columns rows 8 + [ + columns 0 0 + rows neg 0 rows + ] + { GrayPseudoClassPacket } image + } ifelse + } ifelse +} bind def + +/DisplayImage +{ + % + % Display a DirectClass or PseudoClass image. + % + % Parameters: + % x & y translation. + % x & y scale. + % label pointsize. + % image label. + % image columns & rows. + % class: 0-DirectClass or 1-PseudoClass. + % compression: 0-none or 1-RunlengthEncoded. + % hex color packets. + % + gsave + /buffer 512 string def + /byte 1 string def + /color_packet 3 string def + /pixels 768 string def + + currentfile buffer readline pop + token pop /x exch def + token pop /y exch def pop + x y translate + currentfile buffer readline pop + token pop /x exch def + token pop /y exch def pop + currentfile buffer readline pop + token pop /pointsize exch def pop + /Times-Roman findfont pointsize scalefont setfont + x y scale + currentfile buffer readline pop + token pop /columns exch def + token pop /rows exch def pop + currentfile buffer readline pop + token pop /class exch def pop + currentfile buffer readline pop + token pop /compression exch def pop + class 0 gt { PseudoClassImage } { DirectClassImage } ifelse +} bind def +%%EndProlog +%%Page: 1 1 +%%PageBoundingBox: 0 0 48 48 +userdict begin +DisplayImage +0 0 +48 48 +12.000000 +48 48 +0 +0 +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000 +000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000 +000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000 +000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000FFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFF000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFF000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000 +000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000 +000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFF000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFF000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000 +000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000 +000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFF000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFF000000A39121F5E78AEFD532C5B029A391216E6216000000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000FFFFFFFFFFFF00000092821A +000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000A39121 +F7EEAEEFD532C5B029A391216E6216000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFF000000F2D72C00000000000092821AF2D72C000000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000A39121F5E78AEFD532C5B029A39121 +5B5112000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000 +F2D72CF2D72C5A5010F2D72CF2D72C000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +0000000A09004C450B887A1BCFC36CEADD8BE9CF38E5CA38D1BA31B19C27807319453E0A0A0900 +000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000F2D72CF2D72CF2D72C +92821A000000000000FFFFFFFFFFFFFFFFFFFFFFFF0000002421037E721ADAC036EDD33AF4D83A +F5DE5BF3DD5AEED336EBD136E8CC35E5CA34E2C834DBC033CBB0317063171E1C02000000FFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFF00000092821AF2D72CF2D72CF2D72CF2D72CF2D72CF2D72C000000 +FFFFFFFFFFFF000000746817D9C135E9CF38F5DA38F8DC38F6DB37F5DA35F3D834F2D634EFD532 +EDD231E9CE32E6CA32E4C932E0C433D7BC33CBB033605513000000FFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000 +F2D72CF2D72CF2D72CF2D72CF2D72C000000000000000000FFFFFF000000242204AF9C29EAD039 +F2D738F9DE36FADE36F8DD35F7DD32F7DB31F5DB2FF4DA2FF2D72FF0D52FEDD230EBCF30E9CC30 +E6C932E1C533DCBF33CDB2338F7D211C1A02000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000F2D72CF2D72C000000000000F2D72C +F2D72C000000FFFFFFFFFFFF000000302C06CCB432F2D739FADD39FADF36FADF33FADE32FADF30 +F9DE2DF8DD2DF7DD2CF6DB2CF4DA2CF2D72CF0D52DEED32CECD02EE8CB2FE3C630E0C331DABC32 +CDAF31A38B28221F03000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFF000000000000FFFFFFFFFFFF000000F2D72CF2D72C000000FFFFFF +242004CAB332F3D539F9DD37FADE35FADE32FADF30FADF2EFAE02CF9DF2AF9DF29F8DE29F8DD29 +F6DC28F4DA29F3D82AF0D52AEFD22BEBCF2CE6C92DE3C630DEC030D3B630B79B2D917C24171502 +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFF000000F2D72CF2D72C000000000000AE9A28F1D438F9DD37FADD34 +FADE32FADE2FFADF2CFAE02AFAE029F9DF27F9DF26F9DF25F8DE25F7DE25F6DC26B8A41DB6A21D +F1D529EED12AEACD2BE6C92CE0C22EDBBB2FCAAC2EB1952C73601C000000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFF000000F2D72C000000786B18F1D33AF8DB38F9DC35F9DD31F9DD2EFADF2B3B3509746812 +FAE026F9E1249C8D15000000F9E023F8DE23F7DD235F550D1A1704C8B11FEFD327C3AB21685B13 +C7AD26DEBF2DD6B62FC2A42DA38827463C0F000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000252104 +ECCE3AF8D93AF8DA36F9DB32F9DC2FF9DE2BF9DE29CBB51F0D0C029B8B1551490A161402A59515 +FAE120F9DF20F8DE21CCB61C1412020E0C0260550F040400151203C9AD24DFC02CDAB92DCFAE2E +B9992B957A25121001FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000088781DF4D43BF7D837F8DA32F8DB2F +F8DC2CF9DD29F9DE26F9DF244B430A040400161402C1AE17FAE11FFAE21FF9E120F8DF21F8DD20 +BDA91A0000000000004C430CECCE27E6C829E2C22ADABA2CD3B22EC3A22B987D2440350E000000 +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFF0A0900E1C237F7D639F7D835F8D931F8DB2DF8DC2AF9DD27F9DE25665B0E +0000002A2505000000A59513FAE324FAE32AF9E22AF7DF279B8B15090801060500000000121002 +DEC123E8C927E2C228DCBB29D3B02BC5A32BA48626745E1D070600FFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF49410C +E5C537F6D537F7D732F7D92FF7DA2BF8DB28F8DD25F8DE23373207CBB619FAE11D766B0D000000 +CCBA27FAE63EF3E041ECD8397A6E14403908E7CD1EBAA3180C0A01231E05E9CA27E2C228DCBC28 +D3B12ACBA92BAE8F278369201F1A05FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000080701BE9C837F5D435F6D631F6D82D +F7DA2AF7DB27F8DD23F8DE22F9DF1FF9E01DFAE11CFAE21CCBB925ECDA44F8E75EEBDC5DDBCB49 +D6C230E1C920F0D51EEBD01E7768101D1904917D16E2C227DCBB27D3B128CAA729B998298D7121 +362B0C000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFF000000A68E26EAC735F4D333F5D530F6D82CF6D829F7DA26F8DC23F8DE21 +F9DF1FF9E01DFAE11BFAE323FBE84FFCED77F8ED8AEADF82D4C85FC4B335C7B21ED4BC1ACAB31A +D8BD1EC6AD1CCAAE1EE2C125DCBA27D2B126C8A427B99727957622504013000000FFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000 +AC9228DAB931EFCC31F4D430F5D72BF6D828F6D925F7DB23F8DD20F9DF1DF9DF1CF7DE1DF6E240 +FCEE7EFDF3A8FCF4B5F1E8A3DACE75BCAC39A090189D8B139E8B14C3AA1ADCBF1FE3C321E1C025 +DAB826D1AF26C6A327B89526967822604B17000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000BF9F2EE0BE32F0CE30F3D22E +F3D42BF5D628F6D825F7DB22F8DC1FF8DE1EF7DD1BEFD929E7D75CF8EE9FFDF7C6FDF8CCF8F1B7 +E3D77FC0B03A8677125C520B6C5E0DB09917D6B91EE1C122DEBE24D9B525CFAB25C3A126B49224 +9A792272591B000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFF000000BFA02DDEBC31EECA2FF2D02DF2D22AF4D427F5D724F6D923 +F7DB20F7DC1EF7DC1DEBD42FDDCF66F3EAA8FBF6CDFCF7CFFCF4B5EFE17CC6B4347F710F53490A +4F450A917E13D3B61EE0BF21DDBB23D6B324CBA824C09C24B08D2496762172571A000000FFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +000000AA8E27D1B02EE8C52FEFCD2CF1CF2AF3D226F4D524F5D722F6D920F6DA1EF6DB1DEBD42F +D8CA5FE8DE96ECE6B3F0E9B4F6EB9AE9D95F92831B64580B6E600D61540C9F8A15D7B91DE0BF20 +DAB722D2AE23C8A524BD9922AB88238F6E1F5D4715000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000967E20DBB631E9C42E +ECC92DEECC29EFCF27F2D225F3D422F4D621F5D81EF6DA1DEFD62BDDCA48CCC067B6AD6EB9B06B +C2B4569A8B25594F0C6F610DA79114A18C15C9AC1AE0BF1FDFBC21D8B622CFAB23C39F22B79223 +A5812181631D44340E000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000006A5A14CDAB2DE2BD2EE8C42CEBC829EDCC26EFCE23 +F0D122F2D420F4D51FF4D71EF5D923F0D834DFCC44BFB045A49636A2922492801387770FBEA716 +DCBE1AD9BB1BE3C11FE1BF20DBB820D2AF21C9A522BF9B22AF8A2197741F775A1A32260A000000 +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFF342D08C8A52CDFB92CE4BF2BE6C328E9C826EBCA24EECD22F0D020F1D31EE6CA1C +907F14665C145E551B61581C564E1450470C4E44085449099C8712BAA016E4C21EDCBA1EDDBA20 +D6B420CFAA21C49F20B89320A984208B6B1D7155181A1503FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF070700B89528 +DCB42CDFB92BE2BD29E5C127E8C524EAC822E9C820AC9617050400090503371E153E25193F2717 +261E0931200C472B1345281437230E3D300A9D8614BA9C19D9B520D0AC20C8A320BD9720B28D1F +9F7A1D7F601A6E5117060500FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000604F12C49F29DAB22ADDB828E0BC27 +E2BF25E6C221CFB11D171303000000452914A84B44AE4A4AA547474E2222783333A24444A34842 +7E3E2F39270D010100907714CCA91EC9A61FC19C20B8921FA9841F906D1C745617382A09000000 +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFF181602A18222C8A328D7B129DAB526DCB823D2B120282206000000 +090601AC4848C45353CA5555C85454863C3CA94949C75454BF5151AC4949622929261F052D2506 +987C17BB971DB8921EAD871E99761C7B5C186F51170D0B00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +0000004D3F0DB49123CFA827D3AE26D7B2259F84190101001714033A290CBA4E4ED05555D55A5A +B94C4C7C3939B34949C85353B54B4B9C43437D38380E0C020302005D4A0EA5821AAE881D9E7A1B +795B166A4D14312608000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000846A19BC9625 +CCA425D1AA253D320A0000000F0C02722F2FCD5555DD5C5CD55A5AA94848924040C55151CA5555 +B74C4C9841417436360706011D17041410038E6F17A07B1B816216664B134E390D000000FFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1B180198761FB89124CAA1259075180A0801 +140D03823535D35757DB5C5CD65A5AB44C4CAD4848CD5555C75454B54B4B9340406C3333201606 +000000070501765A137F6015644A12583F100F0D00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFF000000201C038A6C1BAF8821BF96226E5812000000CE5555D45959D85B5B +D45959C55252C14F4FCC5454BF4F4FAA4848873C3C643131050300251D067356127E5F15654B11 +563D0F131001000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +000000161401755D15A47F1EB98F21C66F3ECD5555CE5555CF5555D15656CD5454C85252C35151 +B54B4B9B41417837375E2E2E775813926E18795A14664A1146330B0F0D00000000FFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000004F400B +A67F1EBC6D38C35050C35151C45151C45252BF5050BB4E4EB04A4A9C4343853A3A6A3333714027 +8764167054126146102B2105000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000001714015B480DB55444B84E4E +B74B4BB14B4BAD4848A144449140407D39396C33336B392B76571263480F3125060F0D00000000 +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000009080059311B894430A14343913E3E823939 +7235357042235F40163A2D071C1802060600000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000 +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFF + +end +%%PageTrailer +%%Trailer +%%EOF diff --git a/documentation/etc/images/i-core.pdf b/documentation/etc/images/i-core.pdf new file mode 100644 index 0000000000000000000000000000000000000000..2bb22c3bb31f218ae5c98d4bc16638576be5b014 GIT binary patch literal 8043 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 literal 0 HcmV?d00001 diff --git a/documentation/etc/socstyle.tex b/documentation/etc/socstyle.tex new file mode 100644 index 00000000..5cf8f487 --- /dev/null +++ b/documentation/etc/socstyle.tex @@ -0,0 +1,89 @@ + + \usepackage[default,osfigures,scale=0.95]{opensans} + \usepackage{xspace} + \usepackage{fancyhdr} +%\usepackage[dvipdfm]{graphicx} + \usepackage{graphicx} + \usepackage{enumitem} + \usepackage[sf,bf]{titlesec} + \usepackage{titletoc} + \usepackage[colorlinks=true,linkcolor=blue,urlcolor=blue,dvipdfm]{hyperref} + \usepackage[paper=a4paper,headheight=30pt,tmargin=1.5in,bmargin=1in]{geometry} +%\usepackage{layouts} + + \urlstyle{tt} % normal text font (alternatives: same, tt, rm, sf) + \renewlist{itemize}{itemize}{9} + \setlist[itemize]{label=\textbullet} + +% The LaTeX Companion -- p. 204. +% Miniature display of the page layout. +%\newcommand{\showpage}{% +% \setlayoutscale{0.65}\setlabelfont{\tiny}% +% \printheadingsfalse\printparametersfalse% +% \currentpage\pagedesign% +%} + + \titlecontents{section}[0pc] + {\sffamily\bfseries} % above code. + {\contentslabel{1pc}} % numbered entry format. + {} % numberless entry format. + {\titlerule*[8pt]{.}\textsc{\textbf{{\contentspage}}}} % page format. + \titlecontents{subsection}[0pc] + {\sffamily} % above code. + {\contentslabel{2pc}} % numbered entry format. + {} % numberless entry format. + {\titlerule*[8pt]{.}\textsc{\textbf{{\contentspage}}}} % page format. + \titlecontents{subsubsection}[1pc] + {\sffamily} % above code. + {\contentslabel{2pc}} % numbered entry format. + {} % numberless entry format. + {\titlerule*[8pt]{.}\textsc{\textbf{{\contentspage}}}} % page format. + + \newcommand{\key}[1]{\raisebox{-0.5\baselineskip}{\rule{0pt}{1.5\baselineskip}}\fbox{\textsf{#1}}} + + \newcommand{\DUroleul}[1]{\underline{#1}\xspace} + \newcommand{\DUrolesc}[1]{\textsc{#1}\xspace} + \newcommand{\DUrolecb}[1]{\textbf{\texttt{#1}}\xspace} + \newcommand{\DUrolefboxtt}[1]{\fbox{\texttt{#1}}\xspace} + + \newcommand{\DUtitlenote}[1]{\noindent\textbf{#1}\smallskip} + + \newcommand{\DUadmonitionnote}[1]{% + \begin{center} + \sffamily + \begin{array}[t]{m{1cm}!{\vrule width 1pt}m{.90\textwidth}} + \raisebox{0.0cm}{\includegraphics[scale=0.5,natwidth=48,natheight=48]{./images/clipboard.pdf}} & + \begin{minipage}[t]{.85\textwidth} #1 + \end{minipage} \\ + \end{array} + \end{center} + } + + \newcommand{\DUtitleerror}[1]{\noindent\textbf{\color{red}#1}\smallskip} + + \newcommand{\DUadmonitionerror}[1]{% + \begin{center} + \sffamily + \begin{array}[t]{m{1cm}!{\vrule width 1pt}m{.90\textwidth}} + \raisebox{0.0cm}{\includegraphics[scale=0.5,natwidth=48,natheight=48]{./images/i-core.pdf}} & + \begin{minipage}[t]{.85\textwidth} #1 + \end{minipage} \\ + \end{array} + \end{center} + } + + \newcommand{\UPMC} {\textsc{upmc}\xspace} + \newcommand{\LIP} {\textsc{lip6}\xspace} + \newcommand{\SoC} {\textsc{S}o\textsc{C}\xspace} + + \renewcommand{\headrulewidth}{0.2mm} + \renewcommand{\footrulewidth}{0.2mm} + \renewcommand{\sectionmark}[1]{\markboth{\thesection\ #1}{\thesection\ #1}} + \renewcommand{\subsectionmark}[1]{} + \lhead[]{Documentation \SoC} + \rhead[]{March 2015} + \lfoot[]{\UPMC/\LIP/\SoC} + \rfoot[]{\thepage} + \cfoot[]{} + + \pagestyle{fancy}