Merge branch 'devel_anabatic' of ssh://bop/users/largo2/git/coriolis into devel_anabatic
This commit is contained in:
commit
b5d0af693c
|
@ -26,7 +26,7 @@ Documentation
|
|||
|
||||
The complete documentation is available here, both in pdf & html:
|
||||
|
||||
./documentation/UsersGuide/UsersGuide.html
|
||||
./documentation/_build/html/index.html
|
||||
./documentation/UsersGuide/UsersGuide.pdf
|
||||
|
||||
The documentation of the latest *stable* version is also
|
||||
|
|
|
@ -7,6 +7,7 @@
|
|||
FindLibexecinfo.cmake
|
||||
FindLibbfd.cmake
|
||||
FindQwt.cmake
|
||||
FindSphinx.cmake
|
||||
GetGitRevisionDescription.cmake
|
||||
GetGitRevisionDescription.cmake.in
|
||||
)
|
||||
|
|
|
@ -0,0 +1,12 @@
|
|||
|
||||
# CMake snippet courtesy of Eric Scott BARR's blog.
|
||||
|
||||
find_program( SPHINX_EXECUTABLE NAMES sphinx-build
|
||||
HINTS $ENV{SPHINX_DIR}
|
||||
PATH_SUFFIXES bin
|
||||
DOC "Sphinx documentation generator"
|
||||
)
|
||||
|
||||
include( FindPackageHandleStandardArgs )
|
||||
find_package_handle_standard_args( Sphinx DEFAULT_MSG SPHINX_EXECUTABLE )
|
||||
mark_as_advanced( SPHINX_EXECUTABLE )
|
|
@ -12,6 +12,10 @@
|
|||
font-family: "Open Sans", Verdana, sans-serif;;
|
||||
}
|
||||
|
||||
html {
|
||||
background: #dddddd;
|
||||
}
|
||||
|
||||
body {
|
||||
color: black;
|
||||
background: white;
|
||||
|
@ -20,9 +24,10 @@
|
|||
background-attachment: fixed;
|
||||
background-repeat: no-repeat;
|
||||
margin-top: 2em;
|
||||
width: 550pt;
|
||||
width: 600pt;
|
||||
margin-right: auto;
|
||||
margin-left: auto;
|
||||
padding: 30pt;
|
||||
/*
|
||||
margin-right: 12%;
|
||||
margin-left: 12%;
|
||||
|
@ -38,19 +43,21 @@
|
|||
|
||||
|
||||
h1, h2, h3, h4, h5, h6 {
|
||||
/*font-family: "Liberation Serif", sans-serif;*/
|
||||
/*font-family: "URW Bookman L", "Liberation Serif", sans-serif;*/
|
||||
font-family: "URW Bookman L";
|
||||
}
|
||||
|
||||
h1 { text-align: center; }
|
||||
h1.header { text-align: center; }
|
||||
h1 { text-align: left; }
|
||||
h2, h3, h4, h5, h6 { text-align: left;
|
||||
padding-top: 11pt;
|
||||
}
|
||||
h1, h2, h3 { /*font-family: "Liberation Serif", sans-serif; */
|
||||
/*color: #09550B;*/
|
||||
}
|
||||
h1 { font-weight:normal; font-size: 170%; letter-spacing:0.2em; word-spacing:0.4em; }
|
||||
h2 { font-weight:normal; font-size: 140%; letter-spacing:0.2em; word-spacing:0.4em; }
|
||||
h3 { font-weight: bold; font-size: 118%; letter-spacing:0.2em; word-spacing:0.4em; }
|
||||
h1 { font-weight: bold; font-size: 170%; /*letter-spacing:0.2em; word-spacing:0.4em;*/ }
|
||||
h2 { font-weight: bold; font-size: 140%; /*letter-spacing:0.2em; word-spacing:0.4em;*/ }
|
||||
h3 { font-weight: bold; font-size: 118%; /*letter-spacing:0.2em; word-spacing:0.4em;*/ }
|
||||
h4 { font-weight: bold; font-size: 100%; }
|
||||
h5 { font-style: italic; font-size: 100%; }
|
||||
h6 { font-variant: small-caps; font-size: 100%; }
|
||||
|
@ -156,14 +163,20 @@
|
|||
a:link img, a:visited img { border-style: none; }
|
||||
a img { color: white; }
|
||||
|
||||
a {
|
||||
color: black;
|
||||
border-bottom: 1px solid black;
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
a:link, a:active, a:visited {
|
||||
color: #09550B;
|
||||
text-decoration: none;
|
||||
/*color: #09550B;*/
|
||||
/*text-decoration: none;*/
|
||||
}
|
||||
|
||||
a:hover, a:focus {
|
||||
color: #FF9900;
|
||||
text-decoration: underline;
|
||||
/*color: #FF9900; */
|
||||
border-bottom: 2px solid black;
|
||||
}
|
||||
|
||||
|
||||
|
@ -210,6 +223,7 @@
|
|||
padding: 2px 0px;
|
||||
text-align: center;
|
||||
background-color: black;
|
||||
border-bottom: none;
|
||||
}
|
||||
|
||||
table.header td {
|
||||
|
@ -220,6 +234,18 @@
|
|||
font-size: 110%;
|
||||
}
|
||||
|
||||
table.UserDefined {
|
||||
border: 1px solid;
|
||||
}
|
||||
|
||||
table.UserDefined th {
|
||||
border: 1px solid;
|
||||
}
|
||||
|
||||
table.UserDefined td {
|
||||
padding: 0px 5px;
|
||||
}
|
||||
|
||||
table.DoxUser td, table.DoxUser th {
|
||||
padding: 0px 5px;
|
||||
border: 0px;
|
||||
|
@ -349,7 +375,7 @@
|
|||
display: table-cell;
|
||||
text-align: center;
|
||||
padding: 2pt;
|
||||
width: 10%;
|
||||
width: 5%;
|
||||
}
|
||||
|
||||
ul.tablist li:hover {
|
||||
|
@ -362,7 +388,9 @@
|
|||
color: white;
|
||||
}
|
||||
|
||||
ul.tablist * a:link img, ul.tablist * a:visited img { border-style: none; }
|
||||
ul.tablist * a { border-bottom: none; }
|
||||
|
||||
ul.tablist * a:link img, ul.tablist * a:visited img { border-style: none; border-bottom: none; }
|
||||
|
||||
ul.tablist * a:link, ul.tablist * a:visited {
|
||||
color: black;
|
||||
|
@ -410,8 +438,8 @@
|
|||
width: 100%-4px;
|
||||
/*background-color: #DADAEF;*/
|
||||
/*background-color: #eeeeff;*/
|
||||
/*background-color: #EEEEEE;*/
|
||||
background-color: #CCE6CA;
|
||||
background-color: #cccccc;
|
||||
/*background-color: #CCE6CA;*/
|
||||
border: 0px solid #003300;
|
||||
text-align: center;
|
||||
margin: 0px;
|
||||
|
@ -427,11 +455,18 @@
|
|||
}
|
||||
|
||||
a.qindex, a.qindex:visited {
|
||||
color: #09550B;
|
||||
/*color: #09550B;*/
|
||||
color: black;
|
||||
border: 2px solid #cccccc;
|
||||
padding: 2px 2px;
|
||||
border-bottom: none;
|
||||
}
|
||||
|
||||
a.qindex:hover {
|
||||
background-color: #ddddff;
|
||||
/*background-color: #ddddff;*/
|
||||
font-weight: bold;
|
||||
padding: 2px 2px;
|
||||
border: 2px solid black;
|
||||
}
|
||||
|
||||
a.qindexHL, a.qindexHL:hover, a.qindexHL:visited {
|
||||
|
@ -544,6 +579,7 @@
|
|||
{
|
||||
font-family: time;
|
||||
font-size: 250%;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
|
||||
|
@ -554,9 +590,10 @@
|
|||
div.fragment {
|
||||
font-family: "Monospace";
|
||||
font-size: 80%;
|
||||
border: dashed;
|
||||
border-width: thin;
|
||||
border-color: #003300;
|
||||
border: none;
|
||||
/*border-width: thin; */
|
||||
/*border-color: #003300;*/
|
||||
/*background-color: #FCFCE1;*/
|
||||
background-color: #FCFCE1;
|
||||
padding: 0.5em;
|
||||
margin-left: 5%;
|
||||
|
@ -583,9 +620,17 @@
|
|||
* Attributes Listing.
|
||||
*/
|
||||
|
||||
p.formulaDsp {
|
||||
text-align: center;
|
||||
}
|
||||
a.el, a.elRef {
|
||||
font-family: Courier;
|
||||
font-weight: bold;
|
||||
font-size: 110%;
|
||||
color: black;
|
||||
border-bottom: none;
|
||||
}
|
||||
|
||||
p.formulaDsp {
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.mdTable {
|
||||
/*border: 1px solid #868686;*/
|
||||
|
@ -628,10 +673,12 @@ p.formulaDsp {
|
|||
}
|
||||
|
||||
.memproto {
|
||||
background-color: #CCE6CA;
|
||||
/*background-color: #CCE6CA;*/
|
||||
background-color: #cccccc;
|
||||
border-left-width: 4px;
|
||||
border-left-style: solid;
|
||||
border-color: #008500;
|
||||
/*border-color: #008500;*/
|
||||
border-color: black;
|
||||
}
|
||||
|
||||
.memname {
|
||||
|
@ -650,7 +697,8 @@ p.formulaDsp {
|
|||
/*margin-top: -8px;*/
|
||||
border-left-width: 1px;
|
||||
border-left-style: solid;
|
||||
border-color: #008500;
|
||||
/*border-color: #008500;*/
|
||||
border-color: black;
|
||||
}
|
||||
|
||||
div.contents * table tr {
|
||||
|
|
|
@ -5,16 +5,14 @@
|
|||
|
||||
cmake_minimum_required(VERSION 2.4.0)
|
||||
|
||||
OPTION(BUILD_DOC "Build the documentation (html+latex)" OFF)
|
||||
option(BUILD_DOC "Build the documentation (html+pdf)" OFF)
|
||||
|
||||
list(INSERT CMAKE_MODULE_PATH 0 "${DESTDIR}$ENV{CORIOLIS_TOP}/share/cmake/Modules/")
|
||||
find_package(Bootstrap REQUIRED)
|
||||
find_package(Sphinx REQUIRED)
|
||||
setup_project_paths(CORIOLIS)
|
||||
list(INSERT CMAKE_MODULE_PATH 0 "${CRLCORE_SOURCE_DIR}/cmake_modules/")
|
||||
print_cmake_module_path()
|
||||
|
||||
set_cmake_policies()
|
||||
check_distribution()
|
||||
|
||||
#if(BUILD_DOC)
|
||||
# include(UseLATEX)
|
||||
|
@ -22,13 +20,77 @@
|
|||
|
||||
add_subdirectory(examples)
|
||||
if(BUILD_DOC)
|
||||
add_subdirectory(etc)
|
||||
add_subdirectory(UsersGuide)
|
||||
add_subdirectory(PythonCpp)
|
||||
set ( htmlInstallDir share/doc/coriolis2/en/html/main )
|
||||
set ( pdfInstallDir share/doc/coriolis2/en/pdf/main )
|
||||
|
||||
set ( pythonCppRst PythonCpp/pdfHeader.rst
|
||||
PythonCpp/Introduction.rst
|
||||
PythonCpp/Configuration.rst
|
||||
PythonCpp/DBoStandalone.rst
|
||||
PythonCpp/DBoHierarchy.rst
|
||||
PythonCpp/NonDBo.rst
|
||||
PythonCpp/DbU.rst
|
||||
PythonCpp/Name.rst )
|
||||
|
||||
set ( usersGuideRst UsersGuide/pdfHeader.rst
|
||||
UsersGuide/LicenseCredits.rst
|
||||
UsersGuide/Releases.rst
|
||||
UsersGuide/Installation.rst
|
||||
UsersGuide/Configuration.rst
|
||||
UsersGuide/ViewerTools.rst
|
||||
UsersGuide/ScriptsPlugins.rst )
|
||||
|
||||
set ( rdsRst RDS/pdfHeader.rst
|
||||
RDS/RDSpage.rst )
|
||||
|
||||
add_custom_target ( doc_HTML ALL
|
||||
cd ${DOCUMENTATION_SOURCE_DIR}
|
||||
&& rm -rf _build
|
||||
&& sphinx-build -b html -d _build/doctrees . _build/html )
|
||||
add_dependencies ( doc_HTML ../etc/definitions.rst
|
||||
../_static/SoC.css
|
||||
../_static/www-SoC.css
|
||||
../_static/SoC-ReST.css
|
||||
../_static/pygments.css
|
||||
CrlCore/CrlCore.rst
|
||||
DpGen/DpGen.rst
|
||||
Hurricane/Hurricane.rst
|
||||
Patterns/Patterns.rst
|
||||
Stratus/Stratus.rst
|
||||
Unicorn/Unicorn.rst
|
||||
Viewer/Viewer.rst
|
||||
${usersGuideRst} UsersGuide/index.rst
|
||||
${pythonCppRst} PythonCpp/index.rst
|
||||
${rdsRst} RDS/index.rst
|
||||
)
|
||||
|
||||
add_custom_target ( pdf_UsersGuide ALL
|
||||
cd ${DOCUMENTATION_SOURCE_DIR}/UsersGuide
|
||||
&& ../etc/doPdf.sh ${usersGuideRst} UsersGuide.rst )
|
||||
add_dependencies ( pdf_UsersGuide ../etc/definitions.rst
|
||||
../etc/SoC-ReST.tex
|
||||
${usersGuideRst} )
|
||||
|
||||
add_custom_target ( pdf_PythonCpp ALL
|
||||
cd ${DOCUMENTATION_SOURCE_DIR}/PythonCpp
|
||||
&& ../etc/doPdf.sh ${pythonCppRst} PythonCpp.rst
|
||||
)
|
||||
add_dependencies ( pdf_PythonCpp ../etc/definitions.rst
|
||||
../etc/SoC-ReST.tex
|
||||
${pythonCppRst} )
|
||||
|
||||
add_custom_target ( pdf_RDS ALL
|
||||
cd ${DOCUMENTATION_SOURCE_DIR}/RDS
|
||||
&& ../etc/doPdf.sh ${rdsRst} RDS.rst
|
||||
)
|
||||
add_dependencies ( pdf_RDS ../etc/definitions.rst
|
||||
../etc/SoC-ReST.tex
|
||||
${pythonCppRst} )
|
||||
|
||||
install ( DIRECTORY _build/html/ DESTINATION ${htmlInstallDir} )
|
||||
install ( FILES RDS/RDS.pdf
|
||||
PythonCpp/PythonCpp.pdf
|
||||
UsersGuide/UsersGuide.pdf DESTINATION ${pdfInstallDir} )
|
||||
|
||||
endif(BUILD_DOC)
|
||||
|
||||
set ( htmlInstallDir share/doc/coriolis2/ )
|
||||
set ( latexInstallDir share/doc/coriolis2/ )
|
||||
|
||||
install ( FILES general-index.html DESTINATION ${htmlInstallDir} RENAME index.html )
|
||||
|
||||
|
|
|
@ -0,0 +1,20 @@
|
|||
.. Coriolis documentation master file, created by
|
||||
sphinx-quickstart on Mon Jul 10 15:08:36 2017.
|
||||
You can adapt this file completely to your liking, but it should at least
|
||||
contain the root `toctree` directive.
|
||||
|
||||
Comprenhensive Table of Contents
|
||||
================================
|
||||
|
||||
.. toctree::
|
||||
|
||||
UsersGuide/index.rst
|
||||
Stratus/Stratus.rst
|
||||
DpGen/DpGen.rst
|
||||
Patterns/Patterns.rst
|
||||
Hurricane/Hurricane.rst
|
||||
Viewer/Viewer.rst
|
||||
CrlCore/CrlCore.rst
|
||||
Unicorn/Unicorn.rst
|
||||
PythonCpp/index.rst
|
||||
RDS/index.rst
|
|
@ -0,0 +1,11 @@
|
|||
.. -*- Mode: rst -*-
|
||||
|
||||
.. include:: ../etc/definitions.rst
|
||||
|
||||
|
||||
====================
|
||||
CRL Core Reference
|
||||
====================
|
||||
|
||||
The CRL Core C++ API reference is generated by Doxygen_ and is
|
||||
available here: `CRL Core <file:../../crlcore/index.html>`_
|
|
@ -0,0 +1,11 @@
|
|||
.. -*- Mode: rst -*-
|
||||
|
||||
.. include:: ../etc/definitions.rst
|
||||
|
||||
|
||||
=================
|
||||
DpGen Reference
|
||||
=================
|
||||
|
||||
The DpGen extension of the Stratus Language reference is generated by LaTeX2HTML_ and is
|
||||
available here: `DpGen <file:../../dpgen/index.html>`_
|
|
@ -0,0 +1,11 @@
|
|||
.. -*- Mode: rst -*-
|
||||
|
||||
.. include:: ../etc/definitions.rst
|
||||
|
||||
|
||||
=====================
|
||||
Hurricane Reference
|
||||
=====================
|
||||
|
||||
The Hurricane C++ API reference is generated by Doxygen_ and is
|
||||
available here: `Hurricane <file:../../hurricane/index.html>`_
|
|
@ -0,0 +1,14 @@
|
|||
.. -*- Mode: rst -*-
|
||||
|
||||
.. include:: ../etc/definitions.rst
|
||||
|
||||
|
||||
=====================
|
||||
Katabatic Reference
|
||||
=====================
|
||||
|
||||
The Katabatic C++ API reference is generated by Doxygen_ and is
|
||||
available here: `Katana <file:../../katabatic/index.html>`_
|
||||
|
||||
.. note:: The Katabatic API has served as a base for it's
|
||||
mixed signal conterpart **Anabatic**.
|
|
@ -0,0 +1,14 @@
|
|||
.. -*- Mode: rst -*-
|
||||
|
||||
.. include:: ../etc/definitions.rst
|
||||
|
||||
|
||||
=================
|
||||
Kite Reference
|
||||
=================
|
||||
|
||||
The Kite C++ API reference is generated by Doxygen_ and is
|
||||
available here: `Kite <file:../../kite/index.html>`_
|
||||
|
||||
.. note:: The Kite API has also served has a base for it's
|
||||
mixed-signal conterpart Katana (:sc:`Kit[e]-Ana[logic]`).
|
|
@ -0,0 +1,153 @@
|
|||
# Makefile for Sphinx documentation
|
||||
#
|
||||
|
||||
# You can set these variables from the command line.
|
||||
SPHINXOPTS =
|
||||
SPHINXBUILD = sphinx-build
|
||||
PAPER =
|
||||
BUILDDIR = _build
|
||||
|
||||
# Internal variables.
|
||||
PAPEROPT_a4 = -D latex_paper_size=a4
|
||||
PAPEROPT_letter = -D latex_paper_size=letter
|
||||
ALLSPHINXOPTS = -d $(BUILDDIR)/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) .
|
||||
# the i18n builder cannot share the environment and doctrees with the others
|
||||
I18NSPHINXOPTS = $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) .
|
||||
|
||||
.PHONY: help clean html dirhtml singlehtml pickle json htmlhelp qthelp devhelp epub latex latexpdf text man changes linkcheck doctest gettext
|
||||
|
||||
help:
|
||||
@echo "Please use \`make <target>' where <target> is one of"
|
||||
@echo " html to make standalone HTML files"
|
||||
@echo " dirhtml to make HTML files named index.html in directories"
|
||||
@echo " singlehtml to make a single large HTML file"
|
||||
@echo " pickle to make pickle files"
|
||||
@echo " json to make JSON files"
|
||||
@echo " htmlhelp to make HTML files and a HTML help project"
|
||||
@echo " qthelp to make HTML files and a qthelp project"
|
||||
@echo " devhelp to make HTML files and a Devhelp project"
|
||||
@echo " epub to make an epub"
|
||||
@echo " latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter"
|
||||
@echo " latexpdf to make LaTeX files and run them through pdflatex"
|
||||
@echo " text to make text files"
|
||||
@echo " man to make manual pages"
|
||||
@echo " texinfo to make Texinfo files"
|
||||
@echo " info to make Texinfo files and run them through makeinfo"
|
||||
@echo " gettext to make PO message catalogs"
|
||||
@echo " changes to make an overview of all changed/added/deprecated items"
|
||||
@echo " linkcheck to check all external links for integrity"
|
||||
@echo " doctest to run all doctests embedded in the documentation (if enabled)"
|
||||
|
||||
clean:
|
||||
-rm -rf $(BUILDDIR)/*
|
||||
|
||||
html:
|
||||
$(SPHINXBUILD) -b html $(ALLSPHINXOPTS) $(BUILDDIR)/html
|
||||
@echo
|
||||
@echo "Build finished. The HTML pages are in $(BUILDDIR)/html."
|
||||
|
||||
dirhtml:
|
||||
$(SPHINXBUILD) -b dirhtml $(ALLSPHINXOPTS) $(BUILDDIR)/dirhtml
|
||||
@echo
|
||||
@echo "Build finished. The HTML pages are in $(BUILDDIR)/dirhtml."
|
||||
|
||||
singlehtml:
|
||||
$(SPHINXBUILD) -b singlehtml $(ALLSPHINXOPTS) $(BUILDDIR)/singlehtml
|
||||
@echo
|
||||
@echo "Build finished. The HTML page is in $(BUILDDIR)/singlehtml."
|
||||
|
||||
pickle:
|
||||
$(SPHINXBUILD) -b pickle $(ALLSPHINXOPTS) $(BUILDDIR)/pickle
|
||||
@echo
|
||||
@echo "Build finished; now you can process the pickle files."
|
||||
|
||||
json:
|
||||
$(SPHINXBUILD) -b json $(ALLSPHINXOPTS) $(BUILDDIR)/json
|
||||
@echo
|
||||
@echo "Build finished; now you can process the JSON files."
|
||||
|
||||
htmlhelp:
|
||||
$(SPHINXBUILD) -b htmlhelp $(ALLSPHINXOPTS) $(BUILDDIR)/htmlhelp
|
||||
@echo
|
||||
@echo "Build finished; now you can run HTML Help Workshop with the" \
|
||||
".hhp project file in $(BUILDDIR)/htmlhelp."
|
||||
|
||||
qthelp:
|
||||
$(SPHINXBUILD) -b qthelp $(ALLSPHINXOPTS) $(BUILDDIR)/qthelp
|
||||
@echo
|
||||
@echo "Build finished; now you can run "qcollectiongenerator" with the" \
|
||||
".qhcp project file in $(BUILDDIR)/qthelp, like this:"
|
||||
@echo "# qcollectiongenerator $(BUILDDIR)/qthelp/Coriolis.qhcp"
|
||||
@echo "To view the help file:"
|
||||
@echo "# assistant -collectionFile $(BUILDDIR)/qthelp/Coriolis.qhc"
|
||||
|
||||
devhelp:
|
||||
$(SPHINXBUILD) -b devhelp $(ALLSPHINXOPTS) $(BUILDDIR)/devhelp
|
||||
@echo
|
||||
@echo "Build finished."
|
||||
@echo "To view the help file:"
|
||||
@echo "# mkdir -p $$HOME/.local/share/devhelp/Coriolis"
|
||||
@echo "# ln -s $(BUILDDIR)/devhelp $$HOME/.local/share/devhelp/Coriolis"
|
||||
@echo "# devhelp"
|
||||
|
||||
epub:
|
||||
$(SPHINXBUILD) -b epub $(ALLSPHINXOPTS) $(BUILDDIR)/epub
|
||||
@echo
|
||||
@echo "Build finished. The epub file is in $(BUILDDIR)/epub."
|
||||
|
||||
latex:
|
||||
$(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex
|
||||
@echo
|
||||
@echo "Build finished; the LaTeX files are in $(BUILDDIR)/latex."
|
||||
@echo "Run \`make' in that directory to run these through (pdf)latex" \
|
||||
"(use \`make latexpdf' here to do that automatically)."
|
||||
|
||||
latexpdf:
|
||||
$(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex
|
||||
@echo "Running LaTeX files through pdflatex..."
|
||||
$(MAKE) -C $(BUILDDIR)/latex all-pdf
|
||||
@echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex."
|
||||
|
||||
text:
|
||||
$(SPHINXBUILD) -b text $(ALLSPHINXOPTS) $(BUILDDIR)/text
|
||||
@echo
|
||||
@echo "Build finished. The text files are in $(BUILDDIR)/text."
|
||||
|
||||
man:
|
||||
$(SPHINXBUILD) -b man $(ALLSPHINXOPTS) $(BUILDDIR)/man
|
||||
@echo
|
||||
@echo "Build finished. The manual pages are in $(BUILDDIR)/man."
|
||||
|
||||
texinfo:
|
||||
$(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo
|
||||
@echo
|
||||
@echo "Build finished. The Texinfo files are in $(BUILDDIR)/texinfo."
|
||||
@echo "Run \`make' in that directory to run these through makeinfo" \
|
||||
"(use \`make info' here to do that automatically)."
|
||||
|
||||
info:
|
||||
$(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo
|
||||
@echo "Running Texinfo files through makeinfo..."
|
||||
make -C $(BUILDDIR)/texinfo info
|
||||
@echo "makeinfo finished; the Info files are in $(BUILDDIR)/texinfo."
|
||||
|
||||
gettext:
|
||||
$(SPHINXBUILD) -b gettext $(I18NSPHINXOPTS) $(BUILDDIR)/locale
|
||||
@echo
|
||||
@echo "Build finished. The message catalogs are in $(BUILDDIR)/locale."
|
||||
|
||||
changes:
|
||||
$(SPHINXBUILD) -b changes $(ALLSPHINXOPTS) $(BUILDDIR)/changes
|
||||
@echo
|
||||
@echo "The overview file is in $(BUILDDIR)/changes."
|
||||
|
||||
linkcheck:
|
||||
$(SPHINXBUILD) -b linkcheck $(ALLSPHINXOPTS) $(BUILDDIR)/linkcheck
|
||||
@echo
|
||||
@echo "Link check complete; look for any errors in the above output " \
|
||||
"or in $(BUILDDIR)/linkcheck/output.txt."
|
||||
|
||||
doctest:
|
||||
$(SPHINXBUILD) -b doctest $(ALLSPHINXOPTS) $(BUILDDIR)/doctest
|
||||
@echo "Testing of doctests in the sources finished, look at the " \
|
||||
"results in $(BUILDDIR)/doctest/output.txt."
|
|
@ -0,0 +1,11 @@
|
|||
.. -*- Mode: rst -*-
|
||||
|
||||
.. include:: ../etc/definitions.rst
|
||||
|
||||
|
||||
====================
|
||||
Patterns Reference
|
||||
====================
|
||||
|
||||
The Patterns extension of the Stratus Language reference is generated by LaTeX2HTML_ and is
|
||||
available here: `Patterns <file:../../patterns/index.html>`_
|
|
@ -1,39 +0,0 @@
|
|||
# -*- mode: CMAKE; explicit-buffer-name: "CMakeLists.txt<PythonCpp>" -*-
|
||||
|
||||
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} )
|
|
@ -0,0 +1,42 @@
|
|||
.. -*- Mode: rst -*-
|
||||
|
||||
.. include:: ../etc/definitions.rst
|
||||
|
||||
|
||||
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-block:: 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.
|
||||
)
|
|
@ -0,0 +1,439 @@
|
|||
.. -*- Mode: rst -*-
|
||||
|
||||
.. include:: ../etc/definitions.rst
|
||||
|
||||
|
||||
|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 the 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 :ref:`3.1`
|
||||
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-block:: 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 :ref:`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-block:: 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<Horizontal*>(entity);
|
||||
if (horizontal) return PyHorizontal_Link( horizontal );
|
||||
|
||||
Vertical* vertical = dynamic_cast<Vertical*>(entity);
|
||||
if (vertical) return PyVertical_Link( vertical );
|
||||
|
||||
Contact* contact = dynamic_cast<Contact*>(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 :ref:`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-block:: 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<Component*>(PYCOMPONENT(v)->_baseObject._object))
|
||||
|
||||
} // extern "C".
|
||||
} // Isobar namespace.
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
4.4 Intermediate Class File
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
Changes from :ref:`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-block:: 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-block:: 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-block:: 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-block:: 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 , "<Entity>" , false ); // step 3.
|
||||
__cs.addType( "comp" , &PyTypeComponent, "<Component>", false, "ent" );
|
||||
__cs.addType( "contact", &PyTypeContact , "<Contact>" , 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.
|
||||
}
|
|
@ -0,0 +1,395 @@
|
|||
.. -*- Mode: rst -*-
|
||||
|
||||
.. include:: ../etc/definitions.rst
|
||||
|
||||
|
||||
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:
|
||||
|
||||
.. _3.1 Class Associated Header File:
|
||||
|
||||
3.1 Class Associated Header File
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
Here is the typical content of a header file (for ``PyLibrary``):
|
||||
|
||||
.. code-block:: 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 Class Associated File
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
3.2.1 Head of the file
|
||||
------------------------
|
||||
|
||||
.. code-block:: 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-block:: 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-block:: 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-block:: 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-block:: 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 <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-block:: 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-block:: 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-block:: c++
|
||||
|
||||
DL_EXPORT(void) initHurricane ()
|
||||
{
|
||||
PyLibrary_LinkPyType(); // step 1.
|
||||
|
||||
PYTYPE_READY( Library ) // step 2.
|
||||
|
||||
__cs.addType( "library", &PyTypeLibrary, "<Library>", 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-block:: python
|
||||
|
||||
import Hurricane
|
||||
lib = Hurricane.Library.create( db, 'root' )
|
|
@ -0,0 +1,67 @@
|
|||
.. -*- Mode: rst -*-
|
||||
|
||||
.. include:: ../etc/definitions.rst
|
||||
|
||||
|
||||
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-block:: c++
|
||||
|
||||
DirectSetLongAttribute(PyPoint_SetX,setX,PyPoint,Point)
|
||||
|
||||
|newpage|
|
||||
|
||||
We would get:
|
||||
|
||||
.. code-block:: c++
|
||||
|
||||
static PyObject* PyPoint_setX ( PyPoint *self, PyObject* args )
|
||||
{
|
||||
Point* cobject = static_cast<Point*>( 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-block:: c++
|
||||
|
||||
DirectGetLongAttribute(PyPoint_GetX,getX,PyPoint,Point)
|
||||
|
||||
We would get:
|
||||
|
||||
.. code-block:: c++
|
||||
|
||||
static PyObject* PyPoint_GetX ( PyPoint *self, PyObject* args )
|
||||
{
|
||||
Point* cobject = static_cast<Point*>( 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());
|
||||
}
|
|
@ -0,0 +1,185 @@
|
|||
.. -*- Mode: rst -*-
|
||||
|
||||
.. include:: ../etc/definitions.rst
|
||||
|
||||
|
||||
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-block:: 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-block:: 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 );
|
||||
}
|
|
@ -0,0 +1,9 @@
|
|||
.. -*- Mode: rst -*-
|
||||
|
||||
.. include:: ../etc/definitions.rst
|
||||
|
||||
|
||||
7. No C++ Hurricane::Name encapsulation
|
||||
==========================================
|
||||
|
||||
To be written.
|
|
@ -0,0 +1,171 @@
|
|||
.. -*- Mode: rst -*-
|
||||
|
||||
.. include:: ../etc/definitions.rst
|
||||
|
||||
|
||||
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 :ref:`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-block:: 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 :ref:`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-block:: 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.
|
Binary file not shown.
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,23 @@
|
|||
.. -*- mode: rst; explicit-buffer-name: "index.rst<PythonCpp>" -*-
|
||||
|
||||
.. include:: ../etc/definitions.rst
|
||||
|
||||
|
||||
===================================
|
||||
Hurricane Python/C++ API Tutorial
|
||||
===================================
|
||||
|
||||
Printable version of this document `PythonCpp.pdf <../../../pdf/main/PythonCpp.pdf>`_.
|
||||
|
||||
|
||||
.. toctree::
|
||||
:maxdepth: 2
|
||||
|
||||
Introduction.rst
|
||||
Configuration.rst
|
||||
DBoStandalone.rst
|
||||
DBoHierarchy.rst
|
||||
NonDBo.rst
|
||||
DbU.rst
|
||||
Name.rst
|
||||
|
|
@ -0,0 +1,15 @@
|
|||
.. -*- Mode: rst -*-
|
||||
|
||||
.. include:: ../etc/definitions.rst
|
||||
|
||||
|
||||
===================================
|
||||
Hurricane Python/C++ API Tutorial
|
||||
===================================
|
||||
|
||||
|pagestylefancy|
|
||||
|
||||
|
||||
.. contents::
|
||||
|
||||
|newpage|
|
|
@ -1,22 +0,0 @@
|
|||
.. -*- Mode: rst -*-
|
||||
|
||||
.. role:: raw-html(raw)
|
||||
:format: html
|
||||
|
||||
.. URLs that changes between the various backends.
|
||||
|
||||
.. For HTML backend
|
||||
|
||||
.. Stand-alone images.
|
||||
.. |RDS_VW| replace:: :raw-html:`<center><img src="./images/RDS_VW.png" alt="RDS Variable Width Rule"></center>`
|
||||
.. |RDS_LCW| replace:: :raw-html:`<center><img src="./images/RDS_LCW.png" alt="RDS Left Constant Width Rule"></center>`
|
||||
.. |SegmentOrientation| replace:: :raw-html:`<center><img src="./images/SegmentOrientation.png" alt="Symbolic Segment Orientations"></center>`
|
||||
.. |BIGVIA_1| replace:: :raw-html:`<center><img src="./images/bigvia-1.png" alt="BIGVIA holes"></center>`
|
||||
.. |BIGVIA_2| replace:: :raw-html:`<center><img src="./images/bigvia-2.png" alt="BIGVIA holes overlap"></center>`
|
||||
|
||||
.. Direct LaTeX commands encapsulation.
|
||||
.. |dotfill| replace:: :raw-html:` `
|
||||
.. |noindent| replace:: :raw-html:`<p class="empty"></p>`
|
||||
.. |medskip| replace:: :raw-html:`<br>`
|
||||
.. |newpage| replace:: :raw-html:`<br>`
|
||||
|
|
@ -1,25 +0,0 @@
|
|||
|
||||
.. -*- Mode: rst -*-
|
||||
|
||||
.. role:: raw-latex(raw)
|
||||
:format: latex
|
||||
|
||||
.. URLs that changes between the various backends.
|
||||
|
||||
.. |DONE| replace:: :raw-latex:`\marginpar{\fbox{\small\ding{56}}}`
|
||||
|
||||
.. For LaTeX/PDF backend.
|
||||
|
||||
.. Stand-alone images.
|
||||
.. |RDS_VW| replace:: :raw-latex:`\begin{center}\fbox{\includegraphics[width=.7\textwidth]{./images/RDS_VW.eps}}\end{center}`
|
||||
.. |RDS_LCW| replace:: :raw-latex:`\begin{center}\fbox{\includegraphics[width=.4\textwidth]{./images/RDS_LCW.eps}}\end{center}`
|
||||
.. |SegmentOrientation| replace:: :raw-latex:`\begin{center}\fbox{\includegraphics[width=.5\textwidth]{./images/SegmentOrientation.eps}}\end{center}`
|
||||
.. |BIGVIA_1| replace:: :raw-latex:`\begin{center}\fbox{\includegraphics[width=.5\textwidth]{./images/bigvia-1.eps}}\end{center}`
|
||||
.. |BIGVIA_2| replace:: :raw-latex:`\begin{center}\fbox{\includegraphics[width=.5\textwidth]{./images/bigvia-2.eps}}\end{center}`
|
||||
|
||||
.. Direct LaTeX commands encapsulation.
|
||||
.. |dotfill| replace:: :raw-latex:`\dotfill`
|
||||
.. |noindent| replace:: :raw-latex:`\noindent`
|
||||
.. |medskip| replace:: :raw-latex:`\medskip`
|
||||
.. |newpage| replace:: :raw-latex:`\newpage`
|
||||
|
File diff suppressed because it is too large
Load Diff
Binary file not shown.
|
@ -1,5 +0,0 @@
|
|||
|
||||
.. -*- Mode: rst -*-
|
||||
|
||||
.. include:: HTML_defs.rst
|
||||
.. include:: RDS.rst
|
|
@ -1,4 +0,0 @@
|
|||
.. -*- Mode: rst -*-
|
||||
|
||||
.. include:: LaTeX_defs.rst
|
||||
.. include:: RDS.rst
|
|
@ -1,18 +1,7 @@
|
|||
.. -*- Mode: rst -*-
|
||||
|
||||
.. role:: ul
|
||||
.. role:: cb
|
||||
.. role:: sc
|
||||
.. role:: fboxtt
|
||||
.. include:: ../etc/definitions.rst
|
||||
|
||||
.. Acronyms & names.
|
||||
.. |GNU| replace:: :sc:`gnu`
|
||||
.. |LGPL| replace:: :sc:`lgpl`
|
||||
.. |GPL| replace:: :sc:`gpl`
|
||||
.. |UPMC| replace:: :sc:`upmc`
|
||||
.. |Alliance| replace:: :sc:`Alliance`
|
||||
.. |MBK| replace:: :sc:`mbk`
|
||||
.. |RDS| replace:: :sc:`rds`
|
||||
|
||||
.. Tools
|
||||
.. |ocp| replace:: ``ocp``
|
||||
|
@ -48,7 +37,6 @@
|
|||
.. |PTIE| replace:: ``PTIE``
|
||||
.. |NDIF| replace:: ``NDIF``
|
||||
.. |PDIF| replace:: ``PDIF``
|
||||
.. |NWELL| replace:: ``NWELL``
|
||||
.. |PWELL| replace:: ``PWELL``
|
||||
.. |NTRANS| replace:: ``NTRANS``
|
||||
.. |PTRANS| replace:: ``PTRANS``
|
||||
|
@ -68,26 +56,33 @@
|
|||
.. |RDS_POLY| replace:: ``RDS_POLY``
|
||||
.. |RDS_ALU1| replace:: ``RDS_ALU1``
|
||||
|
||||
.. Stand-alone images.
|
||||
.. |RDS_VW| image:: ./images/RDS_VW.png
|
||||
:alt: RDS Variable Width Rule
|
||||
:align: middle
|
||||
:width: 60%
|
||||
|
||||
:Date: 26, september 2014
|
||||
:Authors: Jean-Paul Chaput
|
||||
:Contact: <alliance-users@soc.lip6.fr>
|
||||
:Version: 0.2
|
||||
.. |RDS_LCW| image:: ./images/RDS_LCW.png
|
||||
:alt: RDS Left Constant Width Rule
|
||||
:align: middle
|
||||
:width: 40%
|
||||
|
||||
|medskip|
|
||||
.. |SegmentOrientation| image:: ./images/SegmentOrientation.png
|
||||
:alt: Symbolic Segment Orientations
|
||||
:align: middle
|
||||
:width: 50%
|
||||
|
||||
**Disclaimer:** This document is still far from complete.
|
||||
.. |BIGVIA_1| image:: ./images/bigvia-1.png
|
||||
:alt: BIGVIA holes
|
||||
:align: middle
|
||||
:width: 40%
|
||||
|
||||
|medskip|
|
||||
|
||||
=========================================
|
||||
Symbolic to Real Conversion In Alliance
|
||||
=========================================
|
||||
.. |BIGVIA_2| image:: ./images/bigvia-2.png
|
||||
:alt: BIGVIA holes overlap
|
||||
:align: middle
|
||||
:width: 40%
|
||||
|
||||
|
||||
.. contents::
|
||||
|
||||
|medskip|
|
||||
|
||||
|newpage|
|
||||
|
||||
|
@ -189,7 +184,7 @@ In |Alliance|, segments are oriented (up, down, left, right). This disambiguate
|
|||
the left or right side when using the ``LCW`` and ``RCW`` rules in the |RDS| file.
|
||||
It allows to generate, if needed, asymetric object in the real layout file.
|
||||
|
||||
|SegmentOrientation|
|
||||
|bcenter| |SegmentOrientation| |ecenter|
|
||||
|
||||
|newpage|
|
||||
|
||||
|
@ -261,14 +256,14 @@ The translation method of a symbolic segment is as follow:
|
|||
original one. In those rules, the third number is not used, it is only here
|
||||
to make the life easier for the parser...
|
||||
|
||||
|RDS_VW|
|
||||
|bcenter| |RDS_VW| |ecenter|
|
||||
|
||||
* |LCW| or |RCW| for Left/Right Constant Width, create an off-center rectangle
|
||||
of fixed width relatively to the real segment. Note that the ``SP`` number
|
||||
is the distance *between the edge* of the real segment and the edge of the
|
||||
generated real rectangle (*not* from the axis). It is often zero.
|
||||
|
||||
|RDS_LCW|
|
||||
|bcenter| |RDS_LCW| |ecenter|
|
||||
|
||||
|
||||
|newpage|
|
||||
|
@ -383,11 +378,11 @@ The |MBK_TO_RDS_BIGVIA_HOLE| table define the global hole matrix for the whole
|
|||
design. The first number is the individual hole side and the second the grid step
|
||||
(edge to edge). The figure below show the hole generation.
|
||||
|
||||
|BIGVIA_1|
|
||||
|bcenter| |BIGVIA_1| |ecenter|
|
||||
|
||||
Example of BIGVIA overlap:
|
||||
|
||||
|BIGVIA_2|
|
||||
|bcenter| |BIGVIA_2| |ecenter|
|
||||
|
||||
Example: ::
|
||||
|
||||
|
@ -407,8 +402,6 @@ Example: ::
|
|||
``1.5 * step``, the BIGVIA is demoted to a simple VIA.
|
||||
|
||||
|
||||
|newpage|
|
||||
|
||||
The |MBK_TO_RDS_BIGVIA_METAL| table
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
|
@ -438,12 +431,9 @@ Example: ::
|
|||
|
||||
CONT_VIA5 RDS_ALU5 0.0 0.09 ALL \
|
||||
RDS_ALU6 0.0 0.18 ALL
|
||||
|
||||
END
|
||||
|
||||
|
||||
|newpage|
|
||||
|
||||
The |MBK_WIRESETTING| table
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
|
@ -1,750 +0,0 @@
|
|||
|
||||
html, body, th, td, tr, p, li, h1, h2, h3, h4, h5, h6 {
|
||||
font-size: 96%;
|
||||
font-family: "Open Sans", verdana, sans-serif;
|
||||
}
|
||||
|
||||
p, li {
|
||||
text-align: justify;
|
||||
}
|
||||
|
||||
.sc {
|
||||
font-variant: small-caps;
|
||||
font-size: 120%;
|
||||
}
|
||||
|
||||
h1, h2, h3, h4, h5, h6 {
|
||||
font-family: "Open Sans", verdana, sans-serif;
|
||||
}
|
||||
|
||||
h1 { text-align: center;
|
||||
border-top: 2px solid #09550b;
|
||||
border-bottom: 2px solid #09550b;
|
||||
padding-top: 7pt;
|
||||
padding-bottom: 7pt;
|
||||
}
|
||||
h2, h3, h4, h5, h6 { text-align: left; }
|
||||
h1, h2, h3 { font-family: "Open Sans";
|
||||
}
|
||||
h1 { font-weight: normal; font-size: 170%; padding-top: 7pt; margin-top: 25pt; }
|
||||
h2 { font-weight: normal; font-size: 140%; padding-top: 7pt; margin-top: 25pt; }
|
||||
h3 { font-weight: bold; font-size: 118%; padding-top: 7pt; margin-top: 25pt; }
|
||||
h4 { font-weight: bold; font-size: 100%; }
|
||||
h5 { font-style: italic; font-size: 100%; }
|
||||
h6 { font-variant: small-caps; font-size: 100%; }
|
||||
|
||||
body {
|
||||
color: black;
|
||||
background: white;
|
||||
/*
|
||||
background: #09550B;
|
||||
background-color: white;
|
||||
*/
|
||||
background-position: top left;
|
||||
background-attachment: fixed;
|
||||
background-repeat: no-repeat;
|
||||
margin: 0 0 0 0;
|
||||
padding: 20pt;
|
||||
width: 550pt;
|
||||
margin-right: auto;
|
||||
margin-left: auto;
|
||||
margin-top: 20pt;
|
||||
margin-bottom: 20pt;
|
||||
-moz-box-shadow: 4px 4px 5px 3px #ccc;
|
||||
-webkit-box-shadow: 4px 4px 5px 3px #ccc;
|
||||
box-shadow: 4px 4px 5px 3px #ccc;
|
||||
}
|
||||
|
||||
hr {
|
||||
color: #09550b;
|
||||
border: 1px dotted #09550b;
|
||||
border-style: none none dotted;
|
||||
padding-top: 10pt;
|
||||
padding-bottom: 10pt;
|
||||
}
|
||||
|
||||
div#contents {
|
||||
margin: 30pt;
|
||||
padding: 2pt 10pt;
|
||||
background-color: #fff676;
|
||||
-moz-box-shadow: 4px 4px 5px 2px #ccc;
|
||||
-webkit-box-shadow: 4px 4px 5px 2px #ccc;
|
||||
box-shadow: 4px 4px 5px 2px #ccc;
|
||||
|
||||
/* 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
|
||||
*/
|
||||
}
|
||||
|
||||
|
||||
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, 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: #09550b;
|
||||
border-bottom: 1px dotted #09550b;
|
||||
}
|
||||
|
||||
a:hover, a:focus, a:visited {
|
||||
font-weight: normal;
|
||||
font-style: italic;
|
||||
text-decoration: none;
|
||||
/*
|
||||
color: #A40010;
|
||||
border-bottom: 1px dotted #A40010;
|
||||
*/
|
||||
color: #09550b;
|
||||
border-bottom: 1px dotted #09550b;
|
||||
}
|
||||
|
||||
h1 a:link {
|
||||
border-bottom: 0px;
|
||||
}
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
div#header {
|
||||
margin: 0px;
|
||||
padding: 0pt;
|
||||
background-color: white;
|
||||
display: inline-block;
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
div#header_logo {
|
||||
margin: 0px;
|
||||
padding: 10px 0px 10px 12pt;
|
||||
background-color: white;
|
||||
width: 40%;
|
||||
float: left;
|
||||
}
|
||||
|
||||
div#header_menus {
|
||||
background-color: white;
|
||||
width: 55%;
|
||||
float: right;
|
||||
padding-top: 60pt;
|
||||
padding-right: 10pt;
|
||||
text-align: right;
|
||||
font-size: 80%;
|
||||
}
|
||||
|
||||
div#header_menus ul {
|
||||
padding-top: 45pt;
|
||||
list-style: none;
|
||||
text-align: right;
|
||||
font-size: 80%;
|
||||
}
|
||||
|
||||
div#header_menus li {
|
||||
padding: 0pt;
|
||||
margin: 0pt;
|
||||
display: inline;
|
||||
white-space: nowrap;
|
||||
}
|
||||
|
||||
/*
|
||||
div#header_menus a {
|
||||
border-left: 1px solid #d7d7d7;
|
||||
padding: 0 .75em;
|
||||
}
|
||||
|
||||
div#header_menus a.first {
|
||||
border-left: none;
|
||||
}
|
||||
*/
|
||||
|
||||
div#header a:link, div#header a:active, div#header a:visited {
|
||||
margin: 0pt;
|
||||
padding: 0pt 5pt;
|
||||
font-weight: normal;
|
||||
color: black;
|
||||
text-decoration: none;
|
||||
border-bottom: 1px solid black;
|
||||
border-left: 0px;
|
||||
border-right: 0px;
|
||||
}
|
||||
|
||||
div#header a:hover, div#header a:focus {
|
||||
margin: 0pt;
|
||||
padding: 0pt 5pt;
|
||||
font-weight: normal;
|
||||
color: black;
|
||||
text-decoration: none;
|
||||
border-bottom: 4px solid #09550b;
|
||||
border-left: 0px;
|
||||
border-right: 0px;
|
||||
}
|
||||
|
||||
div#header a.current:link, div#header a.current:active, div#header a.current:visited {
|
||||
margin: 0pt;
|
||||
padding: 0pt 5pt;
|
||||
font-weight: bold;
|
||||
font-style: normal;
|
||||
font-size: 120%;
|
||||
color: white;
|
||||
text-decoration: none;
|
||||
border-bottom: 4px solid #09550b;
|
||||
border-left: 0px;
|
||||
border-right: 0px;
|
||||
background-color: #09550b;
|
||||
}
|
||||
|
||||
div#header a.current:hover, div#header a.current:focus {
|
||||
margin: 0pt;
|
||||
padding: 0pt 5pt;
|
||||
font-weight: bold;
|
||||
font-style: normal;
|
||||
font-size: 120%;
|
||||
color: white;
|
||||
text-decoration: none;
|
||||
border-bottom: 4px solid #09550b;
|
||||
border-left: 0px;
|
||||
border-right: 0px;
|
||||
background-color: #09550b;
|
||||
}
|
||||
|
||||
div#header_ancestors {
|
||||
padding: 4px 0px 4px 12pt;
|
||||
background-color: #09550B;
|
||||
color: white;
|
||||
}
|
||||
|
||||
div#header_ancestors ul, div#header_ancestors * li {
|
||||
display: inline;
|
||||
list-style-type: none;
|
||||
padding: 0px 0px 0px 0pt;
|
||||
}
|
||||
|
||||
div#header_ancestors a:link, div#header_ancestors a:active, div#header_ancestors a:visited {
|
||||
font-weight: bold;
|
||||
color: white;
|
||||
text-decoration: none;
|
||||
border-bottom: 0px;
|
||||
}
|
||||
|
||||
div#header_ancestors a:hover, div#header_ancestors a:focus {
|
||||
font-weight: bold;
|
||||
color: white;
|
||||
text-decoration: underline;
|
||||
}
|
||||
|
||||
div#footer {
|
||||
margin: 0px;
|
||||
padding: 0px;
|
||||
border-top: 1px dotted #09550b;
|
||||
background-color: white;
|
||||
display: inline-block;
|
||||
width: 100%;
|
||||
text-align: right;
|
||||
}
|
||||
|
||||
div#searchform {
|
||||
width: 80%;
|
||||
background-color: #ccffcd;
|
||||
padding: 15pt 10pt 15pt 10pt;
|
||||
margin-top: 50pt;
|
||||
margin-bottom: 50pt;
|
||||
margin-left: auto;
|
||||
margin-right: auto;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
div#searchform input#id_q {
|
||||
background-color: white;
|
||||
border: 1px solid #09550b;
|
||||
padding: 2pt;
|
||||
width: 80%;
|
||||
font-size: 110%;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
span.queryref {
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
div#searchform ul {
|
||||
list-style: none;
|
||||
}
|
||||
|
||||
div#searchform li {
|
||||
display: inline;
|
||||
}
|
||||
|
||||
hr#search_vs_results {
|
||||
color: #09550b;
|
||||
border: 2px dotted #09550b;
|
||||
border-style: none none dotted;
|
||||
margin-top: 0pt;
|
||||
margin-bottom: 20pt;
|
||||
}
|
||||
|
||||
div#search_results {
|
||||
width: 85%;
|
||||
margin: auto;
|
||||
}
|
||||
|
||||
div#sidebar hr#separator {
|
||||
color: white;
|
||||
border: 0px;
|
||||
margin-top: 0pt;
|
||||
margin-bottom: 20pt;
|
||||
}
|
||||
|
||||
img.footer-logo {
|
||||
height: 24px;
|
||||
padding: 0px 2px;
|
||||
}
|
||||
|
||||
hr#site_vs_page {
|
||||
color: white;
|
||||
border: 3px dotted white;
|
||||
border-style: none none dotted;
|
||||
margin-top: 20pt;
|
||||
margin-bottom: 20pt;
|
||||
}
|
||||
|
||||
div#sidebar {
|
||||
/*
|
||||
background: #09550B;
|
||||
background: #ccffcd;
|
||||
*/
|
||||
background: white;
|
||||
}
|
||||
|
||||
div#sidebar div#sitemenu, div#sidebar div#pagemenu {
|
||||
/*
|
||||
background: white;
|
||||
*/
|
||||
background: #09550b;
|
||||
width: 85%;
|
||||
margin: auto;
|
||||
padding: 5pt 10pt;
|
||||
}
|
||||
|
||||
div#sidebar * li {
|
||||
text-align: left;
|
||||
}
|
||||
|
||||
div#sidebar * ul {
|
||||
list-style-type: square;
|
||||
padding-left: 12pt;
|
||||
}
|
||||
|
||||
div#sitemenu ul {
|
||||
list-style-type: none;
|
||||
padding-left: 0pt;
|
||||
}
|
||||
|
||||
div#sitemenu ul ul {
|
||||
list-style-type: none;
|
||||
padding-left: 0pt;
|
||||
}
|
||||
|
||||
div#sitemenu ul ul ul {
|
||||
list-style-type: square;
|
||||
padding-left: 12pt;
|
||||
}
|
||||
|
||||
div#sitemenu ul li ul li {
|
||||
padding-top: 3pt;
|
||||
padding-bottom: 5pt;
|
||||
border-top: 1px dotted white;
|
||||
}
|
||||
|
||||
div#sitemenu ul li ul li ul li {
|
||||
border-top: none;
|
||||
padding-top: 1pt;
|
||||
padding-bottom: 1pt;
|
||||
}
|
||||
|
||||
div#sitemenu ul li a:link,
|
||||
div#sitemenu ul li a:active,
|
||||
div#sitemenu ul lu a:visited
|
||||
{
|
||||
font-size: 140%;
|
||||
font-weight: bold;
|
||||
border-bottom: none;
|
||||
}
|
||||
|
||||
div#sitemenu ul li a:focus,
|
||||
div#sitemenu ul lu a:hover
|
||||
{
|
||||
font-size: 140%;
|
||||
font-weight: bold;
|
||||
font-style: italic;
|
||||
border-bottom: none;
|
||||
}
|
||||
|
||||
div#sitemenu ul ul li a:link,
|
||||
div#sitemenu ul ul li a:active,
|
||||
div#sitemenu ul ul lu a:visited,
|
||||
div#sitemenu ul ul li a:focus,
|
||||
div#sitemenu ul ul lu a:hover
|
||||
{
|
||||
font-size: 90%;
|
||||
font-weight: normal;
|
||||
border-bottom: none;
|
||||
/*border-bottom: 1px dotted white;*/
|
||||
}
|
||||
|
||||
div#pagemenu ul {
|
||||
list-style-type: none;
|
||||
padding-left: 0pt;
|
||||
}
|
||||
|
||||
div#pagemenu ul ul {
|
||||
list-style-type: none;
|
||||
padding-left: 0pt;
|
||||
}
|
||||
|
||||
div#pagemenu ul ul ul {
|
||||
padding-left: 12pt;
|
||||
}
|
||||
|
||||
div#pagemenu ul li ul li {
|
||||
padding-top: 3pt;
|
||||
padding-bottom: 5pt;
|
||||
border-top: 1px dotted white;
|
||||
}
|
||||
|
||||
div#pagemenu ul li ul li ul li {
|
||||
border-top: none;
|
||||
padding-top: 1pt;
|
||||
padding-bottom: 1pt;
|
||||
}
|
||||
|
||||
div#pagemenu ul li a:link,
|
||||
div#pagemenu ul li a:active,
|
||||
div#pagemenu ul lu a:visited
|
||||
{
|
||||
font-size: 120%;
|
||||
font-weight: bold;
|
||||
border-bottom: none;
|
||||
}
|
||||
|
||||
div#pagemenu ul li a:focus,
|
||||
div#pagemenu ul lu a:hover
|
||||
{
|
||||
font-size: 120%;
|
||||
font-weight: bold;
|
||||
font-style: italic;
|
||||
border-bottom: none;
|
||||
}
|
||||
|
||||
div#pagemenu ul ul li a:link,
|
||||
div#pagemenu ul ul li a:active,
|
||||
div#pagemenu ul ul lu a:visited,
|
||||
div#pagemenu ul ul li a:focus,
|
||||
div#pagemenu ul ul lu a:hover
|
||||
{
|
||||
font-size: 90%;
|
||||
font-weight: normal;
|
||||
border-bottom: none;
|
||||
/*
|
||||
border-bottom: 1px dotted white;
|
||||
*/
|
||||
}
|
||||
|
||||
|
||||
div#sidebar ul.ancestor * li {
|
||||
padding-top: 0pt;
|
||||
}
|
||||
|
||||
div#sidebar ul {
|
||||
padding-bottom: 8pt;
|
||||
}
|
||||
|
||||
div#sidebar a:link, div#sidebar a:active, div#sidebar a:visited {
|
||||
/*
|
||||
font-weight: normal;
|
||||
*/
|
||||
color: white;
|
||||
text-align: left;
|
||||
text-decoration: none;
|
||||
border-bottom: 1px dotted white;
|
||||
}
|
||||
|
||||
div#sidebar a:hover, div#sidebar a:focus {
|
||||
/*
|
||||
font-weight: normal;
|
||||
*/
|
||||
color: white;
|
||||
text-align: left;
|
||||
text-decoration: none;
|
||||
border-bottom: 1px dotted white;
|
||||
}
|
||||
|
||||
div#main {
|
||||
border-left: 1px solid #09550b;
|
||||
}
|
||||
|
||||
div#main ul#summary {
|
||||
list-style-type: square;
|
||||
padding-left: 12pt;
|
||||
font-size: 14pt;
|
||||
}
|
||||
|
||||
div#main ul#summary * ul {
|
||||
padding-left: 12pt;
|
||||
padding-bottom: 14pt;
|
||||
font-size: 95%;
|
||||
}
|
||||
|
||||
div.code * {
|
||||
background-color: #FCFCE1;
|
||||
}
|
||||
|
||||
div.note {
|
||||
margin: 8px 2% 0px 2%;
|
||||
border: 1px none #fff01c;
|
||||
border-left-width: 4px;
|
||||
border-left-style: solid;
|
||||
padding: 1px 10pt 1px 55px;
|
||||
background: #fff676 url('./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('./images/i-core.png') no-repeat 0% 50%;;
|
||||
font-size: 90%
|
||||
}
|
||||
|
||||
p.admonition-title {
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
div.topic {
|
||||
margin: 5pt;
|
||||
padding: 2pt 10pt;
|
||||
background-color: fff676;
|
||||
}
|
||||
|
||||
div.topic p.first {
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
table.wiki th, table th {
|
||||
color: black;
|
||||
background: #FFFFCC;
|
||||
}
|
||||
|
||||
table.docutils {
|
||||
margin-left: 10%;
|
||||
margin-right: 10%;
|
||||
}
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
#sidebar {
|
||||
float: left;
|
||||
width: 29.9%;
|
||||
padding: 0 0 0 0;
|
||||
margin: 0 0 0 0;
|
||||
color: white;
|
||||
background: #09550B;
|
||||
/*
|
||||
min-height: 300px;
|
||||
background: #f2f2f2;
|
||||
border-right: 1px solid #ccc;
|
||||
padding: 0 0 0 10px;
|
||||
*/
|
||||
}
|
Binary file not shown.
|
@ -1,238 +0,0 @@
|
|||
%!PS-Adobe-2.0 EPSF-2.0
|
||||
%%Title: RDS_LCW.fig
|
||||
%%Creator: fig2dev Version 3.2 Patchlevel 5
|
||||
%%CreationDate: Mon Sep 15 18:23:48 2014
|
||||
%%For: jpc@lepka (Jean-Paul Chaput)
|
||||
%%BoundingBox: 0 0 233 348
|
||||
%Magnification: 0.8000
|
||||
%%EndComments
|
||||
/$F2psDict 200 dict def
|
||||
$F2psDict begin
|
||||
$F2psDict /mtrx matrix put
|
||||
/col-1 {0 setgray} bind def
|
||||
/col0 {0.000 0.000 0.000 srgb} bind def
|
||||
/col1 {0.000 0.000 1.000 srgb} bind def
|
||||
/col2 {0.000 1.000 0.000 srgb} bind def
|
||||
/col3 {0.000 1.000 1.000 srgb} bind def
|
||||
/col4 {1.000 0.000 0.000 srgb} bind def
|
||||
/col5 {1.000 0.000 1.000 srgb} bind def
|
||||
/col6 {1.000 1.000 0.000 srgb} bind def
|
||||
/col7 {1.000 1.000 1.000 srgb} bind def
|
||||
/col8 {0.000 0.000 0.560 srgb} bind def
|
||||
/col9 {0.000 0.000 0.690 srgb} bind def
|
||||
/col10 {0.000 0.000 0.820 srgb} bind def
|
||||
/col11 {0.530 0.810 1.000 srgb} bind def
|
||||
/col12 {0.000 0.560 0.000 srgb} bind def
|
||||
/col13 {0.000 0.690 0.000 srgb} bind def
|
||||
/col14 {0.000 0.820 0.000 srgb} bind def
|
||||
/col15 {0.000 0.560 0.560 srgb} bind def
|
||||
/col16 {0.000 0.690 0.690 srgb} bind def
|
||||
/col17 {0.000 0.820 0.820 srgb} bind def
|
||||
/col18 {0.560 0.000 0.000 srgb} bind def
|
||||
/col19 {0.690 0.000 0.000 srgb} bind def
|
||||
/col20 {0.820 0.000 0.000 srgb} bind def
|
||||
/col21 {0.560 0.000 0.560 srgb} bind def
|
||||
/col22 {0.690 0.000 0.690 srgb} bind def
|
||||
/col23 {0.820 0.000 0.820 srgb} bind def
|
||||
/col24 {0.500 0.190 0.000 srgb} bind def
|
||||
/col25 {0.630 0.250 0.000 srgb} bind def
|
||||
/col26 {0.750 0.380 0.000 srgb} bind def
|
||||
/col27 {1.000 0.500 0.500 srgb} bind def
|
||||
/col28 {1.000 0.630 0.630 srgb} bind def
|
||||
/col29 {1.000 0.750 0.750 srgb} bind def
|
||||
/col30 {1.000 0.880 0.880 srgb} bind def
|
||||
/col31 {1.000 0.840 0.000 srgb} bind def
|
||||
|
||||
end
|
||||
save
|
||||
newpath 0 348 moveto 0 0 lineto 233 0 lineto 233 348 lineto closepath clip newpath
|
||||
-114.1 389.4 translate
|
||||
1 -1 scale
|
||||
|
||||
/cp {closepath} bind def
|
||||
/ef {eofill} bind def
|
||||
/gr {grestore} bind def
|
||||
/gs {gsave} bind def
|
||||
/sa {save} bind def
|
||||
/rs {restore} bind def
|
||||
/l {lineto} bind def
|
||||
/m {moveto} bind def
|
||||
/rm {rmoveto} bind def
|
||||
/n {newpath} bind def
|
||||
/s {stroke} bind def
|
||||
/sh {show} bind def
|
||||
/slc {setlinecap} bind def
|
||||
/slj {setlinejoin} bind def
|
||||
/slw {setlinewidth} bind def
|
||||
/srgb {setrgbcolor} bind def
|
||||
/rot {rotate} bind def
|
||||
/sc {scale} bind def
|
||||
/sd {setdash} bind def
|
||||
/ff {findfont} bind def
|
||||
/sf {setfont} bind def
|
||||
/scf {scalefont} bind def
|
||||
/sw {stringwidth} bind def
|
||||
/tr {translate} bind def
|
||||
/tnt {dup dup currentrgbcolor
|
||||
4 -2 roll dup 1 exch sub 3 -1 roll mul add
|
||||
4 -2 roll dup 1 exch sub 3 -1 roll mul add
|
||||
4 -2 roll dup 1 exch sub 3 -1 roll mul add srgb}
|
||||
bind def
|
||||
/shd {dup dup currentrgbcolor 4 -2 roll mul 4 -2 roll mul
|
||||
4 -2 roll mul srgb} bind def
|
||||
/$F2psBegin {$F2psDict begin /$F2psEnteredState save def} def
|
||||
/$F2psEnd {$F2psEnteredState restore end} def
|
||||
|
||||
$F2psBegin
|
||||
10 setmiterlimit
|
||||
0 slj 0 slc
|
||||
0.04800 0.04800 sc
|
||||
%
|
||||
% Fig objects follow
|
||||
%
|
||||
%
|
||||
% here starts figure with depth 60
|
||||
% Polyline
|
||||
0 slj
|
||||
0 slc
|
||||
15.000 slw
|
||||
n 3900 5700 m 3900 2700 l 4800 2700 l 4800 5700 l
|
||||
cp gs col18 0.50 tnt ef gr gs col18 s gr
|
||||
% here ends figure;
|
||||
%
|
||||
% here starts figure with depth 55
|
||||
% Polyline
|
||||
0 slj
|
||||
0 slc
|
||||
15.000 slw
|
||||
n 5100 6600 m 5100 1800 l 6300 1800 l 6300 6600 l
|
||||
cp gs col7 1.00 shd ef gr gs col0 s gr
|
||||
% here ends figure;
|
||||
%
|
||||
% here starts figure with depth 50
|
||||
% Polyline
|
||||
0 slj
|
||||
0 slc
|
||||
45.000 slw
|
||||
n 5625 1725 m
|
||||
5775 1875 l gs col0 s gr
|
||||
% Polyline
|
||||
n 5625 1875 m
|
||||
5775 1725 l gs col0 s gr
|
||||
% Polyline
|
||||
n 5625 6525 m
|
||||
5775 6675 l gs col0 s gr
|
||||
% Polyline
|
||||
n 5625 6675 m
|
||||
5775 6525 l gs col0 s gr
|
||||
% Polyline
|
||||
15.000 slw
|
||||
n 2400 900 m 5775 900 l 5775 1275 l 2400 1275 l
|
||||
cp gs col0 s gr
|
||||
/Courier-Bold ff 300.00 scf sf
|
||||
2550 1200 m
|
||||
gs 1 -1 sc (LCW) col18 sh gr
|
||||
/Courier-Bold ff 300.00 scf sf
|
||||
3450 1200 m
|
||||
gs 1 -1 sc (dL) col18 sh gr
|
||||
/Courier-Bold ff 300.00 scf sf
|
||||
5250 1200 m
|
||||
gs 1 -1 sc (SP) col18 sh gr
|
||||
/Courier-Bold ff 300.00 scf sf
|
||||
4350 1200 m
|
||||
gs 1 -1 sc (W) col18 sh gr
|
||||
% Polyline
|
||||
[90 45 15 45] 0 sd
|
||||
n 5700 1800 m
|
||||
5700 6600 l gs col0 s gr [] 0 sd
|
||||
% Polyline
|
||||
7.500 slw
|
||||
n 3225 2700 m
|
||||
3825 2700 l gs col0 s gr
|
||||
% Polyline
|
||||
n 5025 1800 m
|
||||
3225 1800 l gs col0 s gr
|
||||
% Polyline
|
||||
n 3825 5700 m
|
||||
3225 5700 l gs col0 s gr
|
||||
% Polyline
|
||||
n 5025 6600 m
|
||||
3225 6600 l gs col0 s gr
|
||||
% Polyline
|
||||
n 3900 5775 m
|
||||
3900 7575 l gs col0 s gr
|
||||
% Polyline
|
||||
n 4800 5775 m
|
||||
4800 7575 l gs col0 s gr
|
||||
% Polyline
|
||||
n 5100 6675 m 5100 6900 l 5400 7200 l
|
||||
5400 7575 l gs col0 s gr
|
||||
% Polyline
|
||||
gs clippath
|
||||
3270 2564 m 3270 2715 l 3330 2715 l 3330 2564 l 3330 2564 l 3300 2684 l 3270 2564 l cp
|
||||
3330 1936 m 3330 1785 l 3270 1785 l 3270 1936 l 3270 1936 l 3300 1816 l 3330 1936 l cp
|
||||
eoclip
|
||||
n 3300 1800 m
|
||||
3300 2700 l gs col0 s gr gr
|
||||
|
||||
% arrowhead
|
||||
n 3330 1936 m 3300 1816 l 3270 1936 l 3330 1936 l cp gs 0.00 setgray ef gr col0 s
|
||||
% arrowhead
|
||||
n 3270 2564 m 3300 2684 l 3330 2564 l 3270 2564 l cp gs 0.00 setgray ef gr col0 s
|
||||
% Polyline
|
||||
gs clippath
|
||||
3270 6464 m 3270 6615 l 3330 6615 l 3330 6464 l 3330 6464 l 3300 6584 l 3270 6464 l cp
|
||||
3330 5836 m 3330 5685 l 3270 5685 l 3270 5836 l 3270 5836 l 3300 5716 l 3330 5836 l cp
|
||||
eoclip
|
||||
n 3300 5700 m
|
||||
3300 6600 l gs col0 s gr gr
|
||||
|
||||
% arrowhead
|
||||
n 3330 5836 m 3300 5716 l 3270 5836 l 3330 5836 l cp gs 0.00 setgray ef gr col0 s
|
||||
% arrowhead
|
||||
n 3270 6464 m 3300 6584 l 3330 6464 l 3270 6464 l cp gs 0.00 setgray ef gr col0 s
|
||||
% Polyline
|
||||
gs clippath
|
||||
4664 7530 m 4815 7530 l 4815 7470 l 4664 7470 l 4664 7470 l 4784 7500 l 4664 7530 l cp
|
||||
4036 7470 m 3885 7470 l 3885 7530 l 4036 7530 l 4036 7530 l 3916 7500 l 4036 7470 l cp
|
||||
eoclip
|
||||
n 3900 7500 m
|
||||
4800 7500 l gs col0 s gr gr
|
||||
|
||||
% arrowhead
|
||||
n 4036 7470 m 3916 7500 l 4036 7530 l 4036 7470 l cp gs 0.00 setgray ef gr col0 s
|
||||
% arrowhead
|
||||
n 4664 7530 m 4784 7500 l 4664 7470 l 4664 7530 l cp gs 0.00 setgray ef gr col0 s
|
||||
% Polyline
|
||||
gs clippath
|
||||
5264 7530 m 5415 7530 l 5415 7470 l 5264 7470 l 5264 7470 l 5384 7500 l 5264 7530 l cp
|
||||
4936 7470 m 4785 7470 l 4785 7530 l 4936 7530 l 4936 7530 l 4816 7500 l 4936 7470 l cp
|
||||
eoclip
|
||||
n 4800 7500 m
|
||||
5400 7500 l gs col0 s gr gr
|
||||
|
||||
% arrowhead
|
||||
n 4936 7470 m 4816 7500 l 4936 7530 l 4936 7470 l cp gs 0.00 setgray ef gr col0 s
|
||||
% arrowhead
|
||||
n 5264 7530 m 5384 7500 l 5264 7470 l 5264 7530 l cp gs 0.00 setgray ef gr col0 s
|
||||
% Polyline
|
||||
n 2400 900 m 7200 900 l 7200 8100 l 2400 8100 l
|
||||
cp gs col0 s gr
|
||||
/Courier-Bold ff 200.00 scf sf
|
||||
5100 7425 m
|
||||
gs 1 -1 sc (SP) dup sw pop 2 div neg 0 rm col0 sh gr
|
||||
/Courier-Bold ff 200.00 scf sf
|
||||
4350 7425 m
|
||||
gs 1 -1 sc (W) dup sw pop 2 div neg 0 rm col0 sh gr
|
||||
/Courier-Bold ff 200.00 scf sf
|
||||
3225 2250 m
|
||||
gs 1 -1 sc 90.0 rot (dL) dup sw pop 2 div neg 0 rm col0 sh gr
|
||||
/Courier-Bold ff 200.00 scf sf
|
||||
3225 6150 m
|
||||
gs 1 -1 sc 90.0 rot (dL) dup sw pop 2 div neg 0 rm col0 sh gr
|
||||
% here ends figure;
|
||||
$F2psEnd
|
||||
rs
|
||||
showpage
|
||||
%%Trailer
|
||||
%EOF
|
Binary file not shown.
|
@ -1,243 +0,0 @@
|
|||
%!PS-Adobe-2.0 EPSF-2.0
|
||||
%%Title: RDS_VW.fig
|
||||
%%Creator: fig2dev Version 3.2 Patchlevel 5
|
||||
%%CreationDate: Mon Sep 15 18:24:04 2014
|
||||
%%For: jpc@lepka (Jean-Paul Chaput)
|
||||
%%BoundingBox: 0 0 489 255
|
||||
%Magnification: 1.0000
|
||||
%%EndComments
|
||||
/$F2psDict 200 dict def
|
||||
$F2psDict begin
|
||||
$F2psDict /mtrx matrix put
|
||||
/col-1 {0 setgray} bind def
|
||||
/col0 {0.000 0.000 0.000 srgb} bind def
|
||||
/col1 {0.000 0.000 1.000 srgb} bind def
|
||||
/col2 {0.000 1.000 0.000 srgb} bind def
|
||||
/col3 {0.000 1.000 1.000 srgb} bind def
|
||||
/col4 {1.000 0.000 0.000 srgb} bind def
|
||||
/col5 {1.000 0.000 1.000 srgb} bind def
|
||||
/col6 {1.000 1.000 0.000 srgb} bind def
|
||||
/col7 {1.000 1.000 1.000 srgb} bind def
|
||||
/col8 {0.000 0.000 0.560 srgb} bind def
|
||||
/col9 {0.000 0.000 0.690 srgb} bind def
|
||||
/col10 {0.000 0.000 0.820 srgb} bind def
|
||||
/col11 {0.530 0.810 1.000 srgb} bind def
|
||||
/col12 {0.000 0.560 0.000 srgb} bind def
|
||||
/col13 {0.000 0.690 0.000 srgb} bind def
|
||||
/col14 {0.000 0.820 0.000 srgb} bind def
|
||||
/col15 {0.000 0.560 0.560 srgb} bind def
|
||||
/col16 {0.000 0.690 0.690 srgb} bind def
|
||||
/col17 {0.000 0.820 0.820 srgb} bind def
|
||||
/col18 {0.560 0.000 0.000 srgb} bind def
|
||||
/col19 {0.690 0.000 0.000 srgb} bind def
|
||||
/col20 {0.820 0.000 0.000 srgb} bind def
|
||||
/col21 {0.560 0.000 0.560 srgb} bind def
|
||||
/col22 {0.690 0.000 0.690 srgb} bind def
|
||||
/col23 {0.820 0.000 0.820 srgb} bind def
|
||||
/col24 {0.500 0.190 0.000 srgb} bind def
|
||||
/col25 {0.630 0.250 0.000 srgb} bind def
|
||||
/col26 {0.750 0.380 0.000 srgb} bind def
|
||||
/col27 {1.000 0.500 0.500 srgb} bind def
|
||||
/col28 {1.000 0.630 0.630 srgb} bind def
|
||||
/col29 {1.000 0.750 0.750 srgb} bind def
|
||||
/col30 {1.000 0.880 0.880 srgb} bind def
|
||||
/col31 {1.000 0.840 0.000 srgb} bind def
|
||||
|
||||
end
|
||||
save
|
||||
newpath 0 255 moveto 0 0 lineto 489 0 lineto 489 255 lineto closepath clip newpath
|
||||
-106.7 306.7 translate
|
||||
1 -1 scale
|
||||
|
||||
/cp {closepath} bind def
|
||||
/ef {eofill} bind def
|
||||
/gr {grestore} bind def
|
||||
/gs {gsave} bind def
|
||||
/sa {save} bind def
|
||||
/rs {restore} bind def
|
||||
/l {lineto} bind def
|
||||
/m {moveto} bind def
|
||||
/rm {rmoveto} bind def
|
||||
/n {newpath} bind def
|
||||
/s {stroke} bind def
|
||||
/sh {show} bind def
|
||||
/slc {setlinecap} bind def
|
||||
/slj {setlinejoin} bind def
|
||||
/slw {setlinewidth} bind def
|
||||
/srgb {setrgbcolor} bind def
|
||||
/rot {rotate} bind def
|
||||
/sc {scale} bind def
|
||||
/sd {setdash} bind def
|
||||
/ff {findfont} bind def
|
||||
/sf {setfont} bind def
|
||||
/scf {scalefont} bind def
|
||||
/sw {stringwidth} bind def
|
||||
/tr {translate} bind def
|
||||
/tnt {dup dup currentrgbcolor
|
||||
4 -2 roll dup 1 exch sub 3 -1 roll mul add
|
||||
4 -2 roll dup 1 exch sub 3 -1 roll mul add
|
||||
4 -2 roll dup 1 exch sub 3 -1 roll mul add srgb}
|
||||
bind def
|
||||
/shd {dup dup currentrgbcolor 4 -2 roll mul 4 -2 roll mul
|
||||
4 -2 roll mul srgb} bind def
|
||||
/$F2psBegin {$F2psDict begin /$F2psEnteredState save def} def
|
||||
/$F2psEnd {$F2psEnteredState restore end} def
|
||||
|
||||
$F2psBegin
|
||||
10 setmiterlimit
|
||||
0 slj 0 slc
|
||||
0.06000 0.06000 sc
|
||||
%
|
||||
% Fig objects follow
|
||||
%
|
||||
%
|
||||
% here starts figure with depth 60
|
||||
% Polyline
|
||||
0 slj
|
||||
0 slc
|
||||
15.000 slw
|
||||
n 2400 1800 m 8400 1800 l 8400 3600 l 2400 3600 l
|
||||
cp gs col18 0.50 tnt ef gr gs col18 s gr
|
||||
% here ends figure;
|
||||
%
|
||||
% here starts figure with depth 55
|
||||
% Polyline
|
||||
0 slj
|
||||
0 slc
|
||||
15.000 slw
|
||||
n 3000 2100 m 7800 2100 l 7800 3300 l 3000 3300 l
|
||||
cp gs col7 1.00 shd ef gr gs col0 s gr
|
||||
% here ends figure;
|
||||
%
|
||||
% here starts figure with depth 50
|
||||
% Polyline
|
||||
0 slj
|
||||
0 slc
|
||||
15.000 slw
|
||||
n 1800 900 m 5175 900 l 5175 1275 l 1800 1275 l
|
||||
cp gs col0 s gr
|
||||
/Courier-Bold ff 300.00 scf sf
|
||||
1950 1200 m
|
||||
gs 1 -1 sc (VW) col18 sh gr
|
||||
/Courier-Bold ff 300.00 scf sf
|
||||
2850 1200 m
|
||||
gs 1 -1 sc (dL) col18 sh gr
|
||||
/Courier-Bold ff 300.00 scf sf
|
||||
3750 1200 m
|
||||
gs 1 -1 sc (dW) col18 sh gr
|
||||
/Courier-Bold ff 300.00 scf sf
|
||||
4650 1200 m
|
||||
gs 1 -1 sc (dX) col0 sh gr
|
||||
% Polyline
|
||||
7.500 slw
|
||||
n 7875 2100 m
|
||||
9375 2100 l gs col0 s gr
|
||||
% Polyline
|
||||
n 8475 1800 m 8700 1800 l 9000 1500 l
|
||||
9375 1500 l gs col0 s gr
|
||||
% Polyline
|
||||
n 7875 3300 m
|
||||
9375 3300 l gs col0 s gr
|
||||
% Polyline
|
||||
n 8475 3600 m 8700 3600 l 9000 3900 l
|
||||
9375 3900 l gs col0 s gr
|
||||
% Polyline
|
||||
n 7800 3375 m
|
||||
7800 4575 l gs col0 s gr
|
||||
% Polyline
|
||||
n 8400 3675 m
|
||||
8400 4575 l gs col0 s gr
|
||||
% Polyline
|
||||
n 2400 3675 m
|
||||
2400 4575 l gs col0 s gr
|
||||
% Polyline
|
||||
n 3000 3375 m
|
||||
3000 4575 l gs col0 s gr
|
||||
% Polyline
|
||||
gs clippath
|
||||
9270 1964 m 9270 2115 l 9330 2115 l 9330 1964 l 9330 1964 l 9300 2084 l 9270 1964 l cp
|
||||
9330 1636 m 9330 1485 l 9270 1485 l 9270 1636 l 9270 1636 l 9300 1516 l 9330 1636 l cp
|
||||
eoclip
|
||||
n 9300 1500 m
|
||||
9300 2100 l gs col0 s gr gr
|
||||
|
||||
% arrowhead
|
||||
n 9330 1636 m 9300 1516 l 9270 1636 l 9330 1636 l cp gs 0.00 setgray ef gr col0 s
|
||||
% arrowhead
|
||||
n 9270 1964 m 9300 2084 l 9330 1964 l 9270 1964 l cp gs 0.00 setgray ef gr col0 s
|
||||
% Polyline
|
||||
gs clippath
|
||||
9270 3764 m 9270 3915 l 9330 3915 l 9330 3764 l 9330 3764 l 9300 3884 l 9270 3764 l cp
|
||||
9330 3436 m 9330 3285 l 9270 3285 l 9270 3436 l 9270 3436 l 9300 3316 l 9330 3436 l cp
|
||||
eoclip
|
||||
n 9300 3300 m
|
||||
9300 3900 l gs col0 s gr gr
|
||||
|
||||
% arrowhead
|
||||
n 9330 3436 m 9300 3316 l 9270 3436 l 9330 3436 l cp gs 0.00 setgray ef gr col0 s
|
||||
% arrowhead
|
||||
n 9270 3764 m 9300 3884 l 9330 3764 l 9270 3764 l cp gs 0.00 setgray ef gr col0 s
|
||||
% Polyline
|
||||
gs clippath
|
||||
8264 4530 m 8415 4530 l 8415 4470 l 8264 4470 l 8264 4470 l 8384 4500 l 8264 4530 l cp
|
||||
7936 4470 m 7785 4470 l 7785 4530 l 7936 4530 l 7936 4530 l 7816 4500 l 7936 4470 l cp
|
||||
eoclip
|
||||
n 7800 4500 m
|
||||
8400 4500 l gs col0 s gr gr
|
||||
|
||||
% arrowhead
|
||||
n 7936 4470 m 7816 4500 l 7936 4530 l 7936 4470 l cp gs 0.00 setgray ef gr col0 s
|
||||
% arrowhead
|
||||
n 8264 4530 m 8384 4500 l 8264 4470 l 8264 4530 l cp gs 0.00 setgray ef gr col0 s
|
||||
% Polyline
|
||||
gs clippath
|
||||
2864 4530 m 3015 4530 l 3015 4470 l 2864 4470 l 2864 4470 l 2984 4500 l 2864 4530 l cp
|
||||
2536 4470 m 2385 4470 l 2385 4530 l 2536 4530 l 2536 4530 l 2416 4500 l 2536 4470 l cp
|
||||
eoclip
|
||||
n 2400 4500 m
|
||||
3000 4500 l gs col0 s gr gr
|
||||
|
||||
% arrowhead
|
||||
n 2536 4470 m 2416 4500 l 2536 4530 l 2536 4470 l cp gs 0.00 setgray ef gr col0 s
|
||||
% arrowhead
|
||||
n 2864 4530 m 2984 4500 l 2864 4470 l 2864 4530 l cp gs 0.00 setgray ef gr col0 s
|
||||
% Polyline
|
||||
45.000 slw
|
||||
n 2925 2625 m
|
||||
3075 2775 l gs col0 s gr
|
||||
% Polyline
|
||||
n 2925 2775 m
|
||||
3075 2625 l gs col0 s gr
|
||||
% Polyline
|
||||
n 7725 2625 m
|
||||
7875 2775 l gs col0 s gr
|
||||
% Polyline
|
||||
n 7725 2775 m
|
||||
7875 2625 l gs col0 s gr
|
||||
% Polyline
|
||||
15.000 slw
|
||||
[90 45 15 45] 0 sd
|
||||
n 3000 2700 m
|
||||
7800 2700 l gs col0 s gr [] 0 sd
|
||||
% Polyline
|
||||
7.500 slw
|
||||
n 1800 900 m 9900 900 l 9900 5100 l 1800 5100 l
|
||||
cp gs col0 s gr
|
||||
/Courier-Bold ff 200.00 scf sf
|
||||
2700 4425 m
|
||||
gs 1 -1 sc (dL) dup sw pop 2 div neg 0 rm col0 sh gr
|
||||
/Courier-Bold ff 200.00 scf sf
|
||||
8100 4425 m
|
||||
gs 1 -1 sc (dL) dup sw pop 2 div neg 0 rm col0 sh gr
|
||||
/Courier-Bold ff 200.00 scf sf
|
||||
9225 3600 m
|
||||
gs 1 -1 sc 90.0 rot (dW/2) dup sw pop 2 div neg 0 rm col0 sh gr
|
||||
/Courier-Bold ff 200.00 scf sf
|
||||
9225 1800 m
|
||||
gs 1 -1 sc 90.0 rot (dW/2) dup sw pop 2 div neg 0 rm col0 sh gr
|
||||
% here ends figure;
|
||||
$F2psEnd
|
||||
rs
|
||||
showpage
|
||||
%%Trailer
|
||||
%EOF
|
|
@ -1,283 +0,0 @@
|
|||
%!PS-Adobe-2.0 EPSF-2.0
|
||||
%%Title: SegmentOrientation.fig
|
||||
%%Creator: fig2dev Version 3.2 Patchlevel 5
|
||||
%%CreationDate: Fri Sep 26 17:55:45 2014
|
||||
%%For: jpc@lepka (Jean-Paul Chaput)
|
||||
%%BoundingBox: 0 0 507 471
|
||||
%Magnification: 1.0000
|
||||
%%EndComments
|
||||
/$F2psDict 200 dict def
|
||||
$F2psDict begin
|
||||
$F2psDict /mtrx matrix put
|
||||
/col-1 {0 setgray} bind def
|
||||
/col0 {0.000 0.000 0.000 srgb} bind def
|
||||
/col1 {0.000 0.000 1.000 srgb} bind def
|
||||
/col2 {0.000 1.000 0.000 srgb} bind def
|
||||
/col3 {0.000 1.000 1.000 srgb} bind def
|
||||
/col4 {1.000 0.000 0.000 srgb} bind def
|
||||
/col5 {1.000 0.000 1.000 srgb} bind def
|
||||
/col6 {1.000 1.000 0.000 srgb} bind def
|
||||
/col7 {1.000 1.000 1.000 srgb} bind def
|
||||
/col8 {0.000 0.000 0.560 srgb} bind def
|
||||
/col9 {0.000 0.000 0.690 srgb} bind def
|
||||
/col10 {0.000 0.000 0.820 srgb} bind def
|
||||
/col11 {0.530 0.810 1.000 srgb} bind def
|
||||
/col12 {0.000 0.560 0.000 srgb} bind def
|
||||
/col13 {0.000 0.690 0.000 srgb} bind def
|
||||
/col14 {0.000 0.820 0.000 srgb} bind def
|
||||
/col15 {0.000 0.560 0.560 srgb} bind def
|
||||
/col16 {0.000 0.690 0.690 srgb} bind def
|
||||
/col17 {0.000 0.820 0.820 srgb} bind def
|
||||
/col18 {0.560 0.000 0.000 srgb} bind def
|
||||
/col19 {0.690 0.000 0.000 srgb} bind def
|
||||
/col20 {0.820 0.000 0.000 srgb} bind def
|
||||
/col21 {0.560 0.000 0.560 srgb} bind def
|
||||
/col22 {0.690 0.000 0.690 srgb} bind def
|
||||
/col23 {0.820 0.000 0.820 srgb} bind def
|
||||
/col24 {0.500 0.190 0.000 srgb} bind def
|
||||
/col25 {0.630 0.250 0.000 srgb} bind def
|
||||
/col26 {0.750 0.380 0.000 srgb} bind def
|
||||
/col27 {1.000 0.500 0.500 srgb} bind def
|
||||
/col28 {1.000 0.630 0.630 srgb} bind def
|
||||
/col29 {1.000 0.750 0.750 srgb} bind def
|
||||
/col30 {1.000 0.880 0.880 srgb} bind def
|
||||
/col31 {1.000 0.840 0.000 srgb} bind def
|
||||
|
||||
end
|
||||
save
|
||||
newpath 0 471 moveto 0 0 lineto 507 0 lineto 507 471 lineto closepath clip newpath
|
||||
-88.7 595.3 translate
|
||||
1 -1 scale
|
||||
|
||||
/cp {closepath} bind def
|
||||
/ef {eofill} bind def
|
||||
/gr {grestore} bind def
|
||||
/gs {gsave} bind def
|
||||
/sa {save} bind def
|
||||
/rs {restore} bind def
|
||||
/l {lineto} bind def
|
||||
/m {moveto} bind def
|
||||
/rm {rmoveto} bind def
|
||||
/n {newpath} bind def
|
||||
/s {stroke} bind def
|
||||
/sh {show} bind def
|
||||
/slc {setlinecap} bind def
|
||||
/slj {setlinejoin} bind def
|
||||
/slw {setlinewidth} bind def
|
||||
/srgb {setrgbcolor} bind def
|
||||
/rot {rotate} bind def
|
||||
/sc {scale} bind def
|
||||
/sd {setdash} bind def
|
||||
/ff {findfont} bind def
|
||||
/sf {setfont} bind def
|
||||
/scf {scalefont} bind def
|
||||
/sw {stringwidth} bind def
|
||||
/tr {translate} bind def
|
||||
/tnt {dup dup currentrgbcolor
|
||||
4 -2 roll dup 1 exch sub 3 -1 roll mul add
|
||||
4 -2 roll dup 1 exch sub 3 -1 roll mul add
|
||||
4 -2 roll dup 1 exch sub 3 -1 roll mul add srgb}
|
||||
bind def
|
||||
/shd {dup dup currentrgbcolor 4 -2 roll mul 4 -2 roll mul
|
||||
4 -2 roll mul srgb} bind def
|
||||
/DrawEllipse {
|
||||
/endangle exch def
|
||||
/startangle exch def
|
||||
/yrad exch def
|
||||
/xrad exch def
|
||||
/y exch def
|
||||
/x exch def
|
||||
/savematrix mtrx currentmatrix def
|
||||
x y tr xrad yrad sc 0 0 1 startangle endangle arc
|
||||
closepath
|
||||
savematrix setmatrix
|
||||
} def
|
||||
|
||||
/$F2psBegin {$F2psDict begin /$F2psEnteredState save def} def
|
||||
/$F2psEnd {$F2psEnteredState restore end} def
|
||||
|
||||
$F2psBegin
|
||||
10 setmiterlimit
|
||||
0 slj 0 slc
|
||||
0.06000 0.06000 sc
|
||||
%
|
||||
% Fig objects follow
|
||||
%
|
||||
%
|
||||
% here starts figure with depth 60
|
||||
% Ellipse
|
||||
15.000 slw
|
||||
n 2775 4200 450 450 0 360 DrawEllipse gs col18 0.50 tnt ef gr gs col18 s gr
|
||||
|
||||
% Polyline
|
||||
0 slj
|
||||
0 slc
|
||||
45.000 slw
|
||||
n 3300 2700 m 3900 2700 l 3900 5700 l 3300 5700 l
|
||||
cp gs col0 s gr
|
||||
% Polyline
|
||||
7.500 slw
|
||||
[60 30 15 30] 0 sd
|
||||
n 3600 2700 m
|
||||
3600 5700 l gs col0 s gr [] 0 sd
|
||||
% Polyline
|
||||
45.000 slw
|
||||
n 3450 5550 m
|
||||
3750 5850 l gs col0 s gr
|
||||
% Polyline
|
||||
n 3450 5850 m
|
||||
3750 5550 l gs col0 s gr
|
||||
% Polyline
|
||||
n 3600 2700 m
|
||||
3450 3000 l gs col0 s gr
|
||||
% Polyline
|
||||
n 3600 2700 m
|
||||
3750 3000 l gs col0 s gr
|
||||
% Ellipse
|
||||
15.000 slw
|
||||
n 4425 4200 450 450 0 360 DrawEllipse gs col12 0.50 tnt ef gr gs col12 s gr
|
||||
|
||||
% Polyline
|
||||
45.000 slw
|
||||
n 7500 5700 m 8100 5700 l 8100 2700 l 7500 2700 l
|
||||
cp gs col0 s gr
|
||||
% Polyline
|
||||
7.500 slw
|
||||
[60 30 15 30] 0 sd
|
||||
n 7800 5700 m
|
||||
7800 2700 l gs col0 s gr [] 0 sd
|
||||
% Polyline
|
||||
45.000 slw
|
||||
n 7650 2850 m
|
||||
7950 2550 l gs col0 s gr
|
||||
% Polyline
|
||||
n 7650 2550 m
|
||||
7950 2850 l gs col0 s gr
|
||||
% Polyline
|
||||
n 7800 5700 m
|
||||
7650 5400 l gs col0 s gr
|
||||
% Polyline
|
||||
n 7800 5700 m
|
||||
7950 5400 l gs col0 s gr
|
||||
% Ellipse
|
||||
15.000 slw
|
||||
n 6975 4200 450 450 0 360 DrawEllipse gs col12 0.50 tnt ef gr gs col12 s gr
|
||||
|
||||
% Ellipse
|
||||
n 8625 4200 450 450 0 360 DrawEllipse gs col18 0.50 tnt ef gr gs col18 s gr
|
||||
|
||||
% Polyline
|
||||
45.000 slw
|
||||
n 6300 8400 m 6300 7800 l 9300 7800 l 9300 8400 l
|
||||
cp gs col0 s gr
|
||||
% Polyline
|
||||
7.500 slw
|
||||
[60 30 15 30] 0 sd
|
||||
n 6300 8100 m
|
||||
9300 8100 l gs col0 s gr [] 0 sd
|
||||
% Polyline
|
||||
45.000 slw
|
||||
n 9150 8250 m
|
||||
9450 7950 l gs col0 s gr
|
||||
% Polyline
|
||||
n 9450 8250 m
|
||||
9150 7950 l gs col0 s gr
|
||||
% Polyline
|
||||
n 6300 8100 m
|
||||
6600 8250 l gs col0 s gr
|
||||
% Polyline
|
||||
n 6300 8100 m
|
||||
6600 7950 l gs col0 s gr
|
||||
% Ellipse
|
||||
15.000 slw
|
||||
n 7800 8925 450 450 0 360 DrawEllipse gs col18 0.50 tnt ef gr gs col18 s gr
|
||||
|
||||
% Ellipse
|
||||
n 7800 7275 450 450 0 360 DrawEllipse gs col12 0.50 tnt ef gr gs col12 s gr
|
||||
|
||||
% Polyline
|
||||
45.000 slw
|
||||
n 5100 7800 m 5100 8400 l 2100 8400 l 2100 7800 l
|
||||
cp gs col0 s gr
|
||||
% Polyline
|
||||
7.500 slw
|
||||
[60 30 15 30] 0 sd
|
||||
n 5100 8100 m
|
||||
2100 8100 l gs col0 s gr [] 0 sd
|
||||
% Polyline
|
||||
45.000 slw
|
||||
n 2250 7950 m
|
||||
1950 8250 l gs col0 s gr
|
||||
% Polyline
|
||||
n 1950 7950 m
|
||||
2250 8250 l gs col0 s gr
|
||||
% Polyline
|
||||
n 5100 8100 m
|
||||
4800 7950 l gs col0 s gr
|
||||
% Polyline
|
||||
n 5100 8100 m
|
||||
4800 8250 l gs col0 s gr
|
||||
% Ellipse
|
||||
15.000 slw
|
||||
n 3525 7275 450 450 0 360 DrawEllipse gs col18 0.50 tnt ef gr gs col18 s gr
|
||||
|
||||
% Ellipse
|
||||
n 3525 8925 450 450 0 360 DrawEllipse gs col12 0.50 tnt ef gr gs col12 s gr
|
||||
|
||||
% here ends figure;
|
||||
%
|
||||
% here starts figure with depth 50
|
||||
/Courier-Bold ff 200.00 scf sf
|
||||
2775 4275 m
|
||||
gs 1 -1 sc (left) dup sw pop 2 div neg 0 rm col18 sh gr
|
||||
/Courier-Bold ff 200.00 scf sf
|
||||
4425 4275 m
|
||||
gs 1 -1 sc (right) dup sw pop 2 div neg 0 rm col12 sh gr
|
||||
/Courier-Bold ff 200.00 scf sf
|
||||
6975 4275 m
|
||||
gs 1 -1 sc (right) dup sw pop 2 div neg 0 rm col12 sh gr
|
||||
/Courier-Bold ff 200.00 scf sf
|
||||
8625 4275 m
|
||||
gs 1 -1 sc (left) dup sw pop 2 div neg 0 rm col18 sh gr
|
||||
/Courier-Bold ff 200.00 scf sf
|
||||
7800 9000 m
|
||||
gs 1 -1 sc (left) dup sw pop 2 div neg 0 rm col18 sh gr
|
||||
/Courier-Bold ff 200.00 scf sf
|
||||
7800 7350 m
|
||||
gs 1 -1 sc (right) dup sw pop 2 div neg 0 rm col12 sh gr
|
||||
/Courier-Bold ff 200.00 scf sf
|
||||
3525 7350 m
|
||||
gs 1 -1 sc (left) dup sw pop 2 div neg 0 rm col18 sh gr
|
||||
/Courier-Bold ff 200.00 scf sf
|
||||
3525 9000 m
|
||||
gs 1 -1 sc (right) dup sw pop 2 div neg 0 rm col12 sh gr
|
||||
% Polyline
|
||||
0 slj
|
||||
0 slc
|
||||
15.000 slw
|
||||
n 5700 2100 m
|
||||
5700 9900 l gs col0 s gr
|
||||
% Polyline
|
||||
n 1500 6300 m
|
||||
9900 6300 l gs col0 s gr
|
||||
% Polyline
|
||||
n 1500 2100 m 9900 2100 l 9900 9900 l 1500 9900 l
|
||||
cp gs col0 s gr
|
||||
/Courier-Bold ff 266.67 scf sf
|
||||
1650 2400 m
|
||||
gs 1 -1 sc (Up) col0 sh gr
|
||||
/Courier-Bold ff 266.67 scf sf
|
||||
1650 6600 m
|
||||
gs 1 -1 sc (Right) col0 sh gr
|
||||
/Courier-Bold ff 266.67 scf sf
|
||||
5850 6600 m
|
||||
gs 1 -1 sc (Left) col0 sh gr
|
||||
/Courier-Bold ff 266.67 scf sf
|
||||
5850 2400 m
|
||||
gs 1 -1 sc (Down) col0 sh gr
|
||||
% here ends figure;
|
||||
$F2psEnd
|
||||
rs
|
||||
showpage
|
||||
%%Trailer
|
||||
%EOF
|
|
@ -1,259 +0,0 @@
|
|||
%!PS-Adobe-2.0 EPSF-2.0
|
||||
%%Title: bigvia-1.fig
|
||||
%%Creator: fig2dev Version 3.2 Patchlevel 5
|
||||
%%CreationDate: Fri Sep 26 22:43:59 2014
|
||||
%%For: jpc@lepka (Jean-Paul Chaput)
|
||||
%%BoundingBox: 0 0 275 269
|
||||
%Magnification: 0.7000
|
||||
%%EndComments
|
||||
/$F2psDict 200 dict def
|
||||
$F2psDict begin
|
||||
$F2psDict /mtrx matrix put
|
||||
/col-1 {0 setgray} bind def
|
||||
/col0 {0.000 0.000 0.000 srgb} bind def
|
||||
/col1 {0.000 0.000 1.000 srgb} bind def
|
||||
/col2 {0.000 1.000 0.000 srgb} bind def
|
||||
/col3 {0.000 1.000 1.000 srgb} bind def
|
||||
/col4 {1.000 0.000 0.000 srgb} bind def
|
||||
/col5 {1.000 0.000 1.000 srgb} bind def
|
||||
/col6 {1.000 1.000 0.000 srgb} bind def
|
||||
/col7 {1.000 1.000 1.000 srgb} bind def
|
||||
/col8 {0.000 0.000 0.560 srgb} bind def
|
||||
/col9 {0.000 0.000 0.690 srgb} bind def
|
||||
/col10 {0.000 0.000 0.820 srgb} bind def
|
||||
/col11 {0.530 0.810 1.000 srgb} bind def
|
||||
/col12 {0.000 0.560 0.000 srgb} bind def
|
||||
/col13 {0.000 0.690 0.000 srgb} bind def
|
||||
/col14 {0.000 0.820 0.000 srgb} bind def
|
||||
/col15 {0.000 0.560 0.560 srgb} bind def
|
||||
/col16 {0.000 0.690 0.690 srgb} bind def
|
||||
/col17 {0.000 0.820 0.820 srgb} bind def
|
||||
/col18 {0.560 0.000 0.000 srgb} bind def
|
||||
/col19 {0.690 0.000 0.000 srgb} bind def
|
||||
/col20 {0.820 0.000 0.000 srgb} bind def
|
||||
/col21 {0.560 0.000 0.560 srgb} bind def
|
||||
/col22 {0.690 0.000 0.690 srgb} bind def
|
||||
/col23 {0.820 0.000 0.820 srgb} bind def
|
||||
/col24 {0.500 0.190 0.000 srgb} bind def
|
||||
/col25 {0.630 0.250 0.000 srgb} bind def
|
||||
/col26 {0.750 0.380 0.000 srgb} bind def
|
||||
/col27 {1.000 0.500 0.500 srgb} bind def
|
||||
/col28 {1.000 0.630 0.630 srgb} bind def
|
||||
/col29 {1.000 0.750 0.750 srgb} bind def
|
||||
/col30 {1.000 0.880 0.880 srgb} bind def
|
||||
/col31 {1.000 0.840 0.000 srgb} bind def
|
||||
|
||||
end
|
||||
save
|
||||
newpath 0 269 moveto 0 0 lineto 275 0 lineto 275 269 lineto closepath clip newpath
|
||||
-3.2 331.3 translate
|
||||
1 -1 scale
|
||||
|
||||
/cp {closepath} bind def
|
||||
/ef {eofill} bind def
|
||||
/gr {grestore} bind def
|
||||
/gs {gsave} bind def
|
||||
/sa {save} bind def
|
||||
/rs {restore} bind def
|
||||
/l {lineto} bind def
|
||||
/m {moveto} bind def
|
||||
/rm {rmoveto} bind def
|
||||
/n {newpath} bind def
|
||||
/s {stroke} bind def
|
||||
/sh {show} bind def
|
||||
/slc {setlinecap} bind def
|
||||
/slj {setlinejoin} bind def
|
||||
/slw {setlinewidth} bind def
|
||||
/srgb {setrgbcolor} bind def
|
||||
/rot {rotate} bind def
|
||||
/sc {scale} bind def
|
||||
/sd {setdash} bind def
|
||||
/ff {findfont} bind def
|
||||
/sf {setfont} bind def
|
||||
/scf {scalefont} bind def
|
||||
/sw {stringwidth} bind def
|
||||
/tr {translate} bind def
|
||||
/tnt {dup dup currentrgbcolor
|
||||
4 -2 roll dup 1 exch sub 3 -1 roll mul add
|
||||
4 -2 roll dup 1 exch sub 3 -1 roll mul add
|
||||
4 -2 roll dup 1 exch sub 3 -1 roll mul add srgb}
|
||||
bind def
|
||||
/shd {dup dup currentrgbcolor 4 -2 roll mul 4 -2 roll mul
|
||||
4 -2 roll mul srgb} bind def
|
||||
/$F2psBegin {$F2psDict begin /$F2psEnteredState save def} def
|
||||
/$F2psEnd {$F2psEnteredState restore end} def
|
||||
|
||||
$F2psBegin
|
||||
10 setmiterlimit
|
||||
0 slj 0 slc
|
||||
0.04200 0.04200 sc
|
||||
%
|
||||
% Fig objects follow
|
||||
%
|
||||
%
|
||||
% here starts figure with depth 60
|
||||
% Polyline
|
||||
0 slj
|
||||
0 slc
|
||||
0.000 slw
|
||||
n 900 6300 m 1500 6300 l 1500 6900 l 900 6900 l
|
||||
cp gs col7 0.80 shd ef gr
|
||||
% Polyline
|
||||
n 2400 6300 m 3000 6300 l 3000 6900 l 2400 6900 l
|
||||
cp gs col7 0.80 shd ef gr
|
||||
% Polyline
|
||||
n 3900 6300 m 4500 6300 l 4500 6900 l 3900 6900 l
|
||||
cp gs col7 0.80 shd ef gr
|
||||
% Polyline
|
||||
n 5400 6300 m 6000 6300 l 6000 6900 l 5400 6900 l
|
||||
cp gs col7 0.80 shd ef gr
|
||||
% Polyline
|
||||
n 900 4800 m 1500 4800 l 1500 5400 l 900 5400 l
|
||||
cp gs col7 0.80 shd ef gr
|
||||
% Polyline
|
||||
n 900 3300 m 1500 3300 l 1500 3900 l 900 3900 l
|
||||
cp gs col7 0.80 shd ef gr
|
||||
% Polyline
|
||||
n 900 1800 m 1500 1800 l 1500 2400 l 900 2400 l
|
||||
cp gs col7 0.80 shd ef gr
|
||||
% Polyline
|
||||
n 2400 4800 m 3000 4800 l 3000 5400 l 2400 5400 l
|
||||
cp gs col7 0.00 shd ef gr
|
||||
% Polyline
|
||||
n 2400 3300 m 3000 3300 l 3000 3900 l 2400 3900 l
|
||||
cp gs col7 0.00 shd ef gr
|
||||
% Polyline
|
||||
n 3900 3300 m 4500 3300 l 4500 3900 l 3900 3900 l
|
||||
cp gs col7 0.00 shd ef gr
|
||||
% Polyline
|
||||
n 3900 4800 m 4500 4800 l 4500 5400 l 3900 5400 l
|
||||
cp gs col7 0.00 shd ef gr
|
||||
% Polyline
|
||||
n 2400 1800 m 3000 1800 l 3000 2400 l 2400 2400 l
|
||||
cp gs col7 0.80 shd ef gr
|
||||
% Polyline
|
||||
n 3900 1800 m 4500 1800 l 4500 2400 l 3900 2400 l
|
||||
cp gs col7 0.80 shd ef gr
|
||||
% Polyline
|
||||
n 5400 1800 m 6000 1800 l 6000 2400 l 5400 2400 l
|
||||
cp gs col7 0.80 shd ef gr
|
||||
% Polyline
|
||||
n 5400 3300 m 6000 3300 l 6000 3900 l 5400 3900 l
|
||||
cp gs col7 0.80 shd ef gr
|
||||
% Polyline
|
||||
n 5400 4800 m 6000 4800 l 6000 5400 l 5400 5400 l
|
||||
cp gs col7 0.80 shd ef gr
|
||||
% Polyline
|
||||
7.500 slw
|
||||
n 5400 6900 m
|
||||
5400 7875 l gs col7 0.00 shd ef gr gs col0 s gr
|
||||
% Polyline
|
||||
n 6000 6900 m 6000 7200 l 6300 7500 l
|
||||
6300 7875 l gs col0 s gr
|
||||
% Polyline
|
||||
n 1500 5775 m
|
||||
1500 7875 l gs col0 s gr
|
||||
% Polyline
|
||||
n 1425 5700 m
|
||||
225 5700 l gs col0 s gr
|
||||
% Polyline
|
||||
n 1425 2700 m
|
||||
225 2700 l gs col0 s gr
|
||||
% Polyline
|
||||
gs clippath
|
||||
270 5564 m 270 5715 l 330 5715 l 330 5564 l 330 5564 l 300 5684 l 270 5564 l cp
|
||||
330 2836 m 330 2685 l 270 2685 l 270 2836 l 270 2836 l 300 2716 l 330 2836 l cp
|
||||
eoclip
|
||||
n 300 2700 m
|
||||
300 5700 l gs col0 s gr gr
|
||||
|
||||
% arrowhead
|
||||
n 330 2836 m 300 2716 l 270 2836 l 330 2836 l cp gs 0.00 setgray ef gr col0 s
|
||||
% arrowhead
|
||||
n 270 5564 m 300 5684 l 330 5564 l 270 5564 l cp gs 0.00 setgray ef gr col0 s
|
||||
% Polyline
|
||||
gs clippath
|
||||
4364 7830 m 4515 7830 l 4515 7770 l 4364 7770 l 4364 7770 l 4484 7800 l 4364 7830 l cp
|
||||
1636 7770 m 1485 7770 l 1485 7830 l 1636 7830 l 1636 7830 l 1516 7800 l 1636 7770 l cp
|
||||
eoclip
|
||||
n 1500 7800 m
|
||||
4500 7800 l gs col0 s gr gr
|
||||
|
||||
% arrowhead
|
||||
n 1636 7770 m 1516 7800 l 1636 7830 l 1636 7770 l cp gs 0.00 setgray ef gr col0 s
|
||||
% arrowhead
|
||||
n 4364 7830 m 4484 7800 l 4364 7770 l 4364 7830 l cp gs 0.00 setgray ef gr col0 s
|
||||
% Polyline
|
||||
gs clippath
|
||||
5264 7830 m 5415 7830 l 5415 7770 l 5264 7770 l 5264 7770 l 5384 7800 l 5264 7830 l cp
|
||||
4636 7770 m 4485 7770 l 4485 7830 l 4636 7830 l 4636 7830 l 4516 7800 l 4636 7770 l cp
|
||||
eoclip
|
||||
n 4500 7800 m
|
||||
5400 7800 l gs col0 s gr gr
|
||||
|
||||
% arrowhead
|
||||
n 4636 7770 m 4516 7800 l 4636 7830 l 4636 7770 l cp gs 0.00 setgray ef gr col0 s
|
||||
% arrowhead
|
||||
n 5264 7830 m 5384 7800 l 5264 7770 l 5264 7830 l cp gs 0.00 setgray ef gr col0 s
|
||||
% Polyline
|
||||
gs clippath
|
||||
6164 7830 m 6315 7830 l 6315 7770 l 6164 7770 l 6164 7770 l 6284 7800 l 6164 7830 l cp
|
||||
5536 7770 m 5385 7770 l 5385 7830 l 5536 7830 l 5536 7830 l 5416 7800 l 5536 7770 l cp
|
||||
eoclip
|
||||
n 5400 7800 m
|
||||
6300 7800 l gs col0 s gr gr
|
||||
|
||||
% arrowhead
|
||||
n 5536 7770 m 5416 7800 l 5536 7830 l 5536 7770 l cp gs 0.00 setgray ef gr col0 s
|
||||
% arrowhead
|
||||
n 6164 7830 m 6284 7800 l 6164 7770 l 6164 7830 l cp gs 0.00 setgray ef gr col0 s
|
||||
% Polyline
|
||||
n 4500 5775 m
|
||||
4500 7875 l gs col0 s gr
|
||||
/Courier-Bold ff 200.00 scf sf
|
||||
3000 7725 m
|
||||
gs 1 -1 sc (width) dup sw pop 2 div neg 0 rm col0 sh gr
|
||||
/Courier-Bold ff 200.00 scf sf
|
||||
4950 7725 m
|
||||
gs 1 -1 sc (step) dup sw pop 2 div neg 0 rm col0 sh gr
|
||||
/Courier-Bold ff 200.00 scf sf
|
||||
5850 7725 m
|
||||
gs 1 -1 sc (side) dup sw pop 2 div neg 0 rm col0 sh gr
|
||||
/Courier-Bold ff 200.00 scf sf
|
||||
225 4200 m
|
||||
gs 1 -1 sc 90.0 rot (height) dup sw pop 2 div neg 0 rm col0 sh gr
|
||||
% here ends figure;
|
||||
%
|
||||
% here starts figure with depth 50
|
||||
% Polyline
|
||||
0 slj
|
||||
0 slc
|
||||
7.500 slw
|
||||
gs clippath
|
||||
6343 6960 m 6615 6960 l 6615 6840 l 6343 6840 l 6343 6840 l 6583 6900 l 6343 6960 l cp
|
||||
eoclip
|
||||
n 600 6900 m
|
||||
6600 6900 l gs col0 s gr gr
|
||||
|
||||
% arrowhead
|
||||
n 6343 6960 m 6583 6900 l 6343 6840 l col0 s
|
||||
% Polyline
|
||||
gs clippath
|
||||
960 1757 m 960 1485 l 840 1485 l 840 1757 l 840 1757 l 900 1517 l 960 1757 l cp
|
||||
eoclip
|
||||
n 900 7200 m
|
||||
900 1500 l gs col0 s gr gr
|
||||
|
||||
% arrowhead
|
||||
n 960 1757 m 900 1517 l 840 1757 l col0 s
|
||||
% Polyline
|
||||
45.000 slw
|
||||
[150 75 15 75] 0 sd
|
||||
n 1500 2700 m 4500 2700 l 4500 5700 l 1500 5700 l
|
||||
cp gs col0 s gr [] 0 sd
|
||||
% here ends figure;
|
||||
$F2psEnd
|
||||
rs
|
||||
showpage
|
||||
%%Trailer
|
||||
%EOF
|
|
@ -1,184 +0,0 @@
|
|||
%!PS-Adobe-2.0 EPSF-2.0
|
||||
%%Title: bigvia-2.fig
|
||||
%%Creator: fig2dev Version 3.2 Patchlevel 5
|
||||
%%CreationDate: Fri Sep 26 22:28:01 2014
|
||||
%%For: jpc@lepka (Jean-Paul Chaput)
|
||||
%%BoundingBox: 0 0 254 254
|
||||
%Magnification: 0.7000
|
||||
%%EndComments
|
||||
/$F2psDict 200 dict def
|
||||
$F2psDict begin
|
||||
$F2psDict /mtrx matrix put
|
||||
/col-1 {0 setgray} bind def
|
||||
/col0 {0.000 0.000 0.000 srgb} bind def
|
||||
/col1 {0.000 0.000 1.000 srgb} bind def
|
||||
/col2 {0.000 1.000 0.000 srgb} bind def
|
||||
/col3 {0.000 1.000 1.000 srgb} bind def
|
||||
/col4 {1.000 0.000 0.000 srgb} bind def
|
||||
/col5 {1.000 0.000 1.000 srgb} bind def
|
||||
/col6 {1.000 1.000 0.000 srgb} bind def
|
||||
/col7 {1.000 1.000 1.000 srgb} bind def
|
||||
/col8 {0.000 0.000 0.560 srgb} bind def
|
||||
/col9 {0.000 0.000 0.690 srgb} bind def
|
||||
/col10 {0.000 0.000 0.820 srgb} bind def
|
||||
/col11 {0.530 0.810 1.000 srgb} bind def
|
||||
/col12 {0.000 0.560 0.000 srgb} bind def
|
||||
/col13 {0.000 0.690 0.000 srgb} bind def
|
||||
/col14 {0.000 0.820 0.000 srgb} bind def
|
||||
/col15 {0.000 0.560 0.560 srgb} bind def
|
||||
/col16 {0.000 0.690 0.690 srgb} bind def
|
||||
/col17 {0.000 0.820 0.820 srgb} bind def
|
||||
/col18 {0.560 0.000 0.000 srgb} bind def
|
||||
/col19 {0.690 0.000 0.000 srgb} bind def
|
||||
/col20 {0.820 0.000 0.000 srgb} bind def
|
||||
/col21 {0.560 0.000 0.560 srgb} bind def
|
||||
/col22 {0.690 0.000 0.690 srgb} bind def
|
||||
/col23 {0.820 0.000 0.820 srgb} bind def
|
||||
/col24 {0.500 0.190 0.000 srgb} bind def
|
||||
/col25 {0.630 0.250 0.000 srgb} bind def
|
||||
/col26 {0.750 0.380 0.000 srgb} bind def
|
||||
/col27 {1.000 0.500 0.500 srgb} bind def
|
||||
/col28 {1.000 0.630 0.630 srgb} bind def
|
||||
/col29 {1.000 0.750 0.750 srgb} bind def
|
||||
/col30 {1.000 0.880 0.880 srgb} bind def
|
||||
/col31 {1.000 0.840 0.000 srgb} bind def
|
||||
|
||||
end
|
||||
save
|
||||
newpath 0 254 moveto 0 0 lineto 254 0 lineto 254 254 lineto closepath clip newpath
|
||||
-24.7 302.9 translate
|
||||
1 -1 scale
|
||||
|
||||
/cp {closepath} bind def
|
||||
/ef {eofill} bind def
|
||||
/gr {grestore} bind def
|
||||
/gs {gsave} bind def
|
||||
/sa {save} bind def
|
||||
/rs {restore} bind def
|
||||
/l {lineto} bind def
|
||||
/m {moveto} bind def
|
||||
/rm {rmoveto} bind def
|
||||
/n {newpath} bind def
|
||||
/s {stroke} bind def
|
||||
/sh {show} bind def
|
||||
/slc {setlinecap} bind def
|
||||
/slj {setlinejoin} bind def
|
||||
/slw {setlinewidth} bind def
|
||||
/srgb {setrgbcolor} bind def
|
||||
/rot {rotate} bind def
|
||||
/sc {scale} bind def
|
||||
/sd {setdash} bind def
|
||||
/ff {findfont} bind def
|
||||
/sf {setfont} bind def
|
||||
/scf {scalefont} bind def
|
||||
/sw {stringwidth} bind def
|
||||
/tr {translate} bind def
|
||||
/tnt {dup dup currentrgbcolor
|
||||
4 -2 roll dup 1 exch sub 3 -1 roll mul add
|
||||
4 -2 roll dup 1 exch sub 3 -1 roll mul add
|
||||
4 -2 roll dup 1 exch sub 3 -1 roll mul add srgb}
|
||||
bind def
|
||||
/shd {dup dup currentrgbcolor 4 -2 roll mul 4 -2 roll mul
|
||||
4 -2 roll mul srgb} bind def
|
||||
/$F2psBegin {$F2psDict begin /$F2psEnteredState save def} def
|
||||
/$F2psEnd {$F2psEnteredState restore end} def
|
||||
|
||||
$F2psBegin
|
||||
10 setmiterlimit
|
||||
0 slj 0 slc
|
||||
0.04200 0.04200 sc
|
||||
%
|
||||
% Fig objects follow
|
||||
%
|
||||
%
|
||||
% here starts figure with depth 60
|
||||
% Polyline
|
||||
0 slj
|
||||
0 slc
|
||||
0.000 slw
|
||||
n 900 6300 m 1500 6300 l 1500 6900 l 900 6900 l
|
||||
cp gs col7 0.80 shd ef gr
|
||||
% Polyline
|
||||
n 2400 6300 m 3000 6300 l 3000 6900 l 2400 6900 l
|
||||
cp gs col7 0.80 shd ef gr
|
||||
% Polyline
|
||||
n 3900 6300 m 4500 6300 l 4500 6900 l 3900 6900 l
|
||||
cp gs col7 0.80 shd ef gr
|
||||
% Polyline
|
||||
n 5400 6300 m 6000 6300 l 6000 6900 l 5400 6900 l
|
||||
cp gs col7 0.80 shd ef gr
|
||||
% Polyline
|
||||
n 900 4800 m 1500 4800 l 1500 5400 l 900 5400 l
|
||||
cp gs col7 0.80 shd ef gr
|
||||
% Polyline
|
||||
n 900 3300 m 1500 3300 l 1500 3900 l 900 3900 l
|
||||
cp gs col7 0.80 shd ef gr
|
||||
% Polyline
|
||||
n 900 1800 m 1500 1800 l 1500 2400 l 900 2400 l
|
||||
cp gs col7 0.80 shd ef gr
|
||||
% Polyline
|
||||
n 2400 4800 m 3000 4800 l 3000 5400 l 2400 5400 l
|
||||
cp gs col7 0.00 shd ef gr
|
||||
% Polyline
|
||||
n 2400 3300 m 3000 3300 l 3000 3900 l 2400 3900 l
|
||||
cp gs col7 0.00 shd ef gr
|
||||
% Polyline
|
||||
n 3900 3300 m 4500 3300 l 4500 3900 l 3900 3900 l
|
||||
cp gs col7 0.00 shd ef gr
|
||||
% Polyline
|
||||
n 3900 4800 m 4500 4800 l 4500 5400 l 3900 5400 l
|
||||
cp gs col7 0.00 shd ef gr
|
||||
% Polyline
|
||||
n 2400 1800 m 3000 1800 l 3000 2400 l 2400 2400 l
|
||||
cp gs col7 0.80 shd ef gr
|
||||
% Polyline
|
||||
n 5400 4800 m 6000 4800 l 6000 5400 l 5400 5400 l
|
||||
cp gs col7 0.80 shd ef gr
|
||||
% Polyline
|
||||
n 3900 1800 m 4500 1800 l 4500 2400 l 3900 2400 l
|
||||
cp gs col7 0.00 shd ef gr
|
||||
% Polyline
|
||||
n 5400 1800 m 6000 1800 l 6000 2400 l 5400 2400 l
|
||||
cp gs col7 0.00 shd ef gr
|
||||
% Polyline
|
||||
n 5400 3300 m 6000 3300 l 6000 3900 l 5400 3900 l
|
||||
cp gs col7 0.00 shd ef gr
|
||||
% here ends figure;
|
||||
%
|
||||
% here starts figure with depth 50
|
||||
% Polyline
|
||||
0 slj
|
||||
0 slc
|
||||
7.500 slw
|
||||
gs clippath
|
||||
6343 6960 m 6615 6960 l 6615 6840 l 6343 6840 l 6343 6840 l 6583 6900 l 6343 6960 l cp
|
||||
eoclip
|
||||
n 600 6900 m
|
||||
6600 6900 l gs col0 s gr gr
|
||||
|
||||
% arrowhead
|
||||
n 6343 6960 m 6583 6900 l 6343 6840 l col0 s
|
||||
% Polyline
|
||||
gs clippath
|
||||
960 1457 m 960 1185 l 840 1185 l 840 1457 l 840 1457 l 900 1217 l 960 1457 l cp
|
||||
eoclip
|
||||
n 900 7200 m
|
||||
900 1200 l gs col0 s gr gr
|
||||
|
||||
% arrowhead
|
||||
n 960 1457 m 900 1217 l 840 1457 l col0 s
|
||||
% Polyline
|
||||
45.000 slw
|
||||
[150 75 15 75] 0 sd
|
||||
n 1500 2700 m 4500 2700 l 4500 5700 l 1500 5700 l
|
||||
cp gs col0 s gr [] 0 sd
|
||||
% Polyline
|
||||
[150 75 15 75] 0 sd
|
||||
n 3600 1500 m 6300 1500 l 6300 4200 l 3600 4200 l
|
||||
cp gs col0 s gr [] 0 sd
|
||||
% here ends figure;
|
||||
$F2psEnd
|
||||
rs
|
||||
showpage
|
||||
%%Trailer
|
||||
%EOF
|
Binary file not shown.
|
@ -0,0 +1,26 @@
|
|||
.. -*- mode: rst; explicit-buffer-name: "index.rst<RDS>" -*-
|
||||
|
||||
.. include:: ../etc/definitions.rst
|
||||
|
||||
|
||||
:Date: 26, september 2014
|
||||
:Authors: Jean-Paul Chaput
|
||||
:Contact: <alliance-users@soc.lip6.fr>
|
||||
:Version: 0.2
|
||||
|
||||
|
||||
**Disclaimer:** This document is still far from complete.
|
||||
|
||||
|
||||
=========================================
|
||||
Symbolic to Real Conversion in Alliance
|
||||
=========================================
|
||||
|
||||
Printable version of this document `RDS.pdf <../../../pdf/main/RDS.pdf>`_.
|
||||
|
||||
|
||||
.. toctree::
|
||||
:maxdepth: 2
|
||||
|
||||
RDSpage.rst
|
||||
|
|
@ -0,0 +1,27 @@
|
|||
.. -*- mode: rst; explicit-buffer-name: "pdfHeader.rst<RDS>" -*-
|
||||
|
||||
.. include:: ../etc/definitions.rst
|
||||
|
||||
|
||||
:Date: 26, september 2014
|
||||
:Authors: Jean-Paul Chaput
|
||||
:Contact: <alliance-users@soc.lip6.fr>
|
||||
:Version: 0.2
|
||||
|
||||
|medskip|
|
||||
|
||||
**Disclaimer:** This document is still far from complete.
|
||||
|
||||
|medskip|
|
||||
|
||||
|
||||
=========================================
|
||||
Symbolic To Real Conversion in Alliance
|
||||
=========================================
|
||||
|
||||
|pagestylefancy|
|
||||
|
||||
|
||||
.. contents::
|
||||
|
||||
|newpage|
|
|
@ -1,86 +0,0 @@
|
|||
|
||||
\usepackage[default,osfigures,scale=0.95]{opensans}
|
||||
\usepackage{xspace}
|
||||
\usepackage{fancyhdr}
|
||||
\usepackage{graphicx}
|
||||
\usepackage{enumitem}
|
||||
\usepackage[sf,bf]{titlesec}
|
||||
\usepackage{titletoc}
|
||||
\usepackage[paper=a4paper,headheight=30pt,tmargin=1.5in,bmargin=1in]{geometry}
|
||||
%\usepackage{layouts}
|
||||
|
||||
\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]{./images/clipboard.eps}} &
|
||||
\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]{./images/i-core.eps}} &
|
||||
\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[]{\textsc{SoC} Documentation}
|
||||
\rhead[]{September 2014}
|
||||
\lfoot[]{\UPMC/\LIP/\SoC}
|
||||
\rfoot[]{\thepage}
|
||||
\cfoot[]{}
|
||||
|
||||
\pagestyle{fancy}
|
|
@ -0,0 +1,11 @@
|
|||
.. -*- Mode: rst -*-
|
||||
|
||||
.. include:: ../etc/definitions.rst
|
||||
|
||||
|
||||
===================
|
||||
Stratus Reference
|
||||
===================
|
||||
|
||||
The Stratus Language reference is generated by LaTeX2HTML_ and is
|
||||
available here: `Stratus <file:../../stratus/index.html>`_
|
|
@ -0,0 +1,11 @@
|
|||
.. -*- Mode: rst -*-
|
||||
|
||||
.. include:: ../etc/definitions.rst
|
||||
|
||||
|
||||
===================
|
||||
Unicorn Reference
|
||||
===================
|
||||
|
||||
The Unicorn C++ API reference is generated by Doxygen_ and is
|
||||
available here: `Unicorn <file:../../unicorn/index.html>`_
|
|
@ -1,36 +0,0 @@
|
|||
# -*- mode: CMAKE; explicit-buffer-name: "CMakeLists.txt<UsersGuide>" -*-
|
||||
|
||||
set ( htmlInstallDir share/doc/coriolis2/en/html/users-guide )
|
||||
set ( latexInstallDir share/doc/coriolis2/en/latex/users-guide )
|
||||
|
||||
add_custom_target ( doc_HTML ALL
|
||||
cd ${DOCUMENTATION_SOURCE_DIR}/UsersGuide
|
||||
&& rst2html --link-stylesheet --stylesheet=./SoC.css,./Pygments.css UsersGuide_HTML.rst UsersGuide.html )
|
||||
add_dependencies ( doc_HTML SoC.css Pygments.css UsersGuide_HTML.rst UsersGuide.rst )
|
||||
|
||||
add_custom_target ( doc_LaTeX ALL
|
||||
cd ${DOCUMENTATION_SOURCE_DIR}/UsersGuide
|
||||
&& rst2latex --use-latex-toc --stylesheet=./socstyle.tex UsersGuide_LaTeX.rst UsersGuide-raw.tex
|
||||
&& sed 's, \\& \\\\multicolumn{2}{l|}{, \\& \\\\multicolumn{2}{p{0.6\\\\DUtablewidth}|}{,' UsersGuide-raw.tex > UsersGuide.tex
|
||||
&& latex UsersGuide
|
||||
&& latex UsersGuide
|
||||
&& latex UsersGuide
|
||||
&& dvipdfm UsersGuide
|
||||
)
|
||||
add_dependencies ( doc_LaTeX socstyle.tex UsersGuide_LaTeX.rst UsersGuide.rst )
|
||||
|
||||
install ( DIRECTORY images/
|
||||
DESTINATION ${htmlInstallDir}/images
|
||||
FILES_MATCHING PATTERN "*.png" )
|
||||
install ( FILES SoC.css
|
||||
Pygments.css
|
||||
UsersGuide.html DESTINATION ${htmlInstallDir} )
|
||||
|
||||
install ( DIRECTORY images/
|
||||
DESTINATION ${latexInstallDir}/images
|
||||
FILES_MATCHING PATTERN "*.pdf"
|
||||
PATTERN "*.eps"
|
||||
PATTERN "*.bb" )
|
||||
|
||||
install ( FILES socstyle.tex
|
||||
UsersGuide.tex DESTINATION ${latexInstallDir} )
|
|
@ -0,0 +1,342 @@
|
|||
.. -*- Mode: rst -*-
|
||||
|
||||
.. include:: ../etc/definitions.rst
|
||||
|
||||
.. URLs that changes between the various backends.
|
||||
.. _Coriolis Tools Documentation: file:///usr/share/doc/coriolis2/index.html
|
||||
|
||||
|
||||
|
||||
.. |CoriolisSoftSchema| image:: ./images/Coriolis-Soft-Schema.png
|
||||
:alt: Coriolis Software Schematic
|
||||
:align: middle
|
||||
:width: 60%
|
||||
|
||||
|newpage|
|
||||
|
||||
|
||||
Coriolis Configuration & Initialisation
|
||||
=======================================
|
||||
|
||||
|
||||
General Software Architecture
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
|Coriolis| has been build with respect of the classical paradigm that the
|
||||
computational instensive parts have been written in C++, and almost
|
||||
everything else in |Python|. To build the |Python| interface we used
|
||||
two methods:
|
||||
|
||||
* For self-contained modules :cb:`boost::python` (mainly in :cb:`vlsisapd`).
|
||||
* For all modules based on |Hurricane|, we created our own wrappers due
|
||||
to very specific requirements such as shared functions between modules
|
||||
or C++/|Python| secure bi-directional object deletion.
|
||||
|
||||
.. note:: **Python Documentation:**
|
||||
Most of the documentation is related to the C++ API and implemetation of
|
||||
the tools. However, the |Python| bindings have been created so they
|
||||
mimic *as closely as possible* the C++ interface, so the documentation
|
||||
applies to both languages with only minor syntactic changes.
|
||||
|
||||
|bcenter| |CoriolisSoftSchema| |ecenter|
|
||||
|
||||
All configuration & initialization files are Python scripts, despite their
|
||||
|dot_conf| extention. From a syntactic point of view, there is no difference
|
||||
between the system-wide configuration files and the user's configuration,
|
||||
they may use the same Python helpers.
|
||||
|medskip|
|
||||
|
||||
Configuration is done in two stages:
|
||||
|
||||
#. Selecting the symbolic technology.
|
||||
#. Loading the complete configuration for the given technology.
|
||||
|
||||
|newpage|
|
||||
|
||||
|
||||
First Stage: Symbolic Technology Selection
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
|noindent|
|
||||
The initialization process is done by executing, in order, the following
|
||||
file(s):
|
||||
|
||||
+-------+----------------------------------+----------------------------------------------+
|
||||
| Order | Meaning | File |
|
||||
+=======+==================================+==============================================+
|
||||
| **1** | The system setting | :cb:`/etc/coriolis2/techno.conf` |
|
||||
+-------+----------------------------------+----------------------------------------------+
|
||||
| **2** | The user's global setting | :cb:`${HOME}/.coriolis2/techno.py` |
|
||||
+-------+----------------------------------+----------------------------------------------+
|
||||
| **3** | The user's local setting | :cb:`<CWD>/.coriolis2/techno.py` |
|
||||
+-------+----------------------------------+----------------------------------------------+
|
||||
|
||||
Thoses files must provides only two variables, the name of the symbolic technology
|
||||
and the one of the real technology. For example: ::
|
||||
|
||||
# -*- Mode:Python -*-
|
||||
|
||||
symbolicTechno = 'cmos'
|
||||
realTechno = 'hcmos9'
|
||||
|
||||
|
||||
Second Stage: Technology Configuration Loading
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
|noindent|
|
||||
The :cb:`TECHNO` variable is set by the first stage and it's the name of the
|
||||
symbolic technology. A directory of that name, with all the configuration files,
|
||||
must exists in the configuration directory. In addition to the technology-specific
|
||||
directories, a :cb:`common/` directory is there to provides a trunk for all the
|
||||
identical datas across the various technologies. The initialization process is done
|
||||
by executing, in order, the following file(s):
|
||||
|
||||
+-------+----------------------------------+----------------------------------------------+
|
||||
| Order | Meaning | File |
|
||||
+=======+==================================+==============================================+
|
||||
| **1** | The system initialization | :cb:`/etc/coriolis2/<TECHNO>/<TOOL>.conf` |
|
||||
+-------+----------------------------------+----------------------------------------------+
|
||||
| **2** | The user's global initialization | :cb:`${HOME}/.coriolis2/settings.py` |
|
||||
+-------+----------------------------------+----------------------------------------------+
|
||||
| **3** | The user's local initialization | :cb:`<CWD>/.coriolis2/settings.py` |
|
||||
+-------+----------------------------------+----------------------------------------------+
|
||||
|
||||
.. note:: *The loading policy is not hard-coded.* It is implemented
|
||||
at Python level in :cb:`/etc/coriolis2/coriolisInit.py`, and thus may be easily be
|
||||
amended to whatever site policy.
|
||||
|
||||
The truly mandatory requirement is the existence of :cb:`coriolisInit.py`
|
||||
which *must* contain a :cb:`coriolisConfigure()` function with no argument.
|
||||
|
||||
|
||||
Configuration Helpers
|
||||
~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
To ease the writing of configuration files, a set of small helpers
|
||||
is available. They allow to setup the configuration parameters through
|
||||
simple assembly of tuples. The helpers are installed under the directory: ::
|
||||
|
||||
<install>/etc/coriolis2/
|
||||
|
||||
Where :cb:`<install>/` is the root of the installation.
|
||||
|
||||
|newpage|
|
||||
|
||||
|
||||
.. _Alliance Helper:
|
||||
|
||||
|Alliance| Helper
|
||||
-----------------
|
||||
|
||||
The configuration file must provide a :cb:`allianceConfig` tuple of
|
||||
the form: ::
|
||||
|
||||
cellsTop = '/usr/share/alliance/cells/'
|
||||
|
||||
allianceConfig = \
|
||||
( ( 'SYMBOLIC_TECHNOLOGY', helpers.sysConfDir+'/technology.symbolic.xml' )
|
||||
, ( 'REAL_TECHNOLOGY' , helpers.sysConfDir+'/technology.cmos130.s2r.xml')
|
||||
, ( 'DISPLAY' , helpers.sysConfDir+'/display.xml' )
|
||||
, ( 'CATALOG' , 'CATAL')
|
||||
, ( 'WORKING_LIBRARY' , '.')
|
||||
, ( 'SYSTEM_LIBRARY' , ( (cellsTop+'sxlib' , Environment.Append)
|
||||
, (cellsTop+'dp_sxlib', Environment.Append)
|
||||
, (cellsTop+'ramlib' , Environment.Append)
|
||||
, (cellsTop+'romlib' , Environment.Append)
|
||||
, (cellsTop+'rflib' , Environment.Append)
|
||||
, (cellsTop+'rf2lib' , Environment.Append)
|
||||
, (cellsTop+'pxlib' , Environment.Append) ) )
|
||||
, ( 'SCALE_X' , 100)
|
||||
, ( 'IN_LO' , 'vst')
|
||||
, ( 'IN_PH' , 'ap')
|
||||
, ( 'OUT_LO' , 'vst')
|
||||
, ( 'OUT_PH' , 'ap')
|
||||
, ( 'POWER' , 'vdd')
|
||||
, ( 'GROUND' , 'vss')
|
||||
, ( 'CLOCK' , '^ck.*')
|
||||
, ( 'BLOCKAGE' , '^blockageNet*')
|
||||
)
|
||||
|
||||
|
||||
|noindent| The example above shows the system configuration file, with all the
|
||||
available settings. Some important remarks about thoses settings:
|
||||
|
||||
* In it's configuration file, the user do not need to redefine all the settings,
|
||||
just the one he wants to change. In most of the cases, the ``SYSTEM_LIBRARY``,
|
||||
the ``WORKING_LIBRARY`` and the special net names (at this point there is not
|
||||
much alternatives for the others settings).
|
||||
|
||||
* ``SYSTEM_LIBRARY`` setting: Setting up the library search path.
|
||||
Each library entry in the tuple will be added to the search path according
|
||||
to the second parameter:
|
||||
|
||||
* :cb:`Environment::Append`: append to the search path.
|
||||
|
||||
* :cb:`Environment::Prepend`: insert in head of the search path.
|
||||
|
||||
* :cb:`Environment::Replace`: look for a library of the same name and replace
|
||||
it, whithout changing the search path order. If no library of that name
|
||||
already exists, it is appended.
|
||||
|
||||
A library is identified by it's name, this name is the last component of the
|
||||
path name. For instance: ``/soc/alliance/sxlib`` will be named ``sxlib``.
|
||||
Implementing the |Alliance| specification, when looking for a |Cell| ``name``,
|
||||
the system will browse sequentially trought the library list and returns
|
||||
the first |Cell| whose name match.
|
||||
|
||||
* For ``POWER``, ``GROUND``, ``CLOCK`` and ``BLOCKAGE`` net names, a regular
|
||||
expression (|GNU| regexp) is expected.
|
||||
|
||||
* The ``helpers.sysConfDir`` variable is supplied by the helpers, it is the
|
||||
directory in which the system-wide configuration files are locateds.
|
||||
For a standard installation it would be: ``/soc/coriolis2``.
|
||||
|
||||
.. * Trick and naming convention about ``SYMBOLIC_TECHNOLOGY``, ``REAL_TECHNOLOGY``
|
||||
.. and ``DISPLAY``. In the previous releases, thoses files where to read by
|
||||
.. XML parsers, and still do if you triggers the XML compatibility mode.
|
||||
.. But now, they have Python conterparts. In the configuration files, you
|
||||
.. still have to name them as XML files, the Python file name will be
|
||||
.. deduced from this one with thoses two translation rules:
|
||||
..
|
||||
.. #. In the filename, all dots, except for the last (the file extention),
|
||||
.. are replaced by underscores.
|
||||
..
|
||||
.. #. The ``.xml`` extention is substituted by a ``.conf``.
|
||||
..
|
||||
.. For the symbolic technology, it would give: ::
|
||||
..
|
||||
.. /soc/coriolis2/technology.symbolic.xml
|
||||
.. --> /soc/coriolis2/technology_symbolic.conf
|
||||
|
||||
A typical user's configuration file would be: ::
|
||||
|
||||
import os
|
||||
|
||||
homeDir = os.getenv('HOME')
|
||||
|
||||
allianceConfig = \
|
||||
( ('WORKING_LIBRARY' , homeDir+'/worklib')
|
||||
, ('SYSTEM_LIBRARY' , ( (homeDir+'/mylib', Environment.Append) ) )
|
||||
, ('POWER' , 'vdd.*')
|
||||
, ('GROUND' , 'vss.*')
|
||||
)
|
||||
|
||||
|
||||
Tools Configuration Helpers
|
||||
---------------------------
|
||||
|
||||
All the tools uses the same helper to load their configuration (a.k.a.
|
||||
*Configuration Helper*). Currently the following configuration system-wide
|
||||
configuration files are defined:
|
||||
|
||||
* :cb:`misc.conf`: commons settings or not belonging specifically to a tool.
|
||||
* :cb:`etesian.conf`: for the |Etesian| tool.
|
||||
* :cb:`kite.conf`: for the |Kite| tool.
|
||||
* :cb:`stratus1.conf`: for the |stratus1| tool.
|
||||
|
||||
Here is the contents of :cb:`etesian.conf`: ::
|
||||
|
||||
# Etesian parameters.
|
||||
parametersTable = \
|
||||
( ('etesian.aspectRatio' , TypePercentage, 100 , { 'min':10, 'max':1000 } )
|
||||
, ('etesian.spaceMargin' , TypePercentage, 5 )
|
||||
, ('etesian.uniformDensity' , TypeBool , False )
|
||||
, ('etesian.routingDriven' , TypeBool , False )
|
||||
, ("etesian.effort" , TypeEnumerate , 2
|
||||
, { 'values':( ("Fast" , 1)
|
||||
, ("Standard", 2)
|
||||
, ("High" , 3)
|
||||
, ("Extreme" , 4) ) }
|
||||
)
|
||||
, ("etesian.graphics" , TypeEnumerate , 2
|
||||
, { 'values':( ("Show every step" , 1)
|
||||
, ("Show lower bound" , 2)
|
||||
, ("Show result only" , 3) ) }
|
||||
)
|
||||
)
|
||||
|
||||
layoutTable = \
|
||||
( (TypeTab , 'Etesian', 'etesian')
|
||||
|
||||
, (TypeTitle , 'Placement area')
|
||||
, (TypeOption, "etesian.aspectRatio" , "Aspect Ratio, X/Y (%)", 0 )
|
||||
, (TypeOption, "etesian.spaceMargin" , "Space Margin" , 1 )
|
||||
, (TypeRule ,)
|
||||
, (TypeTitle , 'Etesian - Placer')
|
||||
, (TypeOption, "etesian.uniformDensity", "Uniform density" , 0 )
|
||||
, (TypeOption, "etesian.routingDriven" , "Routing driven" , 0 )
|
||||
, (TypeOption, "etesian.effort" , "Placement effort" , 1 )
|
||||
, (TypeOption, "etesian.graphics" , "Placement view" , 1 )
|
||||
, (TypeRule ,)
|
||||
)
|
||||
|
||||
|newpage|
|
||||
|
||||
|
||||
Taxonomy of the file:
|
||||
|
||||
* It must contains, at least, the two tables:
|
||||
|
||||
* ``parametersTable``, defines & initialise the configuration variables.
|
||||
|
||||
* ``layoutTables``, defines how the various parameters will be displayed
|
||||
in the configuration window (:ref:`The Settings Tab`).
|
||||
|
||||
* The ``parametersTable``, is a tuple (list) of tuples. Each entry in the list
|
||||
describe a configuration parameter. In it's simplest form, it's a quadruplet
|
||||
:cb:`(TypeOption, 'paramId', ParameterType, DefaultValue)` with:
|
||||
|
||||
#. ``TypeOption``, tells that this tuple describe a parameter.
|
||||
|
||||
#. ``paramId``, the identifier of the parameter. Identifiers are defined
|
||||
by the tools. The list of parameters is detailed in each tool section.
|
||||
|
||||
#. ``ParameterType``, the kind of parameter. Could be:
|
||||
|
||||
* ``TypeBool``, boolean.
|
||||
* ``TypeInt``, signed integer.
|
||||
* ``TypeEnumerate``, enumerated type, needs extra entry.
|
||||
* ``TypePercentage``, percentage, expressed between 0 and 100.
|
||||
* ``TypeDouble``, float.
|
||||
* ``TypeString``, character string.
|
||||
|
||||
#. ``DefaultValue``, the default value for that parameter.
|
||||
|
||||
|
||||
Hacking the Configuration Files
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
Asides from the symbols that gets used by the configuration helpers like
|
||||
:cb:`allianceConfig` or :cb:`parametersTable`, you can put pretty much anything
|
||||
in :cb:`<CWD>/.coriolis2/settings.py` (that is, written in |Python|).
|
||||
|
||||
For example: ::
|
||||
|
||||
# -*- Mode:Python -*-
|
||||
|
||||
defaultStyle = 'Alliance.Classic [black]'
|
||||
|
||||
# Regular Coriolis configuration.
|
||||
parametersTable = \
|
||||
( ('misc.catchCore' , TypeBool , False )
|
||||
, ('misc.info' , TypeBool , False )
|
||||
, ('misc.paranoid' , TypeBool , False )
|
||||
, ('misc.bug' , TypeBool , False )
|
||||
, ('misc.logMode' , TypeBool , True )
|
||||
, ('misc.verboseLevel1' , TypeBool , False )
|
||||
, ('misc.verboseLevel2' , TypeBool , True )
|
||||
, ('misc.minTraceLevel' , TypeInt , 0 )
|
||||
, ('misc.maxTraceLevel' , TypeInt , 0 )
|
||||
)
|
||||
|
||||
# Some ordinary Python script...
|
||||
import os
|
||||
|
||||
print ' o Cleaning up ClockTree previous run.'
|
||||
for fileName in os.listdir('.'):
|
||||
if fileName.endswith('.ap') or (fileName.find('_clocked.') >= 0):
|
||||
print ' - <%s>' % fileName
|
||||
os.unlink(fileName)
|
||||
|
||||
|
||||
See :ref:`Python Interface to Coriolis` for more details those capabilities.
|
|
@ -1,49 +0,0 @@
|
|||
|
||||
.. -*- Mode: rst -*-
|
||||
|
||||
.. role:: raw-html(raw)
|
||||
:format: html
|
||||
|
||||
.. URLs that changes between the various backends.
|
||||
.. _Coriolis Tools Documentation: file:///usr/share/doc/coriolis2/index.html
|
||||
.. _Stratus Documentation: file:///usr/share/doc/coriolis2/en/html/stratus/index.html
|
||||
.. _Here: file:///usr/share/doc/coriolis2/en/latex/users-guide/UsersGuide.pdf
|
||||
|
||||
.. For HTML backend
|
||||
.. |rightarrow| replace:: :raw-html:`<p class="empty"></p>`
|
||||
.. |menu_P&R| replace:: :raw-html:`<p class="empty"></p>`
|
||||
.. |menu_StepByStep| replace:: :raw-html:`<p class="empty"></p>`
|
||||
.. |menu_KiteSaveGlobalRouting| image:: ./images/PR-SBS-SaveGlobal.png
|
||||
.. |menu_KiteLoadGlobalRouting| image:: ./images/PR-SBS-LoadGlobal.png
|
||||
.. |menu_KiteGlobalRoute| image:: ./images/PR-GlobalRoute.png
|
||||
.. |menu_KiteDetailedRoute| image:: ./images/PR-DetailedRoute.png
|
||||
.. |menu_KiteDetailedPreRoute| image:: ./images/PR-DetailedPreRoute.png
|
||||
.. |menu_KiteFinalizeRoute| image:: ./images/PR-FinalizeRoute.png
|
||||
|
||||
.. Stand-alone images.
|
||||
.. |ViewerSnapshot_1| replace:: :raw-html:`<center><img class="addborder" src="./images/Viewer-1.png" alt="Viewer Basic Snapshot"></center>`
|
||||
.. |ControllerSnapshot_1| replace:: :raw-html:`<center><img src="./images/Controller-1.png" alt="Controller Basic Snapshot"></center>`
|
||||
.. |ControllerLook_1| replace:: :raw-html:`<center><img src="./images/Controller-Look-1.png" alt="Controller Basic Snapshot"></center>`
|
||||
.. |ControllerFilter_1| replace:: :raw-html:`<center><img src="./images/Controller-Filter-1.png" alt="Controller Basic Snapshot"></center>`
|
||||
.. |ControllerLayersGos_1| replace:: :raw-html:`<center><img src="./images/Controller-LayersGos-1.png" alt="Controller Basic Snapshot"></center>`
|
||||
.. |ControllerNetlist_1| replace:: :raw-html:`<center><img src="./images/Controller-Netlist-1.png" alt="Controller Basic Snapshot"></center>`
|
||||
.. |ViewerNetlist_1| replace:: :raw-html:`<center><img src="./images/Viewer-Netlist-1.png" alt="Controller Basic Snapshot"></center>`
|
||||
.. |ControllerSelection_1| replace:: :raw-html:`<center><img src="./images/Controller-Selection-1.png" alt="Controller Basic Snapshot"></center>`
|
||||
.. |ControllerInspector_1| replace:: :raw-html:`<center><img src="./images/Controller-Inspector-1.png" alt="Controller Basic Snapshot"></center>`
|
||||
.. |ControllerInspector_2| replace:: :raw-html:`<center><img src="./images/Controller-Inspector-2.png" alt="Controller Basic Snapshot"></center>`
|
||||
.. |ControllerInspector_3| replace:: :raw-html:`<center><img src="./images/Controller-Inspector-3.png" alt="Controller Basic Snapshot"></center>`
|
||||
.. |ControllerSettings_1| replace:: :raw-html:`<center><img src="./images/Controller-Settings-1.png" alt="Controller Basic Snapshot"></center>`
|
||||
.. |CoriolisSoftSchema| replace:: :raw-html:`<center><img src="./images/Coriolis-Soft-Schema.png" alt="Coriolis Software Schematic"></center>`
|
||||
.. |ChipStructure-1| replace:: :raw-html:`<center><img src="./images/chip-structure-1.png" alt="Chip Top Structure"></center>`
|
||||
.. |Etesian-1| replace:: :raw-html:`<center><img src="./images/etesian-1.png" alt="Etesian Abutment Box"></center>`
|
||||
|
||||
.. |BigMouse| image:: ./images/ComputerMouse.png
|
||||
:scale: 25%
|
||||
|
||||
.. Direct LaTeX commands encapsulation.
|
||||
.. |dotfill| replace:: :raw-html:` `
|
||||
.. |noindent| replace:: :raw-html:`<p class="empty"></p>`
|
||||
.. |medskip| replace:: :raw-html:`<br>`
|
||||
.. |newpage| replace:: :raw-html:`<hr>`
|
||||
.. |br| replace:: :raw-html:`<br>`
|
||||
|
|
@ -0,0 +1,230 @@
|
|||
.. -*- Mode: rst -*-
|
||||
|
||||
.. include:: ../etc/definitions.rst
|
||||
|
||||
|newpage|
|
||||
|
||||
|
||||
Installation
|
||||
============
|
||||
|
||||
.. note::
|
||||
As the sources are being released, the binary packaging is dropped.
|
||||
You still may find older version here: http://asim.lip6.fr/pub/coriolis/2.0 .
|
||||
|
||||
In a nutshell, building source consist in pulling the |git| repository then
|
||||
running the |ccb| installer.
|
||||
|
||||
Main building prerequisites:
|
||||
|
||||
* cmake
|
||||
* C++11-capable compiler
|
||||
* RapidJSON_
|
||||
* python2.7
|
||||
* boost
|
||||
* libxml2
|
||||
* bzip2
|
||||
* yacc & lex
|
||||
* Qt 4 or Qt 5
|
||||
|
||||
Building documentation prerequisites:
|
||||
|
||||
* doxygen
|
||||
* latex
|
||||
* latex2html
|
||||
* python-docutils (for reStructuredText)
|
||||
|
||||
Optional libraries:
|
||||
|
||||
* LEF/DEF (from `SI2 <https://www.si2.org/>`_)
|
||||
|
||||
For other distributions, refer to their own packaging system.
|
||||
|
||||
|newpage|
|
||||
|
||||
|
||||
Fixed Directory Tree
|
||||
~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
In order to simplificate the work of the |ccb| installer, the source, build
|
||||
and installation tree is fixed. To successfully compile |Coriolis| you must
|
||||
follow it exactly. The tree is relative to the home directory of the user
|
||||
building it (noted :fboxtt:`~/` or :fboxtt:`$HOME/`). Only the source
|
||||
directory needs to be manually created by the user, all others will be
|
||||
automatically created either by |ccb| or the build system.
|
||||
|
||||
+--------------------------------------------------------------------------------------------------------------+
|
||||
| **Sources** |
|
||||
+------------------------------+-------------------------------------------------------------------------------+
|
||||
| | Sources root | | ~/coriolis-2.x/src |
|
||||
| | **under git** | | ~/coriolis-2.x/src/coriolis |
|
||||
+------------------------------+-------------------------------------------------------------------------------+
|
||||
| **Architecture Dependant Build** |
|
||||
+------------------------------+-------------------------------------------------------------------------------+
|
||||
| | Linux, SL 7, 64b | | ~/coriolis-2.x/Linux.el7_64/Release.Shared/build/<tool> |
|
||||
| | Linux, SL 6, 32b | | ~/coriolis-2.x/Linux.slsoc6x/Release.Shared/build/<tool> |
|
||||
| | Linux, SL 6, 64b | | ~/coriolis-2.x/Linux.slsoc6x_64/Release.Shared/build/<tool> |
|
||||
| | Linux, Fedora, 64b | | ~/coriolis-2.x/Linux.fc_64/Release.Shared/build/<tool> |
|
||||
| | Linux, Fedora, 32b | | ~/coriolis-2.x/Linux.fc/Release.Shared/build/<tool> |
|
||||
| | FreeBSD 8, 32b | | ~/coriolis-2.x/FreeBSD.8x.i386/Release.Shared/build/<tool> |
|
||||
| | FreeBSD 8, 64b | | ~/coriolis-2.x/FreeBSD.8x.amd64/Release.Shared/build/<tool> |
|
||||
| | Windows 7, 32b | | ~/coriolis-2.x/Cygwin.W7/Release.Shared/build/<tool> |
|
||||
| | Windows 7, 64b | | ~/coriolis-2.x/Cygwin.W7_64/Release.Shared/build/<tool> |
|
||||
| | Windows 8.x, 32b | | ~/coriolis-2.x/Cygwin.W8/Release.Shared/build/<tool> |
|
||||
| | Windows 8.x, 64b | | ~/coriolis-2.x/Cygwin.W8_64/Release.Shared/build/<tool> |
|
||||
+------------------------------+-------------------------------------------------------------------------------+
|
||||
| **Architecture Dependant Install** |
|
||||
+------------------------------+-------------------------------------------------------------------------------+
|
||||
| Linux, SL 6, 32b | ~/coriolis-2.x/Linux.slsoc6x/Release.Shared/install/ |
|
||||
+------------------------------+-------------------------------------------------------------------------------+
|
||||
| **FHS Compliant Structure under Install** |
|
||||
+------------------------------+-------------------------------------------------------------------------------+
|
||||
| | Binaries | | .../install/bin |
|
||||
| | Libraries (Python) | | .../install/lib |
|
||||
| | Include by tool | | .../install/include/coriolis2/<project>/<tool> |
|
||||
| | Configuration files | | .../install/etc/coriolis2/ |
|
||||
| | Doc, by tool | | .../install/share/doc/coriolis2/en/html/<tool> |
|
||||
+------------------------------+-------------------------------------------------------------------------------+
|
||||
|
||||
.. note:: *Alternate build types:* the ``Release.Shared`` means an optimized build
|
||||
with shared libraries. But there are also available ``Static`` instead of ``Shared``
|
||||
and ``Debug`` instead of ``Release`` and any combination of them.
|
||||
|
||||
``Static`` do not work because I don't know yet to mix statically linked binaries
|
||||
and Python modules (which must be dynamic).
|
||||
|
||||
|newpage|
|
||||
|
||||
|
||||
Building Coriolis
|
||||
~~~~~~~~~~~~~~~~~
|
||||
|
||||
First step is to install the prerequisites. Currently, only RapidJSON_.
|
||||
As RapidJSON is evolving fast, if you encounter compatibility problems,
|
||||
the exact version we compiled against is given below. ::
|
||||
|
||||
dummy@lepka:~$ mkdir -p ~/coriolis-2.x/src/support
|
||||
dummy@lepka:~$ cd ~/coriolis-2.x/src/support
|
||||
dummy@lepka:~$ git clone http://github.com/miloyip/rapidjson
|
||||
dummy@lepka:~$ git checkout ec322005072076ef53984462fb4a1075c27c7dfd
|
||||
|
||||
The second step is to create the source directory and pull the |git| repository: ::
|
||||
|
||||
dummy@lepka:~$ mkdir -p ~/coriolis-2.x/src
|
||||
dummy@lepka:~$ cd ~/coriolis-2.x/src
|
||||
dummy@lepka:~$ git clone https://www-soc.lip6.fr/git/coriolis.git
|
||||
|
||||
Third and final step, build & install: ::
|
||||
|
||||
dummy@lepka:src$ ./bootstrap/ccb.py --project=support \
|
||||
--project=coriolis \
|
||||
--make="-j4 install"
|
||||
dummy@lepka:src$ ./bootstrap/ccb.py --project=support \
|
||||
--project=coriolis \
|
||||
--doc --make="-j1 install"
|
||||
|
||||
We need to separate to perform a separate installation of the documentation because it
|
||||
do not support to be generated with a parallel build. So we compile & install in a first
|
||||
stage in ``-j4`` (or whatever) then we generate the documentation in ``-j1``
|
||||
|
||||
Under |RHEL6| or clones, you must build using the |devtoolset2|: ::
|
||||
|
||||
dummy@lepka:src$ ./bootstrap/ccb.py --project=coriolis \
|
||||
--devtoolset-2 --make="-j4 install"
|
||||
|
||||
If you want to uses Qt 5 instead of Qt 4, you may add the ``--qt5`` argument.
|
||||
|
||||
The complete list of |ccb| functionalities can be accessed with the ``--help`` argument.
|
||||
It also may be run in graphical mode (``--gui``).
|
||||
|
||||
|
||||
Building the Devel Branch
|
||||
-------------------------
|
||||
|
||||
In the |Coriolis| |git| repository, two branches are present:
|
||||
|
||||
* The :cb:`master` branch, which contains the latest stable version. This is the
|
||||
one used by default if you follow the above instructions.
|
||||
|
||||
* The :cb:`devel` branch, which obviously contains the latest commits from the
|
||||
development team. To use it instead of the :cb:`master` one, do the following
|
||||
command just after the first step: ::
|
||||
|
||||
dummy@lepka:~$ git checkout devel
|
||||
dummy@lepka:src$ ./bootstrap/ccb.py --project=coriolis \
|
||||
--make="-j4 install" --debug
|
||||
|
||||
Be aware that it may requires newer versions of the dependencies and may introduce
|
||||
incompatibilites with the stable version.
|
||||
|
||||
In the (unlikely) event of a crash of |cgt|, as it is a |Python| script, the right
|
||||
command to run |gdb| on it is: ::
|
||||
|
||||
dummy@lepka:work$ gdb python core.XXXX
|
||||
|
||||
|newpage|
|
||||
|
||||
|
||||
Additionnal Requirement under |MacOS|
|
||||
-------------------------------------
|
||||
|
||||
|Coriolis| make uses of the :cb:`boost::python` module, but the |macports| |boost|
|
||||
seems unable to work with the |Python| bundled with |MacOS|. So you have to install
|
||||
both of them from |macports|: ::
|
||||
|
||||
dummy@macos:~$ port install boost +python27
|
||||
dummy@macos:~$ port select python python27
|
||||
dummy@macos:-$ export DYLD_FRAMEWORK_PATH=/opt/local/Library/Frameworks
|
||||
|
||||
The last two lines tell |MacOS| to use the |Python| from |macports| and *not* from
|
||||
the system.
|
||||
|
||||
Then proceed with the generic install instructions.
|
||||
|
||||
|
||||
Packaging Coriolis
|
||||
~~~~~~~~~~~~~~~~~~
|
||||
|
||||
Packager should not uses |ccb|, instead ``bootstrap/Makefile.package`` is provided
|
||||
to emulate a top-level ``autotool`` makefile. Just copy it in the root of the
|
||||
|Coriolis| git repository (``~/corriolis-2.x/src/coriolis/``) and build.
|
||||
|
||||
Sligthly outaded packaging configuration files can also be found under ``bootstrap/``:
|
||||
|
||||
* ``bootstrap/coriolis2.spec.in`` for |rpm| based distributions.
|
||||
* ``bootstrap/debian`` for |Debian| based distributions.
|
||||
|
||||
|
||||
Hooking up into |Alliance|
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
|Coriolis| relies on |Alliance| for the cell libraries. So after installing or
|
||||
packaging, you must configure it so that it can found those libraries.
|
||||
|
||||
This is done by editing the one variable :cb:`cellsTop` in the |Alliance| helper
|
||||
(see :ref:`Alliance Helper`). This variable must point to the directory of the
|
||||
cells libraries. In a typical installation, this is generally
|
||||
:cb:`/usr/share/alliance/cells`.
|
||||
|
||||
|
||||
Setting up the Environment (coriolisEnv.py)
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
To simplify the tedious task of configuring your environment, a helper is provided
|
||||
in the ``bootstrap`` source directory (also installed in the directory
|
||||
``.../install/etc/coriolis2/``) : ::
|
||||
|
||||
~/coriolis-2.x/src/coriolis/bootstrap/coriolisEnv.py
|
||||
|
||||
Use it like this: ::
|
||||
|
||||
dummy@lepka:~> eval `~/coriolis-2.x/src/coriolis/bootstrap/coriolisEnv.py`
|
||||
|
||||
.. note:: **Do not call that script in your environement initialisation.**
|
||||
When used under |RHEL6| or clones, it needs to be run in the |devtoolset2|
|
||||
environement. The script then launch a new shell, which may cause an
|
||||
infinite loop if it's called again in, say :cb:`~/.bashrc`.
|
||||
|
||||
Instead you may want to create an alias: ::
|
||||
|
||||
alias c2r='eval "`~/coriolis-2.x/src/coriolis/bootstrap/coriolisEnv.py`"'
|
|
@ -1,50 +0,0 @@
|
|||
|
||||
.. -*- Mode: rst -*-
|
||||
|
||||
.. role:: raw-latex(raw)
|
||||
:format: latex
|
||||
|
||||
.. URLs that changes between the various backends.
|
||||
.. _Coriolis Tools Documentation: https://www-soc.lip6.fr/sesi-docs/coriolis2-docs/coriolis2/
|
||||
.. _Stratus Documentation: https://www-soc.lip6.fr/sesi-docs/coriolis2-docs/coriolis2/en/html/stratus/index.html
|
||||
|
||||
.. |DONE| replace:: :raw-latex:`\marginpar{\fbox{\small\ding{56}}}`
|
||||
|
||||
.. For LaTeX/PDF backend.
|
||||
.. |rightarrow| replace:: :raw-latex:`$\rightarrow$`
|
||||
.. |menu_P&R| replace:: :raw-latex:`\fbox{\textsf{\textbf{{P\&R}}}}`
|
||||
.. |menu_StepByStep| replace:: :raw-latex:`\fbox{\textsf{\textbf{{\underline{S}tep by Step}}}}`
|
||||
.. |menu_KiteSaveGlobalRouting| replace:: :raw-latex:`\fbox{\textsf{\textbf{{\underline{S}ave Global Routing}}}}`
|
||||
.. |menu_KiteLoadGlobalRouting| replace:: :raw-latex:`\fbox{\textsf{\textbf{{\underline{L}oad Global Routing}}}}`
|
||||
.. |menu_KiteGlobalRoute| replace:: :raw-latex:`\fbox{\textsf{\textbf{{\underline{G}lobal Route}}}}`
|
||||
.. |menu_KiteDetailedRoute| replace:: :raw-latex:`\fbox{\textsf{\textbf{{\underline{D}etailed Route}}}}`
|
||||
.. |menu_KiteDetailedPreRoute| replace:: :raw-latex:`\fbox{\textsf{\textbf{{\underline{D}etailed Pre-Route}}}}`
|
||||
.. |menu_KiteFinalizeRoute| replace:: :raw-latex:`\fbox{\textsf{\textbf{{\underline{F}inalize Route}}}}`
|
||||
|
||||
.. Stand-alone images.
|
||||
.. |ViewerSnapshot_1| replace:: :raw-latex:`\begin{center}\fbox{\includegraphics[width=.7\textwidth]{./images/Viewer-1.eps}}\end{center}`
|
||||
.. |ControllerSnapshot_1| replace:: :raw-latex:`\begin{center}\includegraphics[width=.7\textwidth]{./images/Controller-1.eps}\end{center}`
|
||||
.. |ControllerLook_1| replace:: :raw-latex:`\begin{center}\includegraphics[width=.7\textwidth]{./images/Controller-Look-1.eps}\end{center}`
|
||||
.. |ControllerFilter_1| replace:: :raw-latex:`\begin{center}\includegraphics[width=.7\textwidth]{./images/Controller-Filter-1.eps}\end{center}`
|
||||
.. |ControllerLayersGos_1| replace:: :raw-latex:`\begin{center}\includegraphics[width=.7\textwidth]{./images/Controller-LayersGos-1.eps}\end{center}`
|
||||
.. |ControllerNetlist_1| replace:: :raw-latex:`\begin{center}\includegraphics[width=.7\textwidth]{./images/Controller-Netlist-1.eps}\end{center}`
|
||||
.. |ViewerNetlist_1| replace:: :raw-latex:`\begin{center}\includegraphics[width=.7\textwidth]{./images/Viewer-Netlist-1.eps}\end{center}`
|
||||
.. |ControllerSelection_1| replace:: :raw-latex:`\begin{center}\includegraphics[width=.7\textwidth]{./images/Controller-Selection-1.eps}\end{center}`
|
||||
.. |ControllerInspector_1| replace:: :raw-latex:`\begin{center}\includegraphics[width=.7\textwidth]{./images/Controller-Inspector-1.eps}\end{center}`
|
||||
.. |ControllerInspector_2| replace:: :raw-latex:`\begin{center}\includegraphics[width=.7\textwidth]{./images/Controller-Inspector-2.eps}\end{center}`
|
||||
.. |ControllerInspector_3| replace:: :raw-latex:`\begin{center}\includegraphics[width=.7\textwidth]{./images/Controller-Inspector-3.eps}\end{center}`
|
||||
.. |ControllerSettings_1| replace:: :raw-latex:`\begin{center}\includegraphics[width=.7\textwidth]{./images/Controller-Settings-1.eps}\end{center}`
|
||||
.. |CoriolisSoftSchema| replace:: :raw-latex:`\begin{center}\includegraphics[width=.7\textwidth]{./images/Coriolis-Soft-Schema.eps}\end{center}`
|
||||
.. |ChipStructure-1| replace:: :raw-latex:`\begin{center}\includegraphics[width=.95\textwidth]{./images/chip-structure-1.eps}\end{center}`
|
||||
.. |Etesian-1| replace:: :raw-latex:`\begin{center}\includegraphics[width=.95\textwidth]{./images/etesian-1.eps}\end{center}`
|
||||
|
||||
.. |BigMouse| image:: ./images/ComputerMouse.eps
|
||||
:scale: 25%
|
||||
|
||||
.. Direct LaTeX commands encapsulation.
|
||||
.. |dotfill| replace:: :raw-latex:`\dotfill`
|
||||
.. |noindent| replace:: :raw-latex:`\noindent`
|
||||
.. |medskip| replace:: :raw-latex:`\medskip`
|
||||
.. |newpage| replace:: :raw-latex:`\newpage`
|
||||
.. |br| replace:: :raw-latex:`\\`
|
||||
|
|
@ -0,0 +1,55 @@
|
|||
.. -*- Mode: rst -*-
|
||||
|
||||
.. include:: ../etc/definitions.rst
|
||||
|
||||
|
||||
Credits & License
|
||||
=================
|
||||
|
||||
.. raw:: html
|
||||
|
||||
<p class="credit"><span class="left"><span class="sc">Hurricane</span></span>
|
||||
<span class="right">Rémy <span class="sc">Escassut</span> &
|
||||
Christian <span class="sc">Masson</span></span></p>
|
||||
<br>
|
||||
<p class="credit"><span class="left"><span class="sc">Etesian</span></span>
|
||||
<span class="right">Gabriel <span class="sc">Gouvine</span></span></p>
|
||||
<br>
|
||||
<p class="credit"><span class="left"><span class="sc">Stratus</span></span>
|
||||
<span class="right">Sophie <span class="sc">Belloeil</span></span></p>
|
||||
<br>
|
||||
<p class="credit"><span class="left"><span class="sc">Knik</span></span>
|
||||
<span class="right">Damien <span class="sc">Dupuis</span></span></p>
|
||||
<br>
|
||||
<p class="credit"><span class="left"><span class="sc">Kite</span>,
|
||||
<span class="sc">Unicorn</span></span></span>
|
||||
<span class="right">Jean-Paul <span class="sc">Chaput</span></span></p>
|
||||
<br>
|
||||
|
||||
|
||||
.. raw:: latex
|
||||
|
||||
\begin{center}\begin{minipage}[t]{.8\textwidth}
|
||||
\noindent\DUrole{sc}{Hurricane} \dotfill Rémy \DUrole{sc}{Escassut} \&
|
||||
Christian \DUrole{sc}{Masson} \\
|
||||
\noindent\DUrole{sc}{Etesian} \dotfill Gabriel \DUrole{sc}{Gouvine} \\
|
||||
\noindent\DUrole{sc}{Stratus} \dotfill Sophie \DUrole{sc}{Belloeil} \\
|
||||
\noindent\DUrole{sc}{Knik} \dotfill Damien \DUrole{sc}{Dupuis} \\
|
||||
\noindent\DUrole{sc}{Kite},
|
||||
\DUrole{sc}{Unicorn} \dotfill Jean-Paul \DUrole{sc}{Chaput} \\
|
||||
\end{minipage}\end{center}
|
||||
|
||||
|
||||
|medskip|
|
||||
|
||||
The |Hurricane| data-base is copyright© |Bull| 2000-2016 and is
|
||||
released under the terms of the |LGPL| license. All other tools are
|
||||
copyright© |UPMC| 2008-2016 and released under the |GPL|
|
||||
license.
|
||||
|
||||
Others important contributors to |Coriolis| are Christophe |Alexandre|,
|
||||
Hugo |Clement|, Marek |Sroka| and Wu |Yifei|.
|
||||
|
||||
The |Knik| router makes use of the |Flute| software, which is
|
||||
copyright© Chris C. N. |Chu| from the Iowa State University
|
||||
(http://home.eng.iastate.edu/~cnchu/).
|
|
@ -1,41 +0,0 @@
|
|||
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 */
|
|
@ -0,0 +1,102 @@
|
|||
.. -*- Mode: rst -*-
|
||||
|
||||
.. include:: ../etc/definitions.rst
|
||||
|
||||
|
||||
Release Notes
|
||||
=============
|
||||
|
||||
Release 1.0.1475
|
||||
~~~~~~~~~~~~~~~~
|
||||
|
||||
This is the first preliminary release of the |Coriolis2| framework.
|
||||
|
||||
This release mainly ships the global router |Knik| and the detailed router
|
||||
|Kite|. Together they aim to replace the |Alliance| |Nero| router.
|
||||
Unlike |Nero|, |Kite| is based on an innovating routing modeling and ad-hoc
|
||||
algorithm. Although it is released under |GPL| license, the source code
|
||||
will be avalaible later.
|
||||
|medskip|
|
||||
|
||||
|
||||
|noindent| Contents of this release:
|
||||
|
||||
1. A graphical user interface (viewer only).
|
||||
2. The |Knik| global router.
|
||||
3. The |Kite| detailed router.
|
||||
|
||||
|noindent| Supported input/output formats:
|
||||
|
||||
* |Alliance| |vst| (netlist) & |ap| (physical) formats.
|
||||
* Even if there are some references to the |Cadence| |LEFDEF| format, its
|
||||
support is not included because it depends on a library only available
|
||||
to |Si2| affiliated members.
|
||||
|
||||
|
||||
Release 1.0.1963
|
||||
~~~~~~~~~~~~~~~~
|
||||
|
||||
Release 1963 is alpha. All the tools from |Coriolis1| have been ported into
|
||||
this release.
|
||||
|
||||
|noindent| Contents of this release:
|
||||
|
||||
#. The |Stratus| netlist capture language (|GenLib| replacement).
|
||||
#. The |Mauka| placer (still contains bugs).
|
||||
#. A graphical user interface (viewer only).
|
||||
#. The |Knik| global router.
|
||||
#. The |Kite| detailed router.
|
||||
#. Partially implemented python support for configuration files
|
||||
(alternative to |XML|).
|
||||
#. A documentation (imcomplete/obsoleted in |Hurricane|'s case).
|
||||
|
||||
|
||||
Release 1.0.2049
|
||||
~~~~~~~~~~~~~~~~
|
||||
|
||||
Release `2049` is Alpha.
|
||||
|
||||
|noindent| Changes of this release:
|
||||
|
||||
#. The |Hurricane| documentation is now accurate. Documentation
|
||||
for the Cell viewer and |CRLcore| has been added.
|
||||
#. More extensive Python support for all the components of
|
||||
|Coriolis|.
|
||||
#. Configuration is now completly migrated under Python.
|
||||
|XML| loaders can still be useds for compatibilty.
|
||||
#. The |cgt| main has been rewritten in Python.
|
||||
|
||||
|
||||
Release v2.0.1
|
||||
~~~~~~~~~~~~~~
|
||||
|
||||
#. Migrated the repository from |svn| to |git|, and release complete sources.
|
||||
As a consequence, we drop the distribution packaging support and give
|
||||
public read-only access to the repository.
|
||||
#. Deep rewrite of the |Katabatic| database and |Kite| detailed router,
|
||||
achieve a speedup factor greater than 20...
|
||||
|
||||
|
||||
Release v2.1
|
||||
~~~~~~~~~~~~
|
||||
|
||||
#. Replace the old simulated annealing placer |Mauka| by the analytical placer
|
||||
|Etesian| and its legalization and detailed placement tools.
|
||||
#. Added a Blif format parser to process circuits generated by the Yosys and ABC
|
||||
logic synthetizers.
|
||||
#. The multiples user defined configuration files are now grouped under
|
||||
a common hidden (dot) directory ``.coriolis2`` and the file extension
|
||||
is back from ``.conf`` to ``.py``.
|
||||
|
||||
.. #. Under |RHEL7| / |SL7|, there is a known bug in the graphical visualizer.
|
||||
.. When shifting to the left, the right-half part of the screen gets
|
||||
.. badly redrawn. Uses |CTRL_L| to refresh. It will be corrected as soon
|
||||
.. as possible.
|
||||
|
||||
|
||||
**Release v2.2**
|
||||
~~~~~~~~~~~~~~~~
|
||||
|
||||
#. Added JSON import/export of the whole Hurricane DataBase. Two save mode
|
||||
are supported: *Cell* mode (standalone) or *Blob* mode, which dump the
|
||||
whole design down and including the standard cells.
|
|
@ -0,0 +1,332 @@
|
|||
.. -*- Mode: rst -*-
|
||||
|
||||
.. include:: ../etc/definitions.rst
|
||||
|
||||
.. URLs that changes between the various backends.
|
||||
.. _Stratus Documentation: file:///usr/share/doc/coriolis2/en/html/stratus/index.html
|
||||
|
||||
.. |ChipStructure-1| image:: ./images/chip-structure-1.png
|
||||
:alt: Chip Top Structure
|
||||
:align: middle
|
||||
:width: 90%
|
||||
|
||||
|
||||
.. _Python Interface to Coriolis:
|
||||
|
||||
Python Interface for |Hurricane| / |Coriolis|
|
||||
=============================================
|
||||
|
||||
The (almost) complete interface of |Hurricane| is exported as a |Python| module
|
||||
and some part of the other components of |Coriolis| (each one in a separate
|
||||
module). The interface has been made to mirror as closely as possible the
|
||||
C++ one, so the C++ doxygen documentation could be used to write code with
|
||||
either languages.
|
||||
|
||||
`Summary of the C++ Documentation <file:../../../index.html>`_
|
||||
|
||||
A script could be run directly in text mode from the command line or through
|
||||
the graphical interface (see :ref:`Python Scripts in Cgt`).
|
||||
|
||||
Asides for this requirement, the python script can contain anything valid
|
||||
in |Python|, so don't hesitate to use any package or extention.
|
||||
|
||||
Small example of Python/Stratus script: ::
|
||||
|
||||
from Hurricane import *
|
||||
from Stratus import *
|
||||
|
||||
def doSomething ():
|
||||
# ...
|
||||
return
|
||||
|
||||
def ScriptMain ( **kw ):
|
||||
editor = None
|
||||
if kw.has_key('editor') and kw['editor']:
|
||||
editor = kw['editor']
|
||||
stratus.setEditor( editor )
|
||||
|
||||
doSomething()
|
||||
return
|
||||
|
||||
if __name__ == "__main__" :
|
||||
kw = {}
|
||||
success = ScriptMain( **kw )
|
||||
shellSuccess = 0
|
||||
if not success: shellSuccess = 1
|
||||
|
||||
sys.exit( shellSuccess )
|
||||
ScriptMain ()
|
||||
|
||||
This typical script can be executed in two ways:
|
||||
|
||||
#. Run directly as a |Python| script, thanks to the ::
|
||||
|
||||
if __name__ == "__main__" :
|
||||
|
||||
part (this is standart |Python|). It is a simple adapter that will
|
||||
calls :cb:`ScriptMain()`.
|
||||
#. Through |cgt|, either in text or graphical mode. In that case, the
|
||||
:cb:`ScriptMain()` is directly called trough a sub-interpreter.
|
||||
The arguments of the script are passed through the ``**kw`` dictionnary.
|
||||
|
||||
+----------------------+-----------------------------------------------+
|
||||
| \*\*kw Dictionnary |
|
||||
+----------------------+-----------------------------------------------+
|
||||
| Parameter Key/Name | Contents type |
|
||||
+======================+===============================================+
|
||||
| ``'cell'`` | A Hurricane cell on which to work. Depending |
|
||||
| | on the context, it may be ``None``. |
|
||||
| | For example, when run from |cgt|, it the cell |
|
||||
| | currently loaded in the viewer, if any. |
|
||||
+----------------------+-----------------------------------------------+
|
||||
| ``'editor'`` | The viewer from which the script is run, when |
|
||||
| | lauched through |cgt|. |
|
||||
+----------------------+-----------------------------------------------+
|
||||
|
||||
|
||||
Plugins
|
||||
~~~~~~~
|
||||
|
||||
Plugins are |Python| scripts specially crafted to integrate with |cgt|.
|
||||
Their entry point is a :cb:`ScriptMain()` method as described in
|
||||
`Python Interface to Coriolis`_. They can be called by user scripts
|
||||
through this method.
|
||||
|
||||
|
||||
|
||||
Chip Placement
|
||||
--------------
|
||||
|
||||
Automatically perform the placement of a complete chip. This plugin, as well
|
||||
as the other P&R tools expect a specific top-level hierarchy for the design.
|
||||
The top-level hierarchy must contains the instances of all the I/O pads and
|
||||
**exactly one** instance of the chip's core model.
|
||||
|
||||
|bcenter| |ChipStructure-1| |ecenter|
|
||||
|
||||
The designer must provide a configuration file that define the rules for the
|
||||
placement of the top-level hierarchy (that is, the pads and the core).
|
||||
This file must be named after the chip's name, by appending ``_chip.py``
|
||||
(obviously, it is a |Python| file). For instance if the chip netlist file
|
||||
is called ``amd2901_crl.vst``, then the configuration file must be named
|
||||
``amd2901_crl_chip.vst``.
|
||||
|
||||
Example of chip placement configuration file (for ``AM2901``): ::
|
||||
|
||||
chip = \
|
||||
{ 'pads.south' : [ 'p_a3' , 'p_a2' , 'p_a1' , 'p_r0'
|
||||
, 'p_vddick0', 'p_vssick0', 'p_a0' , 'p_i6'
|
||||
, 'p_i8' , 'p_i7' , 'p_r3' ]
|
||||
, 'pads.east' : [ 'p_zero' , 'p_i0' , 'p_i1' , 'p_i2'
|
||||
, 'p_vddeck0', 'p_vsseck0', 'p_q3' , 'p_b0'
|
||||
, 'p_b1' , 'p_b2' , 'p_b3' ]
|
||||
, 'pads.north' : [ 'p_noe' , 'p_y3' , 'p_y2' , 'p_y1'
|
||||
, 'p_y0' , 'p_vddeck1', 'p_vsseck1', 'p_np'
|
||||
, 'p_ovr' , 'p_cout' , 'p_ng' ]
|
||||
, 'pads.west' : [ 'p_cin' , 'p_i4' , 'p_i5' , 'p_i3'
|
||||
, 'p_ck' , 'p_d0' , 'p_d1' , 'p_d2'
|
||||
, 'p_d3' , 'p_q0' , 'p_f3' ]
|
||||
, 'core.size' : ( 1500, 1500 )
|
||||
, 'chip.size' : ( 3000, 3000 )
|
||||
, 'chip.clockTree' : True
|
||||
}
|
||||
|
||||
The file must contain *one dictionnary* named ``chip``.
|
||||
|
||||
+----------------------+-------------------------------------------------------+
|
||||
| Chip Dictionnary |
|
||||
+----------------------+-------------------------------------------------------+
|
||||
| Parameter Key/Name | Value/Contents type |
|
||||
+======================+=======================================================+
|
||||
| ``'pad.south'`` | Ordered list (left to right) of pad instances names |
|
||||
| | to put on the south side of the chip |
|
||||
+----------------------+-------------------------------------------------------+
|
||||
| ``'pad.east'`` | Ordered list (down to up) of pad instances names |
|
||||
| | to put on the east side of the chip |
|
||||
+----------------------+-------------------------------------------------------+
|
||||
| ``'pad.north'`` | Ordered list (left to right) of pad instances names |
|
||||
| | to put on the north side of the chip |
|
||||
+----------------------+-------------------------------------------------------+
|
||||
| ``'pad.west'`` | Ordered list (down to up) of pad instances names |
|
||||
| | to put on the west side of the chip |
|
||||
+----------------------+-------------------------------------------------------+
|
||||
| ``'core.size'`` | The size of the core (to be used by the placer) |
|
||||
+----------------------+-------------------------------------------------------+
|
||||
| ``'chip.size'`` | The size of the whole chip. The sides must be great |
|
||||
| | enough to accomodate all the pads |
|
||||
+----------------------+-------------------------------------------------------+
|
||||
| ``'chip.clockTree'`` | Whether to generate a clock tree or not. This calls |
|
||||
| | the ClockTree plugin |
|
||||
+----------------------+-------------------------------------------------------+
|
||||
|
||||
Configuration parameters, defaults are defined in ``etc/coriolis2/<STECHNO>/plugins.conf``.
|
||||
|
||||
+-----------------------------------+------------------+----------------------------+
|
||||
| Parameter Identifier | Type | Default |
|
||||
+===================================+==================+============================+
|
||||
| **Chip Plugin Parameters** |
|
||||
+-----------------------------------+------------------+----------------------------+
|
||||
|``chip.block.rails.count`` | TypeInt | :cb:`5` |
|
||||
| +------------------+----------------------------+
|
||||
| | The minimum number of rails around the core |
|
||||
| | block. Must be odd and suppérior to 5. |
|
||||
| | One rail for the clock and at least two pairs |
|
||||
| | of power/grounds |
|
||||
+-----------------------------------+------------------+----------------------------+
|
||||
|``chip.block.rails.hWidth`` | TypeInt | :cb:`12` |
|
||||
| +------------------+----------------------------+
|
||||
| | The horizontal with of the rails |
|
||||
+-----------------------------------+------------------+----------------------------+
|
||||
|``chip.block.rails.vWidth`` | TypeInt | :cb:`12` |
|
||||
| +------------------+----------------------------+
|
||||
| | The vertical with of the rails |
|
||||
+-----------------------------------+------------------+----------------------------+
|
||||
|``chip.block.rails.hSpacing`` | TypeInt | :cb:`6` |
|
||||
| +------------------+----------------------------+
|
||||
| | The spacing, *edge to edge* of two adjacent |
|
||||
| | horizontal rails |
|
||||
+-----------------------------------+------------------+----------------------------+
|
||||
|``chip.block.rails.vSpacing`` | TypeInt | :cb:`6` |
|
||||
| +------------------+----------------------------+
|
||||
| | The spacing, *edge to edge* of two adjacent |
|
||||
| | vertical rails |
|
||||
+-----------------------------------+------------------+----------------------------+
|
||||
|``chip.pad.pck`` | TypeString | :cb:`pck_px` |
|
||||
| +------------------+----------------------------+
|
||||
| | The model name of the pad connected to the |
|
||||
| | chip external clock |
|
||||
+-----------------------------------+------------------+----------------------------+
|
||||
|``chip.pad.pvddeck`` | TypeString | :cb:`pvddeck_px` |
|
||||
| +------------------+----------------------------+
|
||||
| | The model name of the pad connected to the |
|
||||
| | ``vdde`` (external power) and suppling it to |
|
||||
| | the core |
|
||||
+-----------------------------------+------------------+----------------------------+
|
||||
|``chip.pad.pvsseck`` | TypeString | :cb:`pvsseck_px` |
|
||||
| +------------------+----------------------------+
|
||||
| | The model name of the pad connected to the |
|
||||
| | ``vsse`` (external ground) and suppling it to |
|
||||
| | the core |
|
||||
+-----------------------------------+------------------+----------------------------+
|
||||
|``chip.pad.pvddick`` | TypeString | :cb:`pvddick_px` |
|
||||
| +------------------+----------------------------+
|
||||
| | The model name of the pad connected to the |
|
||||
| | ``vddi`` (internal power) and suppling it to |
|
||||
| | the core |
|
||||
+-----------------------------------+------------------+----------------------------+
|
||||
|``chip.pad.pvssick`` | TypeString | :cb:`pvssick_px` |
|
||||
| +------------------+----------------------------+
|
||||
| | The model name of the pad connected to the |
|
||||
| | ``vssi`` (internal ground) and suppling it to |
|
||||
| | the core |
|
||||
+-----------------------------------+------------------+----------------------------+
|
||||
|
||||
.. note::
|
||||
If no clock tree is generated, then the clock rail is *not* created.
|
||||
So even if the requested number of rails ``chip.block.rails.count`` is, say 5,
|
||||
only four rails (2* ``power``, 2* ``ground``) will be generateds.
|
||||
|
||||
|
||||
Clock Tree
|
||||
----------
|
||||
|
||||
Insert a clock tree into a block. The clock tree uses the H strategy.
|
||||
The clock net is splitted into sub-nets, one for each branch of the
|
||||
tree.
|
||||
|
||||
* On **chips** design, the sub-nets are createds in the model of the
|
||||
core block (then trans-hierarchically flattened to be shown at
|
||||
chip level).
|
||||
* On **blocks**, the sub nets are created directly in the top block.
|
||||
* The sub-nets are named according to a simple geometrical scheme.
|
||||
A common prefix ``ck_htree``, then one postfix by level telling
|
||||
on which quarter of plane the sub-clock is located:
|
||||
|
||||
#. ``_bl``: bottom left plane quarter.
|
||||
#. ``_br``: bottom right plane quarter.
|
||||
#. ``_tl``: top left plane quarter.
|
||||
#. ``_tr``: top right plane quarter.
|
||||
|
||||
We can have ``ck_htree_bl``, ``ck_htree_bl_bl``, ``ch_htree_bl_tl`` and so on.
|
||||
|
||||
The clock tree plugin works in four steps:
|
||||
|
||||
#. Build the clock tree: creates the top-block abutment box, compute the
|
||||
levels of H tree neededs and place the clock buffers.
|
||||
#. Once the clock buffers are placed, calls the placer (|etesian|) to place
|
||||
the ordinary standart cells, whithout disturbing clock H-tree buffers.
|
||||
#. At this point we know the exact positions of all the DFFs, so we can
|
||||
connect them to the nearest H-tree leaf clock signal.
|
||||
#. Leaf clock signals that are not connecteds to any DFFs are removed.
|
||||
|
||||
Netlist reorganisation:
|
||||
|
||||
* Obviously the top block or chip core model netlist is modificated to
|
||||
contains all the clock sub-nets. The interface is *not* changed.
|
||||
* If the top block contains instances of other models *and* those models
|
||||
contains DFFs that get re-connecteds to the clock sub-nets (from the
|
||||
top level). Change both the model netlist and interface to propagate
|
||||
the relevant clock sub-nets to the instanciated model. The new model
|
||||
with the added clock signal is renamed with a ``_clocked`` suffix.
|
||||
For example, the sub-block model ``ram.vst`` will become ``ram_clocked.vst``.
|
||||
|
||||
.. note::
|
||||
If you are to re-run the clock tree plugin on a netlist, be careful
|
||||
to erase any previously generated ``_clocked`` file (both netlist and
|
||||
layout: ``rm *.clocked.{ap,vst}``). And restart |cgt| to clear it's
|
||||
memory cache.
|
||||
|
||||
Configuration parameters, defaults are defined in ``etc/coriolis2/<STECHNO>/plugins.conf``.
|
||||
|
||||
+-----------------------------------+------------------+----------------------------+
|
||||
| Parameter Identifier | Type | Default |
|
||||
+===================================+==================+============================+
|
||||
| **ClockTree Plugin Parameters** |
|
||||
+-----------------------------------+------------------+----------------------------+
|
||||
|``clockTree.minimumSide`` | TypeInt | :cb:`300` |
|
||||
| +------------------+----------------------------+
|
||||
| | The minimum size below which the clock tree |
|
||||
| | will stop to perform quadri-partitions |
|
||||
+-----------------------------------+------------------+----------------------------+
|
||||
|``clockTree.buffer`` | TypeString | :cb:`buf_x2` |
|
||||
| +------------------+----------------------------+
|
||||
| | The buffer model to use to drive sub-nets |
|
||||
+-----------------------------------+------------------+----------------------------+
|
||||
|``clockTree.placerEngine`` | TypeString | :cb:`Etesian` |
|
||||
| +------------------+----------------------------+
|
||||
| | The placer to use. Other value is ``Mauka`` |
|
||||
| | the simulated annealing placer which will go |
|
||||
| | into retirement very soon |
|
||||
+-----------------------------------+------------------+----------------------------+
|
||||
|
||||
|
||||
Recursive-Save (RSave)
|
||||
----------------------
|
||||
|
||||
Perform a recursive top down save of all the models from the top cell
|
||||
loaded in |cgt|. Force a write of any non-terminal model. This plugin is used
|
||||
by the clock tree plugin after the netlist clock sub-nets creation.
|
||||
|
||||
|
||||
A Simple Example: AM2901
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
To illustrate the capabilities of |Coriolis| tools and |Python| scripting, a small
|
||||
example, derived from the |Alliance| :cb:`AM2901` is supplied.
|
||||
|
||||
This example contains only the synthetized netlists and the :cb:`doChip.py` script
|
||||
which perform the whole P&R of the design.
|
||||
|
||||
You can generate the chip using one of the following method:
|
||||
|
||||
#. **Command line mode:** directly run the script: ::
|
||||
|
||||
dummy@lepka:AM2901$ ./doChip -V --cell=amd2901
|
||||
|
||||
#. **Graphic mode:** launch |cgt|, load chip netlist ``amd2901`` (the top cell)
|
||||
then run the |Python| script :cb:`doChip.py`.
|
||||
|
||||
.. note::
|
||||
Between two consecutive run, be sure to erase the netlist/layout generateds: ::
|
||||
|
||||
dummy@lepka:AM2901$ rm *_clocked*.vst *.ap
|
|
@ -1,796 +0,0 @@
|
|||
|
||||
html, body, th, td, tr, p, li, h1, h2, h3, h4, h5, h6 {
|
||||
font-size: 96%;
|
||||
font-family: "Open Sans", verdana, sans-serif;
|
||||
}
|
||||
|
||||
body {
|
||||
color: black;
|
||||
background: white;
|
||||
/*
|
||||
background: #09550B;
|
||||
background-color: white;
|
||||
*/
|
||||
background-position: top left;
|
||||
background-attachment: fixed;
|
||||
background-repeat: no-repeat;
|
||||
margin: 0 0 0 0;
|
||||
padding: 20pt;
|
||||
width: 550pt;
|
||||
margin-right: 10%;
|
||||
margin-left: 30%;
|
||||
-moz-box-shadow: 4px 4px 5px 3px #ccc;
|
||||
-webkit-box-shadow: 4px 4px 5px 3px #ccc;
|
||||
box-shadow: 4px 4px 5px 3px #ccc;
|
||||
}
|
||||
|
||||
body.gsummary {
|
||||
margin-right: 10%;
|
||||
margin-left: 10%;
|
||||
}
|
||||
|
||||
h1, h2, h3, h4, h5, h6 { font-family: "Open Sans", verdana, sans-serif; }
|
||||
h1 { text-align: center;
|
||||
border-top: 2px solid #09550b;
|
||||
border-bottom: 2px solid #09550b;
|
||||
padding-top: 7pt;
|
||||
padding-bottom: 7pt;
|
||||
}
|
||||
h2, h3, h4, h5, h6 { text-align: left; }
|
||||
h1, h2, h3 { font-family: "Open Sans";
|
||||
}
|
||||
h1 { font-weight: normal; font-size: 170%; padding-top: 7pt; margin-top: 25pt; }
|
||||
h2 { font-weight: normal; font-size: 140%; padding-top: 7pt; margin-top: 25pt; }
|
||||
h3 { font-weight: bold; font-size: 118%; padding-top: 7pt; margin-top: 25pt; }
|
||||
h4 { font-weight: bold; font-size: 100%; }
|
||||
h5 { font-style: italic; font-size: 100%; }
|
||||
h6 { font-variant: small-caps; font-size: 100%; }
|
||||
|
||||
body.gsummary h1 { text-align: center; font-size: 220%; }
|
||||
|
||||
h1 a:link { border-bottom: 0px; }
|
||||
|
||||
|
||||
hr {
|
||||
color: #09550b;
|
||||
border: 1px dotted #09550b;
|
||||
border-style: none none dotted;
|
||||
padding-top: 10pt;
|
||||
padding-bottom: 10pt;
|
||||
}
|
||||
|
||||
div#contents {
|
||||
margin: 30pt;
|
||||
padding: 2pt 10pt;
|
||||
background-color: #fff676;
|
||||
}
|
||||
|
||||
div#centered {
|
||||
margin-left: auto;
|
||||
margin-right: auto;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
p, li {
|
||||
text-align: justify;
|
||||
}
|
||||
|
||||
.sc {
|
||||
font-variant: small-caps;
|
||||
font-size: 110%;
|
||||
}
|
||||
|
||||
pre, tt, code {
|
||||
font-family: "courrier", "andale mono", monospace;
|
||||
font-size: 100%;
|
||||
white-space: pre;
|
||||
}
|
||||
|
||||
tt {
|
||||
color: #09550b;
|
||||
}
|
||||
|
||||
pre.wiki, 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: #09550b;
|
||||
border-bottom: 1px dotted #09550b;
|
||||
}
|
||||
|
||||
a:hover, a:focus, a:visited {
|
||||
font-weight: normal;
|
||||
font-style: italic;
|
||||
text-decoration: none;
|
||||
/*
|
||||
color: #A40010;
|
||||
border-bottom: 1px dotted #A40010;
|
||||
*/
|
||||
color: #09550b;
|
||||
border-bottom: 1px dotted #09550b;
|
||||
}
|
||||
|
||||
body.gsummary a:link, a:active {
|
||||
font-size: 140%;
|
||||
font-weight: bold;
|
||||
text-decoration: none;
|
||||
color: #09550b;
|
||||
border-bottom: none;
|
||||
/*
|
||||
border-bottom: 1px dotted #09550b;
|
||||
*/
|
||||
}
|
||||
|
||||
body.gsummary a:hover, a:focus, a:visited {
|
||||
font-size: 120%;
|
||||
font-weight: bold;
|
||||
font-style: italic;
|
||||
text-decoration: none;
|
||||
/*
|
||||
color: #A40010;
|
||||
border-bottom: 1px dotted #A40010;
|
||||
*/
|
||||
color: #09550b;
|
||||
/*
|
||||
border-bottom: 1px dotted #09550b;
|
||||
*/
|
||||
}
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
div#header {
|
||||
margin: 0px;
|
||||
padding: 0pt;
|
||||
background-color: white;
|
||||
display: inline-block;
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
div#header_logo {
|
||||
margin: 0px;
|
||||
padding: 10px 0px 10px 12pt;
|
||||
background-color: white;
|
||||
width: 40%;
|
||||
float: left;
|
||||
}
|
||||
|
||||
div#header_menus {
|
||||
background-color: white;
|
||||
width: 55%;
|
||||
float: right;
|
||||
padding-top: 60pt;
|
||||
padding-right: 10pt;
|
||||
text-align: right;
|
||||
font-size: 80%;
|
||||
}
|
||||
|
||||
div#header_menus ul {
|
||||
padding-top: 45pt;
|
||||
list-style: none;
|
||||
text-align: right;
|
||||
font-size: 80%;
|
||||
}
|
||||
|
||||
div#header_menus li {
|
||||
padding: 0pt;
|
||||
margin: 0pt;
|
||||
display: inline;
|
||||
white-space: nowrap;
|
||||
}
|
||||
|
||||
/*
|
||||
div#header_menus a {
|
||||
border-left: 1px solid #d7d7d7;
|
||||
padding: 0 .75em;
|
||||
}
|
||||
|
||||
div#header_menus a.first {
|
||||
border-left: none;
|
||||
}
|
||||
*/
|
||||
|
||||
div#header a:link, div#header a:active, div#header a:visited {
|
||||
margin: 0pt;
|
||||
padding: 0pt 5pt;
|
||||
font-weight: normal;
|
||||
color: black;
|
||||
text-decoration: none;
|
||||
border-bottom: 1px solid black;
|
||||
border-left: 0px;
|
||||
border-right: 0px;
|
||||
}
|
||||
|
||||
div#header a:hover, div#header a:focus {
|
||||
margin: 0pt;
|
||||
padding: 0pt 5pt;
|
||||
font-weight: normal;
|
||||
color: black;
|
||||
text-decoration: none;
|
||||
border-bottom: 4px solid #09550b;
|
||||
border-left: 0px;
|
||||
border-right: 0px;
|
||||
}
|
||||
|
||||
div#header a.current:link, div#header a.current:active, div#header a.current:visited {
|
||||
margin: 0pt;
|
||||
padding: 0pt 5pt;
|
||||
font-weight: bold;
|
||||
font-style: normal;
|
||||
font-size: 120%;
|
||||
color: white;
|
||||
text-decoration: none;
|
||||
border-bottom: 4px solid #09550b;
|
||||
border-left: 0px;
|
||||
border-right: 0px;
|
||||
background-color: #09550b;
|
||||
}
|
||||
|
||||
div#header a.current:hover, div#header a.current:focus {
|
||||
margin: 0pt;
|
||||
padding: 0pt 5pt;
|
||||
font-weight: bold;
|
||||
font-style: normal;
|
||||
font-size: 120%;
|
||||
color: white;
|
||||
text-decoration: none;
|
||||
border-bottom: 4px solid #09550b;
|
||||
border-left: 0px;
|
||||
border-right: 0px;
|
||||
background-color: #09550b;
|
||||
}
|
||||
|
||||
div#header_ancestors {
|
||||
padding: 4px 0px 4px 12pt;
|
||||
background-color: #09550B;
|
||||
color: white;
|
||||
}
|
||||
|
||||
div#header_ancestors ul, div#header_ancestors * li {
|
||||
display: inline;
|
||||
list-style-type: none;
|
||||
padding: 0px 0px 0px 0pt;
|
||||
}
|
||||
|
||||
div#header_ancestors a:link, div#header_ancestors a:active, div#header_ancestors a:visited {
|
||||
font-weight: bold;
|
||||
color: white;
|
||||
text-decoration: none;
|
||||
border-bottom: 0px;
|
||||
}
|
||||
|
||||
div#header_ancestors a:hover, div#header_ancestors a:focus {
|
||||
font-weight: bold;
|
||||
color: white;
|
||||
text-decoration: underline;
|
||||
}
|
||||
|
||||
div#footer {
|
||||
margin: 0px;
|
||||
padding: 0px;
|
||||
border-top: 1px dotted #09550b;
|
||||
background-color: white;
|
||||
display: inline-block;
|
||||
width: 100%;
|
||||
text-align: right;
|
||||
}
|
||||
|
||||
div#searchform {
|
||||
width: 80%;
|
||||
background-color: #ccffcd;
|
||||
padding: 15pt 10pt 15pt 10pt;
|
||||
margin-top: 50pt;
|
||||
margin-bottom: 50pt;
|
||||
margin-left: auto;
|
||||
margin-right: auto;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
div#searchform input#id_q {
|
||||
background-color: white;
|
||||
border: 1px solid #09550b;
|
||||
padding: 2pt;
|
||||
width: 80%;
|
||||
font-size: 110%;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
span.queryref {
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
div#searchform ul {
|
||||
list-style: none;
|
||||
}
|
||||
|
||||
div#searchform li {
|
||||
display: inline;
|
||||
}
|
||||
|
||||
hr#search_vs_results {
|
||||
color: #09550b;
|
||||
border: 2px dotted #09550b;
|
||||
border-style: none none dotted;
|
||||
margin-top: 0pt;
|
||||
margin-bottom: 20pt;
|
||||
}
|
||||
|
||||
div#search_results {
|
||||
width: 85%;
|
||||
margin: auto;
|
||||
}
|
||||
|
||||
div#sidebar hr#separator {
|
||||
color: white;
|
||||
border: 0px;
|
||||
margin-top: 0pt;
|
||||
margin-bottom: 20pt;
|
||||
}
|
||||
|
||||
img.footer-logo {
|
||||
height: 24px;
|
||||
padding: 0px 2px;
|
||||
}
|
||||
|
||||
hr#site_vs_page {
|
||||
color: white;
|
||||
border: 3px dotted white;
|
||||
border-style: none none dotted;
|
||||
margin-top: 20pt;
|
||||
margin-bottom: 20pt;
|
||||
}
|
||||
|
||||
div#sidebar {
|
||||
/*
|
||||
background: #09550B;
|
||||
background: #ccffcd;
|
||||
*/
|
||||
background: white;
|
||||
}
|
||||
|
||||
div#sidebar div#sitemenu, div#sidebar div#pagemenu {
|
||||
/*
|
||||
background: white;
|
||||
*/
|
||||
background: #09550b;
|
||||
width: 85%;
|
||||
margin: auto;
|
||||
padding: 5pt 10pt;
|
||||
}
|
||||
|
||||
div#sidebar * li {
|
||||
text-align: left;
|
||||
}
|
||||
|
||||
div#sidebar * ul {
|
||||
list-style-type: square;
|
||||
padding-left: 12pt;
|
||||
}
|
||||
|
||||
div#sitemenu ul {
|
||||
list-style-type: none;
|
||||
padding-left: 0pt;
|
||||
}
|
||||
|
||||
div#sitemenu ul ul {
|
||||
list-style-type: none;
|
||||
padding-left: 0pt;
|
||||
}
|
||||
|
||||
div#sitemenu ul ul ul {
|
||||
list-style-type: square;
|
||||
padding-left: 12pt;
|
||||
}
|
||||
|
||||
div#sitemenu ul li ul li {
|
||||
padding-top: 3pt;
|
||||
padding-bottom: 5pt;
|
||||
border-top: 1px dotted white;
|
||||
}
|
||||
|
||||
div#sitemenu ul li ul li ul li {
|
||||
border-top: none;
|
||||
padding-top: 1pt;
|
||||
padding-bottom: 1pt;
|
||||
}
|
||||
|
||||
div#sitemenu ul li a:link,
|
||||
div#sitemenu ul li a:active,
|
||||
div#sitemenu ul lu a:visited
|
||||
{
|
||||
font-size: 140%;
|
||||
font-weight: bold;
|
||||
border-bottom: none;
|
||||
}
|
||||
|
||||
div#sitemenu ul li a:focus,
|
||||
div#sitemenu ul lu a:hover
|
||||
{
|
||||
font-size: 140%;
|
||||
font-weight: bold;
|
||||
font-style: italic;
|
||||
border-bottom: none;
|
||||
}
|
||||
|
||||
div#sitemenu ul ul li a:link,
|
||||
div#sitemenu ul ul li a:active,
|
||||
div#sitemenu ul ul lu a:visited,
|
||||
div#sitemenu ul ul li a:focus,
|
||||
div#sitemenu ul ul lu a:hover
|
||||
{
|
||||
font-size: 90%;
|
||||
font-weight: normal;
|
||||
border-bottom: none;
|
||||
/*border-bottom: 1px dotted white;*/
|
||||
}
|
||||
|
||||
div#pagemenu ul {
|
||||
list-style-type: none;
|
||||
padding-left: 0pt;
|
||||
}
|
||||
|
||||
div#pagemenu ul ul {
|
||||
list-style-type: none;
|
||||
padding-left: 0pt;
|
||||
}
|
||||
|
||||
div#pagemenu ul ul ul {
|
||||
padding-left: 12pt;
|
||||
}
|
||||
|
||||
div#pagemenu ul li ul li {
|
||||
padding-top: 3pt;
|
||||
padding-bottom: 5pt;
|
||||
border-top: 1px dotted white;
|
||||
}
|
||||
|
||||
div#pagemenu ul li ul li ul li {
|
||||
border-top: none;
|
||||
padding-top: 1pt;
|
||||
padding-bottom: 1pt;
|
||||
}
|
||||
|
||||
div#pagemenu ul li a:link,
|
||||
div#pagemenu ul li a:active,
|
||||
div#pagemenu ul lu a:visited
|
||||
{
|
||||
font-size: 120%;
|
||||
font-weight: bold;
|
||||
border-bottom: none;
|
||||
}
|
||||
|
||||
div#pagemenu ul li a:focus,
|
||||
div#pagemenu ul lu a:hover
|
||||
{
|
||||
font-size: 120%;
|
||||
font-weight: bold;
|
||||
font-style: italic;
|
||||
border-bottom: none;
|
||||
}
|
||||
|
||||
div#pagemenu ul ul li a:link,
|
||||
div#pagemenu ul ul li a:active,
|
||||
div#pagemenu ul ul lu a:visited,
|
||||
div#pagemenu ul ul li a:focus,
|
||||
div#pagemenu ul ul lu a:hover
|
||||
{
|
||||
font-size: 90%;
|
||||
font-weight: normal;
|
||||
border-bottom: none;
|
||||
/*
|
||||
border-bottom: 1px dotted white;
|
||||
*/
|
||||
}
|
||||
|
||||
|
||||
div#sidebar ul.ancestor * li {
|
||||
padding-top: 0pt;
|
||||
}
|
||||
|
||||
div#sidebar ul {
|
||||
padding-bottom: 8pt;
|
||||
}
|
||||
|
||||
div#sidebar a:link, div#sidebar a:active, div#sidebar a:visited {
|
||||
/*
|
||||
font-weight: normal;
|
||||
*/
|
||||
color: white;
|
||||
text-align: left;
|
||||
text-decoration: none;
|
||||
border-bottom: 1px dotted white;
|
||||
}
|
||||
|
||||
div#sidebar a:hover, div#sidebar a:focus {
|
||||
/*
|
||||
font-weight: normal;
|
||||
*/
|
||||
color: white;
|
||||
text-align: left;
|
||||
text-decoration: none;
|
||||
border-bottom: 1px dotted white;
|
||||
}
|
||||
|
||||
div#main {
|
||||
border-left: 1px solid #09550b;
|
||||
}
|
||||
|
||||
div#main ul#summary {
|
||||
list-style-type: square;
|
||||
padding-left: 12pt;
|
||||
font-size: 14pt;
|
||||
}
|
||||
|
||||
div#main ul#summary * ul {
|
||||
padding-left: 12pt;
|
||||
padding-bottom: 14pt;
|
||||
font-size: 95%;
|
||||
}
|
||||
|
||||
div.code * {
|
||||
background-color: #FCFCE1;
|
||||
}
|
||||
|
||||
div.note {
|
||||
margin: 8px 2% 0px 2%;
|
||||
border: 1px none #fff01c;
|
||||
border-left-width: 4px;
|
||||
border-left-style: solid;
|
||||
padding: 1px 10pt 1px 55px;
|
||||
background: #fff676 url('./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('./images/i-core.png') no-repeat 0% 50%;;
|
||||
font-size: 90%
|
||||
}
|
||||
|
||||
p.admonition-title {
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
div.topic {
|
||||
margin: 5pt;
|
||||
padding: 2pt 10pt;
|
||||
background-color: fff676;
|
||||
}
|
||||
|
||||
div.topic p.first {
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
body.gsummary table {
|
||||
border-collapse: collapse;
|
||||
border-color: transparent;
|
||||
width: 60%;
|
||||
margin-left: auto;
|
||||
margin-right: auto;
|
||||
}
|
||||
|
||||
/*
|
||||
body.gsummary table th {
|
||||
}
|
||||
*/
|
||||
|
||||
body.gsummary table td {
|
||||
border: none;
|
||||
}
|
||||
|
||||
/*
|
||||
body.gsummary table tr td ul {
|
||||
margin: 0pt;
|
||||
border-left: 1px solid black;
|
||||
}
|
||||
*/
|
||||
|
||||
/*
|
||||
body.gsummary table tr td ul li {
|
||||
border-bottom: 2px dotted black;
|
||||
}
|
||||
*/
|
||||
|
||||
body.gsummary li {
|
||||
padding: 0%;
|
||||
list-style-type: none;
|
||||
}
|
||||
|
||||
body.gsummary ul {
|
||||
padding: 0px 0px 10px 0px;
|
||||
margin: 0%;
|
||||
border-bottom: 1px dotted black;
|
||||
}
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
#sidebar {
|
||||
float: left;
|
||||
width: 29.9%;
|
||||
padding: 0 0 0 0;
|
||||
margin: 0 0 0 0;
|
||||
color: white;
|
||||
background: #09550B;
|
||||
/*
|
||||
min-height: 300px;
|
||||
background: #f2f2f2;
|
||||
border-right: 1px solid #ccc;
|
||||
padding: 0 0 0 10px;
|
||||
*/
|
||||
}
|
File diff suppressed because it is too large
Load Diff
Binary file not shown.
File diff suppressed because it is too large
Load Diff
|
@ -1,5 +0,0 @@
|
|||
|
||||
.. -*- Mode: rst -*-
|
||||
|
||||
.. include:: HTML_defs.rst
|
||||
.. include:: UsersGuide.rst
|
|
@ -1,5 +0,0 @@
|
|||
|
||||
.. -*- Mode: rst -*-
|
||||
|
||||
.. include:: LaTeX_defs.rst
|
||||
.. include:: UsersGuide.rst
|
|
@ -0,0 +1,868 @@
|
|||
.. -*- Mode: rst -*-
|
||||
|
||||
.. include:: ../etc/definitions.rst
|
||||
|
||||
.. URLs that changes between the various backends.
|
||||
.. _Stratus Documentation: file:///usr/share/doc/coriolis2/en/html/stratus/index.html
|
||||
|
||||
|
||||
.. |BigMouse| image:: ./images/ComputerMouse.png
|
||||
:scale: 25%
|
||||
|
||||
.. |ViewerSnapshot_1| image:: ./images/Viewer-1.png
|
||||
:alt: Viewer Basic Snapshot
|
||||
:align: middle
|
||||
:width: 80%
|
||||
|
||||
.. |ControllerSnapshot_1| image:: ./images/Controller-1.png
|
||||
:alt: Controller Basic Snapshot
|
||||
:align: middle
|
||||
:width: 80%
|
||||
|
||||
.. |ControllerLook_1| image:: ./images/Controller-Look-1.png
|
||||
:alt: Controller Look, Snapshot 1
|
||||
:align: middle
|
||||
:width: 80%
|
||||
|
||||
.. |ControllerFilter_1| image:: ./images/Controller-Filter-1.png
|
||||
:alt: Controller Basic Snapshot
|
||||
:align: middle
|
||||
:width: 80%
|
||||
|
||||
.. |ControllerLayersGos_1| image:: ./images/Controller-LayersGos-1.png
|
||||
:alt: Controller Basic Snapshot
|
||||
:align: middle
|
||||
:width: 80%
|
||||
|
||||
.. |ControllerNetlist_1| image:: ./images/Controller-Netlist-1.png
|
||||
:alt: Controller Basic Snapshot
|
||||
:align: middle
|
||||
:width: 80%
|
||||
|
||||
.. |ViewerNetlist_1| image:: ./images/Viewer-Netlist-1.png
|
||||
:alt: Controller Basic Snapshot
|
||||
:align: middle
|
||||
:width: 80%
|
||||
|
||||
.. |ControllerSelection_1| image:: ./images/Controller-Selection-1.png
|
||||
:alt: Controller Basic Snapshot
|
||||
:align: middle
|
||||
:width: 80%
|
||||
|
||||
.. |ControllerInspector_1| image:: ./images/Controller-Inspector-1.png
|
||||
:alt: Controller Basic Snapshot
|
||||
:align: middle
|
||||
:width: 80%
|
||||
|
||||
.. |ControllerInspector_2| image:: ./images/Controller-Inspector-2.png
|
||||
:alt: Controller Basic Snapshot
|
||||
:align: middle
|
||||
:width: 80%
|
||||
|
||||
.. |ControllerInspector_3| image:: ./images/Controller-Inspector-3.png
|
||||
:alt: Controller Basic Snapshot
|
||||
:align: middle
|
||||
:width: 80%
|
||||
|
||||
.. |ControllerSettings_1| image:: ./images/Controller-Settings-1.png
|
||||
:alt: Controller Basic Snapshot
|
||||
:align: middle
|
||||
:width: 80%
|
||||
|
||||
.. |Etesian-1| image:: ./images/etesian-1.png
|
||||
:alt: Etesian Abutment Box
|
||||
:align: middle
|
||||
:width: 80%
|
||||
|
||||
|
||||
CGT - The Graphical Interface
|
||||
=============================
|
||||
|
||||
The |Coriolis| graphical interface is split up into two windows.
|
||||
|
||||
* The **Viewer**, with the following features:
|
||||
|
||||
* Basic load/save capabilities.
|
||||
* Display the current working cell. Could be empty if the design
|
||||
is not yet placed.
|
||||
* Execute Stratus Scripts.
|
||||
* Menu to run the tools (placement, routage).
|
||||
|
||||
Features are detailed in `Viewer & Tools`_.
|
||||
|
||||
|ViewerSnapShot_1|
|
||||
|
||||
* The **Controller**, which allows:
|
||||
|
||||
* Tweak what is displayer by the *Viewer*. Through the *Look*,
|
||||
*Filter* and *Layers&Gos* tabs.
|
||||
* Browse the |netlist| with eponym tab.
|
||||
* Show the list of selected objects (if any) with *selection*
|
||||
* Walk through the Database, the Cell or the Selection with *Inspector*.
|
||||
This is an advanced feature, reserved for experimented users.
|
||||
* The tab *Settings* which give access to all the settings.
|
||||
They are closely related to Configuration & Initialisation.
|
||||
|
||||
|bcenter| |ControllerSnapShot_1| |ecenter|
|
||||
|
||||
|
||||
.. _Viewer & Tools:
|
||||
|
||||
Viewer & Tools
|
||||
~~~~~~~~~~~~~~
|
||||
|
||||
|Stratus| Netlist Capture
|
||||
-------------------------
|
||||
|
||||
|Stratus| is the replacement for |GenLib| procedural netlist capture language.
|
||||
It is designed as a set of |Python| classes, and comes with it's own documentation
|
||||
(`Stratus Documentation`_)
|
||||
|
||||
|
||||
The |Hurricane| Data-Base
|
||||
-------------------------
|
||||
|
||||
The |Alliance| flow is based on the |MBK| data-base, which has one data-structure
|
||||
for each view. That is, |LOFIG| for the *logical* view and |PHFIG| for the *physical*
|
||||
view. The place and route tools were responsible for maintaining (or not) the
|
||||
coherency between views. Reflecting this weak coupling between views, each one
|
||||
was stored in a separate file with a specific format. The *logical* view is stored
|
||||
in a |vst| file in |VHDL| format and the *physical* in an |ap| file in an ad-hoc format.
|
||||
|
||||
The |Coriolis| flow is based on the |Hurricane| data-base, which has a unified
|
||||
structure for *logical* and *physical* view. That data structure is the |Cell| object.
|
||||
The |Cell| can have any state between pure netlist and completly placed and
|
||||
routed design. Although the memory representation of the views has deeply
|
||||
changed we still use the |Alliance| files format, but they now really represent
|
||||
views of the same object. The point is that one must be very careful about
|
||||
view coherency when going to and from |Coriolis|.
|
||||
|
||||
As for the second release, |Coriolis| can be used only for three purposes :
|
||||
|
||||
* **Placing a design**, in which case the |netlist| view must be present.
|
||||
* **Routing a design**, in that case the |netlist|
|
||||
view and the |layout| view must be present and |layout| view must contain
|
||||
a placement. Both views must have the same name. When saving the routed design,
|
||||
it is advised to change the design name otherwise the original unrouted placement
|
||||
in the |layout| view will be overwritten.
|
||||
* **Viewing a design**, the |netlist| view must be present, if a |layout|
|
||||
view is present it still must have the same name but it can be in any
|
||||
state.
|
||||
|
||||
|
||||
Synthetizing and loading a design
|
||||
---------------------------------
|
||||
|
||||
|Coriolis| supports several file formats. It can load all file format
|
||||
from the |Alliance| toolchain (.ap for layout, behavioural and structural vhdl .vbe and .vst),
|
||||
BLIF netlist format as well as benchmark formats from the ISPD contests.
|
||||
|
||||
It can be compiled with LEF/DEF support, although it requires acceptance of the SI2 license
|
||||
and may not be compiled in your version of the software.
|
||||
|
||||
Synthesis under Yosys
|
||||
.....................
|
||||
|
||||
You can create a BLIF file from the |Yosys| synthetizer, which can be imported under Coriolis.
|
||||
Most libraries are specified as a .lib liberty file and a .lef LEF file.
|
||||
|Yosys| opens most .lib files with minor modifications, but LEF support in Coriolis relies on SI2.
|
||||
If Coriolis hasn't been compiled against it, the library is given in |Alliance| .ap format.
|
||||
`Some free libraries <http://vlsitechnology.org>`_ already provide both .ap and .lib files.
|
||||
|
||||
Once you have installed a common library under |Yosys| and Coriolis, just synthetize your design
|
||||
with |Yosys| and import it (as Blif without the extension) under Coriolis to perform place&route.
|
||||
|
||||
Synthesis under Alliance
|
||||
........................
|
||||
|
||||
|Alliance| is an older toolchain but has been extensively used for years. Coriolis can import
|
||||
and write Alliance designs and libraries directly.
|
||||
|
||||
Etesian -- Placer
|
||||
-----------------
|
||||
|
||||
The |Etesian| placer is a state of the art (as of 2015) analytical placer. It is
|
||||
within ``5%`` of other placers' solutions, but is normally a bit worse than ePlace.
|
||||
This |Coriolis| tool is actually an encapsulation of |Coloquinte| which *is* the placer.
|
||||
|
||||
.. note:: *Instance Uniquification Unsupported:* a same logical instance cannot have
|
||||
two different placements. So, either you manually make a clone of it or you
|
||||
supply a placement for it. We need to implement uniquification in the
|
||||
|Hurricane| database.
|
||||
|
||||
|
||||
|noindent|
|
||||
**Hierarchical Placement**
|
||||
|
||||
The placement area is defined by the top cell abutment box.
|
||||
|
||||
When placing a complete hierarchy, the abutment boxes of the cells (models) other than
|
||||
the top cell are sets identical to the one of the top cell and their instances are
|
||||
all placed at position ``(0,0,ID)``. That is, all the abutments boxes, whatever the
|
||||
hierarchical level, defines the same area (they are exactly superposed).
|
||||
|
||||
We choose this scheme because the placer will see all the instances as virtually
|
||||
flattened, so they can be placed anywhere inside the top-cell abutment box.
|
||||
|
||||
|bcenter| |Etesian-1| |ecenter|
|
||||
|
||||
|
||||
|noindent|
|
||||
**Computing the Placement Area**
|
||||
|
||||
The placement area is computed using the ``etesian.aspectRatio`` and ``etesian.spaceMargin``
|
||||
parameters only if the top-cell has an empty abutment box. If the top-cell abutment
|
||||
box has to be set, then it is propagated to all the instances models recursively.
|
||||
|
||||
|
||||
|noindent|
|
||||
**Reseting the Placement**
|
||||
|
||||
Once a placement has been done, the placer cannot reset it (will be implemented
|
||||
later). To perform a new placement, you must restart |cgt|. In addition, if you
|
||||
have saved the placement on disk, you must erase any :cb:`.ap` file, which are
|
||||
automatically reloaded along with the netlist (:cb:`.vst`).
|
||||
|
||||
|noindent|
|
||||
**Limitations**
|
||||
|
||||
Etesian supports standard cells and fixed macros. As for the Coriolis 2.1 version,
|
||||
it doesn't support movable macros, and you must place every macro beforehand.
|
||||
Timing and routability analysis are not included either, and the returned placement
|
||||
may be unroutable.
|
||||
|
||||
|
||||
Etesian Configuration Parameters
|
||||
................................
|
||||
|
||||
+-----------------------------------+------------------+----------------------------+
|
||||
| Parameter Identifier | Type | Default |
|
||||
+===================================+==================+============================+
|
||||
| **Etesian Parameters** |
|
||||
+-----------------------------------+------------------+----------------------------+
|
||||
|``etesian.aspectRatio`` | TypePercentage | :cb:`100` |
|
||||
| +------------------+----------------------------+
|
||||
| | Define the height on width ``H/W`` aspect |
|
||||
| | ratio, can be comprised between 10 and 1000 |
|
||||
+-----------------------------------+------------------+----------------------------+
|
||||
|``etesian.spaceMargin`` | TypePercentage | :cb:`5` |
|
||||
| +------------------+----------------------------+
|
||||
| | The extra white space added to the total area |
|
||||
| | of the standard cells |
|
||||
+-----------------------------------+------------------+----------------------------+
|
||||
|``etesian.uniformDensity`` | TypeBool | :cb:`False` |
|
||||
| +------------------+----------------------------+
|
||||
| | Whether the cells will be spread envenly |
|
||||
| | across the area or allowed to form denser |
|
||||
| | clusters |
|
||||
+-----------------------------------+------------------+----------------------------+
|
||||
|``etesian.effort`` | TypeInt | :cb:`2` |
|
||||
| +------------------+----------------------------+
|
||||
| | Sets the balance between the speed of the |
|
||||
| | placer and the solution quality |
|
||||
+-----------------------------------+------------------+----------------------------+
|
||||
|``etesian.routingDriven`` | TypeBool | :cb:`False` |
|
||||
| +------------------+----------------------------+
|
||||
| | Whether the tool will try routing iterations |
|
||||
| | and whitespace allocation to improve |
|
||||
| | routability; to be implemented |
|
||||
+-----------------------------------+------------------+----------------------------+
|
||||
|``etesian.graphics`` | TypeInt | :cb:`2` |
|
||||
| +------------------+----------------------------+
|
||||
| | How often the display will be refreshed |
|
||||
| | More refreshing slows the placer. |
|
||||
| | |
|
||||
| | * ``1`` shows both upper and lower bounds |
|
||||
| | * ``2`` only shows lower bound results |
|
||||
| | * ``3`` only shows the final results |
|
||||
+-----------------------------------+-----------------------------------------------+
|
||||
|
||||
|newpage|
|
||||
|
||||
|
||||
Knik -- Global Router
|
||||
---------------------
|
||||
|
||||
The quality of |Knik| global routing solutions are equivalent to those of FGR_ 1.0.
|
||||
For an in-depth description of |Knik| algorithms, you may download the thesis of
|
||||
D. |Dupuis| avalaible from here~: `Knik Thesis`_.
|
||||
|
||||
The global router is (not yet) deterministic. To circumvent this limitation,
|
||||
a global routing *solution* can be saved to disk and reloaded for later uses.
|
||||
|
||||
A global routing is saved into a file with the same name as the design and a
|
||||
|kgr| extention. It is in `Box Router`_ output format.
|
||||
|
||||
|noindent| Menus:
|
||||
|
||||
* :math:`\textbf{P\&R} \rightarrow \textbf{Step by Step} \rightarrow \textbf{Save Global Routing}`
|
||||
* :math:`\textbf{P\&R} \rightarrow \textbf{Step by Step} \rightarrow \textbf{Load Global Routing}`
|
||||
|
||||
|
||||
Kite -- Detailed Router
|
||||
-----------------------
|
||||
|
||||
|Kite| no longer suffers from the limitations of |Nero|. It can route big designs
|
||||
as its runtime and memory footprint is almost linear (with respect to the number
|
||||
of gates). It has successfully routed design of more than `150K` gates.
|
||||
|medskip|
|
||||
|
||||
|noindent| However, this first release comes with the temporary the following
|
||||
restrictions:
|
||||
|
||||
* Works only with |SxLib| standard cell gauge.
|
||||
* Works always with 4 routing metal layers (`M2` through `M5`).
|
||||
* Do not allow (take into account) pre-routed wires on signals
|
||||
other than |POWER| or |GROUND|.
|
||||
|
||||
.. note::
|
||||
**Slow Layer Assignment.** Most of the time, the layer assignment stage is
|
||||
fast (less than a dozen seconds), but in some instances it can take more
|
||||
than a dozen *minutes*. This is a known bug and will be corrected in later
|
||||
releases.
|
||||
|
||||
After each run, |Kite| displays a set of *completion ratios* which must all
|
||||
be equal to `100%` if the detailed routing has been successfull.
|
||||
In the event of a failure, on a saturated design, you may decrease the
|
||||
`edge saturation ratio` (argument `--edge`) to balance more evenly the design
|
||||
saturation. That is, the maximum saturation decrease at the price of a wider
|
||||
saturated area and increased wirelength. This is the saturation of the
|
||||
*global* router |Knik|, and you may increase/decrease by steps of ``5%``,
|
||||
which represent one track. The maximum capacity of the |SxLib| gauge is
|
||||
10 tracks in two layers, that makes 20 tracks by |Knik| edge.
|
||||
|
||||
Routing a design is done in four ordered steps:
|
||||
|
||||
#. Detailed pre-route :math:`\textbf{P\&R} \rightarrow \textbf{Step by Step} \rightarrow \textbf{Detailed PreRoute}`
|
||||
#. Global routing :math:`\textbf{P\&R} \rightarrow \textbf{Step by Step} \rightarrow \textbf{Global Route}`
|
||||
#. Detailed routing :math:`\textbf{P\&R} \rightarrow \textbf{Step by Step} \rightarrow \textbf{Detailed Route}`
|
||||
#. Finalize routing :math:`\textbf{P\&R} \rightarrow \textbf{Step by Step} \rightarrow \textbf{Finalize Route}`
|
||||
|
||||
It is possible to supply to the router a complete wiring for some nets that the user's
|
||||
wants to be routed according to a specific topology. The supplied topology must respect
|
||||
the building rules of the |Katabatic| database (contacts must be, terminals, turns, h-tee
|
||||
& v-tee only). During the first step :fboxtt:`Detailed Pre-Route` the router will solve
|
||||
overlaps between the segments, without making any dogleg. If no pre-routed topologies
|
||||
are present, this step may be ommited. Any net routed at this step is then fixed and
|
||||
become unmovable for the later stages.
|
||||
|
||||
After the detailed routing step the |Kite| data-structure is still active
|
||||
(the Hurricane wiring is decorated). The finalize step performs the removal of
|
||||
the |Kite| data-structure, and it is not advisable to save the design before
|
||||
that step.
|
||||
|
||||
You may visualize the density (saturation) of either |Knik| (on edges) or
|
||||
|Kite| (on GCells) until the routing is finalized. Special layers appears
|
||||
to that effect in the `The Layers&Go Tab`_.
|
||||
|
||||
|
||||
Kite Configuration Parameters
|
||||
.............................
|
||||
|
||||
As |Knik| is only called through |Kite|, it's parameters also have
|
||||
the :cb:`kite.` prefix.
|
||||
|
||||
The |Katabatic| parameters control the layer assignment step.
|
||||
|
||||
All the defaults value given below are from the default |Alliance| technology
|
||||
(:cb:`cmos` and :cb:`SxLib` cell gauge/routing gauge).
|
||||
|
||||
+-----------------------------------+------------------+----------------------------+
|
||||
| Parameter Identifier | Type | Default |
|
||||
+===================================+==================+============================+
|
||||
| **Katabatic Parameters** |
|
||||
+-----------------------------------+------------------+----------------------------+
|
||||
|``katabatic.topRoutingLayer`` | TypeString | :cb:`METAL5` |
|
||||
| +------------------+----------------------------+
|
||||
| | Define the highest metal layer that will be |
|
||||
| | used for routing (inclusive). |
|
||||
+-----------------------------------+------------------+----------------------------+
|
||||
|``katabatic.globalLengthThreshold``| TypeInt | :cb:`1450` |
|
||||
| +------------------+----------------------------+
|
||||
| | This parameter is used by a layer assignment |
|
||||
| | method which is no longer used (did not give |
|
||||
| | good results) |
|
||||
+-----------------------------------+------------------+----------------------------+
|
||||
| ``katabatic.saturateRatio`` | TypePercentage | :cb:`80` |
|
||||
| +------------------+----------------------------+
|
||||
| | If ``M(x)`` density is above this ratio, |
|
||||
| | move up feedthru global segments up from |
|
||||
| | depth ``x`` to ``x+2`` |
|
||||
+-----------------------------------+------------------+----------------------------+
|
||||
| ``katabatic.saturateRp`` | TypeInt | :cb:`8` |
|
||||
| +------------------+----------------------------+
|
||||
| | If a GCell contains more terminals |
|
||||
| | (:cb:`RoutingPad`) than that number, force a |
|
||||
| | move up of the connecting segments to those |
|
||||
| | in excess |
|
||||
+-----------------------------------+------------------+----------------------------+
|
||||
| **Knik Parameters** |
|
||||
+-----------------------------------+------------------+----------------------------+
|
||||
| ``kite.hTracksReservedLocal`` | TypeInt | :cb:`3` |
|
||||
| +------------------+----------------------------+
|
||||
| | To take account the tracks needed *inside* a |
|
||||
| | GCell to build the *local* routing, decrease |
|
||||
| | the capacity of the edges of the global |
|
||||
| | router. Horizontal and vertical locally |
|
||||
| | reserved capacity can be distinguished for |
|
||||
| | more accuracy. |
|
||||
+-----------------------------------+------------------+----------------------------+
|
||||
| ``kite.vTracksReservedLocal`` | TypeInt | :cb:`3` |
|
||||
| +------------------+----------------------------+
|
||||
| | cf. ``kite.hTracksReservedLocal`` |
|
||||
+-----------------------------------+------------------+----------------------------+
|
||||
| **Kite Parameters** |
|
||||
+-----------------------------------+------------------+----------------------------+
|
||||
| ``kite.eventsLimit`` | TypeInt | :cb:`4000002` |
|
||||
| +------------------+----------------------------+
|
||||
| | The maximum number of segment displacements, |
|
||||
| | this is a last ditch safety against infinite |
|
||||
| | loop. It's perhaps a little too low for big |
|
||||
| | designs |
|
||||
+-----------------------------------+------------------+----------------------------+
|
||||
| ``kite.ripupCost`` | TypeInt | :cb:`3` |
|
||||
| +------------------+----------------------------+
|
||||
| | Differential introduced between two ripup |
|
||||
| | cost to avoid a loop between two ripped up |
|
||||
| | segments |
|
||||
+-----------------------------------+------------------+----------------------------+
|
||||
| ``kite.strapRipupLimit`` | TypeInt | :cb:`16` |
|
||||
| +------------------+----------------------------+
|
||||
| | Maximum number of ripup for *strap* segments |
|
||||
+-----------------------------------+------------------+----------------------------+
|
||||
| ``kite.localRipupLimit`` | TypeInt | :cb:`9` |
|
||||
| +------------------+----------------------------+
|
||||
| | Maximum number of ripup for *local* segments |
|
||||
+-----------------------------------+------------------+----------------------------+
|
||||
| ``kite.globalRipupLimit`` | TypeInt | :cb:`5` |
|
||||
| +------------------+----------------------------+
|
||||
| | Maximum number of ripup for *global* segments,|
|
||||
| | when this limit is reached, triggers topologic|
|
||||
| | modification |
|
||||
+-----------------------------------+------------------+----------------------------+
|
||||
| ``kite.longGlobalRipupLimit`` | TypeInt | :cb:`5` |
|
||||
| +------------------+----------------------------+
|
||||
| | Maximum number of ripup for *long global* |
|
||||
| | segments, when this limit is reached, triggers|
|
||||
| | topological modification |
|
||||
+-----------------------------------+------------------+----------------------------+
|
||||
|
||||
|
||||
|
||||
.. _Python Scripts in Cgt:
|
||||
|
||||
Executing Python Scripts in Cgt
|
||||
-------------------------------
|
||||
|
||||
Python/Stratus scripts can be executed either in text or graphical mode.
|
||||
|
||||
.. note:: **How Cgt Locates Python Scripts:**
|
||||
|cgt| uses the Python ``import`` mechanism to load Python scripts.
|
||||
So you must give the name of your script whitout ``.py`` extention and
|
||||
it must be reachable through the ``PYTHONPATH``. You may uses the
|
||||
dotted module notation.
|
||||
|
||||
A Python/Stratus script must contains a function called ``ScriptMain()``
|
||||
with one optional argument, the graphical editor into which it may be
|
||||
running (will be set to ``None`` in text mode). The Python interface to
|
||||
the editor (type: :cb:`CellViewer`) is limited to basic capabilities
|
||||
only.
|
||||
|
||||
Any script given on the command line will be run immediatly *after* the
|
||||
initializations and *before* any other argument is processed.
|
||||
|
||||
For more explanation on Python scripts see :ref:`Python Interface to Coriolis`.
|
||||
|
||||
|
||||
Printing & Snapshots
|
||||
--------------------
|
||||
|
||||
Printing or saving into a |pdf| is fairly simple, just uses the **File -> Print**
|
||||
menu or the |CTRL_P| shortcut to open the dialog box.
|
||||
|
||||
The print functionality uses exactly the same rendering mechanism as for the
|
||||
screen, beeing almost *WYSIWYG*. Thus, to obtain the best results it is advisable
|
||||
to select the ``Coriolis.Printer`` look (in the *Controller*), which uses a
|
||||
white background and much suited for high resolutions ``32x32`` pixels patterns
|
||||
|
||||
There is also two mode of printing selectable through the *Controller*
|
||||
**Settings -> Misc -> Printer/Snapshot Mode**:
|
||||
|
||||
=============== ================= =====================================================
|
||||
Mode DPI (approx.) Intended Usage
|
||||
--------------- ----------------- -----------------------------------------------------
|
||||
**Cell Mode** 150 For single ``Cell`` printing or very small designs.
|
||||
Patterns will be bigger and more readable.
|
||||
**Design Mode** 300 For designs (mostly commposed of wires and cells
|
||||
outlines).
|
||||
=============== ================= =====================================================
|
||||
|
||||
.. note:: *The pdf file size*
|
||||
Be aware that the generated |pdf| files are indeed only pixmaps.
|
||||
So they can grew very large if you select paper format above ``A2``
|
||||
or similar.
|
||||
|
||||
|
||||
|noindent|
|
||||
Saving into an image is subject to the same remarks as for |pdf|.
|
||||
|
||||
|
||||
Memento of Shortcuts in Graphic Mode
|
||||
------------------------------------
|
||||
|
||||
The main application binary is |cgt|.
|
||||
|
||||
+---------------+-------------------+-----------------------------------------------------------+
|
||||
| Category | Keys | Action |
|
||||
+===============+===================+===========================================================+
|
||||
| **Moves** | | |KeyUp|, | Shift the view in the according direction |
|
||||
| | |KeyDown| | |
|
||||
| | | |KeyLeft|, | |
|
||||
| | |KeyRight| | |
|
||||
+---------------+-------------------+-----------------------------------------------------------+
|
||||
| **Fit** | |KeyF| | Fit to the Cell abutment box |
|
||||
+---------------+-------------------+-----------------------------------------------------------+
|
||||
| **Refresh** | |CTRL_L| | Triggers a complete display redraw |
|
||||
+---------------+-------------------+-----------------------------------------------------------+
|
||||
| **Goto** | |KeyG| | *apperture* is the minimum side of the area |
|
||||
| | | displayed around the point to go to. It's an |
|
||||
| | | alternative way of setting the zoom level |
|
||||
+---------------+-------------------+-----------------------------------------------------------+
|
||||
| **Zoom** | |KeyZ|, | Respectively zoom by a 2 factor and *unzoom* |
|
||||
| | |KeyM| | by a 2 factor |
|
||||
| +-------------------+-----------------------------------------------------------+
|
||||
| | | |BigMouse| | You can perform a zoom to an area. |
|
||||
| | | Area Zoom | Define the zoom area by *holding down the left |
|
||||
| | | mouse button* while moving the mouse. |
|
||||
+---------------+-------------------+-----------------------------------------------------------+
|
||||
| **Selection** | | |BigMouse| | You can select displayed objects under an area. |
|
||||
| | | Area Selection | Define the selection area by *holding down the |
|
||||
| | | right mouse button* while moving the mouse. |
|
||||
| +-------------------+-----------------------------------------------------------+
|
||||
| | | |BigMouse| | You can toggle the selection of one object under |
|
||||
| | | Toggle Selection| the mouse position by pressing |CTRL| and |
|
||||
| | | pressing down *the right mouse button*. A popup |
|
||||
| | | list of what's under the position shows up into |
|
||||
| | | which you can toggle the selection state of one |
|
||||
| | | item. |
|
||||
| +-------------------+-----------------------------------------------------------+
|
||||
| | |KeyCapS| | Toggle the selection visibility |
|
||||
+---------------+-------------------+-----------------------------------------------------------+
|
||||
| **Controller**| |CTRL_I| | Show/hide the controller window. |
|
||||
| | | |
|
||||
| | | It's the Swiss Army Knife of the viewer. |
|
||||
| | | From it, you can fine-control the display and |
|
||||
| | | inspect almost everything in your design. |
|
||||
+---------------+-------------------+-----------------------------------------------------------+
|
||||
| **Rulers** | |KeyK|, | One stroke on |KeyK| enters the ruler mode, in |
|
||||
| | |KeyESC| | which you can draw one ruler. You can exit the |
|
||||
| | | ruler mode by pressing |KeyESC|. Once in ruler |
|
||||
| | | mode, the first click on the *left mouse button* |
|
||||
| | | sets the ruler's starting point and the second |
|
||||
| | | click the ruler's end point. The second click |
|
||||
| | | exits automatically the ruler mode. |
|
||||
| +-------------------+-----------------------------------------------------------+
|
||||
| | |KeyCapK| | Clears all the drawn rulers |
|
||||
+---------------+-------------------+-----------------------------------------------------------+
|
||||
| **Print** | |CTRL_P| | Currently rather crude. It's a direct copy of |
|
||||
| | | what's displayed in pixels. So the resulting |
|
||||
| | | picture will be a little blurred due to |
|
||||
| | | anti-aliasing mechanism. |
|
||||
+---------------+-------------------+-----------------------------------------------------------+
|
||||
| **Open/Close**| |CTRL_O| | Opens a new design. The design name must be |
|
||||
| | | given without path or extention. |
|
||||
| +-------------------+-----------------------------------------------------------+
|
||||
| | |CTRL_W| | Close the current viewer window, but do not quit |
|
||||
| | | the application. |
|
||||
| +-------------------+-----------------------------------------------------------+
|
||||
| | |CTRL_Q| | `CTRL+Q` quit the application |
|
||||
| | | (closing all windows). |
|
||||
+---------------+-------------------+-----------------------------------------------------------+
|
||||
| **Hierarchy** | |CTRL_Down| | Go one hierarchy level down. That is, if there |
|
||||
| | | is an *instance* under the cursor position, load |
|
||||
| | | it's *model* Cell in place of the current one. |
|
||||
| +-------------------+-----------------------------------------------------------+
|
||||
| | |CTRL_Up| | Go one hierarchy level up. if we have entered |
|
||||
| | | the current model through |CTRL_Down| |
|
||||
| | | reload the previous model (the one |
|
||||
| | | in which this model is instanciated). |
|
||||
+---------------+-------------------+-----------------------------------------------------------+
|
||||
|
||||
|
||||
Cgt Command Line Options
|
||||
------------------------
|
||||
|
||||
Appart from the obvious ``--text`` options, all can be used for text and graphical mode.
|
||||
|
||||
+-----------------------------+------------------------------------------------+
|
||||
| Arguments | Meaning |
|
||||
+=============================+================================================+
|
||||
| `-t|--text` | Instruct |cgt| to run in text mode. |
|
||||
+-----------------------------+------------------------------------------------+
|
||||
| `-L|--log-mode` | Disable the uses of |ANSI| escape sequence on |
|
||||
| | the |tty|. Useful when the output is |
|
||||
| | redirected to a file. |
|
||||
+-----------------------------+------------------------------------------------+
|
||||
| `-c <cell>|--cell=<cell>` | The name of the design to load, without |
|
||||
| | leading path or extention. |
|
||||
+-----------------------------+------------------------------------------------+
|
||||
| `-g|--load-global` | Reload a global routing solution from disk. |
|
||||
| | The file containing the solution must be named |
|
||||
| | `<cell>.kgr`. |
|
||||
+-----------------------------+------------------------------------------------+
|
||||
| `--save-global` | Save the global routing solution, into a file |
|
||||
| | named `<design>.kgr`. |
|
||||
+-----------------------------+------------------------------------------------+
|
||||
| `-e <ratio>|--edge=<ratio>` | Change the edge capacity for the global |
|
||||
| | router, between 0 and 1 (|Knik|). |
|
||||
+-----------------------------+------------------------------------------------+
|
||||
| `-G|--global-route` | Run the global router (|Knik|). |
|
||||
+-----------------------------+------------------------------------------------+
|
||||
| `-R|--detailed-route` | Run the detailed router (|Kite|). |
|
||||
+-----------------------------+------------------------------------------------+
|
||||
| `-s|--save-design=<routed>` | The design into which the routed layout will |
|
||||
| | be saved. It is strongly recommanded to choose |
|
||||
| | a different name from the source (unrouted) |
|
||||
| | design. |
|
||||
+-----------------------------+------------------------------------------------+
|
||||
| `--events-limit=<count>` | The maximal number of events after which the |
|
||||
| | router will stops. This is mainly a failsafe |
|
||||
| | against looping. The limit is sets to 4 |
|
||||
| | millions of iteration which should suffice to |
|
||||
| | any design of `100K`. gates. For bigger |
|
||||
| | designs you may wants to increase this limit. |
|
||||
+-----------------------------+------------------------------------------------+
|
||||
| `--stratus-script=<module>` | Run the Python/Stratus script ``module``. |
|
||||
| | See `Python Scripts in Cgt`_. |
|
||||
+-----------------------------+------------------------------------------------+
|
||||
|
||||
|newpage|
|
||||
|
||||
|
||||
Some Examples :
|
||||
|
||||
* Run both global and detailed router, then save the routed design : ::
|
||||
|
||||
> cgt -v -t -G -R --cell=design --save-design=design_kite
|
||||
|
||||
* Load a previous global solution, run the detailed router, then save the
|
||||
routed design : ::
|
||||
|
||||
> cgt -v -t --load-global -R --cell=design --save-design=design_kite
|
||||
|
||||
* Run the global router, then save the global routing solution : ::
|
||||
|
||||
> cgt -v -t -G --save-global --cell=design
|
||||
|
||||
|
||||
Miscellaneous Settings
|
||||
----------------------
|
||||
|
||||
+---------------------------------------+------------------+----------------------------+
|
||||
| Parameter Identifier | Type | Default |
|
||||
+=======================================+==================+============================+
|
||||
| **Verbosity/Log Parameters** |
|
||||
+---------------------------------------+------------------+----------------------------+
|
||||
| ``misc.info`` | TypeBool | :cb:`False` |
|
||||
| +------------------+----------------------------+
|
||||
| | Enable display of *info* level message |
|
||||
| | (:cb:`cinfo` stream) |
|
||||
+---------------------------------------+------------------+----------------------------+
|
||||
| ``misc.bug`` | TypeBool | :cb:`False` |
|
||||
| +------------------+----------------------------+
|
||||
| | Enable display of *bug* level message |
|
||||
| | (:cb:`cbug` stream), messages can be a little |
|
||||
| | scarry |
|
||||
+---------------------------------------+------------------+----------------------------+
|
||||
| ``misc.logMode`` | TypeBool | :cb:`False` |
|
||||
| +------------------+----------------------------+
|
||||
| | If enabled, assume that the output device |
|
||||
| | is not a ``tty`` and suppress any escaped |
|
||||
| | sequences |
|
||||
+---------------------------------------+------------------+----------------------------+
|
||||
| ``misc.verboseLevel1`` | TypeBool | :cb:`True` |
|
||||
| +------------------+----------------------------+
|
||||
| | First level of verbosity, disable level 2 |
|
||||
+---------------------------------------+------------------+----------------------------+
|
||||
| ``misc.verboseLevel2`` | TypeBool | :cb:`False` |
|
||||
| +------------------+----------------------------+
|
||||
| | Second level of verbosity |
|
||||
+---------------------------------------+------------------+----------------------------+
|
||||
| **Development/Debug Parameters** |
|
||||
+---------------------------------------+------------------+----------------------------+
|
||||
| ``misc.minTraceLevel`` | TypeInt | :cb:`0` |
|
||||
+---------------------------------------+------------------+----------------------------+
|
||||
| ``misc.maxTraceLevel`` | TypeInt | :cb:`0` |
|
||||
| +------------------+----------------------------+
|
||||
| | Display trace information *between* those two |
|
||||
| | levels (:cb:`cdebug` stream) |
|
||||
+---------------------------------------+------------------+----------------------------+
|
||||
| ``misc.catchCore`` | TypeBool | :cb:`False` |
|
||||
| +------------------+----------------------------+
|
||||
| | By default, |cgt| do not dump core. |
|
||||
| | To generate one set this flag to :cb:`True` |
|
||||
+---------------------------------------+------------------+----------------------------+
|
||||
|
||||
|newpage|
|
||||
|
||||
|
||||
.. _The Controller:
|
||||
|
||||
The Controller
|
||||
~~~~~~~~~~~~~~
|
||||
|
||||
The *Controller* window is composed of seven tabs:
|
||||
|
||||
#. `The Look Tab`_ to select the display style.
|
||||
#. `The Filter Tab`_ the hierarchical levels to be displayed, the look of
|
||||
rubbers and the dimension units.
|
||||
#. `The Layers&Go Tab`_ to selectively hide/display layers.
|
||||
#. `The Netlist Tab`_ to browse through the |netlist|. Works in association
|
||||
with the *Selection* tab.
|
||||
#. `The Selection Tab`_ allow to view all the currently selected elements.
|
||||
#. `The Inspector Tab`_ browse through either the DataBase, the Cell or
|
||||
the current selection.
|
||||
#. `The Settings Tab`_ access all the tool's configuration settings.
|
||||
|
||||
|
||||
.. _The Look Tab:
|
||||
|
||||
The Look Tab
|
||||
------------
|
||||
|
||||
You can select how the layout will be displayed. There is a special one
|
||||
``Printer.Coriolis`` specifically designed for `Printing & Snapshots`_.
|
||||
You should select it prior to calling the print or snapshot dialog boxes.
|
||||
|
||||
|bcenter| |ControllerLook_1| |ecenter|
|
||||
|
||||
|newpage|
|
||||
|
||||
|
||||
.. _The Filter Tab:
|
||||
|
||||
The Filter Tab
|
||||
--------------
|
||||
|
||||
The filter tab let you select what hierarchical levels of your design will be
|
||||
displayed. Hierarchy level are numbered top-down: the level 0 correspond to
|
||||
the top-level cell, the level one to the instances of the top-level Cell and
|
||||
so on.
|
||||
|
||||
There are also check boxes to enable/disable the processing of Terminal Cell,
|
||||
Master Cells and Compnents. The processing of Terminal Cell (hierarchy leaf
|
||||
cells) is disabled by default when you load a hierarchical design and enabled
|
||||
when you load a single Cell.
|
||||
|
||||
You can choose what kind of form to give to the rubbers and the type of
|
||||
unit used to display coordinates.
|
||||
|
||||
.. note:: *What are Rubbers:* |Hurricane| uses *Rubbers* to materialize
|
||||
physical gaps in net topology. That is, if some wires are missing to
|
||||
connect two or more parts of net, a *rubber* will be drawn between them
|
||||
to signal the gap.
|
||||
|
||||
For example, after the detailed routing no *rubbers* should remains.
|
||||
They have been made *very* visibles as big violet lines...
|
||||
|
||||
|bcenter| |ControllerFilter_1| |ecenter|
|
||||
|
||||
|newpage|
|
||||
|
||||
|
||||
.. _The Layers&Go Tab:
|
||||
|
||||
The Layers&Go Tab
|
||||
-----------------
|
||||
|
||||
Control the individual display of all *layers* and *Gos*.
|
||||
|
||||
* *Layers* correspond to a true physical layer. From a |Hurricane| point of
|
||||
view they are all the *BasicLayers* (could be matched to GDSII).
|
||||
* *Gos* stands from *Graphical Objects*, they are drawings that have no
|
||||
physical existence but are added by the various tools to display extra
|
||||
information. One good exemple is the density map of the detailed router,
|
||||
to easily locate congested areas.
|
||||
|
||||
For each layer/Go there are two check boxes:
|
||||
|
||||
* The normal one triggers the display.
|
||||
* The red-outlined allows objects of that layer to be selectable or not.
|
||||
|
||||
|bcenter| |ControllerLayersGos_1| |ecenter|
|
||||
|
||||
|
||||
.. _The Netlist Tab:
|
||||
|
||||
The Netlist Tab
|
||||
---------------
|
||||
|
||||
The *Netlist* tab shows the list of nets... By default the tab is not
|
||||
*synched* with the displayed Cell. To see the nets you must check the
|
||||
**Sync Netlist** checkbox. You can narrow the set of displayed nets by
|
||||
using the filter pattern (supports regular expressions).
|
||||
|
||||
An very useful feature is to enable the **Sync Selection**, which will
|
||||
automatically select all the components of the selected net(s). You can
|
||||
select multiple nets. In the figure the net ``auxsc35`` is selected and
|
||||
is highlited in the *Viewer*.
|
||||
|
||||
|bcenter| |ControllerNetlist_1| |ecenter|
|
||||
|bcenter| |ViewerNetlist_1| |ecenter|
|
||||
|
||||
|
||||
.. _The Selection Tab:
|
||||
|
||||
The Selection Tab
|
||||
-----------------
|
||||
|
||||
The *Selection* tab list all the components currently selecteds. They
|
||||
can be filtered thanks to the filter pattern.
|
||||
|
||||
Used in conjunction with the *Netlist* **Sync Selection** you will all see
|
||||
all the components part of *net*.
|
||||
|
||||
In this list, you can toggle individually the selection of component by
|
||||
pressing the ``t`` key. When unselected in this way a component is not
|
||||
removed from the the selection list but instead displayed in red italic.
|
||||
To see where a component is you may make it blink by repeatedly press
|
||||
the ``t`` key...
|
||||
|
||||
|bcenter| |ControllerSelection_1| |ecenter|
|
||||
|
||||
|
||||
.. _The Inspector Tab:
|
||||
|
||||
The Inspector Tab
|
||||
-----------------
|
||||
|
||||
This tab is very useful, but mostly for |Coriolis| developpers. It allows
|
||||
to browse through the live DataBase. The *Inspector* provide three entry points:
|
||||
|
||||
* **DataBase**: Starts from the whole |Hurricane| DataBase.
|
||||
* **Cell**: Inspect the currently loaded Cell.
|
||||
* **Selection**: Inspect the object currently highlited in the *Selection* tab.
|
||||
|
||||
Once an entry point has been activated, you may recursively expore all
|
||||
it's fields using the right/left arrows.
|
||||
|
||||
.. note:: *Do not put your fingers in the socket:* when inspecting
|
||||
anything, do not modify the DataBase. If any object under inspection
|
||||
is deleted, you will crash the application...
|
||||
|
||||
.. note:: *Implementation Detail:* the inspector support is done with
|
||||
``Slot``, ``Record`` and ``getString()``.
|
||||
|
||||
|bcenter| |ControllerInspector_1| |ecenter|
|
||||
|bcenter| |ControllerInspector_2| |ecenter|
|
||||
|bcenter| |ControllerInspector_3| |ecenter|
|
||||
|
||||
|
||||
.. _The Settings Tab:
|
||||
|
||||
The Settings Tab
|
||||
----------------
|
||||
|
||||
Here comes the description of the *Settings* tab.
|
||||
|
||||
|bcenter| |ControllerSettings_1| |ecenter|
|
|
@ -1,70 +0,0 @@
|
|||
|
||||
.. -*- Mode: rst -*-
|
||||
.. This header contains the definitions needed for the UsersGuide.rst
|
||||
.. document to be displayed correctly on the soc-extras website.
|
||||
.. The only difference with HTML_defs.rst is that the images are
|
||||
.. stored at a different URL on the website. Namely:
|
||||
.. https://soc-extras.lip6.fr/media/filer/2012/12/07/
|
||||
|
||||
.. URLs that changes between the various backends.
|
||||
.. _Coriolis Tools Documentation: https://www-soc.lip6.fr/sesi-docs/coriolis2-docs/coriolis2/
|
||||
.. _Stratus Documentation: https://www-soc.lip6.fr/sesi-docs/coriolis2-docs/coriolis2/en/html/stratus/index.html
|
||||
.. _Here: https://www-soc.lip6.fr/sesi-docs/coriolis2-docs/coriolis2/en/latex/users-guide/UsersGuide.pdf
|
||||
|
||||
.. role:: raw-html(raw)
|
||||
:format: html
|
||||
|
||||
.. For HTML backend
|
||||
.. |Key_ESC| image:: https://soc-extras.lip6.fr/media/filer/2012/12/07/key_esc.png
|
||||
.. |Key_CTRL| image:: https://soc-extras.lip6.fr/media/filer/2012/12/07/key_ctrl.png
|
||||
.. |Key_Up| image:: https://soc-extras.lip6.fr/media/filer/2012/12/07/key_up.png
|
||||
.. |Key_Down| image:: https://soc-extras.lip6.fr/media/filer/2012/12/07/key_down.png
|
||||
.. |Key_Left| image:: https://soc-extras.lip6.fr/media/filer/2012/12/07/key_left.png
|
||||
.. |Key_Right| image:: https://soc-extras.lip6.fr/media/filer/2012/12/07/key_right.png
|
||||
.. |Key_f| image:: https://soc-extras.lip6.fr/media/filer/2012/12/07/key_f.png
|
||||
.. |Key_G| image:: https://soc-extras.lip6.fr/media/filer/2012/12/07/key_gcap.png
|
||||
.. |Key_i| image:: https://soc-extras.lip6.fr/media/filer/2012/12/07/key_icap.png
|
||||
.. |Key_l| image:: https://soc-extras.lip6.fr/media/filer/2012/12/07/key_lcap.png
|
||||
.. |Key_m| image:: https://soc-extras.lip6.fr/media/filer/2012/12/07/key_m.png
|
||||
.. |Key_k| image:: https://soc-extras.lip6.fr/media/filer/2012/12/07/key_k.png
|
||||
.. |Key_K| image:: https://soc-extras.lip6.fr/media/filer/2012/12/07/key_kcap.png
|
||||
.. |Key_o| image:: https://soc-extras.lip6.fr/media/filer/2012/12/07/key_ocap.png
|
||||
.. |Key_p| image:: https://soc-extras.lip6.fr/media/filer/2012/12/07/key_pcap.png
|
||||
.. |Key_q| image:: https://soc-extras.lip6.fr/media/filer/2012/12/07/key_qcap.png
|
||||
.. |Key_w| image:: https://soc-extras.lip6.fr/media/filer/2012/12/07/key_wcap.png
|
||||
.. |Key_S| image:: https://soc-extras.lip6.fr/media/filer/2012/12/07/key_scap.png
|
||||
.. |Key_z| image:: https://soc-extras.lip6.fr/media/filer/2012/12/07/key_z.png
|
||||
.. |Plus| replace:: :raw-html:`+`
|
||||
.. |rightarrow| replace:: :raw-html:`<p class="empty"></p>`
|
||||
.. |menu_P&R| replace:: :raw-html:`<p class="empty"></p>`
|
||||
.. |menu_StepByStep| replace:: :raw-html:`<p class="empty"></p>`
|
||||
.. |menu_KiteSaveGlobalRouting| image:: https://soc-extras.lip6.fr/media/filer/2012/12/07/pr-sbs-saveglobal.png
|
||||
.. |menu_KiteLoadGlobalRouting| image:: https://soc-extras.lip6.fr/media/filer/2012/12/07/pr-sbs-loadglobal.png
|
||||
.. |menu_KiteGlobalRoute| image:: https://soc-extras.lip6.fr/media/filer/2012/12/07/pr-globalroute.png
|
||||
.. |menu_KiteDetailedRoute| image:: https://soc-extras.lip6.fr/media/filer/2012/12/07/pr-detailedroute.png
|
||||
.. |menu_KiteDetailedPreRoute| image:: https://soc-extras.lip6.fr/media/filer/2012/12/07/pr-detailedpreroute.png
|
||||
.. |menu_KiteFinalizeRoute| image:: https://soc-extras.lip6.fr/media/filer/2012/12/07/pr-finalizeroute.png
|
||||
|
||||
.. Stand-alone images.
|
||||
.. |ViewerSnapshot_1| replace:: :raw-html:`<center><img class="addborder" src="https://soc-extras.lip6.fr/media/filer/2012/12/07/viewer-1.png" alt="Viewer Basic Snapshot"></center>`
|
||||
.. |ControllerSnapshot_1| replace:: :raw-html:`<center><img src="https://soc-extras.lip6.fr/media/filer/2012/12/07/controller-1.png" alt="Controller Basic Snapshot"></center>`
|
||||
.. |ControllerLook_1| replace:: :raw-html:`<center><img src="https://soc-extras.lip6.fr/media/filer/2012/12/07/controller-look-1.png" alt="Controller Basic Snapshot"></center>`
|
||||
.. |ControllerFilter_1| replace:: :raw-html:`<center><img src="https://soc-extras.lip6.fr/media/filer/2012/12/07/controller-filter-1.png" alt="Controller Basic Snapshot"></center>`
|
||||
.. |ControllerLayersGos_1| replace:: :raw-html:`<center><img src="https://soc-extras.lip6.fr/media/filer/2012/12/07/controller-layersgos-1.png" alt="Controller Basic Snapshot"></center>`
|
||||
.. |ControllerNetlist_1| replace:: :raw-html:`<center><img src="https://soc-extras.lip6.fr/media/filer/2012/12/07/controller-netlist-1.png" alt="Controller Basic Snapshot"></center>`
|
||||
.. |ViewerNetlist_1| replace:: :raw-html:`<center><img src="https://soc-extras.lip6.fr/media/filer/2012/12/07/viewer-netlist-1.png" alt="Controller Basic Snapshot"></center>`
|
||||
.. |ControllerSelection_1| replace:: :raw-html:`<center><img src="https://soc-extras.lip6.fr/media/filer/2012/12/07/controller-selection-1.png" alt="Controller Basic Snapshot"></center>`
|
||||
.. |ControllerInspector_1| replace:: :raw-html:`<center><img src="https://soc-extras.lip6.fr/media/filer/2012/12/07/controller-inspector-1.png" alt="Controller Basic Snapshot"></center>`
|
||||
.. |ControllerInspector_2| replace:: :raw-html:`<center><img src="https://soc-extras.lip6.fr/media/filer/2012/12/07/controller-inspector-2.png" alt="Controller Basic Snapshot"></center>`
|
||||
.. |ControllerInspector_3| replace:: :raw-html:`<center><img src="https://soc-extras.lip6.fr/media/filer/2012/12/07/controller-inspector-3.png" alt="Controller Basic Snapshot"></center>`
|
||||
.. |ControllerSettings_1| replace:: :raw-html:`<center><img src="https://soc-extras.lip6.fr/media/filer/2012/12/07/controller-settings-1.png" alt="Controller Basic Snapshot"></center>`
|
||||
.. |CoriolisSoftSchema| replace:: :raw-html:`<center><img src="https://soc-extras.lip6.fr/media/filer/2014/06/29/Coriolis-Soft-Schema.png" alt="Coriolis Software Schematic"></center>`
|
||||
|
||||
.. |BigMouse| image:: https://soc-extras.lip6.fr/media/filer/2012/12/07/computermouse.png
|
||||
:scale: 25%
|
||||
|
||||
.. Direct LaTeX commands encapsulation.
|
||||
.. |dotfill| replace:: :raw-html:` `
|
||||
.. |noindent| replace:: :raw-html:`<p class="empty"></p>`
|
||||
.. |medskip| replace:: :raw-html:`<br>`
|
||||
.. |newpage| replace:: :raw-html:`<hr>`
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
|
@ -0,0 +1,21 @@
|
|||
.. -*- mode: rst; explicit-buffer-name: "index.rst<UsersGuide>" -*-
|
||||
|
||||
.. include:: ../etc/definitions.rst
|
||||
|
||||
|
||||
=======================
|
||||
Coriolis User's Guide
|
||||
=======================
|
||||
|
||||
Printable version of this document `UsersGuide.pdf <../../../pdf/main/UsersGuide.pdf>`_.
|
||||
|
||||
|
||||
.. toctree::
|
||||
:maxdepth: 2
|
||||
|
||||
LicenseCredits.rst
|
||||
Releases.rst
|
||||
Installation.rst
|
||||
Configuration.rst
|
||||
ViewerTools.rst
|
||||
ScriptsPlugins.rst
|
|
@ -0,0 +1,15 @@
|
|||
.. -*- Mode: rst -*-
|
||||
|
||||
.. include:: ../etc/definitions.rst
|
||||
|
||||
|
||||
=======================
|
||||
Coriolis User's Guide
|
||||
=======================
|
||||
|
||||
|pagestylefancy|
|
||||
|
||||
|
||||
.. contents::
|
||||
|
||||
|newpage|
|
|
@ -1,89 +0,0 @@
|
|||
|
||||
\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}
|
|
@ -0,0 +1,11 @@
|
|||
.. -*- Mode: rst -*-
|
||||
|
||||
.. include:: ../etc/definitions.rst
|
||||
|
||||
|
||||
==================
|
||||
Viewer Reference
|
||||
==================
|
||||
|
||||
The Viewer C++ API reference is generated by Doxygen_ and is
|
||||
available here: `Viewer <file:../../viewer/index.html>`_
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue