diff --git a/Makefile b/Makefile
index 8ccdbbb5..c03bfee1 100644
--- a/Makefile
+++ b/Makefile
@@ -1,15 +1,16 @@
- UNAME_S = $(shell uname -s)
- UNAME_R = $(shell uname -r)
+ UNAME_S = $(shell uname -s)
+ UNAME_R = $(shell uname -r)
+ DEVTOOLSET_VERSION = 7
-# We must use devtoolset-2 only under RHEL6 & clones.
+# We must use devtoolset only under RHEL6 & clones.
DEVTOOLSET_OPTION =
ifeq ($(UNAME_S),Linux)
- ifneq ($(findstring .el6.,$(UNAME_R)),)
- DEVTOOLSET_OPTION = --devtoolset-2
+ ifneq ($(findstring .el7.,$(UNAME_R)),)
+ DEVTOOLSET_OPTION = --devtoolset=$(DEVTOOLSET_VERSION)
endif
ifneq ($(findstring .slsoc6.,$(UNAME_R)),)
- DEVTOOLSET_OPTION = --devtoolset-2
+ DEVTOOLSET_OPTION = --devtoolset=$(DEVTOOLSET_VERSION)
endif
endif
diff --git a/anabatic/CMakeLists.txt b/anabatic/CMakeLists.txt
index 43651e8e..ce2e393b 100644
--- a/anabatic/CMakeLists.txt
+++ b/anabatic/CMakeLists.txt
@@ -20,6 +20,7 @@
find_package(PythonLibs 2 REQUIRED)
find_package(PythonSitePackages REQUIRED)
+ find_package(FLUTE REQUIRED)
find_package(VLSISAPD REQUIRED)
find_package(HURRICANE REQUIRED)
find_package(CORIOLIS REQUIRED)
diff --git a/anabatic/src/AnabaticEngine.cpp b/anabatic/src/AnabaticEngine.cpp
index f835cc86..f56c29ec 100644
--- a/anabatic/src/AnabaticEngine.cpp
+++ b/anabatic/src/AnabaticEngine.cpp
@@ -504,6 +504,24 @@ namespace Anabatic {
}
+ void AnabaticEngine::exclude ( const Name& netName )
+ {
+ Net* net = _cell->getNet( netName );
+ if (not net) return;
+
+ exclude( net );
+ }
+
+
+ void AnabaticEngine::exclude ( Net* net )
+ {
+ NetDatas::iterator inet =_netDatas.find( net->getId() );
+ if (inet == _netDatas.end()) return;
+
+ (*inet).second->setExcluded( true );
+ }
+
+
void AnabaticEngine::updateMatrix()
{
_matrix.setCell( getCell(), Session::getSliceHeight() );
@@ -1028,7 +1046,7 @@ namespace Anabatic {
void AnabaticEngine::updateNetTopology ( Net* net )
{
- DebugSession::open( net, 140, 150 );
+ DebugSession::open( net, 145, 150 );
cdebug_log(149,0) << "Anabatic::updateNetTopology( " << net << " )" << endl;
cdebug_tabw(145,1);
@@ -1069,7 +1087,7 @@ namespace Anabatic {
void AnabaticEngine::_alignate ( Net* net )
{
- DebugSession::open( net, 140, 150 );
+ DebugSession::open( net, 145, 150 );
cdebug_log(149,0) << "Anabatic::_alignate( " << net << " )" << endl;
cdebug_tabw(145,1);
@@ -1127,7 +1145,7 @@ namespace Anabatic {
void AnabaticEngine::_computeNetTerminals ( Net* net )
{
- DebugSession::open( net, 140, 150 );
+ DebugSession::open( net, 145, 150 );
cdebug_log(149,0) << "Anabatic::_computeNetTerminals( " << net << " )" << endl;
cdebug_tabw(145,1);
@@ -1146,7 +1164,7 @@ namespace Anabatic {
void AnabaticEngine::_saveNet ( Net* net )
{
- DebugSession::open( net, 140, 150 );
+ DebugSession::open( net, 145, 150 );
cdebug_log(145,0) << "Anabatic::_saveNet() " << net << endl;
cdebug_tabw(145,1);
diff --git a/anabatic/src/AutoContact.cpp b/anabatic/src/AutoContact.cpp
index a52d6253..77b23abd 100644
--- a/anabatic/src/AutoContact.cpp
+++ b/anabatic/src/AutoContact.cpp
@@ -110,7 +110,7 @@ namespace Anabatic {
void AutoContact::_preDestroy ()
{
- DebugSession::open( _contact->getNet(), 140, 150 );
+ DebugSession::open( _contact->getNet(), 145, 150 );
cdebug_log(145,0) << "AutoContact::_preDestroy() -
diff --git a/documentation/_build/html/Contents.html b/documentation/_build/html/Contents.html
index 11d08429..be4c6194 100644
--- a/documentation/_build/html/Contents.html
+++ b/documentation/_build/html/Contents.html
@@ -1119,7 +1119,7 @@
diff --git a/documentation/_build/html/CrlCore/CrlCore.html b/documentation/_build/html/CrlCore/CrlCore.html
index edee37d4..30c47acf 100644
--- a/documentation/_build/html/CrlCore/CrlCore.html
+++ b/documentation/_build/html/CrlCore/CrlCore.html
@@ -523,7 +523,7 @@ available here:
Generated by Sphinx
- using a RTD theme on Oct 18, 2018.
+ using a RTD theme on Mar 04, 2019.
Generated by Sphinx
- using a RTD theme on Oct 18, 2018.
+ using a RTD theme on Mar 04, 2019.
diff --git a/documentation/_build/html/Hurricane/Hurricane.html b/documentation/_build/html/Hurricane/Hurricane.html
index b1ba1f45..95c1a918 100644
--- a/documentation/_build/html/Hurricane/Hurricane.html
+++ b/documentation/_build/html/Hurricane/Hurricane.html
@@ -523,7 +523,7 @@ available here:
Generated by Sphinx
- using a RTD theme on Oct 18, 2018.
+ using a RTD theme on Mar 04, 2019.
diff --git a/documentation/_build/html/Katabatic/Katabatic.html b/documentation/_build/html/Katabatic/Katabatic.html
index 9355655f..17d1bab3 100644
--- a/documentation/_build/html/Katabatic/Katabatic.html
+++ b/documentation/_build/html/Katabatic/Katabatic.html
@@ -528,7 +528,7 @@ mixed signal conterpart Anabatic.
DbU::Unit
Generated by Sphinx
- using a RTD theme on Oct 18, 2018.
+ using a RTD theme on Mar 04, 2019.
diff --git a/documentation/_build/html/PythonCpp/Introduction.html b/documentation/_build/html/PythonCpp/Introduction.html
index 009ae652..c8c80139 100644
--- a/documentation/_build/html/PythonCpp/Introduction.html
+++ b/documentation/_build/html/PythonCpp/Introduction.html
@@ -686,7 +686,7 @@ like in the code below:
Generated by Sphinx
- using a RTD theme on Oct 18, 2018.
+ using a RTD theme on Mar 04, 2019.
diff --git a/documentation/_build/html/PythonCpp/Name.html b/documentation/_build/html/PythonCpp/Name.html
index 21b616d3..15e4489b 100644
--- a/documentation/_build/html/PythonCpp/Name.html
+++ b/documentation/_build/html/PythonCpp/Name.html
@@ -525,7 +525,7 @@
Generated by Sphinx
- using a RTD theme on Oct 18, 2018.
+ using a RTD theme on Mar 04, 2019.
diff --git a/documentation/_build/html/PythonCpp/NonDBo.html b/documentation/_build/html/PythonCpp/NonDBo.html
index 4aa7ca73..974b4c56 100644
--- a/documentation/_build/html/PythonCpp/NonDBo.html
+++ b/documentation/_build/html/PythonCpp/NonDBo.html
@@ -675,7 +675,7 @@ a standalone DBo
Generated by Sphinx
- using a RTD theme on Oct 18, 2018.
+ using a RTD theme on Mar 04, 2019.
diff --git a/documentation/_build/html/PythonCpp/index.html b/documentation/_build/html/PythonCpp/index.html
index 34693336..690ee718 100644
--- a/documentation/_build/html/PythonCpp/index.html
+++ b/documentation/_build/html/PythonCpp/index.html
@@ -557,7 +557,7 @@
Generated by Sphinx
- using a RTD theme on Oct 18, 2018.
+ using a RTD theme on Mar 04, 2019.
diff --git a/documentation/_build/html/PythonTutorial/AdvancedTopics.html b/documentation/_build/html/PythonTutorial/AdvancedTopics.html
index e3118a1f..5b1cc0f1 100644
--- a/documentation/_build/html/PythonTutorial/AdvancedTopics.html
+++ b/documentation/_build/html/PythonTutorial/AdvancedTopics.html
@@ -544,7 +544,7 @@ go through all the components of a trans-hierarchical net.
Generated by Sphinx
- using a RTD theme on Oct 18, 2018.
+ using a RTD theme on Mar 04, 2019.
diff --git a/documentation/_build/html/PythonTutorial/CellNetComponent.html b/documentation/_build/html/PythonTutorial/CellNetComponent.html
index 63c5d502..a3d378fe 100644
--- a/documentation/_build/html/PythonTutorial/CellNetComponent.html
+++ b/documentation/_build/html/PythonTutorial/CellNetComponent.html
@@ -835,7 +835,7 @@ explanation of that part of the code, refer to
Generated by Sphinx
- using a RTD theme on Oct 18, 2018.
+ using a RTD theme on Mar 04, 2019.
diff --git a/documentation/_build/html/PythonTutorial/CgtScript.html b/documentation/_build/html/PythonTutorial/CgtScript.html
index 74209c3c..06abd766 100644
--- a/documentation/_build/html/PythonTutorial/CgtScript.html
+++ b/documentation/_build/html/PythonTutorial/CgtScript.html
@@ -594,7 +594,7 @@ The Breakpoint.stop()
Generated by Sphinx
- using a RTD theme on Oct 18, 2018.
+ using a RTD theme on Mar 04, 2019.
diff --git a/documentation/_build/html/PythonTutorial/Collections.html b/documentation/_build/html/PythonTutorial/Collections.html
index a918b19a..4ae0cfd2 100644
--- a/documentation/_build/html/PythonTutorial/Collections.html
+++ b/documentation/_build/html/PythonTutorial/Collections.html
@@ -595,7 +595,7 @@ they may unexpectedly shadow cells from the libraries.
Generated by Sphinx
- using a RTD theme on Oct 18, 2018.
+ using a RTD theme on Mar 04, 2019.
diff --git a/documentation/_build/html/PythonTutorial/Environment.html b/documentation/_build/html/PythonTutorial/Environment.html
index 71e89c06..353026b3 100644
--- a/documentation/_build/html/PythonTutorial/Environment.html
+++ b/documentation/_build/html/PythonTutorial/Environment.html
@@ -518,7 +518,7 @@ or C-Shell
like).
Note
Do not call that script in your environement initialisation.
-When used under rhel6 or clones, it needs to be run in the devtoolset2
+When used under rhel6 or clones, it needs to be run in the devtoolset
environement. The script then launch a new shell, which may cause an
infinite loop if it’s called again in, say ~/.bashrc.
Instead you may want to create an alias:
@@ -600,7 +600,7 @@ in CGT - The
Generated by Sphinx
- using a RTD theme on Oct 18, 2018.
+ using a RTD theme on Mar 04, 2019.
diff --git a/documentation/_build/html/PythonTutorial/Introduction.html b/documentation/_build/html/PythonTutorial/Introduction.html
index 78b70a38..b4d2a3de 100644
--- a/documentation/_build/html/PythonTutorial/Introduction.html
+++ b/documentation/_build/html/PythonTutorial/Introduction.html
@@ -657,7 +657,7 @@ to be explicitly deleted.
Generated by Sphinx
- using a RTD theme on Oct 18, 2018.
+ using a RTD theme on Mar 04, 2019.
diff --git a/documentation/_build/html/PythonTutorial/Netlist.html b/documentation/_build/html/PythonTutorial/Netlist.html
index 3440f52e..238ac8a5 100644
--- a/documentation/_build/html/PythonTutorial/Netlist.html
+++ b/documentation/_build/html/PythonTutorial/Netlist.html
@@ -883,7 +883,7 @@ directory (under the the root of the Coriolis installati
Generated by Sphinx
- using a RTD theme on Oct 18, 2018.
+ using a RTD theme on Mar 04, 2019.
diff --git a/documentation/_build/html/PythonTutorial/RealDesigns.html b/documentation/_build/html/PythonTutorial/RealDesigns.html
index 89491f92..4c047775 100644
--- a/documentation/_build/html/PythonTutorial/RealDesigns.html
+++ b/documentation/_build/html/PythonTutorial/RealDesigns.html
@@ -561,7 +561,7 @@ the one of the FreePDK45, you must load it prior to calling the
Generated by Sphinx
- using a RTD theme on Oct 18, 2018.
+ using a RTD theme on Mar 04, 2019.
diff --git a/documentation/_build/html/PythonTutorial/ToolEngines.html b/documentation/_build/html/PythonTutorial/ToolEngines.html
index fbeb8b8f..1e63a50a 100644
--- a/documentation/_build/html/PythonTutorial/ToolEngines.html
+++ b/documentation/_build/html/PythonTutorial/ToolEngines.html
@@ -724,7 +724,7 @@ case it is around 3%
Generated by Sphinx
- using a RTD theme on Oct 18, 2018.
+ using a RTD theme on Mar 04, 2019.
diff --git a/documentation/_build/html/PythonTutorial/definitions.html b/documentation/_build/html/PythonTutorial/definitions.html
index b602bdf1..cc95299b 100644
--- a/documentation/_build/html/PythonTutorial/definitions.html
+++ b/documentation/_build/html/PythonTutorial/definitions.html
@@ -507,7 +507,7 @@
Generated by Sphinx
- using a RTD theme on Oct 18, 2018.
+ using a RTD theme on Mar 04, 2019.
diff --git a/documentation/_build/html/PythonTutorial/index.html b/documentation/_build/html/PythonTutorial/index.html
index a714edb0..79c63444 100644
--- a/documentation/_build/html/PythonTutorial/index.html
+++ b/documentation/_build/html/PythonTutorial/index.html
@@ -586,7 +586,7 @@ and hierarchical design.
Generated by Sphinx
- using a RTD theme on Oct 18, 2018.
+ using a RTD theme on Mar 04, 2019.
diff --git a/documentation/_build/html/PythonTutorial/pdfHeader.html b/documentation/_build/html/PythonTutorial/pdfHeader.html
index 7a833875..11f186f8 100644
--- a/documentation/_build/html/PythonTutorial/pdfHeader.html
+++ b/documentation/_build/html/PythonTutorial/pdfHeader.html
@@ -522,7 +522,7 @@ and hierarchical design.
Generated by Sphinx
- using a RTD theme on Oct 18, 2018.
+ using a RTD theme on Mar 04, 2019.
diff --git a/documentation/_build/html/RDS/RDSpage.html b/documentation/_build/html/RDS/RDSpage.html
index fb0c60fc..68c61884 100644
--- a/documentation/_build/html/RDS/RDSpage.html
+++ b/documentation/_build/html/RDS/RDSpage.html
@@ -982,7 +982,7 @@ wire width and minimal spacing for the routers. They are patly redundant.
Generated by Sphinx
- using a RTD theme on Oct 18, 2018.
+ using a RTD theme on Mar 04, 2019.
diff --git a/documentation/_build/html/RDS/index.html b/documentation/_build/html/RDS/index.html
index c1b24420..2034ad29 100644
--- a/documentation/_build/html/RDS/index.html
+++ b/documentation/_build/html/RDS/index.html
@@ -541,7 +541,7 @@
Generated by Sphinx
- using a RTD theme on Oct 18, 2018.
+ using a RTD theme on Mar 04, 2019.
diff --git a/documentation/_build/html/Stratus/Developper.html b/documentation/_build/html/Stratus/Developper.html
index 91b40e38..cbb99432 100644
--- a/documentation/_build/html/Stratus/Developper.html
+++ b/documentation/_build/html/Stratus/Developper.html
@@ -794,7 +794,7 @@ by default)
Generated by Sphinx
- using a RTD theme on Oct 18, 2018.
+ using a RTD theme on Mar 04, 2019.
diff --git a/documentation/_build/html/Stratus/DpGen.html b/documentation/_build/html/Stratus/DpGen.html
index a30c393f..2de3ea45 100644
--- a/documentation/_build/html/Stratus/DpGen.html
+++ b/documentation/_build/html/Stratus/DpGen.html
@@ -3801,7 +3801,7 @@ flip-flop
Generated by Sphinx
- using a RTD theme on Oct 18, 2018.
+ using a RTD theme on Mar 04, 2019.
diff --git a/documentation/_build/html/Stratus/Language.html b/documentation/_build/html/Stratus/Language.html
index d6f6b0f8..c91d2ebd 100644
--- a/documentation/_build/html/Stratus/Language.html
+++ b/documentation/_build/html/Stratus/Language.html
@@ -2940,7 +2940,7 @@ The mapping file is not given in the environment variable.
Generated by Sphinx
- using a RTD theme on Oct 18, 2018.
+ using a RTD theme on Mar 04, 2019.
diff --git a/documentation/_build/html/Stratus/Patterns.html b/documentation/_build/html/Stratus/Patterns.html
index c69202a4..3cdf0bb9 100644
--- a/documentation/_build/html/Stratus/Patterns.html
+++ b/documentation/_build/html/Stratus/Patterns.html
@@ -754,7 +754,7 @@ vectors.
Generated by Sphinx
- using a RTD theme on Oct 18, 2018.
+ using a RTD theme on Mar 04, 2019.
diff --git a/documentation/_build/html/Stratus/index.html b/documentation/_build/html/Stratus/index.html
index 9f3bc43f..54a57fc7 100644
--- a/documentation/_build/html/Stratus/index.html
+++ b/documentation/_build/html/Stratus/index.html
@@ -531,7 +531,7 @@
Generated by Sphinx
- using a RTD theme on Oct 18, 2018.
+ using a RTD theme on Mar 04, 2019.
diff --git a/documentation/_build/html/Unicorn/Unicorn.html b/documentation/_build/html/Unicorn/Unicorn.html
index 83b08d35..2acb05d0 100644
--- a/documentation/_build/html/Unicorn/Unicorn.html
+++ b/documentation/_build/html/Unicorn/Unicorn.html
@@ -523,7 +523,7 @@ available here:
Generated by Sphinx
- using a RTD theme on Oct 18, 2018.
+ using a RTD theme on Mar 04, 2019.
diff --git a/documentation/_build/html/UsersGuide/Configuration.html b/documentation/_build/html/UsersGuide/Configuration.html
index 380973b3..5bb32717 100644
--- a/documentation/_build/html/UsersGuide/Configuration.html
+++ b/documentation/_build/html/UsersGuide/Configuration.html
@@ -865,7 +865,7 @@ in <CWD>/.coriolis2/settings.py (that is, written
Generated by Sphinx
- using a RTD theme on Oct 18, 2018.
+ using a RTD theme on Mar 04, 2019.
diff --git a/documentation/_build/html/UsersGuide/Installation.html b/documentation/_build/html/UsersGuide/Installation.html
index 7752ff8e..f10e34c4 100644
--- a/documentation/_build/html/UsersGuide/Installation.html
+++ b/documentation/_build/html/UsersGuide/Installation.html
@@ -528,9 +528,10 @@ running the ccb installer.
latex2html
python-docutils (for reStructuredText)
-Optional libraries:
+The following libraries gets directly bundled with Coriolis:
- LEF/DEF (from SI2)
+- FLUTE (from Chris C. N. Chu)
For other distributions, refer to their own packaging system.
@@ -657,9 +658,10 @@ the exact version we compiled against is given below.
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:
+Under rhel6 or clones, you must build using the devtoolset, the version is to
+be given as argument:
dummy@lepka:src> ./bootstrap/ccb.py --project=coriolis \
- --devtoolset-2 --make="-j4 install"
+ --devtoolset=8 --make="-j4 install"
If you want to uses Qt 5 instead of Qt 4, you may add the --qt5
argument.
@@ -741,7 +743,7 @@ in the bootstrap
Note
Do not call that script in your environement initialisation.
-When used under rhel6 or clones, it needs to be run in the devtoolset2
+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 ~/.bashrc.
Instead you may want to create an alias:
@@ -773,7 +775,7 @@ infinite loop if it’s called again in, say ~/.bashrc
Generated by Sphinx
- using a RTD theme on Oct 18, 2018.
+ using a RTD theme on Mar 04, 2019.
diff --git a/documentation/_build/html/UsersGuide/LicenseCredits.html b/documentation/_build/html/UsersGuide/LicenseCredits.html
index 3735a95a..5452f5aa 100644
--- a/documentation/_build/html/UsersGuide/LicenseCredits.html
+++ b/documentation/_build/html/UsersGuide/LicenseCredits.html
@@ -550,7 +550,7 @@ copyright© Chris C. N. Chu from the Iowa State Universi
Generated by Sphinx
- using a RTD theme on Oct 18, 2018.
+ using a RTD theme on Mar 04, 2019.
diff --git a/documentation/_build/html/UsersGuide/Releases.html b/documentation/_build/html/UsersGuide/Releases.html
index 369953a2..3870350f 100644
--- a/documentation/_build/html/UsersGuide/Releases.html
+++ b/documentation/_build/html/UsersGuide/Releases.html
@@ -607,7 +607,7 @@ whole design down and including the standard cells.
Generated by Sphinx
- using a RTD theme on Oct 18, 2018.
+ using a RTD theme on Mar 04, 2019.
diff --git a/documentation/_build/html/UsersGuide/ScriptsPlugins.html b/documentation/_build/html/UsersGuide/ScriptsPlugins.html
index 7ef84ed7..271a7d26 100644
--- a/documentation/_build/html/UsersGuide/ScriptsPlugins.html
+++ b/documentation/_build/html/UsersGuide/ScriptsPlugins.html
@@ -905,7 +905,7 @@ then run the Python script doChip.py
Generated by Sphinx
- using a RTD theme on Oct 18, 2018.
+ using a RTD theme on Mar 04, 2019.
diff --git a/documentation/_build/html/UsersGuide/ViewerTools.html b/documentation/_build/html/UsersGuide/ViewerTools.html
index 23072ca4..60743904 100644
--- a/documentation/_build/html/UsersGuide/ViewerTools.html
+++ b/documentation/_build/html/UsersGuide/ViewerTools.html
@@ -1397,7 +1397,7 @@ is deleted, you will crash the application...
Generated by Sphinx
- using a RTD theme on Oct 18, 2018.
+ using a RTD theme on Mar 04, 2019.
diff --git a/documentation/_build/html/UsersGuide/index.html b/documentation/_build/html/UsersGuide/index.html
index 8458cb72..08cedd3d 100644
--- a/documentation/_build/html/UsersGuide/index.html
+++ b/documentation/_build/html/UsersGuide/index.html
@@ -562,7 +562,7 @@
Generated by Sphinx
- using a RTD theme on Oct 18, 2018.
+ using a RTD theme on Mar 04, 2019.
diff --git a/documentation/_build/html/Viewer/Viewer.html b/documentation/_build/html/Viewer/Viewer.html
index c9905eea..93b67076 100644
--- a/documentation/_build/html/Viewer/Viewer.html
+++ b/documentation/_build/html/Viewer/Viewer.html
@@ -523,7 +523,7 @@ available here:
Generated by Sphinx
- using a RTD theme on Oct 18, 2018.
+ using a RTD theme on Mar 04, 2019.
diff --git a/documentation/_build/html/_images/math/0b37db03668389c8e33d766f186469af280334bb.png b/documentation/_build/html/_images/math/0b37db03668389c8e33d766f186469af280334bb.png
index a3b0297f..16687fc4 100644
Binary files a/documentation/_build/html/_images/math/0b37db03668389c8e33d766f186469af280334bb.png and b/documentation/_build/html/_images/math/0b37db03668389c8e33d766f186469af280334bb.png differ
diff --git a/documentation/_build/html/_images/math/0d59c123dd2cd130ca29a2ba930fabbc4f547771.png b/documentation/_build/html/_images/math/0d59c123dd2cd130ca29a2ba930fabbc4f547771.png
index 730bef5a..e121fb14 100644
Binary files a/documentation/_build/html/_images/math/0d59c123dd2cd130ca29a2ba930fabbc4f547771.png and b/documentation/_build/html/_images/math/0d59c123dd2cd130ca29a2ba930fabbc4f547771.png differ
diff --git a/documentation/_build/html/_images/math/44344a23b2a3007fed067629259108385790ee6a.png b/documentation/_build/html/_images/math/44344a23b2a3007fed067629259108385790ee6a.png
index 022c2ee4..ea41cf7e 100644
Binary files a/documentation/_build/html/_images/math/44344a23b2a3007fed067629259108385790ee6a.png and b/documentation/_build/html/_images/math/44344a23b2a3007fed067629259108385790ee6a.png differ
diff --git a/documentation/_build/html/_images/math/8080e7327f421afe79e142b39735819ab9631cb9.png b/documentation/_build/html/_images/math/8080e7327f421afe79e142b39735819ab9631cb9.png
index 16560a4a..7725368f 100644
Binary files a/documentation/_build/html/_images/math/8080e7327f421afe79e142b39735819ab9631cb9.png and b/documentation/_build/html/_images/math/8080e7327f421afe79e142b39735819ab9631cb9.png differ
diff --git a/documentation/_build/html/_images/math/9354e2441491d324ef5fd162920f581bdf022af5.png b/documentation/_build/html/_images/math/9354e2441491d324ef5fd162920f581bdf022af5.png
index 234602ed..e9cb6050 100644
Binary files a/documentation/_build/html/_images/math/9354e2441491d324ef5fd162920f581bdf022af5.png and b/documentation/_build/html/_images/math/9354e2441491d324ef5fd162920f581bdf022af5.png differ
diff --git a/documentation/_build/html/_images/math/ab9c214f89790a2afdc94a731f08c35d0fafa77d.png b/documentation/_build/html/_images/math/ab9c214f89790a2afdc94a731f08c35d0fafa77d.png
index c24c7c6e..8d585e6a 100644
Binary files a/documentation/_build/html/_images/math/ab9c214f89790a2afdc94a731f08c35d0fafa77d.png and b/documentation/_build/html/_images/math/ab9c214f89790a2afdc94a731f08c35d0fafa77d.png differ
diff --git a/documentation/_build/html/_images/math/db2555e54bec0d091b2124dccd645c2d7ddaae68.png b/documentation/_build/html/_images/math/db2555e54bec0d091b2124dccd645c2d7ddaae68.png
index 11dfba1e..8f9725e8 100644
Binary files a/documentation/_build/html/_images/math/db2555e54bec0d091b2124dccd645c2d7ddaae68.png and b/documentation/_build/html/_images/math/db2555e54bec0d091b2124dccd645c2d7ddaae68.png differ
diff --git a/documentation/_build/html/_images/math/e6bc812a13677a4608e3f0624c560af92a3d7887.png b/documentation/_build/html/_images/math/e6bc812a13677a4608e3f0624c560af92a3d7887.png
index b6741ccc..3fdb4dfe 100644
Binary files a/documentation/_build/html/_images/math/e6bc812a13677a4608e3f0624c560af92a3d7887.png and b/documentation/_build/html/_images/math/e6bc812a13677a4608e3f0624c560af92a3d7887.png differ
diff --git a/documentation/_build/html/_sources/PythonTutorial/Environment.txt b/documentation/_build/html/_sources/PythonTutorial/Environment.txt
index cf8919ca..e8ce2573 100644
--- a/documentation/_build/html/_sources/PythonTutorial/Environment.txt
+++ b/documentation/_build/html/_sources/PythonTutorial/Environment.txt
@@ -26,7 +26,7 @@ Use it like this (don't forget the ``eval`` **and** the backquotes):
dummy@lepka:~> eval `/etc/coriolis2/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|
+ When used under |RHEL6| or clones, it needs to be run in the |devtoolset|
environement. The script then launch a new shell, which may cause an
infinite loop if it's called again in, say :cb:`~/.bashrc`.
diff --git a/documentation/_build/html/_sources/UsersGuide/Installation.txt b/documentation/_build/html/_sources/UsersGuide/Installation.txt
index a2bed64a..cb264d3c 100644
--- a/documentation/_build/html/_sources/UsersGuide/Installation.txt
+++ b/documentation/_build/html/_sources/UsersGuide/Installation.txt
@@ -34,9 +34,10 @@ Building documentation prerequisites:
* latex2html
* python-docutils (for reStructuredText)
-Optional libraries:
+The following libraries gets directly bundled with |Coriolis|:
* LEF/DEF (from `SI2 `_)
+* FLUTE (from `Chris C. N. Chu `_)
For other distributions, refer to their own packaging system.
@@ -127,10 +128,11 @@ We need to separate to perform a separate installation of the documentation beca
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|: ::
+Under |RHEL6| or clones, you must build using the |devtoolset|, the version is to
+be given as argument: ::
dummy@lepka:src> ./bootstrap/ccb.py --project=coriolis \
- --devtoolset-2 --make="-j4 install"
+ --devtoolset=8 --make="-j4 install"
If you want to uses Qt 5 instead of Qt 4, you may add the ``--qt5`` argument.
diff --git a/documentation/_build/html/_sources/etc/definitions.txt b/documentation/_build/html/_sources/etc/definitions.txt
index 013d3088..7329285c 100644
--- a/documentation/_build/html/_sources/etc/definitions.txt
+++ b/documentation/_build/html/_sources/etc/definitions.txt
@@ -105,7 +105,7 @@
.. |Python| replace:: :sc:`Python`
.. |Linux| replace:: :sc:`Linux`
.. |MacPorts| replace:: :sc:`MacPorts`
-.. |devtoolset2| replace:: :cb:`devtoolset2`
+.. |devtoolset| replace:: :cb:`devtoolset`
.. |boost| replace:: :cb:`boost`
.. |Qt| replace:: :sc:`qt`
.. |tty| replace:: :cb:`tty`
diff --git a/documentation/_build/html/defapi/defapi.html b/documentation/_build/html/defapi/defapi.html
index 21f0218d..c3ca3e03 100644
--- a/documentation/_build/html/defapi/defapi.html
+++ b/documentation/_build/html/defapi/defapi.html
@@ -524,7 +524,7 @@ under the
Generated by Sphinx
- using a RTD theme on Oct 18, 2018.
+ using a RTD theme on Mar 04, 2019.
diff --git a/documentation/_build/html/etc/definitions.html b/documentation/_build/html/etc/definitions.html
index 13b85d95..d3931e18 100644
--- a/documentation/_build/html/etc/definitions.html
+++ b/documentation/_build/html/etc/definitions.html
@@ -507,7 +507,7 @@
Generated by Sphinx
- using a RTD theme on Oct 18, 2018.
+ using a RTD theme on Mar 04, 2019.
diff --git a/documentation/_build/html/genindex.html b/documentation/_build/html/genindex.html
index 6a1b1d5c..ae5a7b30 100644
--- a/documentation/_build/html/genindex.html
+++ b/documentation/_build/html/genindex.html
@@ -514,7 +514,7 @@
Generated by Sphinx
- using a RTD theme on Oct 18, 2018.
+ using a RTD theme on Mar 04, 2019.
diff --git a/documentation/_build/html/index.html b/documentation/_build/html/index.html
index 6e33c254..45dbf04e 100644
--- a/documentation/_build/html/index.html
+++ b/documentation/_build/html/index.html
@@ -498,7 +498,7 @@
Coriolis 2 documentation
- Documentation generated on Oct 18, 2018.
+ Documentation generated on Mar 04, 2019.
Documentation Topics
@@ -596,7 +596,7 @@
Generated by Sphinx
- using a RTD theme on Oct 18, 2018.
+ using a RTD theme on Mar 04, 2019.
diff --git a/documentation/_build/html/lefapi/lefapi.html b/documentation/_build/html/lefapi/lefapi.html
index e8bd82a2..fbe042aa 100644
--- a/documentation/_build/html/lefapi/lefapi.html
+++ b/documentation/_build/html/lefapi/lefapi.html
@@ -555,7 +555,7 @@ and configured when the subsequent
Generated by Sphinx
- using a RTD theme on Oct 18, 2018.
+ using a RTD theme on Mar 04, 2019.
diff --git a/documentation/_build/html/lefdef/lefdef.html b/documentation/_build/html/lefdef/lefdef.html
index b089c7bb..aba01ce3 100644
--- a/documentation/_build/html/lefdef/lefdef.html
+++ b/documentation/_build/html/lefdef/lefdef.html
@@ -521,7 +521,7 @@ under the
Generated by Sphinx
- using a RTD theme on Oct 18, 2018.
+ using a RTD theme on Mar 04, 2019.
diff --git a/documentation/_build/html/search.html b/documentation/_build/html/search.html
index 025ecf05..381f437e 100644
--- a/documentation/_build/html/search.html
+++ b/documentation/_build/html/search.html
@@ -517,7 +517,7 @@
Generated by Sphinx
- using a RTD theme on Oct 18, 2018.
+ using a RTD theme on Mar 04, 2019.
diff --git a/documentation/_build/html/searchindex.js b/documentation/_build/html/searchindex.js
index fd166bf4..e145d7aa 100644
--- a/documentation/_build/html/searchindex.js
+++ b/documentation/_build/html/searchindex.js
@@ -1 +1 @@
-Search.setIndex({envversion:49,filenames:["Analog/Analog","Contents","CrlCore/CrlCore","Hurricane/Hurricane","Katabatic/Katabatic","Kite/Kite","Oroshi/Oroshi","PythonCpp/Configuration","PythonCpp/DBoHierarchy","PythonCpp/DBoStandalone","PythonCpp/DbU","PythonCpp/Introduction","PythonCpp/Name","PythonCpp/NonDBo","PythonCpp/index","PythonTutorial/AdvancedTopics","PythonTutorial/CellNetComponent","PythonTutorial/CgtScript","PythonTutorial/Collections","PythonTutorial/Environment","PythonTutorial/Introduction","PythonTutorial/Netlist","PythonTutorial/RealDesigns","PythonTutorial/ToolEngines","PythonTutorial/definitions","PythonTutorial/index","PythonTutorial/pdfHeader","RDS/RDSpage","RDS/index","Stratus/Developper","Stratus/DpGen","Stratus/Language","Stratus/Patterns","Stratus/index","Unicorn/Unicorn","UsersGuide/Configuration","UsersGuide/Installation","UsersGuide/LicenseCredits","UsersGuide/Releases","UsersGuide/ScriptsPlugins","UsersGuide/ViewerTools","UsersGuide/index","Viewer/Viewer","defapi/defapi","etc/definitions","index","lefapi/lefapi","lefdef/lefdef"],objects:{},objnames:{},objtypes:{},terms:{"005\u00b5m":27,"01\u00b5m":46,"09\u00b5m":27,"0b0001":30,"0b000111":30,"0b0010":31,"0b0110":31,"0b10":31,"0b1001":31,"0b1010":30,"0b1100":30,"0b1110":31,"0b1111":30,"0x0000ffff":30,"0x14":31,"100k":40,"150k":40,"180nm":35,"18\u00b5m":27,"1\u00b5m":27,"2\u00b5m":27,"32b":36,"32x32":40,"45nm":[19,22],"64b":36,"abstract":8,"boolean":[1,9,29],"case":1,"catch":9,"char":9,"class":[1,7],"const":[30,31],"default":[8,19,27,29,30,31,32,35,36,39,40,46],"else":30,"export":[7,8,9,20,36,38,39],"final":[16,27,36,40],"float":[16,32,35],"function":[1,7,8,9,10,11,13],"goto":40,"import":[8,9,11,16,20,21,22,23,30,31,35,37,38,39,40],"int":13,"long":[10,20,40],"new":[8,9,13],"null":[8,9,10,11,13,30],"public":[20,38],"r\u00e9my":37,"return":[8,9,10,11,13,16,17,18,20,21,23,30,31,35,39,40],"short":11,"static":[8,9,10,11,13,20,22,30,36],"supp\u00e9rior":39,"transient":[16,46],"true":[16,17,19,21,23,27,29,30,31,35,39,40],"try":[16,31,35,40],"void":[8,9,13,20],"while":[10,16,18,20,21,40,46],__add__:29,__and__:29,__c:[8,9,11,13],__div__:29,__geslice__:29,__getitem__:29,__init__:29,__invert__:29,__le__:29,__main__:39,__mul__:29,__name__:39,__or__:29,__python_module:11,__python_module__:[8,11,13],__str__:20,__xor__:29,_add:29,_alia:29,_and:29,_ariti:29,_baseobject:8,_bl:39,_br:39,_buff:29,_chip:39,_clock:[35,39],_comp:29,_db:29,_direct:29,_div:29,_ext:29,_h_type:29,_hur_cel:29,_hur_inst:29,_hur_mastercel:29,_hur_net:29,_ind:29,_insref:29,_lib0:29,_map:29,_model:29,_mult:29,_mux:29,_name:[29,32],_nb_alims_vertical:29,_nb_inst:29,_nb_pin:29,_nb_vdd_pin:29,_nb_vss_pin:29,_not:29,_object:[8,9,10,13],_or:29,_param:29,_plac:29,_px:35,_pyobject:8,_real_model:29,_real_net:29,_reg:29,_shift:29,_st_cell:29,_st_ck:29,_st_inst:29,_st_mastercel:29,_st_merg:29,_st_port:29,_st_sig:29,_st_vdd:29,_st_vsss:29,_stim:31,_sym:29,_tab_nets_cat:29,_tab_nets_out:29,_tl:39,_to_cat:29,_to_merg:29,_tr:39,_type:29,_undercel:29,_xor:29,a2_1:[21,23],a2_2:[21,23],a2_x2:[21,23,31],abc:38,abil:31,abl:[11,17,20,22],about:[1,9],abov:[9,16,17,31,35,36,40],absolut:[13,16,32],abtument:31,abut:[16,21,23,31,39,40],abutmentbox:31,accept:[32,40],access:[8,18,21,31,32,36,38,40],access_class:8,access_object:8,accessor:9,accomod:39,accord:[27,35,39,40],accordingli:11,account:40,accross:11,accumul:32,accur:38,accuraci:40,achiev:38,acknowledg:30,across:[27,35,40],act:7,action:40,activ:[17,27,40],actual:[27,30,32,40],adapt:[19,39],add:[1,9,17,21],add_python_modul:[7,11],add_sub:30,addaccu:1,addd:31,added:38,adder:[30,31],adder_8:30,adding:9,addit:[19,30,31,35,40],addition:31,additionn:1,addmode:35,addpat:1,address:30,addtyp:[8,9],adjac:[15,39],adopt:16,adr:30,advis:40,adw:30,affect:1,affect_ani:1,affect_fix:1,affect_int:1,affili:38,after:[9,16,17,21,22,23,29,31,32,36,39,40],afterward:30,again:[8,9,19,22,36],against:[9,11,22,36,40],ago:11,aim:[20,38],alc_env:36,alexandr:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,33,34,35,36,37,38,39,40,41,42,43,44,46,47],algorithm:[18,38,40],alia:[19,29,31,36],alias:40,alim:31,alimconnector:31,aliment:[1,29],alimhorizontalrail:31,alimverticalrail:31,all:[9,11,15,16,18,20,21,23,27,29,31,32,35,36,37,38,39,40],allianc:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27],alliance_top:35,allianceconfig:35,alliancetop:35,alloc:[9,20,40],allow:[9,15,16,18,21,27,30,31,32,35,40],almost:[8,19,35,39,40],alon:16,along:[13,40],alpha:38,alphanumer:31,alreadi:[11,18,25,26,31,35,40],also:[5,16,18,20,21,22,27,31,36,40],altern:[35,38,40],alternat:36,although:[27,38,40],alu1:[27,31],alu2:31,alu3:31,alu4:31,alu5:31,alu6:31,alu:31,alux:27,alwai:[9,11,21,30,31,32,40,46],am2901:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,33,34,35,36,37,38],amd2901:39,amd2901_crl:39,amd2901_crl_chip:39,amd64:36,amend:35,among:16,amount:[30,46],amp:37,ana:5,anabat:[4,23],analysi:40,analyt:[38,40],and2:[30,31],and2_8:30,and3:30,and3_16:30,and4:30,and4_2:30,anded:30,ani:[11,13,16,17,18,19,20,21,22,27,31,32,36,39,40],anneal:[38,39],anonym:18,anoth:[1,11,22,29],another:11,ansi:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,33,34,35,36,37,38,39,40,41,42,43,44,46,47],anti:40,any:40,anymor:27,anyth:[35,39,40],anywher:40,apach:[43,46,47],api:[0,1,2,3,4,5,6,7,8,9,10,11,12,13],appart:40,appear:[9,21,40],append:[18,31,35,39],appertur:40,appli:[11,21,27,30,31,32,35],applic:40,appropri:[9,31],approx:40,architectur:1,archiv:22,area:[21,23,27,35,40],arg0:[9,10,13],arg1:[9,13],arg:[8,9,10,11,13,31],argument:[1,8,9,10,16,17,21,29,30],arith:31,arithmet:[1,29,30],ariti:[29,31,32],army:40,around:[10,23,31,39,40],arrow:40,art:40,articul:[16,21],aside:[35,39],asign:32,asim:[31,36],asimut:31,ask:[21,27],aspect:[11,23,35,40],aspectratio:[23,35,40],assembl:35,assign:40,assignment:40,associ:[7,8,9,11,13,21,27,40],associat:[1,8],assum:[22,25,26,40],assume:21,asymetr:27,attempt:10,attribut:[1,8,13,20],author:31,autocmd:31,automat:[19,23,29,31,32,36,39,40],automaticali:31,autotool:36,auxsc35:40,avail:[0,2,3,4,5,6,11,16,19,31,34,35,36,38,42,43,46,47],avala:[38,40],avoid:[21,27,40,46],avot:32,awar:[21,27,30,36,40],axi:27,back:[31,38],background:40,backquot:19,bad:8,balanc:40,base:[1,4,5],bashrc:[19,36],basi:30,basic:1,basiclay:40,bdo:13,becaus:[8,17,23,27,36,38,40],becom:[8,20,31,39,40],bee:[31,40],been:[9,11,16,17,18,20,21,29,30,31,35,38,39,40],befor:[17,21,29,31,32,36,40,46],before:32,beforehand:40,begin:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,46,47],behav:30,behavior:[9,11,13,29,30,31],behaviour:40,belloeil:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,29,30,31,33,34,35,36,37,38,39,40,41,42,43,44,46,47],belong:[16,31,35,46],below:[9,11,20,21,23,27,29,31,35,36,39,40],benchmark:40,bend:27,best:[13,40],better:21,between:[11,15,20,21,27,30,31,32,35,39,40],bewteen:21,big:[27,31,40],bigger:40,biggest:21,biggestarea:21,bigvia:27,biject:21,bin:[16,21,23,31,36],binari:[31,32,36,40],bind:35,bit:[27,29,30,31,40],black:[19,35],blif:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21],blink:40,blob:38,block:[11,20,30,39],blockag:[27,35],blockage:35,bluntli:13,blur:40,boil:27,bood:31,boost:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,33,34,35,36,37,38,39,40,41,42,43,44,46,47],booth:31,bootstrap:36,borrow:11,botch:1,both:[16,23,27,29,31,35,36,39,40],bother:9,bottom:[27,31,39],bound:[35,40],bourn:19,box:11,brace:20,branch:1,breakpoint:16,bring:11,brows:[35,40],buf:31,buf_x2:39,buff_32:30,buffer:[1,29,30],bufnewfil:31,bufread:31,bug:[19,35,38,40],build:[1,7,9,11,16,21,27,35],buildfulladd:[21,23],buildinvertor:[16,17],bull:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,33,34,35,36,37,38,39,40,41,42,43,44,46,47],bunch:9,bundl:36,buri:15,buse:[29,31],buse_8:30,buss:30,button:40,bzip2:36,c2r:[19,36],c30:30,c31:30,c_temp:31,c_x_n:27,c_x_p:27,ca2:[31,32],cach:39,cad:31,cadenc:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,33,34,35,36,37,38,39,40,41,42,43,44,46,47],calcul:[31,32],call:[8,9,10,11,13,16,17,18,19,20,21,22,23,29,30,31,32,36,39,40,45],callback:45,calu1:31,calu2:31,calu3:31,calu4:31,calu5:31,calu6:31,calu:31,calux:27,camel:9,can:[8,11,15,16,17,18,19,20,21,22,23,27,30,31,32,35,36,38,39,40,46],candid:21,cannot:[11,16,20,21,27,30,40],capabl:[11,35,36,39,40],capac:40,capacitor:30,capit:9,captur:1,care:[11,23,31,39,40],carry_1:[21,23],carry_2:[21,23],cast:[8,9],cat:31,catal:35,catalog:[16,18,21,23,35],catchcor:[19,35,40],categori:40,caus:[19,36],cbug:40,ccb:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,33,34,35,36,37,38,39,40,41,42,43,44,46,47],cdebug:40,ceil:30,cell:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15],cell_1:31,cellnet:18,cellstop:35,cellview:[17,40],center:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,31,33,34,35,36,37,38,39,40,41,42,43,44,46,47],centerend:27,cerr:[8,9],certain:[13,32],cfg:35,cgt:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16],ch_htree_bl_tl:39,cham:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,33,34,35,36,37,38,39,40,41,42,43,44,46,47],chang:[8,13,20,21,30,31,35,38,39,40],chaput:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,33,34,35,36,37,38,39,40,41,42,43,44,46,47],charact:[30,35],check:[22,30,31,40],checkbox:40,checker:27,checkout:36,chip:[1,31],chmod:31,choic:1,choos:[9,31,40],chosen:[29,31],chotin:32,chri:37,christian:37,christoph:37,chu:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,33,34,35,36,37,38,39,40,41,42,43,44,46,47],cif:27,cin:[21,23,31],cinfo:40,circuit:1,circular:31,circumv:40,ck_htree:39,ck_htree_bl:39,ck_htree_bl_bl:39,ckin:[29,31,32],ckok:30,clariti:[8,16],class_nam:31,classic:[11,19,35],clean:35,cleaner:21,cleanli:9,clear:[13,39,40],clearer:31,clement:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,33,34,35,36,37,38,39,40,41,42,43,44,46,47],click:40,clock:[1,29,30,31,35],clocktre:[35,39],clone:[19,36,40],close:[9,16,17,20,21,23,35,39,40],closer:31,clue:11,cluster:40,cmake:[0,1,2,3,4,5,6],cmd0:31,cmd1:31,cmd2:31,cmd:[30,31],cmo:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,33,34,35,36,37,38,39,40,41,42,43,44,46,47],cnchu:37,cobject:10,code:[8,9,11,13,16,19,20,21,35,38,39],coher:[20,40],collect:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17],collector:20,coloquint:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,33,34,35,36,37,38,39,40,41,42,43,44,46,47],color:31,com:[36,43,46,47],combin:[21,36],come:40,command:[1,31,36,39],commit:36,common:[9,11,27,30,31,35,38,39,40],commpos:40,commun:[9,11,13],comp:8,compar:32,comparaison:31,comparison:[1,29],compat:36,compatibilti:38,compil:[11,36,40],complement:[30,32],complet:[7,9,11],completli:[11,16,38,40],complex:[11,27],compliant:36,compnent:40,compon:[1,8,11,15],compos:[21,40],compris:40,comput:[11,16,21,30,31,32,35,39,40],concaten:31,concept:[16,20,21,25,26],conceptor:[29,31],concret:[8,31],conditionn:30,conf:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,33,34,35,36,37,38,39,40,41,42,43,44,46,47],configur:1,confus:21,congest:40,conjunct:40,connect:[16,20],connectmap:31,connector:[1,16,27],connexion:[15,20,21,29,31],consecut:39,consequ:[8,21,27,38,46],consid:[7,21,27],consist:36,const_0x0000ffff:30,constant:[1,27,30],construct:[13,20,21,31],constructor:[9,11,13],constructorerror:[9,11,13],constval0:30,constval1:30,constval2:30,constval3:30,constval:30,cont_body_n:[27,31],cont_body_p:[27,31],cont_dif_n:[16,27,31],cont_dif_p:[16,27,31],cont_poly:[16,27,31],cont_turn1:31,cont_turn2:31,cont_turn3:31,cont_turn4:31,cont_turn5:31,cont_turn6:31,cont_via2:27,cont_via3:27,cont_via4:27,cont_via5:27,cont_via:27,cont_viax:27,contact1:21,contact2:21,contact:[8,11,16,21,27,31,40],contain:[7,11,16,17,18,19,20,22,27,31,32,35,36,38,39,40],contdifn:16,contdifp:16,conterpart:[4,5,27],contest:40,context:39,contpoli:16,contributor:37,control:[1,11,20,21,27,30,31],conveni:9,convent:[11,16],convers:[1,9,16,18],convert:[9,10,13,16,20,27,32],coodin:31,coordin:[16,20,21,27,29,31,40],copi:[13,20,31,36,40],copuupseg:31,copyright:[37,43,46,47],copyupseg:1,copyupsegmentseccopi:31,cordin:31,core:1,corioli:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,31,33,34],coriolis2:[7,16,19,21,23,35,36,38,39],coriolis_install:19,coriolis_top:19,coriolisconfigur:35,coriolisenv:[1,19],coriolisinit:35,corner:[16,21,27,31],correct:[31,40],correctli:[23,31],correspond:[29,31,32,40],corrioli:36,cost:40,cougar:27,could:[18,20,31,35,39,40],count:[11,39,40],coupl:40,cours:20,cout:[18,21,23,31],cover:27,cpp:[7,9,11],craft:39,crash:[36,40],creat:[7,8,9,11,13],createcel:[16,17,21,23],creation:[1,16,20,21,23,29],credit:1,crl:[0,1],crl_cata_lib:31,crlcore:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,33,34,35,36,37,38,39,40,41,42,43,44,46,47],crude:40,csh:36,ctrl:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,33,34,35,36,37,38,39,40,41,42,43,44,46,47],cumbersom:11,current:[16,23,31,32,35,36,39,40],cursor:40,cwd:35,cycl:32,cyclop:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,33,34,35,36,37,38,39,40,41,42,43,44,46,47],cygwin:36,damien:37,dangl:11,darwin:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,33,34,35,36,37,38,39,40,41,42,43,44,46,47],data:[1,30],databas:[9,11,16,18,20,21,29,38,40,46],database:46,datain0:30,datain1:30,datain:30,dataout:30,date:32,dbit:31,dbo:1,dbodeletemethod:[8,9],dbodestroyattribut:[8,9],dbolinkcreatemethod:[8,9,13],dbu:1,debian:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,33,34,35,36,37,38,39,40,41,42,43,44,46,47],debug:[17,36,40],decim:31,declar:[1,9,16],declar_interfac:1,decod:30,decor:40,decreas:40,dedic:[8,20,31],deep:38,deeper:8,deepli:[15,40],def:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,30,31,32,33,34,35,36,37,38,39,40,41,42],defab:1,defaultstyl:[19,35],defaultvalu:35,defin:[7,8,9,11,13,16,27,29,30,31,32,35,38,39,40],define:27,definit:[7,8,9,19],degre:31,delet:[9,11,13,18,20,29,35,40],delta:[27,31],demot:27,denser:40,densiti:[35,40],depend:[7,27,31,36,38,39],deplib:7,depth:40,deriv:1,derivedobject:8,describ:[22,27,31,32,35,39],descript:[1,8],descrob:31,design:1,design_kit:40,desir:31,despit:35,destroi:[8,9,13,18,20],detail:[1,16,19,21,23,35,38],detector:30,deterior:31,determin:9,determinist:40,devel:1,develop:[23,36,40],developp:1,devic:40,devtoolset2:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,33,34,35,36,37,38,39,40,41,42,43,44,46,47],devtoolset:36,dff:39,dff_4:30,dfft_4:30,dialog:40,dict:[18,31],dictionari:[9,18],dictionnari:[9,17,29,31,39],did:[11,22,40],differ:[8,13,18,21,27,29,30,31,35,40],differenti:40,diffus:27,digit:[23,31],digitalinit:23,dimens:[27,31,40],direct:[8,9,11,13,27,29,31,32,35,40],directdeletemethod:13,directdestroymethod:13,directgetlongattribut:[8,10,13],directionn:13,directli:[11,17,20,22,23,32,39,40],directori:[1,16,19,21,22,23,31,35],directsetlongattribut:[10,13],disabl:[20,32,40],disambigu:27,disclaim:1,disconnect:21,discrep:22,diseappear:27,displac:40,displai:[9,21,35,40],display:40,distanc:[22,27,46],distinguish:[27,40],distribut:[36,38],disturb:39,ditch:40,divid:32,divis:31,dksdir:22,dl_export:[8,9],dobreak:[16,17,21,23],doc:[13,16,21,23,31,36],dochip:39,document:[11,14,15,20,21,25,28,31,33,35,36,38,39,40,41],docutil:36,doe:[9,31],doesn:[31,40],dogleg:40,don:[9,19,20,36,39],done:[9,16,31,35,40],dosometh:[20,39],dot:[38,40],dotfil:37,doubl:11,down:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,31,33,34,35,36,37,38,39,40,41,42,43,44,46,47],download:40,doxygen:[0,2,3,4,5,6,34,36,39,42],dozen:40,dp_sxlib:35,dpgen:1,dpgenadsb2f:1,dpgenand2:1,dpgenand3:1,dpgenand4:1,dpgenbuff:1,dpgenbus:1,dpgenconst:1,dpgendff:1,dpgendfft:1,dpgenfifo:1,dpgeninv:1,dpgenmux2:1,dpgennand2:1,dpgennand2mask:1,dpgennand3:1,dpgennand4:1,dpgennbus:1,dpgennmux2:1,dpgennor2:1,dpgennor2mask:1,dpgennor3:1,dpgennor4:1,dpgennul:1,dpgenor2:1,dpgenor3:1,dpgenor4:1,dpgenram:1,dpgenrf1:1,dpgenrf1d:1,dpgenrf1dr0:30,dpgenrf1r0:30,dpgenrom2:1,dpgenrom4:1,dpgensff:1,dpgensfft:1,dpgenshift:1,dpgenshrot:1,dpgenxnor2:1,dpgenxnor2mask:1,dpgenxor2:1,dpi:40,drain:27,draw:[16,27,40],drawn:40,drc:27,drive:[30,39],driven:35,drop:[36,38],druc:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,31,33,34,35,36,37,38,39,40,41,42,43,44,46,47],due:[35,40],dumb:35,dummi:[19,35,36,39],dump:[18,38,40],duplic:31,dupui:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,33,34,35,36,37,38,39,40,41,42,43,44,46,47],dure:[32,40],durole:37,dx1:31,dx2:31,dy1:31,dy2:31,dyld_framework_path:36,dyld_library_path:19,dynam:[11,20,30,36],dynamic_cast:8,each:[9,11,13,21,27,29,30,31,32,35,39,40],eas:[17,35],easi:31,easier:[27,29,31],easiest:36,easili:[20,35,40],east:[31,39],ec322005072076ef53984462fb4a1075c27c7dfd:36,edg:[27,39,40],editor:[1,16,17,21,23,27,29],edu:37,effect:[30,32,40],effort:[23,35,40],egin:32,ego:17,eight:31,either:[9,27,30,31,32,36,39,40],el7_64:36,electr:20,electric:27,element:[16,18,29,40],elif:31,els:[8,9,11,13,31,35],emit:9,empti:[30,40],emul:[9,36],enabl:[30,40],encapsul:[1,8,9],encompass:11,encount:[36,46],end:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,46,47],endif:[8,9,11,13],endl:[8,9,18],endswith:[18,35],enforc:21,eng:37,engin:23,engineloadgrbynet:23,enginenonetlayerassign:23,enough:[21,31,39],enrich:20,ent:8,enter:40,entir:11,entiti:8,entitycast:8,entri:[19,35,39,40],enumer:[31,35],env:31,envelop:31,envenli:40,environ:[1,16],eplac:40,eponym:40,equal:[30,31,40],equival:[20,21,31,40,46],eras:[39,40],error:[1,8,9,11,23,30],esc:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,33,34,35,36,37,38,39,40,41,42,43,44,46,47],escap:40,escassut:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,33,34,35,36,37,38,39,40,41,42,43,44,46,47],especi:16,essai:31,etc:[16,19,31,35,36,39],etesian:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22],etesianengin:23,eval:[19,36],even:[21,27,30,38,39],evenli:40,event:[32,36,40],eventslimit:40,ever:18,everi:[9,29,31,35,40],everybodi:23,everyth:[9,35,40],evolv:36,exacltli:27,exact:[16,36,39],exactli:[17,27,36,39,40],exampl:[1,7,8,9,10],except:[9,16,29,31],excess:40,execut:1,exempl:[29,31,40],exist:[18,19,31,35,40,46],exit:[39,40],expand:27,expansion:31,expect:[10,21,35,39],expens:10,experi:40,explain:21,explan:[16,40],explanat:27,explanatori:[9,20],explicit:[10,16,21],explicitli:20,expor:40,expos:[9,11,18],exposur:11,express:[16,20,22,27,31,35,40,46],ext:27,extand:31,extend:[27,29,31],extens:[1,16,17],extent:[35,39,40],extern:[8,9,11,13,16,20,21,29,31,39],extra:[35,40],extract:[9,32],extractor:27,extreme:35,face:31,facil:1,fact:[8,11],factor:[38,40,46],fail:[8,9],failsaf:40,failur:40,fairli:40,fals:[8,9,19,29,30,31,35,40],familiar:[11,25,26],fanci:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,33,34,35,36,37,38,39,40,41,42,43,44,46,47],far:[11,28],fashion:11,fast:[35,36,40],fc13:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,33,34,35,36,37,38,39,40,41,42,43,44,46,47],fc_64:36,featur:40,fedora:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,33,34,35,36,37,38,39,40,41,42,43,44,46,47],feedthru:40,feel:20,fgr:40,fhs:36,field:[8,9,13,40],fifo:30,fifo_4_16:30,figur:[27,31,40],file:1,file_nam:31,filenam:[31,32,35],fillcel:1,filler:21,filler_1:21,filler_2:21,filter:[1,21],find:[21,31,35,36],fine:40,finger:40,finish:[16,29,31],first:[1,7,9],fit:[16,17,21,23,31,40],five:27,fix:[1,16,27,32],flag:[16,20,21,23,27,30,40],flatten:[15,39,40],flavor:[9,13],flip:30,flop:30,flow:[31,40],flute:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,33,34,35,36,37,38,39,40,41,42,43,44,46,47],fly:21,follow:[7,8,9,11,16,20,27,30,31,32,35,36,39,40],fonction:31,footprint:40,forc:[9,32,39,40],forget:19,forgotten:31,form:[31,35,40],format:[22,31,32,38,40],found:[11,16,21,23,31,35,36],founder:27,foundri:[16,27],four:[9,27,30,39,40],fourth:30,framework:[16,18,21,23,36,38],franck:27,free:[23,40],freebsd:36,freed:20,freedpk:19,freepdk45:22,freepdk:22,freepdk_45:19,from:[8,9,10,11,13,16,18,20],fromlambda:[16,20,21,23],full:30,fulladd:[21,23,31],fulli:[16,23],fuse:[16,20],futur:11,gabriel:37,gap:40,garbag:20,gate:[27,30,40],gaug:[27,35,40],gcell:40,gdb:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,33,34,35,36,37,38,39,40,41,42,43,44,46,47],gdsii:40,gener:[0,1,2,3,4,5,6],generic_method_head:[8,9,13],genlib:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,33,34,35,36,37,38,39,40,41,42,43,44,46,47],geometr:[27,31,39],get:[9,10,11,15],get_cata_lib:29,getcel:[8,9,18,21,23],getcompon:18,getdb:[16,21],getenv:35,getheight:8,getlay:[16,21],getmasternet:21,getnam:18,getnet:[8,18,21,23],getobjectid:[9,13],getplug:[21,23],getrefxy:1,getstr:[20,40],gettechnolog:[16,21],getwidth:8,getx:[8,10,13],gety:[8,13],ghdl:31,gigant:11,git:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,33,34,35,36,37,38,39,40,41,42,43,44,46,47],github:36,give:[7,8,16,27,29,30,31,38,40],given:[8,9,11,16,17,21,27,29,30,31,32,35,36,40],global:[1,9,21,27,35,38],globallengththreshold:40,globalripuplimit:40,gnu:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,33,34,35,36,37,38,39,40,41,42,43,44,46,47],goal:20,goe:11,good:[7,40],gouvin:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,33,34,35,36,37,38,39,40,41,42,43,44,46,47],gpl:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,33,34,35,36,37,38,39,40,41,42,43,44,46,47],graal:27,graphic:[1,19,35,36,38,39],great:39,greater:[31,38],grew:40,grid:[1,16],ground:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,29,30,33,34,35,36,37,38,39,40,41,42,43,44,46,47],group:[20,38],gscl45nm:22,guarded:30,gui:36,guid:1,hack:1,had:27,halfadd:31,hand:27,handl:[16,31],hard:[30,35],has_kei:[16,17,21,23,35,39],hasn:40,have:[8,9,11,13,16,18,20,21,23,27,29,30,31,32,35,36,38,39,40,46],haven:31,hcatch:[8,9,10,11,13],head:1,header:1,hecadecim:31,height:[8,11,27,31,40],help:[17,36],helper:[1,9,19],here:[0,2,3,4,5,6,9,11,21,22,27,32,34,35,36,40,42,43,46,47],herit:29,hesit:39,hexa:31,hexadecim:[31,32],hidden:38,hide:40,hierach:31,hierarchi:1,high:[23,35,40],highest:40,highlight:1,highlit:40,himself:[29,31],histor:27,hmeti:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,33,34,35,36,37,38,39,40,41,42,43,44,46,47],hoc:[38,40],hold:[8,11,16,40],holder:15,hole:27,home:[17,22,31,35,36,37],homedir:35,hook:[1,9],hope:11,horizont:[8,16,20,21,27,31,39,40],how:[1,15,16,18,20,21,27,30],howev:[35,40],hspace:39,html:[31,36],htracksreservedloc:40,htry:[8,9,10,11,13],http:[36,37,43,46,47],hugo:37,hundredth:16,hur_techno_name:31,hurricaneerror:8,hurricaneplug:29,hwidth:39,hypernet:[0,2,3,4,5,6,7,8,9,10,11,12,13,14],i0_20:31,i386:36,iastat:37,ident:[8,31,35,40],identifi:[35,39,40],ifndef:[8,9,13],illegal:31,illustr:[16,21,22,39],imag:40,imcomplet:38,immediatli:40,implant:27,implement:[9,11,20,23,35,38,40,45],implemet:35,impli:[13,20],imposs:31,improv:40,in0:31,in1:[30,31],in2:[30,31],in3:[30,31],in4:30,in_lo:35,in_ph:35,includ:[7,8,9,11,13,20,31,36,38,40],include:36,inclus:40,incompat:31,incompatibilit:36,increas:[27,40],inde:40,indeed:[29,31],indent:20,index:[27,31,45],indic:[29,31],indirect:8,individu:[27,40],infinit:[19,36,40],info:[19,35,40],inform:[11,16,17,27,40,46],inherit:[9,29],init:[9,13],inithurrican:[8,9],initi:[8,9,32,35,40],initialis:[1,9,19,29,31,32],innov:38,inout:[29,31],input:[29,30,31,32,38],insert:[16,35,39],insid:[9,16,17,23,27,40],inspect:40,inspector:1,inst:[29,30,31],inst_adsb2f:30,inst_and2:30,inst_and3:30,inst_and4:30,inst_buff:30,inst_bus:30,inst_const:30,inst_dff:30,inst_dfft:30,inst_fifo:30,inst_inv:30,inst_mux2:30,inst_nand2:30,inst_nand2mask:30,inst_nand3:30,inst_nand4:30,inst_nbus:30,inst_nmux2:30,inst_nor2:30,inst_nor2mask:30,inst_nor3:30,inst_nor4:30,inst_nul:30,inst_or2:30,inst_or3:30,inst_or4:30,inst_ram:30,inst_rf1:30,inst_rf1d:30,inst_rom2:30,inst_rom4:30,inst_sff:30,inst_sfft:30,inst_shift:30,inst_shrot:30,inst_xnor2:30,inst_xnor2mask:30,inst_xor2:30,instal:[7,16,19,21,22,23,35,36,40],install:36,installat:1,instanc:[1,11,16,20],instanci:[1,8,29],instanciat:[1,29],instanti:1,instantiat:[29,31],instead:[8,11,13,19,22,31,36,40],instens:35,insti:30,insto:30,instop:30,instruct:[31,36,40],instshamt:30,insul:9,integ:[16,32,35],integer_word_length:32,integr:[9,39],intend:40,interact:17,interfac:[1,9,11,16,19,20,21,29,30,31,32,35,38],intermedi:1,intern:[29,31,32,39],interpret:[19,39],interrupt:9,intersect:27,intert:30,interv:31,introduc:[16,36,40],introduct:1,inv:31,inv_54:30,inv_x1:18,invalid:[8,9,11,13],inversor:31,invert:[27,30],inverter:30,invertor:[16,17],invok:31,iowa:37,isdir:35,isn:[31,32],isobar:[7,8,9,10,11,13],isobar_py_component_h:8,isobar_py_contact_h:8,isobar_py_entity_h:8,isobar_py_point_h:13,ispd:40,ispycompon:8,ispycontact:8,ispyentiti:8,ispyhorizont:8,ispylibrari:9,ispypoint:13,ispyvert:8,issu:[11,23],istself:7,ital:40,item:40,iter:[18,40],itself:[9,27],iwl:32,jean:37,json:38,just:[10,11,17,18,21,22,27,31,35,36,40],katabat:[0,2,3],katana:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22],katanaengin:23,keep:[13,23],kei:[9,29,31,39,40],kept:27,keyword:17,kgr:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,33,34,35,36,37,38,39,40,41,42,43,44,46,47],kind:[16,18,19],kit:5,kite:[0,1,2,3,4],knife:40,knik:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,33,34,35,36,37,38,39],know:[9,36,39],known:[21,40,46],kwarg:13,lambda:[1,16,22],lanch:19,languag:[1,31,32],larg:40,last:[9,32,35,36,40],lastli:[9,13],latch:30,later:[13,16,21,38,40],latest:[31,36],latex2html:36,latex:36,lauch:39,launch:[17,19,36,39],layer:1,layerassign:23,layout:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15],layoutt:35,lbd:16,lcw:27,ld_library_path:19,lead:40,leaf:[15,39,40],least:[35,39],lef:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21],lefconvertfactor:46,lefdef:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,33,34,35,36,37,38,39,40,41,42,43,44,46,47],lefimport:22,lefimporttmpcel:46,left:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,30,31,33,34,35,36,37,38,39,40,41,42,43,44,46,47],legal:[31,32,38],leght:31,lenght:31,length:[16,27,32],lepka:[19,36,39],less:[11,27,40],let:[13,40],letter:31,level:[8,9,10,11,15,16,17,21,27,35,36,39,40],lex:36,lgpl:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,33,34,35,36,37,38,39,40,41,42,43,44,46,47],lib:[9,22,36,40],liberti:40,libisobar:11,librari:[1,7,8],libxml2:36,licens:1,life:[13,27],like:[8,9,11,17,18,19,20,23,29,30,31,35,36],limit:[20,21,40],line:[1,36,39],linear:40,linebreak:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,33,34,35,36,37,38,39,40,41,42,43,44,46,47],link:1,linker:11,linux:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,33,34,35,36,37,38,39,40,41,42,43,44,46,47],lip6:36,list:[1,7,18,21,29],listdir:35,littl:[17,27,40],live:[11,40],load:[1,16,17],loader:[22,38],loadglobalrout:23,local:[35,36,40],localripuplimit:40,locat:[31,39,40],lofig:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,33,34,35,36,37,38,39,40,41,42,43,44,46,47],log2:30,log:40,logic:[5,16,20,21,22,31,32,38,40],logicin:29,logicinout:29,logicout:29,logicunknown:29,logmod:[19,35,40],longer:[11,40],longglobalripuplimit:40,look:[1,9,13,16,22,35,36],loop:[18,19,30,31,36,40],lot:[21,46],low:40,lower:[16,21,30,31,35,40],lowercas:[9,16],lsb:[29,31],lybrari:9,maco:36,macos:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,33,34,35],macport:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,33,34,35,36,37,38,39,40,41,42,43,44,46,47],macro:[7,8,9,11,13,30,40,46],made:[11,21,23,27,29,30,31,39,40],mai:[11,13,16,17,18,19,20,21,27,31,35,36,39,40],main:[20,36,38,40],mainli:[35,38,40],maintain:40,make:[9,15],makefil:36,manag:[11,16,20,22],mandatori:[9,16,19,29,30,31,35],mani:[11,20,27,31],manipul:10,manual:[1,11],map:[1,18,29,30],marek:37,margin:[23,35],mark:32,mask:30,masson:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,33,34,35,36,37,38,39,40,41,42,43,44,46,47],master:[11,21,23,29,36,40],mastercel:[29,31],masterlibrari:9,masternet:21,match:[18,31,35,40],materi:40,matrix:27,mauka:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,33,34,35,36,37,38,39,40,41,42,43,44,46,47],max:35,maxim:40,maximum:40,maxtracelevel:[35,40],mayb:31,mbk:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,33,34,35,36,37,38,39,40,41,42,43,44,46,47],mbk_:16,mbk_to_rds_bigvia_hole:1,mbk_to_rds_bigvia_metal:1,mbk_to_rds_segment:1,mbk_to_rds_via:1,mbk_wiresetting:1,mean:[11,18,20,22,27,31,35,36,40,46],meaning:[27,30,31],mechan:[9,11,13,15],medskip:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,33,34,35,36,37,38,39,40,41,42,43,44,46,47],member:38,memento:1,memori:[16,18,20,39,40],menu:[17,40],merg:29,messag:[16,17,21,40],metal1:[16,27],metal2:[21,27],metal3:21,metal5:40,metal:[27,40],meth_noargs:[8,9,13],meth_static:[8,9],meth_varargs:[8,9,13],method:[1,9,10,11,13,20,27],method_head:[8,9,13],micromet:[27,46],micron:22,microns:46,middl:31,migrat:38,million:40,miloyip:36,mimic:[9,35],min:35,minim:27,minimum:[39,40],minimumsid:39,minipag:37,minor:[35,40],mintracelevel:[35,40],minut:40,mip:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,33,34,35,36,37,38,39,40,41,42,43,44,46,47],mirror:39,misc:[19,35,40],miscellan:1,miss:40,mistak:[9,16,31],mistral:31,mix:[4,5,11,23,36],mkdir:36,mode:1,model:[1,16,20,21,27],modelnam:[30,31],modif:[16,18,31,39,40],modifi:[13,18,19,31,40],modul:[1,7],modular:11,modules_stratu:31,mofic:17,monolith:11,more:[8,16,18,20,27,31,35,38,40],moreov:11,mosi:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,33,34,35,36,37,38,39,40,41,42,43,44,46,47],most:[31,35,40],mostli:[7,20,40],mous:40,movabl:40,move:40,msb:[29,31],much:[11,29,31,35,40],multipl:[22,27,31,38,40,46],multiplex:30,multiplexor:[1,29],multipli:[27,31],must:[7,8,9,11,16,17,19,20,21,22,27,31,32,35,36,39,40],mutat:9,mux2_8:30,mux:[29,31],mx2:31,my_addaccu_:31,my_and2_4bit:31,my_dpgen_and2:31,my_inv:16,myclass:[29,31],myfunc:20,myinst1:31,myinst2:31,myinst3:31,myinst:31,mylib:35,mymap:29,mynet:31,myparam:29,myref:31,myself:15,na2:31,na3:31,na4:31,name:[1,7,8,9,11],namespac:[1,7,8],nand2:30,nand2_8:30,nand2mask_0x0000ffff:30,nand3:30,nand3_20:30,nand4:30,nand4_9:30,nand:30,narrow:40,navig:18,nbit:[30,31],nbit_cmd:30,nbsp:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,33,34,35,36,37,38,39,40,41,42,43,44,46,47],nbuse29:30,nck:35,ncsu:22,ndif:[16,27,31],nearest:39,need:[7,8,9,11,13,16,19,20,21,23,27,31,35,36,39,40],neg:31,neither:[9,31],nero:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,33,34,35,36,37,38,39,40,41,42,43,44,46,47],net8:31,net:[1,8,11,15],neta:31,netb:31,netc:31,netck:31,netcmd:31,netcout:31,netexternalcompon:[16,21],neti0:31,neti1:31,netin:31,netinput:29,netlist:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20],netnam:31,neton:31,netout:31,netq:31,nets:31,netv:31,netvdd:31,netvss:31,never:18,nevertheless:31,newer:36,newli:[16,31],newnet:31,newpag:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,33,34,35,36,37,38,39,40,41,42,43,44,46,47],next:[31,32,36],nimbu:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,33,34,35,36,37,38,39,40,41,42,43,44,46,47],nmux2_5:30,nmx2:31,no2:31,no3:31,no4:31,noflag:23,noindent:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,33,34,35,36,37,38,39,40,41,42,43,44,46,47],non:[1,9,11],none:[16,17,21,23,29,35,39,40],nor2:30,nor2_8:30,nor2mask_000111:30,nor3:30,nor3_3:30,nor4:30,nor4_15:30,nor:[9,30,31],normal:[23,40],north:[31,39],nosym:[30,31],notat:[29,31,40],note:[1,8,9,27,30,31,36],now:[8,21,38,40],nterfac:32,ntie:[16,27,31],ntran:[16,31],ntrans:[16,27,31],nul:30,nul_4:30,number:[9,11,13,16,27,29,30,31,32,39,40],nutshel:36,nwell:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,31,33,34,35,36,37,38,39,40,41,42,43,44,46,47],nword:[30,31],nxr2:31,nymous_:18,o2_1:[21,23],o2_x2:[21,23],ob_typ:[8,9,13],object:[8,9,10,11,13,16,17,18,20,21,27,31,35,40],observ:32,obsolet:38,obtain:[27,31,40],obviou:[13,40],obvious:[11,36,39],obviousli:[11,21,27,39],occur:[11,16,30,31],occurr:8,ocp:27,octal:32,odd:[27,39],off:[11,27,31],offset:[27,31],offsetx:31,offsety:31,often:[27,40],old:[11,23,38],older:[36,40],ommit:40,onc:[9,11,31],once:[16,39,40],one:[8,21,30,31,39,40],onli:[8,10,11,15,16,17,18,20,21,22,23,27,29,30,31,32,35,36,38,39,40],only:[9,29,30,31,36],open:[16,17,20,21,23,29,31,40],opencham:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,33,34,35,36,37,38,39,40,41,42,43,44,46,47],oper:[1,11,20,21,29,30],operand:30,operat:30,opt:36,optim:[30,36],option:[1,9,17,19,29,30,31,32],optional:[32,36],optionn:[30,31],or2:[30,31],or2_8:30,or3:30,or3_5:30,or4:30,or4_16:30,order:[18,21,29,30,31,35,36,40,45],ordere:39,ordinari:[21,35,39],ored:30,organ:[9,18],orient:27,orientat:21,origin:[11,27,40],osu_soc:22,other:[9,10,11,16,17,20,21,27,31,32,35,36,37,39,40],otherwis:[11,29,30,31,40],ouput:30,our:[9,11,20,35],out:[11,29,30,31],out_lo:35,out_ph:35,outad:36,outil:31,outlin:40,output:[29,30,31,32,38,40],outsid:[7,16,18],over:[10,18,21,23,27],overflow:30,overhang:27,overlap:[27,40],overload:[9,16],overloard:[29,31],overrid:19,overwritten:40,own:[8,31,35,36,40],owner:16,p_a0:39,p_a1:39,p_a2:39,p_a3:39,p_b0:39,p_b1:39,p_b2:39,p_b3:39,p_cin:[31,39],p_ck:39,p_cout:[31,39],p_d0:39,p_d1:39,p_d2:39,p_d3:39,p_f3:39,p_i0:39,p_i1:39,p_i2:39,p_i3:39,p_i4:39,p_i5:39,p_i6:39,p_i7:39,p_i8:39,p_ng:[31,39],p_noe:39,p_np:[31,39],p_ovr:39,p_q0:39,p_q3:39,p_r0:39,p_r3:39,p_vddeck0:[31,39],p_vddeck1:[31,39],p_vddick0:39,p_vsseck0:39,p_vsseck1:[31,39],p_vssick0:[31,39],p_y0:39,p_y1:39,p_y2:39,p_y3:39,p_y:31,p_zero:39,packag:1,pad:[1,16],pad_east:29,pad_north:29,pad_south:29,pad_west:29,padeast:31,padlib:35,padnorth:31,padsouth:31,padwest:31,page:[21,45],pair:[16,31,39],paper:40,para:31,paradigm:35,parallel:36,param:[1,29,30],paramet:[1,9,11,13,21,23],parameterst:[19,23,35],parametertyp:35,paramid:35,paranoid:[19,35],parent:9,pars:[8,31],parser:[27,38],part:[1,8],partial:[8,11,38],particular:[9,17,20],partit:39,paseast:31,pass:[11,21,39],paswest:31,pat:32,patamet:31,path:1,pathnam:31,patli:27,pattern:[1,29],pattern_begin:1,pattern_end:1,patwrit:1,paul:37,pck:39,pck_px:39,pdf:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,33,34,35,36,37,38,39,40,41,42,43,44,46,47],pdif:[16,27,31],peopl:11,per:31,percentag:35,perform:[9,30,31,35,36,39,40],perhap:40,peripheri:31,permit:[30,31],persist:11,phfig:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,33,34,35,36,37,38,39,40,41,42,43,44,46,47],phseg:27,phvia:27,physic:[1,16,20],physical:31,physical_grid:27,pictur:[31,40],piec:31,pin:[20,21,31,46],pitch:[27,31],pixel:40,pixmap:40,place:[1,11,15,16,20],placeandrout:23,placebottom:1,placecentr:1,placecontact:1,placed:21,placeglu:1,placeleft:1,placement:[1,21,23,29,31,35,38],placementstatu:21,placepin:1,placer:1,placeref:1,placerengin:39,placeright:1,placeseg:1,placetop:1,plain:10,plane:39,pleas:[16,31],plot:31,plu:31,plug:[15,16,20],plugin:1,point1:31,point2:31,point:[9,10,11,13,16,20,21,27,31,32,35,39,40],pointer:[8,9,11,13],poli:[16,27,31],polici:35,poly:[16,27,31],polysilicium:27,pop:30,popup:40,port:[29,31,32,36,38],posit:[16,27,31,39,40],possibl:[9,17,20,21,27,31,35,39,40],postfix:39,power:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20],powerr:1,practic:[7,27],pre:40,preced:32,precis:[11,16,31,46],predic:9,prefix:[27,39,40],preliminari:38,prepend:35,prerequisit:36,presenc:8,present:[8,18,20,36,40],press:40,pretti:[22,35],previou:[27,31,35,40],previous:[8,9,23,39],price:40,print:[1,18,20,35],printabl:[14,25,28,33,41],printer:40,prior:[16,22,23,40],problem:36,proce:36,procedur:[31,32,33,40],process:[18,19,21,31,35,38,40],produc:32,profil:36,progess:20,program:[9,11,31],programm:30,progress:17,project:36,propag:[39,40],properti:[9,32],proprieti:32,protocol:18,provid:[1,9,10,11,16,19],proxyerror:10,ptie:[27,31],ptran:[16,31],ptrans:[16,27,31],pub:36,pull:36,pure:[19,20,35,40],purist:27,purpos:[17,31,40],push:30,pust:31,put:[9,11,13,27,31,35,39,40],pvddeck:39,pvddeck_px:39,pvddick:39,pvddick_px:39,pvsseck:39,pvsseck_px:39,pvssick:39,pvssick_px:39,pwell:[27,31],pxlib:35,py_incref:[8,9],py_initmodul:[8,9],py_library_h:9,py_return_none:[8,10],pyany_aslong:[10,13],pyarg_parsetupl:[9,10,11,13],pycel:[8,9],pycell_link:[8,9],pycfunct:[8,9,13],pycompon:[8,11],pycomponent:8,pycomponent_destroi:8,pycomponent_getnet:8,pycomponent_getx:8,pycomponent_gety:8,pycomponent_link:8,pycomponent_linkpytyp:8,pycomponent_method:8,pycomponent_o:[8,11],pycontact:8,pycontact_cr:[8,11],pycontact_destroi:8,pycontact_getheight:8,pycontact_getwidth:8,pycontact_link:[8,11],pycontact_linkpytyp:8,pycontact_method:8,pycontact_o:8,pycpp:7,pydatabas:9,pydatabase_o:9,pydatabse_o:9,pydbu_fromlong:10,pyentiti:8,pyentity:8,pyentity_destroi:8,pyentity_getcel:8,pyentity_link:8,pyentity_linkpytyp:8,pyentity_method:8,pyentity_new:8,pyentity_o:8,pyerr_clear:11,pyerr_setstr:[8,9,10,11,13],pyhorizont:8,pyhorizontal_link:8,pyhorizontal_o:8,pyhurrican:[7,8,9,13],pyhurricane_method:[8,9],pyinclud:7,pyinstanc:11,pyinstance_link:11,pylay:11,pylayer_o:11,pylibrari:[7,9,11],pylibrary:9,pylibrary_cr:9,pylibrary_dealloc:9,pylibrary_destroi:9,pylibrary_getcel:9,pylibrary_link:9,pylibrary_linkpytyp:9,pylibrary_method:9,pylibrary_o:9,pymethoddef:[8,9,13],pymodule_addobject:[8,9],pynet:[8,11],pynet_link:8,pynet_o:11,pyobject:[8,9,10,11,13],pyobject_head:[8,9,13],pyobject_new:13,pypoint:[10,13],pypoint_dealloc:13,pypoint_getx:[10,13],pypoint_gety:13,pypoint_init:13,pypoint_link:13,pypoint_linkpytyp:13,pypoint_method:13,pypoint_new:13,pypoint_o:13,pypoint_setx:[10,13],pypoint_sety:13,pyseg:8,pystring_asstr:9,python27:36,python2:36,python:[0,1,2,3,4,5,6,7],pythoncpp:14,pythonpath:[19,40],pythontutori:25,pytype_ready:[8,9],pytype_ready_sub:8,pytypecompon:[8,11],pytypecontact:8,pytypeent:8,pytypeinheritedobjectdefinit:8,pytypelay:11,pytypelibrari:[7,9],pytypenet:11,pytypeobject:[8,9,13],pytypeobjectdefinit:[9,13],pytypeobjectlinkpytyp:[8,9],pytypeobjectlinkpytypenewinit:13,pytypepoint:13,pytyperootobjectdefinit:8,pyvert:8,pyvertical_link:8,pyvertical_o:8,qt5:36,quadri:39,quadruplet:35,quadtre:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,33,34,35,36,37,38,39,40,41,42,43,44,46,47],qualiti:40,quarter:39,queri:16,quit:[29,40],rail:1,ram:[30,39],ram_32_32:30,ram_clock:39,ramlib:35,rang:[31,32],rapidjson:36,rather:40,ratio:[23,35,40],rcw:27,rds:1,rds_activ:27,rds_alu1:27,rds_alu2:27,rds_alu3:27,rds_alu4:27,rds_alu5:27,rds_alu6:27,rds_cont:27,rds_gate:27,rds_ndif:27,rds_nimp:27,rds_pdif:27,rds_pimp:27,rds_poly:27,rds_via1:27,rds_via2:27,rds_via3:27,rds_via4:27,rds_via5:27,reach:[11,40],reachabl:40,read:[9,30,35,38,46],readabl:40,readi:16,real:[1,9,16,18],realli:40,reason:27,recent:[27,31],recommand:40,recommended:32,record:40,rectang:27,rectangl:27,recurs:1,red:40,redefin:[8,35],redefinit:8,redhat:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,33,34,35,36,37,38,39,40,41,42,43,44,46,47],redirect:40,redraw:40,redund:27,ref:30,refin:9,reflect:40,refnam:31,refresh:[29,31,40],reg:[29,31],regard:[20,31],regexp:35,regist:[1,7,9,29,30],regnumb:30,rel:[16,27,31,32,36],relat:[8,13,21,32,35,40],releas:[1,36,37],relev:[8,9,39],reli:[11,27,36,40],reload:40,remain:[8,9,13,18,40],remark:[8,35,40],rememb:8,remind:15,remov:[18,39,40],ren:30,renam:[39,46],render:40,reopen:17,reorganis:39,repeatedli:40,replac:[20,35,38,40],replic:9,repositori:[36,38],repres:[21,27,31,32,40,46],represent:40,request:[18,30,39],requir:[1,11,29,35],reserv:40,reset:[9,30,40],resizeab:1,resolut:[20,40],respect:[11,35,40],respons:[9,40],rest:[17,23],restart:[39,40],restructuredtext:36,result:[9,11,17,18,20,21,30,35,40],retain:11,retir:39,revers:[8,11],rewrit:[11,38],rewritten:38,rf1_4_16:30,rf1d_4_16:30,rf2lib:35,rflib:35,rhel6:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,33,34,35,36,37,38,39,40,41,42,43,44,46,47],rhel7:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,33,34,35,36,37,38,39,40,41,42,43,44,46,47],right:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,30,31,33,34,35,36,37,38,39,40,41,42,43,44,46,47],ring:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,31,33,34,35,36,37,38,39,40,41,42,43,44,46,47],rip:40,ripup:40,ripupcost:40,rise:[27,31],risk:27,rok:30,rom2_0b1010_0b1100:30,rom4_0b1010_0b1100_0b1111_0b0001:30,rom:30,romlib:35,root:[9,11,16,21,23,35,36],roselyn:32,rot_m:31,rot_p:31,rotat:[21,30,31],rotop:30,rout:[1,20,23,27,29],routabl:40,routag:40,routageck:31,routeck:1,router:[1,16],routingdriven:[35,40],row:21,rowend_x0:21,rp1:21,rp2:21,rpm:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,33,34,35,36,37,38,39,40,41,42,43,44,46,47],rsave:1,rubber:40,rule:[27,39,40],ruler:40,run:[16,17,19,22,23,31,35,36,39,40],runglobalrout:23,runnabl:16,runnegoci:23,runtim:40,s2r:27,safeti:40,sai:[11,19,21,36,39],said:16,sake:[8,16],same:[7,8,11,16,18,21,27,29,31,32,35,40],sarri:30,satur:40,saturateratio:40,saturaterp:40,save:[1,8,9],savecel:[16,21,23],scan:30,scarri:40,scheme:[39,40],scientif:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,33,34,35,36,37,38,39,40,41,42,43,44,46,47],scin:30,scn6m_deep_09:35,scope:20,scout:30,screen:40,script:[1,16],scriptmain:[16,17,21,23,39,40],scrub:9,search:[18,35,45],second:[1,11,16,21,27,30,31],section:[35,36,46],secur:35,see:[9,11,16,17,20,21,27,29,31,32,35,36,39,40],seem:[27,31,36,46],seen:[9,23],sefl:31,segment:[1,16,21],sel0:30,sel1:30,sel:30,select:[1,21,30],self:[8,9,10,13,20,29,30,31,32,35],selr:30,selram:30,selw:30,semant:20,send:27,sensit:31,sentinel:[8,9,13],separ:[9,11,27,29,36,39,40],sequenc:[23,31,40],sequenti:35,serv:[4,5],set:[1,7,9,10],setabutmentbox:[16,17,21],setadd:31,setand:31,setbuff:31,setcel:[16,17,21,23],setcomp:31,setdiv:31,seteditor:39,setextern:[16,21,23],setglob:[16,21,23],setmult:31,setmux:31,setnet:[21,23],setnot:31,setor:31,setplacementstatu:21,setrefin:1,setreg:31,setshift:31,settermin:[16,17],settransform:21,setup:[9,16,19,23,35,36],setx:[10,13],setxor:31,sety:13,seven:40,sever:[11,29,31,40],sff2:31,sff3:31,sff:31,sff_4:30,sfft_4:30,shadow:18,shamt:30,shape:[23,27],share:[1,7,8],she:8,shelf:11,shell:[19,31,36],shellsuccess:39,shift:[29,30,31,40],shifter:[1,29,30],shifter_4:30,ship:38,shortcut:1,should:[11,13,19,31,32,36,40],shouldn:27,show:[11,16,18,27,35,40],shown:[9,27,31,35,39],shrot_4:30,si2:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,33,34,35,36,37,38,39,40,41,42,43,44,46,47],side:[27,31,39,40],sig:29,sign:[30,31,35],signal:[1,4,5,21,29,30],signalin:[30,31,32],signalinout:[30,31,32],signalout:[30,31,32],signalunknown:31,signatur:[8,9,11],silli:27,similar:[8,40],similarli:32,simpl:[1,22,27,35],simplest:[16,35],simpli:[16,18,27,31],simplif:[21,36],simplifi:[19,31,36],simul:[31,32,38,39],sinc:18,singl:40,site:35,size:[27,30,31,32,39,40],skip:18,slanski:31,slice:31,slight:20,sligthli:36,slot:40,slow:40,slsoc6x:36,slsoc6x_64:36,small:[23,25,26,27,31,35,39,40],smallest:[30,46],smallskip:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,33,34,35,36,37,38,39,40,41,42,43,44,46,47],snapshot:1,snx:22,soc:[35,36],socket:40,softwar:1,sole:17,solut:40,solv:40,some:[1,11,16,18,20,27,29],someth:[16,20],sometim:21,somewhat:21,soon:39,sophi:[29,30,31,37],sourc:[16,27,31,36,38,40],sout:[21,23,31],sout_1:[21,23],south:[31,39],space:[23,27,31,35,39,40],spacemargin:[23,35,40],span:13,spec:36,special:[9,19,20],specif:[9,20,35,39,40],specifi:[30,31,40],speed:40,speedup:38,spl1:31,split:[11,39,40],spread:[23,40],squar:[23,27],src:36,sroka:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,33,34,35,36,37,38,39,40,41,42,43,44,46,47],st_config:31,stabl:36,stack:9,stage:1,stai:27,stamp:32,stand:40,standalon:1,standard:[9,11,13],standard_instances_list:29,standart:39,standpoint:27,start:[20,27,31,40],starter:15,state:[16,18,20,21,23,37,40],statement:46,static_cast:[8,10],statu:21,stechno:39,step:[8,9,27,31,35,36,39,40,46],still:[8,13,28,36,38,40],stimuli:1,stimulu:32,stl:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,33,34,35,36,37,38,39,40,41,42,43,44,46,47],stop:[16,17,21,23,39,40],storag:46,store:[9,10,16,20,30,40],straightforward:22,straigthforward:21,strap:40,strapripuplimit:40,strategi:39,stratu:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28],stratus1:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,33,34,35,36,37,38,39,40,41,42,43,44,46,47],stratus2:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,33,34,35,36,37,38,39,40,41,42,43,44,46,47],stratus:31,stratus_mapping_name:31,stream:40,strict:[21,27],string:[9,16,20,30,31,32,35],stroke:40,strongli:40,strongly:32,struct:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,33,34,35,36,37,38,39,40,41,42,43,44,46,47],structur:1,stuck:[27,30],stuff:29,style:[9,40],sub:[19,31,32,39],subject:40,subsequ:46,substract:[30,31],substractor:30,subtli:18,success:39,successful:40,successfulli:[36,40],suffer:40,suffic:[21,40],suffix:39,suit:40,summar:20,summari:39,superpos:40,supli:30,suppl:39,suppli:[9,16],support:[7,9,11,13,20,23,32,36,38,40],suppress:40,sure:39,svn:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,33,34,35,36,37,38,39,40,41,42,43,44,46,47],swig:11,swiss:40,sxlib:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,31,33,34,35,36,37,38,39,40,41,42,43,44,46,47],sy_rm:31,sy_rp:31,sym:31,sym_x:31,sym_y:31,symbol:[1,9,16,19,22],symetr:31,symetri:[29,31],symmetri:21,symxy:31,sync:40,synch:40,synonym:23,synopsi:1,syntact:35,syntax:[1,9,20],synthesi:[1,22],synthet:[1,22,38,39],system:[21,31,35,36],system_library:35,tab:[1,21,29,31,35],table:27,tailor:9,take:[9,16,17,23,31,32,40],taken:[11,31,32],talu1:31,talu2:31,talu3:31,talu4:31,talu5:31,talu6:31,talux:27,target:[16,27],task:[8,19,36],taxonomi:35,team:36,technic:1,technolog:[1,16,19,21,22,31],tediou:[19,21,36],tee:40,tell:[9,16,19,27,29,30,35,36,39],temp:31,temp_ext:31,tempext:31,templat:11,temporari:[40,46],ten:11,term:[31,37],termin:1,terminolog:16,test:[1,29],testbench:31,text:[31,39,40],textwidth:37,than:[11,27,31,38,40],thank:[11,29,31,39,40],thei:[9,11,16,18,19,20,27,29,31,35,38,39,40],them:[9,11,20,23,27,36,39,40],therefor:[21,30],thesi:40,thi:[8,9,11,13,14,15,16,18,19,20,21,23,25,26,27,28,29,30,31,32,33,35,36,38,39,40,41,46],thing:32,third:[21,27,30,36],thispagestyl:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,33,34,35,36,37,38,39,40,41,42,43,44,46,47],those:[8,9,18,19,21,27,29,30,31,35,36,39,40],though:11,three:[7,9,21,27,30,40],through:[9,11,15,16],througout:27,thu:[9,20,35,40],tie:27,tie_x0:21,time:[8,11,31,32,40],tmp:20,todai:16,todbu:[16,17,21,23],togeth:[30,38],toggl:40,tolambda:16,too:[11,23,27,31,40],tool:[1,11,17,19,20],toolchain:40,toolengin:23,top:[31,36,39,40],topolog:40,toproutinglay:40,total:40,toward:[11,19,31],tp_compar:9,tp_dealloc:9,tp_hash:9,tp_init:13,tp_method:9,tp_new:13,tp_repr:9,tp_str:9,trace:[9,40],track:40,track_spacing_alu1:27,track_spacing_alu2:27,track_spacing_alu3:27,track_spacing_alu4:27,track_spacing_alu5:27,track_spacing_alu6:27,track_spacing_alu7:27,track_spacing_alu8:27,track_width_alu1:27,track_width_alu2:27,track_width_alu3:27,track_width_alu4:27,track_width_alu5:27,track_width_alu6:27,track_width_alu7:27,track_width_alu8:27,transform:[9,20],transistor:27,transit:32,translat:[21,27],transmiss:11,transpar:27,tree:[1,8,11,31],tricki:11,trigger:[35,40],tristat:[29,30,31,32],tristate:29,trough:39,trought:35,truli:35,trunk:35,tty:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,33,34,35,36,37,38,39,40,41,42,43,44,46,47],tupl:35,turn:[16,21,40],tutori:1,tweak:40,twenti:31,twentu:31,twice:[11,18,31],two:[8,11,15,16,17,19,20,21,23,27,29,30,31,32,35,36,38,39,40],type:[1,7,8],typebool:[19,23,35,40],typedef:[8,9,10,13],typedoubl:35,typeenumer:[23,35],typeint:[35,39,40],typeopt:35,typepercentag:[23,35,40],typerul:35,typestr:[35,39,40],typetab:35,typetitl:35,typic:[9,35,39],ubuntu:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,33,34,35,36,37,38,39,40,41,42,43,44,46,47],uint64_t:10,unabl:36,unbound:10,uncheck:21,undef:[8,31],undefined:31,under:[1,9,11,16,17,19,21,22,23,27,35],underli:11,underscor:31,understand:[11,36,45],uneed:21,unexpectedli:18,unicorn:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,33],unifi:40,uniform:[23,35],uniformdens:[23,35,40],uniquif:40,unit:[10,11],units:46,univers:37,unknown:29,unlik:36,unlike:[15,16,38],unlink:35,unmov:40,unplaced:29,unpredict:18,unrout:40,unselect:40,unsign:30,unsupport:40,until:[21,23,40],unzoom:40,updat:9,updatesess:[16,17,20,21,23],upmc:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,33,34,35,36,37,38,39,40,41,42,43,44,46,47],upon:[11,31,33],upper:[16,27,30,31,40],uppercas:16,usabl:[13,16,27],usage:[27,40],use:[19,31,32,36],used:[30,40],useful:[1,29],user:1,usersguid:41,using:16,usr:[16,21,23,31],usual:[8,9,16,20],utf:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,33,34,35,36,37,38,39,40,41,42,43,44,46,47],val0:30,val1:30,val2:30,val3:30,valid:[9,11,30,39],valu:[1,8,9,13,19],variabl:[9,16,19,27,31,35],variant:30,variou:[9,11,16],vbe:[29,40],vdd:[16,21,23,29,30,31,32,35],vdde:39,vddi:39,vddin:[29,30,31,32],vector:[18,31,32],verbos:40,verboselevel1:[19,35,40],verboselevel2:[19,35,40],veri:[23,35,39,40],version:[7,14,25,28,33,36,40,41,43,46,47],vertic:[8,16,21,27,31,39,40],vertiv:31,vhdl:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,31,33,34,35,36,37,38,39,40,41,42,43,44,46,47],via12:[21,31],via1:31,via23:[21,31],via24:31,via25:31,via26:31,via2:31,via34:31,via35:31,via36:31,via3:31,via45:31,via46:31,via4:31,via56:31,via5:31,via:27,view:[9,16,18,20],viewer:[0,1,16,17,21,35,38,39],vim:31,vimrc:31,violet:40,virtual:[1,15],visibl:[16,40],visual:[27,40],visualis:16,vlsi:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,31,33,34,35,36,37,38,39,40,41,42,43,44,46,47],vlsisapd:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,33,34,35,36,37,38,39,40,41,42,43,44,46,47],vspace:39,vss:[16,21,23,29,30,31,32,35],vsse:39,vssi:39,vssin:[29,30,31,32],vst:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,31,33,34,35,36,37,38,39,40,41,42,43,44,46,47],vtracksreservedloc:40,vwidth:39,w7_64:36,w8_64:36,wai:[9,10,11,16,20,23,27,31,36,39,40],walk:40,walkthrough:18,wallac:31,want:[8,9,11,16,17,18,19,21,29,31,35,36,40],warn:11,weak:40,weakli:16,weari:18,weekli:21,well:[15,16,18,21,27,29,31,39,40],wen:30,were:40,west:[31,39],wether:31,what:[9,11,17,21,27,31,40],whatev:[35,36,40],when:[10,11,19,27,29,30,31,35,36,39,40,46],where:[7,21,22,32,35,40],whether:[8,18,39,40],which:[7,8,9,13,16,17,19,20,21,27,29,31,32,35,36,37,38,39,40,46],white:40,whitespac:40,whithout:[35,39],whitout:40,whole:[8,27,30,38,39,40,46],whose:[20,35],why:[9,11],wich:31,wide:35,wider:40,width:[8,11,16,27,30,31,40],width_vdd:27,width_vss:27,wil:18,window:[35,36,40],wirelength:40,witch:17,within:[31,40],without:[16,17,27,29,30,31,40],wok:30,won:11,word:[30,31,32],word_length:32,work:[9,16,17,20],work_dir:16,work_lib:18,workhors:15,working_library:35,worklib:35,world:16,wors:40,would:[10,11,18,31,35],wrap:[7,9,11],wrapper:[9,11,23,35],write:[11,15,18,30,31,32,35,39,40],written:[9,11,12,13,16,18,20,35],wrong:31,www:[36,43,46,47],wysiwyg:40,x_grid:27,xml:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,31,33,34,35,36,37,38,39,40,41,42,43,44,46,47],xnor2:30,xnor2_8:30,xnor2mask_0b000111:30,xnor:30,xor2:[30,31],xor2_8:30,xor:30,xored:30,xoring:30,xr2:31,xr2_1:[21,23],xr2_2:[21,23],xr2_x1:[21,23],xr2_x2:[21,23],xxxx:36,y_grid:27,y_slice:27,yacc:36,year:[11,40],yet:[8,31,36,40],yield:31,yifei:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,33,34,35,36,37,38,39,40,41,42,43,44,46,47],yosi:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21],you:[11,16,17,18,19,20,21,22,23,25,26,27,30,31,32,35,36,39,40],your:[1,11,16,17,19,22],zero:[11,27,30,31],zoom:40},titles:["Hurricane/Analog Reference","Comprenhensive Table of Contents","CRL Core Reference","Hurricane Reference","Katabatic Reference","Kite Reference","Oroshi Reference","2. Basic File Structure and CMake configuration","4. Case 2 - Hierarchy of DBo Derived Classes","3. Case 1 - DBo Derived, Standalone","6. Encapsulating DbU","1. Introduction","7. No C++ Hurricane::Name encapsulation","5. Case 3 - Non-DBo Standalone Classe","Hurricane Python/C++ API Tutorial","9. Advanced Topics","3. Making a Standard Cell – Layout","5. Make a script runnable through cgt","4. Manipulating Cells, Nets and Components","2. Setting up the Environment","1. Introduction","6. Making a hierarchical Cell – Netlist","7. Working in real mode","8. Tool Engines (CRL Core)","<no title>","Hurricane+Python Tutorial","Hurricane+Python Tutorial","Symbolic Layout","RDS – Symbolic to Real Conversion in Alliance","Stratus Developper’s Guide","DpGen generators manual","Stratus User’s Guide","Patterns module User’s Guide","Stratus : Netlist Capture Language","Unicorn Reference","Coriolis Configuration & Initialisation","Installation","Credits & License","Release Notes","Python Interface for Hurricane / Coriolis","CGT - The Graphical Interface","Coriolis User’s Guide","Viewer Reference","DEF API Reference","<no title>","Welcome to Coriolis’s documentation!","LEF API Reference","LEF/DEF Language Reference"],titleterms:{"boolean":31,"case":[8,9,13,21],"class":[8,9,13,29],"function":[15,31],"new":16,about:[11,18],abutment:16,add:31,addaccu:31,adding:16,additionn:36,addpat:32,advanc:15,affect:31,affect_ani:32,affect_fix:32,affect_int:32,aliment:31,allianc:[28,35,36,40],allianceframework:[16,18],am2901:39,analog:0,anoth:31,api:[14,43,46],architectur:35,argument:31,arithmet:31,associat:9,attribut:29,base:[8,40],basic:7,blif:22,botch:11,box:16,branch:36,breakpoint:17,buffer:31,build:36,call:46,callback:46,captur:[33,40],cell:[16,18,21,31],cgt:[17,40],chip:39,choic:11,circuit:31,clock:39,cmake:7,collect:18,command:40,comparison:31,complet:[16,21,23],compon:[16,18,27],comprenhens:1,configur:[7,19,31,35,40],connect:21,connector:31,constant:31,constructor:20,content:[1,26],control:40,convers:28,copyupseg:31,core:[2,16,23],corioli:[35,36,39,41,45],coriolisenv:36,creat:[16,21],creation:31,credit:37,crl:[2,16,23],data:[31,40],dbo:[8,9,13],dbu:[10,16],declar:32,declar_interfac:32,def:[43,47],defab:31,deriv:[8,9],descript:[29,31,32],design:[11,40],detail:40,devel:36,developp:29,directori:36,disclaim:11,disk:16,document:45,dpgen:[30,31],dpgenadsb2f:30,dpgenand2:30,dpgenand3:30,dpgenand4:30,dpgenbuff:30,dpgenbus:30,dpgenconst:30,dpgendff:30,dpgendfft:30,dpgenfifo:30,dpgeninv:30,dpgenmux2:30,dpgennand2:30,dpgennand2mask:30,dpgennand3:30,dpgennand4:30,dpgennbus:30,dpgennmux2:30,dpgennor2:30,dpgennor2mask:30,dpgennor3:30,dpgennor4:30,dpgennul:30,dpgenor2:30,dpgenor3:30,dpgenor4:30,dpgenram:30,dpgenrf1:30,dpgenrf1d:30,dpgenrom2:30,dpgenrom4:30,dpgensff:30,dpgensfft:30,dpgenshift:30,dpgenshrot:30,dpgenxnor2:30,dpgenxnor2mask:30,dpgenxor2:30,editor:31,encapsul:[10,12],engine:23,environ:[19,36],error:31,etesian:[23,40],exampl:[16,21,23,31,32,39],execut:[31,40],extens:31,facil:31,file:[7,8,9,13,16,19,21,22,27,31,35],fillcel:31,filter:40,first:[11,35],fix:36,from:21,gener:[20,30,31,35],get:16,getrefxy:31,global:40,graphic:40,grid:27,guid:[29,31,32,41],hack:35,head:9,header:[8,9,13],helper:35,hierarch:[15,21],hierarchi:8,highlight:31,hook:36,how:31,hurrican:[0,3,12,14,16,18,25,26,39,40],hypernet:15,implement:46,indice:45,initialis:35,inspector:40,installat:36,instanc:[21,29,31],instanci:31,instanciat:31,instanti:31,interfac:[39,40],intermedi:8,introduct:[11,20,31],katabat:4,katana:23,kind:20,kite:[5,40],knik:40,lambda:27,languag:[33,47],layer:[16,40],layout:[16,27,31],lef:[22,46,47],librari:[9,31],licens:37,line:40,link:[9,31],list:31,load:[18,22,35,40],look:40,macos:36,make:[16,17,21],manipul:18,manual:30,map:31,mbk_to_rds_bigvia_hole:27,mbk_to_rds_bigvia_metal:27,mbk_to_rds_segment:27,mbk_to_rds_via:27,mbk_wiresetting:27,measur:16,mechan:16,memento:40,method:[29,31,32],miscella:15,miscellan:40,mode:[22,40],model:29,modul:[8,9,31,32],multiplexor:31,name:[12,31],namespac:9,net:[16,18,21,29,31],netlist:[21,31,33,40],non:13,note:[38,46],occurrenc:15,oper:31,option:40,order:46,oroshi:6,packag:[31,36],pad:31,param:31,paramet:[29,31,32,40],part:[9,32],path:[19,31],pattern:[31,32],pattern_begin:32,pattern_end:32,patwrit:32,physic:[21,27],place:[21,31],placebottom:31,placecentr:31,placecontact:31,placeglu:31,placeleft:31,placement:39,placepin:31,placer:[23,40],placeref:31,placeright:31,placeseg:31,placetop:31,plug:21,plugin:39,power:21,powerr:31,print:40,provid:31,python:[8,9,14,25,26,39,40],rail:31,rds:[27,28],real:[22,28],recurs:39,refer:[0,2,3,4,5,6,34,42,43,46,47],regist:31,regular:21,releas:38,requir:36,resizeab:31,restrict:18,rout:31,routeck:31,router:[23,40],routingpad:[15,21],rsave:39,runnabl:17,save:[16,39],script:[17,40],second:35,segment:27,select:[35,40],session:16,set:[16,19,36,40],setrefin:31,share:9,shifter:31,shortcut:40,signal:31,simpl:39,snapshot:40,softwar:35,some:31,special:21,stage:35,standalon:[9,13],standard:16,stimuli:31,stratu:[29,31,33,40],structur:7,suppli:21,symbol:[27,28],synopsi:[29,31],syntax:[31,32],synthesi:40,synthet:40,tab:40,tabl:[1,27,45],technic:11,techno:19,technolog:35,termin:8,terminolog:20,test:31,through:17,tool:[23,35,40],topic:15,tran:15,transform:21,tree:[36,39],tutori:[14,25,26],type:9,under:[36,40],understand:46,unicorn:34,unit:[16,46],useful:31,user:[19,31,32,41],using:17,valu:[27,31],variou:20,view:21,viewer:[40,42],virtual:31,welcom:45,wire:21,work:22,yosi:[22,40],your:31}})
\ No newline at end of file
+Search.setIndex({envversion:49,filenames:["Analog/Analog","Contents","CrlCore/CrlCore","Hurricane/Hurricane","Katabatic/Katabatic","Kite/Kite","Oroshi/Oroshi","PythonCpp/Configuration","PythonCpp/DBoHierarchy","PythonCpp/DBoStandalone","PythonCpp/DbU","PythonCpp/Introduction","PythonCpp/Name","PythonCpp/NonDBo","PythonCpp/index","PythonTutorial/AdvancedTopics","PythonTutorial/CellNetComponent","PythonTutorial/CgtScript","PythonTutorial/Collections","PythonTutorial/Environment","PythonTutorial/Introduction","PythonTutorial/Netlist","PythonTutorial/RealDesigns","PythonTutorial/ToolEngines","PythonTutorial/definitions","PythonTutorial/index","PythonTutorial/pdfHeader","RDS/RDSpage","RDS/index","Stratus/Developper","Stratus/DpGen","Stratus/Language","Stratus/Patterns","Stratus/index","Unicorn/Unicorn","UsersGuide/Configuration","UsersGuide/Installation","UsersGuide/LicenseCredits","UsersGuide/Releases","UsersGuide/ScriptsPlugins","UsersGuide/ViewerTools","UsersGuide/index","Viewer/Viewer","defapi/defapi","etc/definitions","index","lefapi/lefapi","lefdef/lefdef"],objects:{},objnames:{},objtypes:{},terms:{"005\u00b5m":27,"01\u00b5m":46,"09\u00b5m":27,"0b0001":30,"0b000111":30,"0b0010":31,"0b0110":31,"0b10":31,"0b1001":31,"0b1010":30,"0b1100":30,"0b1110":31,"0b1111":30,"0x0000ffff":30,"0x14":31,"100k":40,"150k":40,"180nm":35,"18\u00b5m":27,"1\u00b5m":27,"2\u00b5m":27,"32b":36,"32x32":40,"45nm":[19,22],"64b":36,"abstract":8,"boolean":[1,9,29],"case":1,"catch":9,"char":9,"class":[1,7],"const":[30,31],"default":[8,19,27,29,30,31,32,35,36,39,40,46],"else":30,"export":[7,8,9,20,36,38,39],"final":[16,27,36,40],"float":[16,32,35],"function":[1,7,8,9,10,11,13],"goto":40,"import":[8,9,11,16,20,21,22,23,30,31,35,37,38,39,40],"int":13,"long":[10,20,40],"new":[8,9,13],"null":[8,9,10,11,13,30],"public":[20,38],"r\u00e9my":37,"return":[8,9,10,11,13,16,17,18,20,21,23,30,31,35,39,40],"short":11,"static":[8,9,10,11,13,20,22,30,36],"supp\u00e9rior":39,"transient":[16,46],"true":[16,17,19,21,23,27,29,30,31,35,39,40],"try":[16,31,35,40],"void":[8,9,13,20],"while":[10,16,18,20,21,40,46],__add__:29,__and__:29,__c:[8,9,11,13],__div__:29,__geslice__:29,__getitem__:29,__init__:29,__invert__:29,__le__:29,__main__:39,__mul__:29,__name__:39,__or__:29,__python_module:11,__python_module__:[8,11,13],__str__:20,__xor__:29,_add:29,_alia:29,_and:29,_ariti:29,_baseobject:8,_bl:39,_br:39,_buff:29,_chip:39,_clock:[35,39],_comp:29,_db:29,_direct:29,_div:29,_ext:29,_h_type:29,_hur_cel:29,_hur_inst:29,_hur_mastercel:29,_hur_net:29,_ind:29,_insref:29,_lib0:29,_map:29,_model:29,_mult:29,_mux:29,_name:[29,32],_nb_alims_vertical:29,_nb_inst:29,_nb_pin:29,_nb_vdd_pin:29,_nb_vss_pin:29,_not:29,_object:[8,9,10,13],_or:29,_param:29,_plac:29,_px:35,_pyobject:8,_real_model:29,_real_net:29,_reg:29,_shift:29,_st_cell:29,_st_ck:29,_st_inst:29,_st_mastercel:29,_st_merg:29,_st_port:29,_st_sig:29,_st_vdd:29,_st_vsss:29,_stim:31,_sym:29,_tab_nets_cat:29,_tab_nets_out:29,_tl:39,_to_cat:29,_to_merg:29,_tr:39,_type:29,_undercel:29,_xor:29,a2_1:[21,23],a2_2:[21,23],a2_x2:[21,23,31],abc:38,abil:31,abl:[11,17,20,22],about:[1,9],abov:[9,16,17,31,35,36,40],absolut:[13,16,32],abtument:31,abut:[16,21,23,31,39,40],abutmentbox:31,accept:[32,40],access:[8,18,21,31,32,36,38,40],access_class:8,access_object:8,accessor:9,accomod:39,accord:[27,35,39,40],accordingli:11,account:40,accross:11,accumul:32,accur:38,accuraci:40,achiev:38,acknowledg:30,across:[27,35,40],act:7,action:40,activ:[17,27,40],actual:[27,30,32,40],adapt:[19,39],add:[1,9,17,21],add_python_modul:[7,11],add_sub:30,addaccu:1,addd:31,added:38,adder:[30,31],adder_8:30,adding:9,addit:[19,30,31,35,40],addition:31,additionn:1,addmode:35,addpat:1,address:30,addtyp:[8,9],adjac:[15,39],adopt:16,adr:30,advis:40,adw:30,affect:1,affect_ani:1,affect_fix:1,affect_int:1,affili:38,after:[9,16,17,21,22,23,29,31,32,36,39,40],afterward:30,again:[8,9,19,22,36],against:[9,11,22,36,40],ago:11,aim:[20,38],alc_env:36,alexandr:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,33,34,35,36,37,38,39,40,41,42,43,44,46,47],algorithm:[18,38,40],alia:[19,29,31,36],alias:40,alim:31,alimconnector:31,aliment:[1,29],alimhorizontalrail:31,alimverticalrail:31,all:[9,11,15,16,18,20,21,23,27,29,31,32,35,36,37,38,39,40],allianc:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27],alliance_top:35,allianceconfig:35,alliancetop:35,alloc:[9,20,40],allow:[9,15,16,18,21,27,30,31,32,35,40],almost:[8,19,35,39,40],alon:16,along:[13,40],alpha:38,alphanumer:31,alreadi:[11,18,25,26,31,35,40],also:[5,16,18,20,21,22,27,31,36,40],altern:[35,38,40],alternat:36,although:[27,38,40],alu1:[27,31],alu2:31,alu3:31,alu4:31,alu5:31,alu6:31,alu:31,alux:27,alwai:[9,11,21,30,31,32,40,46],am2901:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,33,34,35,36,37,38],amd2901:39,amd2901_crl:39,amd2901_crl_chip:39,amd64:36,amend:35,among:16,amount:[30,46],amp:37,ana:5,anabat:[4,23],analysi:40,analyt:[38,40],and2:[30,31],and2_8:30,and3:30,and3_16:30,and4:30,and4_2:30,anded:30,ani:[11,13,16,17,18,19,20,21,22,27,31,32,36,39,40],anneal:[38,39],anonym:18,anoth:[1,11,22,29],another:11,ansi:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,33,34,35,36,37,38,39,40,41,42,43,44,46,47],anti:40,any:40,anymor:27,anyth:[35,39,40],anywher:40,apach:[43,46,47],api:[0,1,2,3,4,5,6,7,8,9,10,11,12,13],appart:40,appear:[9,21,40],append:[18,31,35,39],appertur:40,appli:[11,21,27,30,31,32,35],applic:40,appropri:[9,31],approx:40,architectur:1,archiv:22,area:[21,23,27,35,40],arg0:[9,10,13],arg1:[9,13],arg:[8,9,10,11,13,31],argument:[1,8,9,10,16,17,21,29,30],arith:31,arithmet:[1,29,30],ariti:[29,31,32],army:40,around:[10,23,31,39,40],arrow:40,art:40,articul:[16,21],aside:[35,39],asign:32,asim:[31,36],asimut:31,ask:[21,27],aspect:[11,23,35,40],aspectratio:[23,35,40],assembl:35,assign:40,assignment:40,associ:[7,8,9,11,13,21,27,40],associat:[1,8],assum:[22,25,26,40],assume:21,asymetr:27,attempt:10,attribut:[1,8,13,20],author:31,autocmd:31,automat:[19,23,29,31,32,36,39,40],automaticali:31,autotool:36,auxsc35:40,avail:[0,2,3,4,5,6,11,16,19,31,34,35,36,38,42,43,46,47],avala:[38,40],avoid:[21,27,40,46],avot:32,awar:[21,27,30,36,40],axi:27,back:[31,38],background:40,backquot:19,bad:8,balanc:40,base:[1,4,5],bashrc:[19,36],basi:30,basic:1,basiclay:40,bdo:13,becaus:[8,17,23,27,36,38,40],becom:[8,20,31,39,40],bee:[31,40],been:[9,11,16,17,18,20,21,29,30,31,35,38,39,40],befor:[17,21,29,31,32,36,40,46],before:32,beforehand:40,begin:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,46,47],behav:30,behavior:[9,11,13,29,30,31],behaviour:40,belloeil:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,29,30,31,33,34,35,36,37,38,39,40,41,42,43,44,46,47],belong:[16,31,35,46],below:[9,11,20,21,23,27,29,31,35,36,39,40],benchmark:40,bend:27,best:[13,40],better:21,between:[11,15,20,21,27,30,31,32,35,39,40],bewteen:21,big:[27,31,40],bigger:40,biggest:21,biggestarea:21,bigvia:27,biject:21,bin:[16,21,23,31,36],binari:[31,32,36,40],bind:35,bit:[27,29,30,31,40],black:[19,35],blif:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21],blink:40,blob:38,block:[11,20,30,39],blockag:[27,35],blockage:35,bluntli:13,blur:40,boil:27,bood:31,boost:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,33,34,35,36,37,38,39,40,41,42,43,44,46,47],booth:31,bootstrap:36,borrow:11,botch:1,both:[16,23,27,29,31,35,36,39,40],bother:9,bottom:[27,31,39],bound:[35,40],bourn:19,box:11,brace:20,branch:1,breakpoint:16,bring:11,brows:[35,40],buf:31,buf_x2:39,buff_32:30,buffer:[1,29,30],bufnewfil:31,bufread:31,bug:[19,35,38,40],build:[1,7,9,11,16,21,27,35],buildfulladd:[21,23],buildinvertor:[16,17],bull:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,33,34,35,36,37,38,39,40,41,42,43,44,46,47],bunch:9,bundl:36,buri:15,buse:[29,31],buse_8:30,buss:30,button:40,bzip2:36,c2r:[19,36],c30:30,c31:30,c_temp:31,c_x_n:27,c_x_p:27,ca2:[31,32],cach:39,cad:31,cadenc:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,33,34,35,36,37,38,39,40,41,42,43,44,46,47],calcul:[31,32],call:[8,9,10,11,13,16,17,18,19,20,21,22,23,29,30,31,32,36,39,40,45],callback:45,calu1:31,calu2:31,calu3:31,calu4:31,calu5:31,calu6:31,calu:31,calux:27,camel:9,can:[8,11,15,16,17,18,19,20,21,22,23,27,30,31,32,35,36,38,39,40,46],candid:21,cannot:[11,16,20,21,27,30,40],capabl:[11,35,36,39,40],capac:40,capacitor:30,capit:9,captur:1,care:[11,23,31,39,40],carry_1:[21,23],carry_2:[21,23],cast:[8,9],cat:31,catal:35,catalog:[16,18,21,23,35],catchcor:[19,35,40],categori:40,caus:[19,36],cbug:40,ccb:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,33,34,35,36,37,38,39,40,41,42,43,44,46,47],cdebug:40,ceil:30,cell:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15],cell_1:31,cellnet:18,cellstop:35,cellview:[17,40],center:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,31,33,34,35,36,37,38,39,40,41,42,43,44,46,47],centerend:27,cerr:[8,9],certain:[13,32],cfg:35,cgt:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16],ch_htree_bl_tl:39,cham:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,33,34,35,36,37,38,39,40,41,42,43,44,46,47],chang:[8,13,20,21,30,31,35,38,39,40],chaput:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,33,34,35,36,37,38,39,40,41,42,43,44,46,47],charact:[30,35],check:[22,30,31,40],checkbox:40,checker:27,checkout:36,chip:[1,31],chmod:31,choic:1,choos:[9,31,40],chosen:[29,31],chotin:32,chri:[36,37],christian:37,christoph:37,chu:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,33,34,35,36,37,38,39,40,41,42,43,44,46,47],cif:27,cin:[21,23,31],cinfo:40,circuit:1,circular:31,circumv:40,ck_htree:39,ck_htree_bl:39,ck_htree_bl_bl:39,ckin:[29,31,32],ckok:30,clariti:[8,16],class_nam:31,classic:[11,19,35],clean:35,cleaner:21,cleanli:9,clear:[13,39,40],clearer:31,clement:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,33,34,35,36,37,38,39,40,41,42,43,44,46,47],click:40,clock:[1,29,30,31,35],clocktre:[35,39],clone:[19,36,40],close:[9,16,17,20,21,23,35,39,40],closer:31,clue:11,cluster:40,cmake:[0,1,2,3,4,5,6],cmd0:31,cmd1:31,cmd2:31,cmd:[30,31],cmo:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,33,34,35,36,37,38,39,40,41,42,43,44,46,47],cnchu:37,cobject:10,code:[8,9,11,13,16,19,20,21,35,38,39],coher:[20,40],collect:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17],collector:20,coloquint:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,33,34,35,36,37,38,39,40,41,42,43,44,46,47],color:31,com:[36,43,46,47],combin:[21,36],come:40,command:[1,31,36,39],commit:36,common:[9,11,27,30,31,35,38,39,40],commpos:40,commun:[9,11,13],comp:8,compar:32,comparaison:31,comparison:[1,29],compat:36,compatibilti:38,compil:[11,36,40],complement:[30,32],complet:[7,9,11],completli:[11,16,38,40],complex:[11,27],compliant:36,compnent:40,compon:[1,8,11,15],compos:[21,40],compris:40,comput:[11,16,21,30,31,32,35,39,40],concaten:31,concept:[16,20,21,25,26],conceptor:[29,31],concret:[8,31],conditionn:30,conf:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,33,34,35,36,37,38,39,40,41,42,43,44,46,47],configur:1,confus:21,congest:40,conjunct:40,connect:[16,20],connectmap:31,connector:[1,16,27],connexion:[15,20,21,29,31],consecut:39,consequ:[8,21,27,38,46],consid:[7,21,27],consist:36,const_0x0000ffff:30,constant:[1,27,30],construct:[13,20,21,31],constructor:[9,11,13],constructorerror:[9,11,13],constval0:30,constval1:30,constval2:30,constval3:30,constval:30,cont_body_n:[27,31],cont_body_p:[27,31],cont_dif_n:[16,27,31],cont_dif_p:[16,27,31],cont_poly:[16,27,31],cont_turn1:31,cont_turn2:31,cont_turn3:31,cont_turn4:31,cont_turn5:31,cont_turn6:31,cont_via2:27,cont_via3:27,cont_via4:27,cont_via5:27,cont_via:27,cont_viax:27,contact1:21,contact2:21,contact:[8,11,16,21,27,31,40],contain:[7,11,16,17,18,19,20,22,27,31,32,35,36,38,39,40],contdifn:16,contdifp:16,conterpart:[4,5,27],contest:40,context:39,contpoli:16,contributor:37,control:[1,11,20,21,27,30,31],conveni:9,convent:[11,16],convers:[1,9,16,18],convert:[9,10,13,16,20,27,32],coodin:31,coordin:[16,20,21,27,29,31,40],copi:[13,20,31,36,40],copuupseg:31,copyright:[37,43,46,47],copyupseg:1,copyupsegmentseccopi:31,cordin:31,core:1,corioli:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,31,33,34],coriolis2:[7,16,19,21,23,35,36,38,39],coriolis_install:19,coriolis_top:19,coriolisconfigur:35,coriolisenv:[1,19],coriolisinit:35,corner:[16,21,27,31],correct:[31,40],correctli:[23,31],correspond:[29,31,32,40],corrioli:36,cost:40,cougar:27,could:[18,20,31,35,39,40],count:[11,39,40],coupl:40,cours:20,cout:[18,21,23,31],cover:27,cpp:[7,9,11],craft:39,crash:[36,40],creat:[7,8,9,11,13],createcel:[16,17,21,23],creation:[1,16,20,21,23,29],credit:1,crl:[0,1],crl_cata_lib:31,crlcore:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,33,34,35,36,37,38,39,40,41,42,43,44,46,47],crude:40,csh:36,ctrl:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,33,34,35,36,37,38,39,40,41,42,43,44,46,47],cumbersom:11,current:[16,23,31,32,35,36,39,40],cursor:40,cwd:35,cycl:32,cyclop:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,33,34,35,36,37,38,39,40,41,42,43,44,46,47],cygwin:36,damien:37,dangl:11,darwin:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,33,34,35,36,37,38,39,40,41,42,43,44,46,47],data:[1,30],databas:[9,11,16,18,20,21,29,38,40,46],database:46,datain0:30,datain1:30,datain:30,dataout:30,date:32,dbit:31,dbo:1,dbodeletemethod:[8,9],dbodestroyattribut:[8,9],dbolinkcreatemethod:[8,9,13],dbu:1,debian:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,33,34,35,36,37,38,39,40,41,42,43,44,46,47],debug:[17,36,40],decim:31,declar:[1,9,16],declar_interfac:1,decod:30,decor:40,decreas:40,dedic:[8,20,31],deep:38,deeper:8,deepli:[15,40],def:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,30,31,32,33,34,35,36,37,38,39,40,41,42],defab:1,defaultstyl:[19,35],defaultvalu:35,defin:[7,8,9,11,13,16,27,29,30,31,32,35,38,39,40],define:27,definit:[7,8,9,19],degre:31,delet:[9,11,13,18,20,29,35,40],delta:[27,31],demot:27,denser:40,densiti:[35,40],depend:[7,27,31,36,38,39],deplib:7,depth:40,deriv:1,derivedobject:8,describ:[22,27,31,32,35,39],descript:[1,8],descrob:31,design:1,design_kit:40,desir:31,despit:35,destroi:[8,9,13,18,20],detail:[1,16,19,21,23,35,38],detector:30,deterior:31,determin:9,determinist:40,devel:1,develop:[23,36,40],developp:1,devic:40,devtoolset2:36,devtoolset:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,33,34,35,36,37,38,39,40,41,42,43,44,46,47],dff:39,dff_4:30,dfft_4:30,dialog:40,dict:[18,31],dictionari:[9,18],dictionnari:[9,17,29,31,39],did:[11,22,40],differ:[8,13,18,21,27,29,30,31,35,40],differenti:40,diffus:27,digit:[23,31],digitalinit:23,dimens:[27,31,40],direct:[8,9,11,13,27,29,31,32,35,40],directdeletemethod:13,directdestroymethod:13,directgetlongattribut:[8,10,13],directionn:13,directli:[11,17,20,22,23,32,36,39,40],directori:[1,16,19,21,22,23,31,35],directsetlongattribut:[10,13],disabl:[20,32,40],disambigu:27,disclaim:1,disconnect:21,discrep:22,diseappear:27,displac:40,displai:[9,21,35,40],display:40,distanc:[22,27,46],distinguish:[27,40],distribut:[36,38],disturb:39,ditch:40,divid:32,divis:31,dksdir:22,dl_export:[8,9],dobreak:[16,17,21,23],doc:[13,16,21,23,31,36],dochip:39,document:[11,14,15,20,21,25,28,31,33,35,36,38,39,40,41],docutil:36,doe:[9,31],doesn:[31,40],dogleg:40,don:[9,19,20,36,39],done:[9,16,31,35,40],dosometh:[20,39],dot:[38,40],dotfil:37,doubl:11,down:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,31,33,34,35,36,37,38,39,40,41,42,43,44,46,47],download:40,doxygen:[0,2,3,4,5,6,34,36,39,42],dozen:40,dp_sxlib:35,dpgen:1,dpgenadsb2f:1,dpgenand2:1,dpgenand3:1,dpgenand4:1,dpgenbuff:1,dpgenbus:1,dpgenconst:1,dpgendff:1,dpgendfft:1,dpgenfifo:1,dpgeninv:1,dpgenmux2:1,dpgennand2:1,dpgennand2mask:1,dpgennand3:1,dpgennand4:1,dpgennbus:1,dpgennmux2:1,dpgennor2:1,dpgennor2mask:1,dpgennor3:1,dpgennor4:1,dpgennul:1,dpgenor2:1,dpgenor3:1,dpgenor4:1,dpgenram:1,dpgenrf1:1,dpgenrf1d:1,dpgenrf1dr0:30,dpgenrf1r0:30,dpgenrom2:1,dpgenrom4:1,dpgensff:1,dpgensfft:1,dpgenshift:1,dpgenshrot:1,dpgenxnor2:1,dpgenxnor2mask:1,dpgenxor2:1,dpi:40,drain:27,draw:[16,27,40],drawn:40,drc:27,drive:[30,39],driven:35,drop:[36,38],druc:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,31,33,34,35,36,37,38,39,40,41,42,43,44,46,47],due:[35,40],dumb:35,dummi:[19,35,36,39],dump:[18,38,40],duplic:31,dupui:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,33,34,35,36,37,38,39,40,41,42,43,44,46,47],dure:[32,40],durole:37,dx1:31,dx2:31,dy1:31,dy2:31,dyld_framework_path:36,dyld_library_path:19,dynam:[11,20,30,36],dynamic_cast:8,each:[9,11,13,21,27,29,30,31,32,35,39,40],eas:[17,35],easi:31,easier:[27,29,31],easiest:36,easili:[20,35,40],east:[31,39],ec322005072076ef53984462fb4a1075c27c7dfd:36,edg:[27,39,40],editor:[1,16,17,21,23,27,29],edu:37,effect:[30,32,40],effort:[23,35,40],egin:32,ego:17,eight:31,either:[9,27,30,31,32,36,39,40],el7_64:36,electr:20,electric:27,element:[16,18,29,40],elif:31,els:[8,9,11,13,31,35],emit:9,empti:[30,40],emul:[9,36],enabl:[30,40],encapsul:[1,8,9],encompass:11,encount:[36,46],end:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,46,47],endif:[8,9,11,13],endl:[8,9,18],endswith:[18,35],enforc:21,eng:37,engin:23,engineloadgrbynet:23,enginenonetlayerassign:23,enough:[21,31,39],enrich:20,ent:8,enter:40,entir:11,entiti:8,entitycast:8,entri:[19,35,39,40],enumer:[31,35],env:31,envelop:31,envenli:40,environ:[1,16],eplac:40,eponym:40,equal:[30,31,40],equival:[20,21,31,40,46],eras:[39,40],error:[1,8,9,11,23,30],esc:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,33,34,35,36,37,38,39,40,41,42,43,44,46,47],escap:40,escassut:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,33,34,35,36,37,38,39,40,41,42,43,44,46,47],especi:16,essai:31,etc:[16,19,31,35,36,39],etesian:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22],etesianengin:23,eval:[19,36],even:[21,27,30,38,39],evenli:40,event:[32,36,40],eventslimit:40,ever:18,everi:[9,29,31,35,40],everybodi:23,everyth:[9,35,40],evolv:36,exacltli:27,exact:[16,36,39],exactli:[17,27,36,39,40],exampl:[1,7,8,9,10],except:[9,16,29,31],excess:40,execut:1,exempl:[29,31,40],exist:[18,19,31,35,40,46],exit:[39,40],expand:27,expansion:31,expect:[10,21,35,39],expens:10,experi:40,explain:21,explan:[16,40],explanat:27,explanatori:[9,20],explicit:[10,16,21],explicitli:20,expor:40,expos:[9,11,18],exposur:11,express:[16,20,22,27,31,35,40,46],ext:27,extand:31,extend:[27,29,31],extens:[1,16,17],extent:[35,39,40],extern:[8,9,11,13,16,20,21,29,31,39],extra:[35,40],extract:[9,32],extractor:27,extreme:35,face:31,facil:1,fact:[8,11],factor:[38,40,46],fail:[8,9],failsaf:40,failur:40,fairli:40,fals:[8,9,19,29,30,31,35,40],familiar:[11,25,26],fanci:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,33,34,35,36,37,38,39,40,41,42,43,44,46,47],far:[11,28],fashion:11,fast:[35,36,40],fc13:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,33,34,35,36,37,38,39,40,41,42,43,44,46,47],fc_64:36,featur:40,fedora:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,33,34,35,36,37,38,39,40,41,42,43,44,46,47],feedthru:40,feel:20,fgr:40,fhs:36,field:[8,9,13,40],fifo:30,fifo_4_16:30,figur:[27,31,40],file:1,file_nam:31,filenam:[31,32,35],fillcel:1,filler:21,filler_1:21,filler_2:21,filter:[1,21],find:[21,31,35,36],fine:40,finger:40,finish:[16,29,31],first:[1,7,9],fit:[16,17,21,23,31,40],five:27,fix:[1,16,27,32],flag:[16,20,21,23,27,30,40],flatten:[15,39,40],flavor:[9,13],flip:30,flop:30,flow:[31,40],flute:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,33,34,35,36,37,38,39,40,41,42,43,44,46,47],fly:21,follow:[7,8,9,11,16,20,27,30,31,32,35,36,39,40],fonction:31,footprint:40,forc:[9,32,39,40],forget:19,forgotten:31,form:[31,35,40],format:[22,31,32,38,40],found:[11,16,21,23,31,35,36],founder:27,foundri:[16,27],four:[9,27,30,39,40],fourth:30,framework:[16,18,21,23,36,38],franck:27,free:[23,40],freebsd:36,freed:20,freedpk:19,freepdk45:22,freepdk:22,freepdk_45:19,from:[8,9,10,11,13,16,18,20],fromlambda:[16,20,21,23],full:30,fulladd:[21,23,31],fulli:[16,23],fuse:[16,20],futur:11,gabriel:37,gap:40,garbag:20,gate:[27,30,40],gaug:[27,35,40],gcell:40,gdb:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,33,34,35,36,37,38,39,40,41,42,43,44,46,47],gdsii:40,gener:[0,1,2,3,4,5,6],generic_method_head:[8,9,13],genlib:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,33,34,35,36,37,38,39,40,41,42,43,44,46,47],geometr:[27,31,39],get:[9,10,11,15],get_cata_lib:29,getcel:[8,9,18,21,23],getcompon:18,getdb:[16,21],getenv:35,getheight:8,getlay:[16,21],getmasternet:21,getnam:18,getnet:[8,18,21,23],getobjectid:[9,13],getplug:[21,23],getrefxy:1,getstr:[20,40],gettechnolog:[16,21],getwidth:8,getx:[8,10,13],gety:[8,13],ghdl:31,gigant:11,git:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,33,34,35,36,37,38,39,40,41,42,43,44,46,47],github:36,give:[7,8,16,27,29,30,31,38,40],given:[8,9,11,16,17,21,27,29,30,31,32,35,36,40],global:[1,9,21,27,35,38],globallengththreshold:40,globalripuplimit:40,gnu:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,33,34,35,36,37,38,39,40,41,42,43,44,46,47],goal:20,goe:11,good:[7,40],gouvin:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,33,34,35,36,37,38,39,40,41,42,43,44,46,47],gpl:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,33,34,35,36,37,38,39,40,41,42,43,44,46,47],graal:27,graphic:[1,19,35,36,38,39],great:39,greater:[31,38],grew:40,grid:[1,16],ground:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,29,30,33,34,35,36,37,38,39,40,41,42,43,44,46,47],group:[20,38],gscl45nm:22,guarded:30,gui:36,guid:1,hack:1,had:27,halfadd:31,hand:27,handl:[16,31],hard:[30,35],has_kei:[16,17,21,23,35,39],hasn:40,have:[8,9,11,13,16,18,20,21,23,27,29,30,31,32,35,36,38,39,40,46],haven:31,hcatch:[8,9,10,11,13],head:1,header:1,hecadecim:31,height:[8,11,27,31,40],help:[17,36],helper:[1,9,19],here:[0,2,3,4,5,6,9,11,21,22,27,32,34,35,36,40,42,43,46,47],herit:29,hesit:39,hexa:31,hexadecim:[31,32],hidden:38,hide:40,hierach:31,hierarchi:1,high:[23,35,40],highest:40,highlight:1,highlit:40,himself:[29,31],histor:27,hmeti:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,33,34,35,36,37,38,39,40,41,42,43,44,46,47],hoc:[38,40],hold:[8,11,16,40],holder:15,hole:27,home:[17,22,31,35,36,37],homedir:35,hook:[1,9],hope:11,horizont:[8,16,20,21,27,31,39,40],how:[1,15,16,18,20,21,27,30],howev:[35,40],hspace:39,html:[31,36],htracksreservedloc:40,htry:[8,9,10,11,13],http:[36,37,43,46,47],hugo:37,hundredth:16,hur_techno_name:31,hurricaneerror:8,hurricaneplug:29,hwidth:39,hypernet:[0,2,3,4,5,6,7,8,9,10,11,12,13,14],i0_20:31,i386:36,iastat:37,ident:[8,31,35,40],identifi:[35,39,40],ifndef:[8,9,13],illegal:31,illustr:[16,21,22,39],imag:40,imcomplet:38,immediatli:40,implant:27,implement:[9,11,20,23,35,38,40,45],implemet:35,impli:[13,20],imposs:31,improv:40,in0:31,in1:[30,31],in2:[30,31],in3:[30,31],in4:30,in_lo:35,in_ph:35,includ:[7,8,9,11,13,20,31,36,38,40],include:36,inclus:40,incompat:31,incompatibilit:36,increas:[27,40],inde:40,indeed:[29,31],indent:20,index:[27,31,45],indic:[29,31],indirect:8,individu:[27,40],infinit:[19,36,40],info:[19,35,40],inform:[11,16,17,27,40,46],inherit:[9,29],init:[9,13],inithurrican:[8,9],initi:[8,9,32,35,40],initialis:[1,9,19,29,31,32],innov:38,inout:[29,31],input:[29,30,31,32,38],insert:[16,35,39],insid:[9,16,17,23,27,40],inspect:40,inspector:1,inst:[29,30,31],inst_adsb2f:30,inst_and2:30,inst_and3:30,inst_and4:30,inst_buff:30,inst_bus:30,inst_const:30,inst_dff:30,inst_dfft:30,inst_fifo:30,inst_inv:30,inst_mux2:30,inst_nand2:30,inst_nand2mask:30,inst_nand3:30,inst_nand4:30,inst_nbus:30,inst_nmux2:30,inst_nor2:30,inst_nor2mask:30,inst_nor3:30,inst_nor4:30,inst_nul:30,inst_or2:30,inst_or3:30,inst_or4:30,inst_ram:30,inst_rf1:30,inst_rf1d:30,inst_rom2:30,inst_rom4:30,inst_sff:30,inst_sfft:30,inst_shift:30,inst_shrot:30,inst_xnor2:30,inst_xnor2mask:30,inst_xor2:30,instal:[7,16,19,21,22,23,35,36,40],install:36,installat:1,instanc:[1,11,16,20],instanci:[1,8,29],instanciat:[1,29],instanti:1,instantiat:[29,31],instead:[8,11,13,19,22,31,36,40],instens:35,insti:30,insto:30,instop:30,instruct:[31,36,40],instshamt:30,insul:9,integ:[16,32,35],integer_word_length:32,integr:[9,39],intend:40,interact:17,interfac:[1,9,11,16,19,20,21,29,30,31,32,35,38],intermedi:1,intern:[29,31,32,39],interpret:[19,39],interrupt:9,intersect:27,intert:30,interv:31,introduc:[16,36,40],introduct:1,inv:31,inv_54:30,inv_x1:18,invalid:[8,9,11,13],inversor:31,invert:[27,30],inverter:30,invertor:[16,17],invok:31,iowa:37,isdir:35,isn:[31,32],isobar:[7,8,9,10,11,13],isobar_py_component_h:8,isobar_py_contact_h:8,isobar_py_entity_h:8,isobar_py_point_h:13,ispd:40,ispycompon:8,ispycontact:8,ispyentiti:8,ispyhorizont:8,ispylibrari:9,ispypoint:13,ispyvert:8,issu:[11,23],istself:7,ital:40,item:40,iter:[18,40],itself:[9,27],iwl:32,jean:37,json:38,just:[10,11,17,18,21,22,27,31,35,36,40],katabat:[0,2,3],katana:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22],katanaengin:23,keep:[13,23],kei:[9,29,31,39,40],kept:27,keyword:17,kgr:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,33,34,35,36,37,38,39,40,41,42,43,44,46,47],kind:[16,18,19],kit:5,kite:[0,1,2,3,4],knife:40,knik:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,33,34,35,36,37,38,39],know:[9,36,39],known:[21,40,46],kwarg:13,lambda:[1,16,22],lanch:19,languag:[1,31,32],larg:40,last:[9,32,35,36,40],lastli:[9,13],latch:30,later:[13,16,21,38,40],latest:[31,36],latex2html:36,latex:36,lauch:39,launch:[17,19,36,39],layer:1,layerassign:23,layout:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15],layoutt:35,lbd:16,lcw:27,ld_library_path:19,lead:40,leaf:[15,39,40],least:[35,39],lef:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21],lefconvertfactor:46,lefdef:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,33,34,35,36,37,38,39,40,41,42,43,44,46,47],lefimport:22,lefimporttmpcel:46,left:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,30,31,33,34,35,36,37,38,39,40,41,42,43,44,46,47],legal:[31,32,38],leght:31,lenght:31,length:[16,27,32],lepka:[19,36,39],less:[11,27,40],let:[13,40],letter:31,level:[8,9,10,11,15,16,17,21,27,35,36,39,40],lex:36,lgpl:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,33,34,35,36,37,38,39,40,41,42,43,44,46,47],lib:[9,22,36,40],liberti:40,libisobar:11,librari:[1,7,8],libxml2:36,licens:1,life:[13,27],like:[8,9,11,17,18,19,20,23,29,30,31,35,36],limit:[20,21,40],line:[1,36,39],linear:40,linebreak:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,33,34,35,36,37,38,39,40,41,42,43,44,46,47],link:1,linker:11,linux:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,33,34,35,36,37,38,39,40,41,42,43,44,46,47],lip6:36,list:[1,7,18,21,29],listdir:35,littl:[17,27,40],live:[11,40],load:[1,16,17],loader:[22,38],loadglobalrout:23,local:[35,36,40],localripuplimit:40,locat:[31,39,40],lofig:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,33,34,35,36,37,38,39,40,41,42,43,44,46,47],log2:30,log:40,logic:[5,16,20,21,22,31,32,38,40],logicin:29,logicinout:29,logicout:29,logicunknown:29,logmod:[19,35,40],longer:[11,40],longglobalripuplimit:40,look:[1,9,13,16,22,35,36],loop:[18,19,30,31,36,40],lot:[21,46],low:40,lower:[16,21,30,31,35,40],lowercas:[9,16],lsb:[29,31],lybrari:9,maco:36,macos:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,33,34,35],macport:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,33,34,35,36,37,38,39,40,41,42,43,44,46,47],macro:[7,8,9,11,13,30,40,46],made:[11,21,23,27,29,30,31,39,40],mai:[11,13,16,17,18,19,20,21,27,31,35,36,39,40],main:[20,36,38,40],mainli:[35,38,40],maintain:40,make:[9,15],makefil:36,manag:[11,16,20,22],mandatori:[9,16,19,29,30,31,35],mani:[11,20,27,31],manipul:10,manual:[1,11],map:[1,18,29,30],marek:37,margin:[23,35],mark:32,mask:30,masson:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,33,34,35,36,37,38,39,40,41,42,43,44,46,47],master:[11,21,23,29,36,40],mastercel:[29,31],masterlibrari:9,masternet:21,match:[18,31,35,40],materi:40,matrix:27,mauka:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,33,34,35,36,37,38,39,40,41,42,43,44,46,47],max:35,maxim:40,maximum:40,maxtracelevel:[35,40],mayb:31,mbk:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,33,34,35,36,37,38,39,40,41,42,43,44,46,47],mbk_:16,mbk_to_rds_bigvia_hole:1,mbk_to_rds_bigvia_metal:1,mbk_to_rds_segment:1,mbk_to_rds_via:1,mbk_wiresetting:1,mean:[11,18,20,22,27,31,35,36,40,46],meaning:[27,30,31],mechan:[9,11,13,15],medskip:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,33,34,35,36,37,38,39,40,41,42,43,44,46,47],member:38,memento:1,memori:[16,18,20,39,40],menu:[17,40],merg:29,messag:[16,17,21,40],metal1:[16,27],metal2:[21,27],metal3:21,metal5:40,metal:[27,40],meth_noargs:[8,9,13],meth_static:[8,9],meth_varargs:[8,9,13],method:[1,9,10,11,13,20,27],method_head:[8,9,13],micromet:[27,46],micron:22,microns:46,middl:31,migrat:38,million:40,miloyip:36,mimic:[9,35],min:35,minim:27,minimum:[39,40],minimumsid:39,minipag:37,minor:[35,40],mintracelevel:[35,40],minut:40,mip:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,33,34,35,36,37,38,39,40,41,42,43,44,46,47],mirror:39,misc:[19,35,40],miscellan:1,miss:40,mistak:[9,16,31],mistral:31,mix:[4,5,11,23,36],mkdir:36,mode:1,model:[1,16,20,21,27],modelnam:[30,31],modif:[16,18,31,39,40],modifi:[13,18,19,31,40],modul:[1,7],modular:11,modules_stratu:31,mofic:17,monolith:11,more:[8,16,18,20,27,31,35,38,40],moreov:11,mosi:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,33,34,35,36,37,38,39,40,41,42,43,44,46,47],most:[31,35,40],mostli:[7,20,40],mous:40,movabl:40,move:40,msb:[29,31],much:[11,29,31,35,40],multipl:[22,27,31,38,40,46],multiplex:30,multiplexor:[1,29],multipli:[27,31],must:[7,8,9,11,16,17,19,20,21,22,27,31,32,35,36,39,40],mutat:9,mux2_8:30,mux:[29,31],mx2:31,my_addaccu_:31,my_and2_4bit:31,my_dpgen_and2:31,my_inv:16,myclass:[29,31],myfunc:20,myinst1:31,myinst2:31,myinst3:31,myinst:31,mylib:35,mymap:29,mynet:31,myparam:29,myref:31,myself:15,na2:31,na3:31,na4:31,name:[1,7,8,9,11],namespac:[1,7,8],nand2:30,nand2_8:30,nand2mask_0x0000ffff:30,nand3:30,nand3_20:30,nand4:30,nand4_9:30,nand:30,narrow:40,navig:18,nbit:[30,31],nbit_cmd:30,nbsp:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,33,34,35,36,37,38,39,40,41,42,43,44,46,47],nbuse29:30,nck:35,ncsu:22,ndif:[16,27,31],nearest:39,need:[7,8,9,11,13,16,19,20,21,23,27,31,35,36,39,40],neg:31,neither:[9,31],nero:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,33,34,35,36,37,38,39,40,41,42,43,44,46,47],net8:31,net:[1,8,11,15],neta:31,netb:31,netc:31,netck:31,netcmd:31,netcout:31,netexternalcompon:[16,21],neti0:31,neti1:31,netin:31,netinput:29,netlist:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20],netnam:31,neton:31,netout:31,netq:31,nets:31,netv:31,netvdd:31,netvss:31,never:18,nevertheless:31,newer:36,newli:[16,31],newnet:31,newpag:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,33,34,35,36,37,38,39,40,41,42,43,44,46,47],next:[31,32,36],nimbu:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,33,34,35,36,37,38,39,40,41,42,43,44,46,47],nmux2_5:30,nmx2:31,no2:31,no3:31,no4:31,noflag:23,noindent:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,33,34,35,36,37,38,39,40,41,42,43,44,46,47],non:[1,9,11],none:[16,17,21,23,29,35,39,40],nor2:30,nor2_8:30,nor2mask_000111:30,nor3:30,nor3_3:30,nor4:30,nor4_15:30,nor:[9,30,31],normal:[23,40],north:[31,39],nosym:[30,31],notat:[29,31,40],note:[1,8,9,27,30,31,36],now:[8,21,38,40],nterfac:32,ntie:[16,27,31],ntran:[16,31],ntrans:[16,27,31],nul:30,nul_4:30,number:[9,11,13,16,27,29,30,31,32,39,40],nutshel:36,nwell:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,31,33,34,35,36,37,38,39,40,41,42,43,44,46,47],nword:[30,31],nxr2:31,nymous_:18,o2_1:[21,23],o2_x2:[21,23],ob_typ:[8,9,13],object:[8,9,10,11,13,16,17,18,20,21,27,31,35,40],observ:32,obsolet:38,obtain:[27,31,40],obviou:[13,40],obvious:[11,36,39],obviousli:[11,21,27,39],occur:[11,16,30,31],occurr:8,ocp:27,octal:32,odd:[27,39],off:[11,27,31],offset:[27,31],offsetx:31,offsety:31,often:[27,40],old:[11,23,38],older:[36,40],ommit:40,onc:[9,11,31],once:[16,39,40],one:[8,21,30,31,39,40],onli:[8,10,11,15,16,17,18,20,21,22,23,27,29,30,31,32,35,36,38,39,40],only:[9,29,30,31,36],open:[16,17,20,21,23,29,31,40],opencham:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,33,34,35,36,37,38,39,40,41,42,43,44,46,47],oper:[1,11,20,21,29,30],operand:30,operat:30,opt:36,optim:[30,36],option:[1,9,17,19,29,30,31,32],optional:32,optionn:[30,31],or2:[30,31],or2_8:30,or3:30,or3_5:30,or4:30,or4_16:30,order:[18,21,29,30,31,35,36,40,45],ordere:39,ordinari:[21,35,39],ored:30,organ:[9,18],orient:27,orientat:21,origin:[11,27,40],osu_soc:22,other:[9,10,11,16,17,20,21,27,31,32,35,36,37,39,40],otherwis:[11,29,30,31,40],ouput:30,our:[9,11,20,35],out:[11,29,30,31],out_lo:35,out_ph:35,outad:36,outil:31,outlin:40,output:[29,30,31,32,38,40],outsid:[7,16,18],over:[10,18,21,23,27],overflow:30,overhang:27,overlap:[27,40],overload:[9,16],overloard:[29,31],overrid:19,overwritten:40,own:[8,31,35,36,40],owner:16,p_a0:39,p_a1:39,p_a2:39,p_a3:39,p_b0:39,p_b1:39,p_b2:39,p_b3:39,p_cin:[31,39],p_ck:39,p_cout:[31,39],p_d0:39,p_d1:39,p_d2:39,p_d3:39,p_f3:39,p_i0:39,p_i1:39,p_i2:39,p_i3:39,p_i4:39,p_i5:39,p_i6:39,p_i7:39,p_i8:39,p_ng:[31,39],p_noe:39,p_np:[31,39],p_ovr:39,p_q0:39,p_q3:39,p_r0:39,p_r3:39,p_vddeck0:[31,39],p_vddeck1:[31,39],p_vddick0:39,p_vsseck0:39,p_vsseck1:[31,39],p_vssick0:[31,39],p_y0:39,p_y1:39,p_y2:39,p_y3:39,p_y:31,p_zero:39,packag:1,pad:[1,16],pad_east:29,pad_north:29,pad_south:29,pad_west:29,padeast:31,padlib:35,padnorth:31,padsouth:31,padwest:31,page:[21,45],pair:[16,31,39],paper:40,para:31,paradigm:35,parallel:36,param:[1,29,30],paramet:[1,9,11,13,21,23],parameterst:[19,23,35],parametertyp:35,paramid:35,paranoid:[19,35],parent:9,pars:[8,31],parser:[27,38],part:[1,8],partial:[8,11,38],particular:[9,17,20],partit:39,paseast:31,pass:[11,21,39],paswest:31,pat:32,patamet:31,path:1,pathnam:31,patli:27,pattern:[1,29],pattern_begin:1,pattern_end:1,patwrit:1,paul:37,pck:39,pck_px:39,pdf:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,33,34,35,36,37,38,39,40,41,42,43,44,46,47],pdif:[16,27,31],peopl:11,per:31,percentag:35,perform:[9,30,31,35,36,39,40],perhap:40,peripheri:31,permit:[30,31],persist:11,phfig:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,33,34,35,36,37,38,39,40,41,42,43,44,46,47],phseg:27,phvia:27,physic:[1,16,20],physical:31,physical_grid:27,pictur:[31,40],piec:31,pin:[20,21,31,46],pitch:[27,31],pixel:40,pixmap:40,place:[1,11,15,16,20],placeandrout:23,placebottom:1,placecentr:1,placecontact:1,placed:21,placeglu:1,placeleft:1,placement:[1,21,23,29,31,35,38],placementstatu:21,placepin:1,placer:1,placeref:1,placerengin:39,placeright:1,placeseg:1,placetop:1,plain:10,plane:39,pleas:[16,31],plot:31,plu:31,plug:[15,16,20],plugin:1,point1:31,point2:31,point:[9,10,11,13,16,20,21,27,31,32,35,39,40],pointer:[8,9,11,13],poli:[16,27,31],polici:35,poly:[16,27,31],polysilicium:27,pop:30,popup:40,port:[29,31,32,36,38],posit:[16,27,31,39,40],possibl:[9,17,20,21,27,31,35,39,40],postfix:39,power:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20],powerr:1,practic:[7,27],pre:40,preced:32,precis:[11,16,31,46],predic:9,prefix:[27,39,40],preliminari:38,prepend:35,prerequisit:36,presenc:8,present:[8,18,20,36,40],press:40,pretti:[22,35],previou:[27,31,35,40],previous:[8,9,23,39],price:40,print:[1,18,20,35],printabl:[14,25,28,33,41],printer:40,prior:[16,22,23,40],problem:36,proce:36,procedur:[31,32,33,40],process:[18,19,21,31,35,38,40],produc:32,profil:36,progess:20,program:[9,11,31],programm:30,progress:17,project:36,propag:[39,40],properti:[9,32],proprieti:32,protocol:18,provid:[1,9,10,11,16,19],proxyerror:10,ptie:[27,31],ptran:[16,31],ptrans:[16,27,31],pub:36,pull:36,pure:[19,20,35,40],purist:27,purpos:[17,31,40],push:30,pust:31,put:[9,11,13,27,31,35,39,40],pvddeck:39,pvddeck_px:39,pvddick:39,pvddick_px:39,pvsseck:39,pvsseck_px:39,pvssick:39,pvssick_px:39,pwell:[27,31],pxlib:35,py_incref:[8,9],py_initmodul:[8,9],py_library_h:9,py_return_none:[8,10],pyany_aslong:[10,13],pyarg_parsetupl:[9,10,11,13],pycel:[8,9],pycell_link:[8,9],pycfunct:[8,9,13],pycompon:[8,11],pycomponent:8,pycomponent_destroi:8,pycomponent_getnet:8,pycomponent_getx:8,pycomponent_gety:8,pycomponent_link:8,pycomponent_linkpytyp:8,pycomponent_method:8,pycomponent_o:[8,11],pycontact:8,pycontact_cr:[8,11],pycontact_destroi:8,pycontact_getheight:8,pycontact_getwidth:8,pycontact_link:[8,11],pycontact_linkpytyp:8,pycontact_method:8,pycontact_o:8,pycpp:7,pydatabas:9,pydatabase_o:9,pydatabse_o:9,pydbu_fromlong:10,pyentiti:8,pyentity:8,pyentity_destroi:8,pyentity_getcel:8,pyentity_link:8,pyentity_linkpytyp:8,pyentity_method:8,pyentity_new:8,pyentity_o:8,pyerr_clear:11,pyerr_setstr:[8,9,10,11,13],pyhorizont:8,pyhorizontal_link:8,pyhorizontal_o:8,pyhurrican:[7,8,9,13],pyhurricane_method:[8,9],pyinclud:7,pyinstanc:11,pyinstance_link:11,pylay:11,pylayer_o:11,pylibrari:[7,9,11],pylibrary:9,pylibrary_cr:9,pylibrary_dealloc:9,pylibrary_destroi:9,pylibrary_getcel:9,pylibrary_link:9,pylibrary_linkpytyp:9,pylibrary_method:9,pylibrary_o:9,pymethoddef:[8,9,13],pymodule_addobject:[8,9],pynet:[8,11],pynet_link:8,pynet_o:11,pyobject:[8,9,10,11,13],pyobject_head:[8,9,13],pyobject_new:13,pypoint:[10,13],pypoint_dealloc:13,pypoint_getx:[10,13],pypoint_gety:13,pypoint_init:13,pypoint_link:13,pypoint_linkpytyp:13,pypoint_method:13,pypoint_new:13,pypoint_o:13,pypoint_setx:[10,13],pypoint_sety:13,pyseg:8,pystring_asstr:9,python27:36,python2:36,python:[0,1,2,3,4,5,6,7],pythoncpp:14,pythonpath:[19,40],pythontutori:25,pytype_ready:[8,9],pytype_ready_sub:8,pytypecompon:[8,11],pytypecontact:8,pytypeent:8,pytypeinheritedobjectdefinit:8,pytypelay:11,pytypelibrari:[7,9],pytypenet:11,pytypeobject:[8,9,13],pytypeobjectdefinit:[9,13],pytypeobjectlinkpytyp:[8,9],pytypeobjectlinkpytypenewinit:13,pytypepoint:13,pytyperootobjectdefinit:8,pyvert:8,pyvertical_link:8,pyvertical_o:8,qt5:36,quadri:39,quadruplet:35,quadtre:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,33,34,35,36,37,38,39,40,41,42,43,44,46,47],qualiti:40,quarter:39,queri:16,quit:[29,40],rail:1,ram:[30,39],ram_32_32:30,ram_clock:39,ramlib:35,rang:[31,32],rapidjson:36,rather:40,ratio:[23,35,40],rcw:27,rds:1,rds_activ:27,rds_alu1:27,rds_alu2:27,rds_alu3:27,rds_alu4:27,rds_alu5:27,rds_alu6:27,rds_cont:27,rds_gate:27,rds_ndif:27,rds_nimp:27,rds_pdif:27,rds_pimp:27,rds_poly:27,rds_via1:27,rds_via2:27,rds_via3:27,rds_via4:27,rds_via5:27,reach:[11,40],reachabl:40,read:[9,30,35,38,46],readabl:40,readi:16,real:[1,9,16,18],realli:40,reason:27,recent:[27,31],recommand:40,recommended:32,record:40,rectang:27,rectangl:27,recurs:1,red:40,redefin:[8,35],redefinit:8,redhat:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,33,34,35,36,37,38,39,40,41,42,43,44,46,47],redirect:40,redraw:40,redund:27,ref:30,refin:9,reflect:40,refnam:31,refresh:[29,31,40],reg:[29,31],regard:[20,31],regexp:35,regist:[1,7,9,29,30],regnumb:30,rel:[16,27,31,32,36],relat:[8,13,21,32,35,40],releas:[1,36,37],relev:[8,9,39],reli:[11,27,36,40],reload:40,remain:[8,9,13,18,40],remark:[8,35,40],rememb:8,remind:15,remov:[18,39,40],ren:30,renam:[39,46],render:40,reopen:17,reorganis:39,repeatedli:40,replac:[20,35,38,40],replic:9,repositori:[36,38],repres:[21,27,31,32,40,46],represent:40,request:[18,30,39],requir:[1,11,29,35],reserv:40,reset:[9,30,40],resizeab:1,resolut:[20,40],respect:[11,35,40],respons:[9,40],rest:[17,23],restart:[39,40],restructuredtext:36,result:[9,11,17,18,20,21,30,35,40],retain:11,retir:39,revers:[8,11],rewrit:[11,38],rewritten:38,rf1_4_16:30,rf1d_4_16:30,rf2lib:35,rflib:35,rhel6:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,33,34,35,36,37,38,39,40,41,42,43,44,46,47],rhel7:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,33,34,35,36,37,38,39,40,41,42,43,44,46,47],right:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,30,31,33,34,35,36,37,38,39,40,41,42,43,44,46,47],ring:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,31,33,34,35,36,37,38,39,40,41,42,43,44,46,47],rip:40,ripup:40,ripupcost:40,rise:[27,31],risk:27,rok:30,rom2_0b1010_0b1100:30,rom4_0b1010_0b1100_0b1111_0b0001:30,rom:30,romlib:35,root:[9,11,16,21,23,35,36],roselyn:32,rot_m:31,rot_p:31,rotat:[21,30,31],rotop:30,rout:[1,20,23,27,29],routabl:40,routag:40,routageck:31,routeck:1,router:[1,16],routingdriven:[35,40],row:21,rowend_x0:21,rp1:21,rp2:21,rpm:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,33,34,35,36,37,38,39,40,41,42,43,44,46,47],rsave:1,rubber:40,rule:[27,39,40],ruler:40,run:[16,17,19,22,23,31,35,36,39,40],runglobalrout:23,runnabl:16,runnegoci:23,runtim:40,s2r:27,safeti:40,sai:[11,19,21,36,39],said:16,sake:[8,16],same:[7,8,11,16,18,21,27,29,31,32,35,40],sarri:30,satur:40,saturateratio:40,saturaterp:40,save:[1,8,9],savecel:[16,21,23],scan:30,scarri:40,scheme:[39,40],scientif:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,33,34,35,36,37,38,39,40,41,42,43,44,46,47],scin:30,scn6m_deep_09:35,scope:20,scout:30,screen:40,script:[1,16],scriptmain:[16,17,21,23,39,40],scrub:9,search:[18,35,45],second:[1,11,16,21,27,30,31],section:[35,36,46],secur:35,see:[9,11,16,17,20,21,27,29,31,32,35,36,39,40],seem:[27,31,36,46],seen:[9,23],sefl:31,segment:[1,16,21],sel0:30,sel1:30,sel:30,select:[1,21,30],self:[8,9,10,13,20,29,30,31,32,35],selr:30,selram:30,selw:30,semant:20,send:27,sensit:31,sentinel:[8,9,13],separ:[9,11,27,29,36,39,40],sequenc:[23,31,40],sequenti:35,serv:[4,5],set:[1,7,9,10],setabutmentbox:[16,17,21],setadd:31,setand:31,setbuff:31,setcel:[16,17,21,23],setcomp:31,setdiv:31,seteditor:39,setextern:[16,21,23],setglob:[16,21,23],setmult:31,setmux:31,setnet:[21,23],setnot:31,setor:31,setplacementstatu:21,setrefin:1,setreg:31,setshift:31,settermin:[16,17],settransform:21,setup:[9,16,19,23,35,36],setx:[10,13],setxor:31,sety:13,seven:40,sever:[11,29,31,40],sff2:31,sff3:31,sff:31,sff_4:30,sfft_4:30,shadow:18,shamt:30,shape:[23,27],share:[1,7,8],she:8,shelf:11,shell:[19,31,36],shellsuccess:39,shift:[29,30,31,40],shifter:[1,29,30],shifter_4:30,ship:38,shortcut:1,should:[11,13,19,31,32,36,40],shouldn:27,show:[11,16,18,27,35,40],shown:[9,27,31,35,39],shrot_4:30,si2:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,33,34,35,36,37,38,39,40,41,42,43,44,46,47],side:[27,31,39,40],sig:29,sign:[30,31,35],signal:[1,4,5,21,29,30],signalin:[30,31,32],signalinout:[30,31,32],signalout:[30,31,32],signalunknown:31,signatur:[8,9,11],silli:27,similar:[8,40],similarli:32,simpl:[1,22,27,35],simplest:[16,35],simpli:[16,18,27,31],simplif:[21,36],simplifi:[19,31,36],simul:[31,32,38,39],sinc:18,singl:40,site:35,size:[27,30,31,32,39,40],skip:18,slanski:31,slice:31,slight:20,sligthli:36,slot:40,slow:40,slsoc6x:36,slsoc6x_64:36,small:[23,25,26,27,31,35,39,40],smallest:[30,46],smallskip:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,33,34,35,36,37,38,39,40,41,42,43,44,46,47],snapshot:1,snx:22,soc:[35,36],socket:40,softwar:1,sole:17,solut:40,solv:40,some:[1,11,16,18,20,27,29],someth:[16,20],sometim:21,somewhat:21,soon:39,sophi:[29,30,31,37],sourc:[16,27,31,36,38,40],sout:[21,23,31],sout_1:[21,23],south:[31,39],space:[23,27,31,35,39,40],spacemargin:[23,35,40],span:13,spec:36,special:[9,19,20],specif:[9,20,35,39,40],specifi:[30,31,40],speed:40,speedup:38,spl1:31,split:[11,39,40],spread:[23,40],squar:[23,27],src:36,sroka:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,33,34,35,36,37,38,39,40,41,42,43,44,46,47],st_config:31,stabl:36,stack:9,stage:1,stai:27,stamp:32,stand:40,standalon:1,standard:[9,11,13],standard_instances_list:29,standart:39,standpoint:27,start:[20,27,31,40],starter:15,state:[16,18,20,21,23,37,40],statement:46,static_cast:[8,10],statu:21,stechno:39,step:[8,9,27,31,35,36,39,40,46],still:[8,13,28,36,38,40],stimuli:1,stimulu:32,stl:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,33,34,35,36,37,38,39,40,41,42,43,44,46,47],stop:[16,17,21,23,39,40],storag:46,store:[9,10,16,20,30,40],straightforward:22,straigthforward:21,strap:40,strapripuplimit:40,strategi:39,stratu:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28],stratus1:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,33,34,35,36,37,38,39,40,41,42,43,44,46,47],stratus2:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,33,34,35,36,37,38,39,40,41,42,43,44,46,47],stratus:31,stratus_mapping_name:31,stream:40,strict:[21,27],string:[9,16,20,30,31,32,35],stroke:40,strongli:40,strongly:32,struct:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,33,34,35,36,37,38,39,40,41,42,43,44,46,47],structur:1,stuck:[27,30],stuff:29,style:[9,40],sub:[19,31,32,39],subject:40,subsequ:46,substract:[30,31],substractor:30,subtli:18,success:39,successful:40,successfulli:[36,40],suffer:40,suffic:[21,40],suffix:39,suit:40,summar:20,summari:39,superpos:40,supli:30,suppl:39,suppli:[9,16],support:[7,9,11,13,20,23,32,36,38,40],suppress:40,sure:39,svn:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,33,34,35,36,37,38,39,40,41,42,43,44,46,47],swig:11,swiss:40,sxlib:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,31,33,34,35,36,37,38,39,40,41,42,43,44,46,47],sy_rm:31,sy_rp:31,sym:31,sym_x:31,sym_y:31,symbol:[1,9,16,19,22],symetr:31,symetri:[29,31],symmetri:21,symxy:31,sync:40,synch:40,synonym:23,synopsi:1,syntact:35,syntax:[1,9,20],synthesi:[1,22],synthet:[1,22,38,39],system:[21,31,35,36],system_library:35,tab:[1,21,29,31,35],table:27,tailor:9,take:[9,16,17,23,31,32,40],taken:[11,31,32],talu1:31,talu2:31,talu3:31,talu4:31,talu5:31,talu6:31,talux:27,target:[16,27],task:[8,19,36],taxonomi:35,team:36,technic:1,technolog:[1,16,19,21,22,31],tediou:[19,21,36],tee:40,tell:[9,16,19,27,29,30,35,36,39],temp:31,temp_ext:31,tempext:31,templat:11,temporari:[40,46],ten:11,term:[31,37],termin:1,terminolog:16,test:[1,29],testbench:31,text:[31,39,40],textwidth:37,than:[11,27,31,38,40],thank:[11,29,31,39,40],thei:[9,11,16,18,19,20,27,29,31,35,38,39,40],them:[9,11,20,23,27,36,39,40],therefor:[21,30],thesi:40,thi:[8,9,11,13,14,15,16,18,19,20,21,23,25,26,27,28,29,30,31,32,33,35,36,38,39,40,41,46],thing:32,third:[21,27,30,36],thispagestyl:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,33,34,35,36,37,38,39,40,41,42,43,44,46,47],those:[8,9,18,19,21,27,29,30,31,35,36,39,40],though:11,three:[7,9,21,27,30,40],through:[9,11,15,16],througout:27,thu:[9,20,35,40],tie:27,tie_x0:21,time:[8,11,31,32,40],tmp:20,todai:16,todbu:[16,17,21,23],togeth:[30,38],toggl:40,tolambda:16,too:[11,23,27,31,40],tool:[1,11,17,19,20],toolchain:40,toolengin:23,top:[31,36,39,40],topolog:40,toproutinglay:40,total:40,toward:[11,19,31],tp_compar:9,tp_dealloc:9,tp_hash:9,tp_init:13,tp_method:9,tp_new:13,tp_repr:9,tp_str:9,trace:[9,40],track:40,track_spacing_alu1:27,track_spacing_alu2:27,track_spacing_alu3:27,track_spacing_alu4:27,track_spacing_alu5:27,track_spacing_alu6:27,track_spacing_alu7:27,track_spacing_alu8:27,track_width_alu1:27,track_width_alu2:27,track_width_alu3:27,track_width_alu4:27,track_width_alu5:27,track_width_alu6:27,track_width_alu7:27,track_width_alu8:27,transform:[9,20],transistor:27,transit:32,translat:[21,27],transmiss:11,transpar:27,tree:[1,8,11,31],tricki:11,trigger:[35,40],tristat:[29,30,31,32],tristate:29,trough:39,trought:35,truli:35,trunk:35,tty:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,33,34,35,36,37,38,39,40,41,42,43,44,46,47],tupl:35,turn:[16,21,40],tutori:1,tweak:40,twenti:31,twentu:31,twice:[11,18,31],two:[8,11,15,16,17,19,20,21,23,27,29,30,31,32,35,36,38,39,40],type:[1,7,8],typebool:[19,23,35,40],typedef:[8,9,10,13],typedoubl:35,typeenumer:[23,35],typeint:[35,39,40],typeopt:35,typepercentag:[23,35,40],typerul:35,typestr:[35,39,40],typetab:35,typetitl:35,typic:[9,35,39],ubuntu:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,33,34,35,36,37,38,39,40,41,42,43,44,46,47],uint64_t:10,unabl:36,unbound:10,uncheck:21,undef:[8,31],undefined:31,under:[1,9,11,16,17,19,21,22,23,27,35],underli:11,underscor:31,understand:[11,36,45],uneed:21,unexpectedli:18,unicorn:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,33],unifi:40,uniform:[23,35],uniformdens:[23,35,40],uniquif:40,unit:[10,11],units:46,univers:37,unknown:29,unlik:36,unlike:[15,16,38],unlink:35,unmov:40,unplaced:29,unpredict:18,unrout:40,unselect:40,unsign:30,unsupport:40,until:[21,23,40],unzoom:40,updat:9,updatesess:[16,17,20,21,23],upmc:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,33,34,35,36,37,38,39,40,41,42,43,44,46,47],upon:[11,31,33],upper:[16,27,30,31,40],uppercas:16,usabl:[13,16,27],usage:[27,40],use:[19,31,32,36],used:[30,40],useful:[1,29],user:1,usersguid:41,using:16,usr:[16,21,23,31],usual:[8,9,16,20],utf:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,33,34,35,36,37,38,39,40,41,42,43,44,46,47],val0:30,val1:30,val2:30,val3:30,valid:[9,11,30,39],valu:[1,8,9,13,19],variabl:[9,16,19,27,31,35],variant:30,variou:[9,11,16],vbe:[29,40],vdd:[16,21,23,29,30,31,32,35],vdde:39,vddi:39,vddin:[29,30,31,32],vector:[18,31,32],verbos:40,verboselevel1:[19,35,40],verboselevel2:[19,35,40],veri:[23,35,39,40],version:[7,14,25,28,33,36,40,41,43,46,47],vertic:[8,16,21,27,31,39,40],vertiv:31,vhdl:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,31,33,34,35,36,37,38,39,40,41,42,43,44,46,47],via12:[21,31],via1:31,via23:[21,31],via24:31,via25:31,via26:31,via2:31,via34:31,via35:31,via36:31,via3:31,via45:31,via46:31,via4:31,via56:31,via5:31,via:27,view:[9,16,18,20],viewer:[0,1,16,17,21,35,38,39],vim:31,vimrc:31,violet:40,virtual:[1,15],visibl:[16,40],visual:[27,40],visualis:16,vlsi:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,31,33,34,35,36,37,38,39,40,41,42,43,44,46,47],vlsisapd:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,33,34,35,36,37,38,39,40,41,42,43,44,46,47],vspace:39,vss:[16,21,23,29,30,31,32,35],vsse:39,vssi:39,vssin:[29,30,31,32],vst:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,31,33,34,35,36,37,38,39,40,41,42,43,44,46,47],vtracksreservedloc:40,vwidth:39,w7_64:36,w8_64:36,wai:[9,10,11,16,20,23,27,31,36,39,40],walk:40,walkthrough:18,wallac:31,want:[8,9,11,16,17,18,19,21,29,31,35,36,40],warn:11,weak:40,weakli:16,weari:18,weekli:21,well:[15,16,18,21,27,29,31,39,40],wen:30,were:40,west:[31,39],wether:31,what:[9,11,17,21,27,31,40],whatev:[35,36,40],when:[10,11,19,27,29,30,31,35,36,39,40,46],where:[7,21,22,32,35,40],whether:[8,18,39,40],which:[7,8,9,13,16,17,19,20,21,27,29,31,32,35,36,37,38,39,40,46],white:40,whitespac:40,whithout:[35,39],whitout:40,whole:[8,27,30,38,39,40,46],whose:[20,35],why:[9,11],wich:31,wide:35,wider:40,width:[8,11,16,27,30,31,40],width_vdd:27,width_vss:27,wil:18,window:[35,36,40],wirelength:40,witch:17,within:[31,40],without:[16,17,27,29,30,31,40],wok:30,won:11,word:[30,31,32],word_length:32,work:[9,16,17,20],work_dir:16,work_lib:18,workhors:15,working_library:35,worklib:35,world:16,wors:40,would:[10,11,18,31,35],wrap:[7,9,11],wrapper:[9,11,23,35],write:[11,15,18,30,31,32,35,39,40],written:[9,11,12,13,16,18,20,35],wrong:31,www:[36,43,46,47],wysiwyg:40,x_grid:27,xml:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,31,33,34,35,36,37,38,39,40,41,42,43,44,46,47],xnor2:30,xnor2_8:30,xnor2mask_0b000111:30,xnor:30,xor2:[30,31],xor2_8:30,xor:30,xored:30,xoring:30,xr2:31,xr2_1:[21,23],xr2_2:[21,23],xr2_x1:[21,23],xr2_x2:[21,23],xxxx:36,y_grid:27,y_slice:27,yacc:36,year:[11,40],yet:[8,31,36,40],yield:31,yifei:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,33,34,35,36,37,38,39,40,41,42,43,44,46,47],yosi:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21],you:[11,16,17,18,19,20,21,22,23,25,26,27,30,31,32,35,36,39,40],your:[1,11,16,17,19,22],zero:[11,27,30,31],zoom:40},titles:["Hurricane/Analog Reference","Comprenhensive Table of Contents","CRL Core Reference","Hurricane Reference","Katabatic Reference","Kite Reference","Oroshi Reference","2. Basic File Structure and CMake configuration","4. Case 2 - Hierarchy of DBo Derived Classes","3. Case 1 - DBo Derived, Standalone","6. Encapsulating DbU","1. Introduction","7. No C++ Hurricane::Name encapsulation","5. Case 3 - Non-DBo Standalone Classe","Hurricane Python/C++ API Tutorial","9. Advanced Topics","3. Making a Standard Cell – Layout","5. Make a script runnable through cgt","4. Manipulating Cells, Nets and Components","2. Setting up the Environment","1. Introduction","6. Making a hierarchical Cell – Netlist","7. Working in real mode","8. Tool Engines (CRL Core)","<no title>","Hurricane+Python Tutorial","Hurricane+Python Tutorial","Symbolic Layout","RDS – Symbolic to Real Conversion in Alliance","Stratus Developper’s Guide","DpGen generators manual","Stratus User’s Guide","Patterns module User’s Guide","Stratus : Netlist Capture Language","Unicorn Reference","Coriolis Configuration & Initialisation","Installation","Credits & License","Release Notes","Python Interface for Hurricane / Coriolis","CGT - The Graphical Interface","Coriolis User’s Guide","Viewer Reference","DEF API Reference","<no title>","Welcome to Coriolis’s documentation!","LEF API Reference","LEF/DEF Language Reference"],titleterms:{"boolean":31,"case":[8,9,13,21],"class":[8,9,13,29],"function":[15,31],"new":16,about:[11,18],abutment:16,add:31,addaccu:31,adding:16,additionn:36,addpat:32,advanc:15,affect:31,affect_ani:32,affect_fix:32,affect_int:32,aliment:31,allianc:[28,35,36,40],allianceframework:[16,18],am2901:39,analog:0,anoth:31,api:[14,43,46],architectur:35,argument:31,arithmet:31,associat:9,attribut:29,base:[8,40],basic:7,blif:22,botch:11,box:16,branch:36,breakpoint:17,buffer:31,build:36,call:46,callback:46,captur:[33,40],cell:[16,18,21,31],cgt:[17,40],chip:39,choic:11,circuit:31,clock:39,cmake:7,collect:18,command:40,comparison:31,complet:[16,21,23],compon:[16,18,27],comprenhens:1,configur:[7,19,31,35,40],connect:21,connector:31,constant:31,constructor:20,content:[1,26],control:40,convers:28,copyupseg:31,core:[2,16,23],corioli:[35,36,39,41,45],coriolisenv:36,creat:[16,21],creation:31,credit:37,crl:[2,16,23],data:[31,40],dbo:[8,9,13],dbu:[10,16],declar:32,declar_interfac:32,def:[43,47],defab:31,deriv:[8,9],descript:[29,31,32],design:[11,40],detail:40,devel:36,developp:29,directori:36,disclaim:11,disk:16,document:45,dpgen:[30,31],dpgenadsb2f:30,dpgenand2:30,dpgenand3:30,dpgenand4:30,dpgenbuff:30,dpgenbus:30,dpgenconst:30,dpgendff:30,dpgendfft:30,dpgenfifo:30,dpgeninv:30,dpgenmux2:30,dpgennand2:30,dpgennand2mask:30,dpgennand3:30,dpgennand4:30,dpgennbus:30,dpgennmux2:30,dpgennor2:30,dpgennor2mask:30,dpgennor3:30,dpgennor4:30,dpgennul:30,dpgenor2:30,dpgenor3:30,dpgenor4:30,dpgenram:30,dpgenrf1:30,dpgenrf1d:30,dpgenrom2:30,dpgenrom4:30,dpgensff:30,dpgensfft:30,dpgenshift:30,dpgenshrot:30,dpgenxnor2:30,dpgenxnor2mask:30,dpgenxor2:30,editor:31,encapsul:[10,12],engine:23,environ:[19,36],error:31,etesian:[23,40],exampl:[16,21,23,31,32,39],execut:[31,40],extens:31,facil:31,file:[7,8,9,13,16,19,21,22,27,31,35],fillcel:31,filter:40,first:[11,35],fix:36,from:21,gener:[20,30,31,35],get:16,getrefxy:31,global:40,graphic:40,grid:27,guid:[29,31,32,41],hack:35,head:9,header:[8,9,13],helper:35,hierarch:[15,21],hierarchi:8,highlight:31,hook:36,how:31,hurrican:[0,3,12,14,16,18,25,26,39,40],hypernet:15,implement:46,indice:45,initialis:35,inspector:40,installat:36,instanc:[21,29,31],instanci:31,instanciat:31,instanti:31,interfac:[39,40],intermedi:8,introduct:[11,20,31],katabat:4,katana:23,kind:20,kite:[5,40],knik:40,lambda:27,languag:[33,47],layer:[16,40],layout:[16,27,31],lef:[22,46,47],librari:[9,31],licens:37,line:40,link:[9,31],list:31,load:[18,22,35,40],look:40,macos:36,make:[16,17,21],manipul:18,manual:30,map:31,mbk_to_rds_bigvia_hole:27,mbk_to_rds_bigvia_metal:27,mbk_to_rds_segment:27,mbk_to_rds_via:27,mbk_wiresetting:27,measur:16,mechan:16,memento:40,method:[29,31,32],miscella:15,miscellan:40,mode:[22,40],model:29,modul:[8,9,31,32],multiplexor:31,name:[12,31],namespac:9,net:[16,18,21,29,31],netlist:[21,31,33,40],non:13,note:[38,46],occurrenc:15,oper:31,option:40,order:46,oroshi:6,packag:[31,36],pad:31,param:31,paramet:[29,31,32,40],part:[9,32],path:[19,31],pattern:[31,32],pattern_begin:32,pattern_end:32,patwrit:32,physic:[21,27],place:[21,31],placebottom:31,placecentr:31,placecontact:31,placeglu:31,placeleft:31,placement:39,placepin:31,placer:[23,40],placeref:31,placeright:31,placeseg:31,placetop:31,plug:21,plugin:39,power:21,powerr:31,print:40,provid:31,python:[8,9,14,25,26,39,40],rail:31,rds:[27,28],real:[22,28],recurs:39,refer:[0,2,3,4,5,6,34,42,43,46,47],regist:31,regular:21,releas:38,requir:36,resizeab:31,restrict:18,rout:31,routeck:31,router:[23,40],routingpad:[15,21],rsave:39,runnabl:17,save:[16,39],script:[17,40],second:35,segment:27,select:[35,40],session:16,set:[16,19,36,40],setrefin:31,share:9,shifter:31,shortcut:40,signal:31,simpl:39,snapshot:40,softwar:35,some:31,special:21,stage:35,standalon:[9,13],standard:16,stimuli:31,stratu:[29,31,33,40],structur:7,suppli:21,symbol:[27,28],synopsi:[29,31],syntax:[31,32],synthesi:40,synthet:40,tab:40,tabl:[1,27,45],technic:11,techno:19,technolog:35,termin:8,terminolog:20,test:31,through:17,tool:[23,35,40],topic:15,tran:15,transform:21,tree:[36,39],tutori:[14,25,26],type:9,under:[36,40],understand:46,unicorn:34,unit:[16,46],useful:31,user:[19,31,32,41],using:17,valu:[27,31],variou:20,view:21,viewer:[40,42],virtual:31,welcom:45,wire:21,work:22,yosi:[22,40],your:31}})
\ No newline at end of file
diff --git a/documentation/etc/definitions.rst b/documentation/etc/definitions.rst
index 013d3088..7329285c 100644
--- a/documentation/etc/definitions.rst
+++ b/documentation/etc/definitions.rst
@@ -105,7 +105,7 @@
.. |Python| replace:: :sc:`Python`
.. |Linux| replace:: :sc:`Linux`
.. |MacPorts| replace:: :sc:`MacPorts`
-.. |devtoolset2| replace:: :cb:`devtoolset2`
+.. |devtoolset| replace:: :cb:`devtoolset`
.. |boost| replace:: :cb:`boost`
.. |Qt| replace:: :sc:`qt`
.. |tty| replace:: :cb:`tty`
diff --git a/etesian/src/AddFeeds.cpp b/etesian/src/AddFeeds.cpp
index 0b34b057..40c91cd6 100644
--- a/etesian/src/AddFeeds.cpp
+++ b/etesian/src/AddFeeds.cpp
@@ -298,7 +298,6 @@ namespace {
namespace Etesian {
- using Hurricane::ForEachIterator;
using Hurricane::DataBase;
using Hurricane::UpdateSession;
using Hurricane::Occurrence;
@@ -312,14 +311,14 @@ namespace Etesian {
Box topCellAb = getCell()->getAbutmentBox();
if (not topCellAb.isEmpty()) {
- forEach ( Occurrence, ioccurrence, getCell()->getLeafInstanceOccurrences() )
+ for ( Occurrence occurrence : getCell()->getLeafInstanceOccurrences() )
{
- Instance* instance = static_cast((*ioccurrence).getEntity());
+ Instance* instance = static_cast(occurrence.getEntity());
Cell* masterCell = instance->getMasterCell();
Box instanceAb = masterCell->getAbutmentBox();
Transformation instanceTransf = instance->getTransformation();
- (*ioccurrence).getPath().getTransformation().applyOn( instanceTransf );
+ occurrence.getPath().getTransformation().applyOn( instanceTransf );
instanceTransf.applyOn( instanceAb );
if (not topCellAb.contains(instanceAb)) continue;
@@ -371,9 +370,9 @@ namespace Etesian {
sliceHoles.setSpinSlice0( _yspinSlice0 );
- forEach ( Occurrence, ioccurrence, getCell()->getLeafInstanceOccurrences() )
+ for ( Occurrence occurrence : getCell()->getLeafInstanceOccurrences() )
{
- Instance* instance = static_cast((*ioccurrence).getEntity());
+ Instance* instance = static_cast(occurrence.getEntity());
Cell* masterCell = instance->getMasterCell();
if (CatalogExtension::isFeed(masterCell)) {
@@ -384,7 +383,7 @@ namespace Etesian {
Box instanceAb = masterCell->getAbutmentBox();
Transformation instanceTransf = instance->getTransformation();
- (*ioccurrence).getPath().getTransformation().applyOn( instanceTransf );
+ occurrence.getPath().getTransformation().applyOn( instanceTransf );
instanceTransf.applyOn( instanceAb );
if (not topCellAb.contains(instanceAb)) {
diff --git a/etesian/src/EtesianEngine.cpp b/etesian/src/EtesianEngine.cpp
index cf16728c..204dacc6 100644
--- a/etesian/src/EtesianEngine.cpp
+++ b/etesian/src/EtesianEngine.cpp
@@ -83,7 +83,10 @@ namespace {
if (not rp->getOccurrence().getPath().getHeadPath().isEmpty())
name << getString(rp->getOccurrence().getPath().getHeadPath().getName()) << ":";
- name << "I." << getString(rp->getOccurrence().getPath().getTailInstance()->getName());
+ if (rp->getOccurrence().getPath().getTailInstance())
+ name << "I." << getString(rp->getOccurrence().getPath().getTailInstance()->getName());
+ else
+ name << "C";
return name.str();
}
@@ -129,6 +132,7 @@ namespace {
{
Cell* masterCell = rp->getOccurrence().getMasterCell();
Component* component = rp->_getEntityAsComponent();
+
// TODO: verify that it doesn't assume that the orientation is North
Box masterBox = masterCell->getAbutmentBox();
@@ -373,12 +377,6 @@ namespace Etesian {
double rows = std::ceil( sqrt( gcellLength/aspectRatio ) );
double columns = std::ceil( gcellLength / rows );
- cmess1 << " o Creating abutment box (margin:" << (spaceMargin*100.0)
- << "% aspect ratio:" << (aspectRatio*100.0)
- << "% g-length:" << (cellLength/DbU::toLambda(getSliceHeight()))
- << ")" << endl;
- cmess1 << " - GCell grid: [" << (int)columns << "x" << (int)rows << "]" << endl;
-
UpdateSession::open();
for ( auto ioccurrence : feedOccurrences ) {
static_cast(ioccurrence.getEntity())->destroy();
@@ -395,6 +393,13 @@ namespace Etesian {
) );
UpdateSession::close();
if (_viewer) _viewer->getCellWidget()->fitToContents();
+
+ cmess1 << " o Creating abutment box (margin:" << (spaceMargin*100.0)
+ << "% aspect ratio:" << (aspectRatio*100.0)
+ << "% g-length:" << (cellLength/DbU::toLambda(getSliceHeight()))
+ << ")" << endl;
+ cmess1 << " - " << getCell()->getAbutmentBox() << endl;
+ cmess1 << " - GCell grid: [" << (int)columns << "x" << (int)rows << "]" << endl;
}
@@ -445,15 +450,17 @@ namespace Etesian {
void EtesianEngine::toColoquinte ()
{
- cmess1 << " o Converting <" << getCell()->getName() << "> into Coloquinte." << endl;
-
- resetPlacement();
-
- Dots dots ( cmess2, " ", 80, 1000 );
AllianceFramework* af = AllianceFramework::get();
DbU::Unit hpitch = getHorizontalPitch();
DbU::Unit vpitch = getVerticalPitch();
+ cmess1 << " o Converting <" << getCell()->getName() << "> into Coloquinte." << endl;
+ cmess1 << ::Dots::asString(" - H-pitch" , DbU::getValueString(hpitch)) << endl;
+ cmess1 << ::Dots::asString(" - V-pitch" , DbU::getValueString(vpitch)) << endl;
+
+ resetPlacement();
+
+ Dots dots ( cmess2, " ", 80, 1000 );
if (not cmess2.enabled()) dots.disable();
size_t instancesNb = 0;
@@ -544,6 +551,13 @@ namespace Etesian {
int_t xpos = instanceAb.getXMin() / vpitch;
int_t ypos = instanceAb.getYMin() / hpitch;
+ // if ( (ysize != 1) and not instance->isFixed() ) {
+ // cerr << Error( "EtesianEngine::toColoquinte(): Instance \"%s\" of \"%s\" is a block (height: %d)."
+ // , instanceName.c_str()
+ // , getString(masterCell->getName()).c_str()
+ // , ysize ) << endl;
+ // }
+
instances[instanceId].size = point( xsize, ysize );
instances[instanceId].list_index = instanceId;
instances[instanceId].area = static_cast(xsize) * static_cast(ysize);
@@ -644,7 +658,9 @@ namespace Etesian {
_progressReport2(" [---]" );
}
- void EtesianEngine::roughLegalize( float minDisruption, unsigned options ){
+
+ void EtesianEngine::roughLegalize ( float minDisruption, unsigned options )
+ {
using namespace coloquinte::gp;
// Create a legalizer and bipartition it until we have sufficient precision
auto legalizer = (options & ForceUniformDensity) != 0 ?
@@ -669,7 +685,9 @@ namespace Etesian {
get_rough_legalization( _circuit, _placementUB, legalizer );
}
- void EtesianEngine::feedRoutingBack(){
+
+ void EtesianEngine::feedRoutingBack ()
+ {
using namespace Katabatic;
using namespace Kite;
/*
@@ -712,7 +730,14 @@ namespace Etesian {
// Expand areas: TODO
}
- void EtesianEngine::globalPlace ( float initPenalty, float minDisruption, float targetImprovement, float minInc, float maxInc, unsigned options ){
+
+ void EtesianEngine::globalPlace ( float initPenalty
+ , float minDisruption
+ , float targetImprovement
+ , float minInc
+ , float maxInc
+ , unsigned options )
+ {
using namespace coloquinte::gp;
float_t penaltyIncrease = minInc;
@@ -781,7 +806,9 @@ namespace Etesian {
_updatePlacement( _placementUB );
}
- void EtesianEngine::detailedPlace ( int iterations, int effort, unsigned options ){
+
+ void EtesianEngine::detailedPlace ( int iterations, int effort, unsigned options )
+ {
using namespace coloquinte::gp;
using namespace coloquinte::dp;
@@ -841,6 +868,7 @@ namespace Etesian {
_updatePlacement( _placementUB );
}
+
void EtesianEngine::place ()
{
if(getCell()->isPlaced()){
diff --git a/etesian/src/GraphicEtesianEngine.cpp b/etesian/src/GraphicEtesianEngine.cpp
index 336dd219..bd37c00d 100644
--- a/etesian/src/GraphicEtesianEngine.cpp
+++ b/etesian/src/GraphicEtesianEngine.cpp
@@ -126,15 +126,17 @@ namespace Etesian {
_viewer = viewer;
- if (_viewer->hasMenuAction("placeAndRoute.etesianPlace")) {
+ if (_viewer->hasMenuAction("placeAndRoute.etesianPlaceBlock")) {
cerr << Warning( "GraphicEtesianEngine::addToMenu() - Etesian placer already hooked in." ) << endl;
return;
}
- _viewer->addToMenu( "placeAndRoute.etesianPlace"
- , "Etesian - Plac&e"
- , "Run the Etesian placer"
+ _viewer->addToMenu( "placeAndRoute.etesianPlaceBlock"
+ , "Plac&e Block"
+ , "Place a block [Etesian]"
, std::bind(&GraphicEtesianEngine::_place,this)
+ , QIcon()
+ , "placeAndRoute.placeChip"
);
}
diff --git a/etesian/src/PyEtesianEngine.cpp b/etesian/src/PyEtesianEngine.cpp
index aa981c32..5378772d 100644
--- a/etesian/src/PyEtesianEngine.cpp
+++ b/etesian/src/PyEtesianEngine.cpp
@@ -89,7 +89,7 @@ extern "C" {
HTRY
PyObject* arg0;
- if (not ParseOneArg("Etesian.get", args, CELL_ARG, &arg0)) return NULL;
+ if (not ParseOneArg("Etesian.create", args, CELL_ARG, &arg0)) return NULL;
Cell* cell = PYCELL_O(arg0);
etesian = EtesianEngine::get(cell);
diff --git a/flute/CMakeLists.txt b/flute/CMakeLists.txt
new file mode 100644
index 00000000..b876818e
--- /dev/null
+++ b/flute/CMakeLists.txt
@@ -0,0 +1,20 @@
+# -*- mode: CMAKE explicit-buffer-name: "CMakeLists.txt" -*-
+
+ set( CMAKE_LEGACY_CYGWIN_WIN32 0 )
+ project( FLUTE )
+
+ cmake_minimum_required( VERSION 2.8.9 )
+
+ set( ignoreVariables "${BUILD_DOC}" )
+
+ list( INSERT CMAKE_MODULE_PATH 0 "${DESTDIR}$ENV{CORIOLIS_TOP}/share/cmake/Modules/" )
+ find_package( Bootstrap REQUIRED )
+ setup_project_paths( CORIOLIS )
+ print_cmake_module_path()
+
+ set_cmake_policies()
+ check_distribution()
+ setup_sysconfdir( "${CMAKE_INSTALL_PREFIX}" )
+
+ add_subdirectory( src )
+ add_subdirectory( cmake_modules )
diff --git a/flute/cmake_modules/CMakeLists.txt b/flute/cmake_modules/CMakeLists.txt
new file mode 100644
index 00000000..bd988de9
--- /dev/null
+++ b/flute/cmake_modules/CMakeLists.txt
@@ -0,0 +1,2 @@
+
+ install( FILES FindFLUTE.cmake DESTINATION share/cmake/Modules )
diff --git a/flute/cmake_modules/FindFLUTE.cmake b/flute/cmake_modules/FindFLUTE.cmake
new file mode 100644
index 00000000..81fd8433
--- /dev/null
+++ b/flute/cmake_modules/FindFLUTE.cmake
@@ -0,0 +1,31 @@
+# - Find the FLUTE includes and libraries.
+# The following variables are set if Coriolis is found. If FLUTE is not
+# found, FLUTE_FOUND is set to false.
+# FLUTE_FOUND - True when the Coriolis include directory is found.
+# FLUTE_INCLUDE_DIR - the path to where the Coriolis include files are.
+# FLUTE_LIBRARIES - The path to where the Coriolis library files are.
+
+
+set( FLUTE_INCLUDE_PATH_DESCRIPTION "The directory containing the FLUTE include files. E.g /usr/local/include/coriolis/flute/3.1 or /soc/coriolis2/include/coriolis/flute/3.1" )
+set( FLUTE_DIR_MESSAGE "Set the FLUTE_INCLUDE_DIR cmake cache entry to the ${FLUTE_INCLUDE_PATH_DESCRIPTION}" )
+
+if( UNIX )
+ #
+ # Look for an installation.
+ #
+ find_path( FLUTE_INCLUDE_PATH NAMES flute.h
+ PATHS ${CORIOLIS_DIR_SEARCH}
+ PATH_SUFFIXES include/flute/3.1
+ DOC "${FLUTE_INCLUDE_PATH_DESCRIPTION}"
+ )
+
+ find_library( FLUTE_LIBRARY_PATH NAMES flute
+ PATHS ${CORIOLIS_DIR_SEARCH}
+ PATH_SUFFIXES lib${LIB_SUFFIX}
+ DOC "${FLUTE_INCLUDE_PATH_DESCRIPTION}"
+ )
+
+ set_libraries_path (FLUTE FLUTE)
+ hurricane_check_libraries(FLUTE)
+
+endif( UNIX )
diff --git a/flute/src/3.1/CMakeLists.txt b/flute/src/3.1/CMakeLists.txt
new file mode 100644
index 00000000..7629d145
--- /dev/null
+++ b/flute/src/3.1/CMakeLists.txt
@@ -0,0 +1,31 @@
+# -*- mode: CMAKE explicit-buffer-name: "CMakeLists.txt" -*-
+
+ include_directories ( ${FLUTE_SOURCE_DIR}/src/3.1
+ )
+
+ set ( includes flute.h
+ dl.h
+ mst2.h
+ err.h
+ heap.h
+ dist.h
+ global.h
+ neighbors.h
+ )
+ set ( cpps flute.cpp
+ flute_mst.cpp
+ dist.cpp
+ dl.cpp
+ err.cpp
+ mst2.cpp
+ heap.cpp
+ neighbors.cpp
+ )
+
+ add_library ( flute ${cpps} )
+ set_target_properties ( flute PROPERTIES VERSION 3.1 SOVERSION 3 )
+
+ install ( TARGETS flute DESTINATION lib${LIB_SUFFIX} )
+ install ( FILES ${includes} DESTINATION include/flute/3.1 )
+ install ( FILES POST9.dat
+ POWV9.dat DESTINATION share/flute/3.1 )
diff --git a/flute/src/3.1/ChangeLog.txt b/flute/src/3.1/ChangeLog.txt
new file mode 100755
index 00000000..809cc42f
--- /dev/null
+++ b/flute/src/3.1/ChangeLog.txt
@@ -0,0 +1,40 @@
+Version 1.0 [Apr. 2004]
+ * Wirelength estimation based on the idea of ICCAD 04 paper.
+
+Version 2.0 [Feb. 16, 2005]
+ * RSMT construction and Wirelength estimation based on the idea of ISPD
+ 05 paper.
+
+Version 2.1 [Mar. 18, 2005]
+ * The program flute-ckt and associated files are added to compute the
+ FLUTE wirelength for a circuit in bookshelf format.
+
+Version 2.2 [Oct. 16, 2005]
+ * The net breaking technique is improved by incorporating the HPWL based
+ estimation in ICCAD 04 paper.
+ * The option to remove duplicated pins is added.
+ * The code is reorganized.
+
+Version 2.3 [Sep. 23, 2006]
+ * PORT is renamed to POST (Potentially Optimal Steiner Tree)
+ * The function readLUT() is rewritten to significantly cut the POWV
+ and POST reading time.
+
+Version 2.4 [Jan. 16, 2007]
+ * Internal parameters of flutes_wl_MD() and flutes_MD() are tuned to
+ improve runtime-quality tradeoff.
+ * The file size of POST9.dat is reduced by improved encoding.
+ * The function readLUT() is improved to speed up the reading of POST9.dat.
+ * Bookshelf files for ibm01 is included to demonstrate program flute-ckt.
+
+Version 2.5 [Jun. 20, 2007]
+ * Local refinement technique is added to improve runtime-accuracy
+ tradeoff for high accuracy.
+
+Version 3.0 [Apr. 10, 2008]
+ * Implemented the net breaking and merging ideas of VLSIDAT 08 paper to
+ achieve much better scalability and accuracy for high-degree nets.
+
+Version 3.1 [Feb. 28, 2011]
+ * Functions in bookshelf_IO.c and memAlloc.c used by flute-ckt are
+ improved to speed up the reading of GSRC Bookshelf format circuits.
diff --git a/flute/src/3.1/Makefile b/flute/src/3.1/Makefile
new file mode 100755
index 00000000..eae3a599
--- /dev/null
+++ b/flute/src/3.1/Makefile
@@ -0,0 +1,26 @@
+CC = gcc
+CFLAGS = -O3 -I.
+
+SRC = dist.c dl.c err.c heap.c mst2.c neighbors.c \
+ bookshelf_IO.c memAlloc.c flute.c flute_mst.c
+OBJ = $(SRC:.c=.o)
+
+all: flute-net flute-ckt rand-pts
+
+flute-net: flute-net.c ${OBJ}
+ $(CC) $(CFLAGS) -o flute-net flute-net.c ${OBJ} -lm
+
+flute-ckt: flute-ckt.c ${OBJ}
+ $(CC) $(CFLAGS) -o flute-ckt flute-ckt.c ${OBJ} -lm
+
+rand-pts: rand-pts.c
+ $(CC) $(CFLAGS) -o rand-pts rand-pts.c
+
+flute.o: flute.c flute.h
+ $(CC) $(CFLAGS) -c -o flute.o flute.c
+
+flute_mst.o: flute_mst.c flute.h
+ $(CC) $(CFLAGS) -c -o flute_mst.o flute_mst.c
+
+clean:
+ rm -f *.o core*
diff --git a/knik/src/flute-3.1/etc/POST9.dat b/flute/src/3.1/POST9.dat
old mode 100644
new mode 100755
similarity index 100%
rename from knik/src/flute-3.1/etc/POST9.dat
rename to flute/src/3.1/POST9.dat
diff --git a/knik/src/flute-3.1/etc/POWV9.dat b/flute/src/3.1/POWV9.dat
old mode 100644
new mode 100755
similarity index 100%
rename from knik/src/flute-3.1/etc/POWV9.dat
rename to flute/src/3.1/POWV9.dat
diff --git a/flute/src/3.1/Readme b/flute/src/3.1/Readme
new file mode 100755
index 00000000..5b9da7ae
--- /dev/null
+++ b/flute/src/3.1/Readme
@@ -0,0 +1,40 @@
+-------------- FLUTE - Version 3.1 -----------------
+ by
+ Chris C.-N. Chu
+ Dept. of ECpE, Iowa State University
+ Copyright (c) - 2005
+ Iowa State University Research Foundation, Inc.
+----------------------------------------------------
+
+This package contains the following files:
+
+ flute.c -- The rectilinear Steiner minimal tree and wirelength estimation
+ algorithm described in the ICCAD 04 and ISPD 05 papers with
+ some improvements described in TCAD 07 paper.
+ flute.h -- The interface to use flute.
+ flute_mst.c -- The net breaking and merging techniques described in the
+ VLSIDAT 08 paper.
+ dist.[ch], dl.[ch], err.[ch], heap.[ch], mst2.[ch], neighbors.[ch],
+ global.h -- Utility functions used by flute_mst.c
+ POWV9.dat -- The lookup-table of optimal POWVs up to degree 9.
+ POST9.dat -- The lookup-table for optimal Steiner trees up to degree 9.
+ flute-net.c -- A program to evaluate the wirelength of a net. It takes
+ input from stdin as a list of points.
+ rand-pts.c -- A program to generate a list of random points.
+ flute-ckt.c -- A program to find FLUTE and half-perimeter wirelength
+ of a circuit in bookshelf format.
+ bookshelf_IO.[ch] -- Functions for flute-ckt.c to read bookshelf files.
+ memAlloc.[ch] -- Functions for flute-ckt.c to allocate memory.
+ ibm01/ibm01.* -- ibm01 bookshelf files that can be read by flute-ckt.c
+ license.txt -- License agreement.
+ ChangeLog.txt
+ Makefile
+ Readme
+
+To run the programs, first do a 'make'. POWV9.dat and POST9.dat is assume
+to be in the current directory. Some example commands:
+
+ rand-pts | flute-net
+ rand-pts 20 | flute-net // 20-pin nets
+ rand-pts -r 20 | flute-net // randomized
+ flute-ckt ibm01 ibm01.aux ibm01/ibm01.pl
diff --git a/flute/src/3.1/bookshelf_IO.cpp b/flute/src/3.1/bookshelf_IO.cpp
new file mode 100755
index 00000000..216ccb0e
--- /dev/null
+++ b/flute/src/3.1/bookshelf_IO.cpp
@@ -0,0 +1,1208 @@
+/* ----------- FastPlace - Version 3.1 ----------------
+ by
+ Natarajan Viswanathan and Chris C.-N. Chu
+ Dept. of ECpE, Iowa State University
+ Copyright (c) - 2004
+Iowa State University Research Foundation, Inc.
+--------------------------------------------------------*/
+/* --------------------------------------------------------------------------
+ Contains routines to:
+ - Read and Write the benchmark files in Bookshelf format
+----------------------------------------------------------------------------*/
+
+#include
+#include
+#include
+#include
+#include
+
+#include "memAlloc.h"
+#include "bookshelf_IO.h"
+
+namespace Flute {
+
+#define hashsize(n) ((uint32_t)1<<(n))
+#define hashmask(n) (hashsize(n)-1)
+#define rot(x, k) (((x)<<(k)) | ((x)>>(32-(k))))
+#define mix(a,b,c) \
+{ \
+ a -= c; a ^= rot(c, 4); c += b; \
+ b -= a; b ^= rot(a, 6); a += c; \
+ c -= b; c ^= rot(b, 8); b += a; \
+ a -= c; a ^= rot(c,16); c += b; \
+ b -= a; b ^= rot(a,19); a += c; \
+ c -= b; c ^= rot(b, 4); b += a; \
+}
+#define final(a,b,c) \
+{ \
+ c ^= b; c -= rot(b,14); \
+ a ^= c; a -= rot(c,11); \
+ b ^= a; b -= rot(a,25); \
+ c ^= b; c -= rot(b,16); \
+ a ^= c; a -= rot(c,4); \
+ b ^= a; b -= rot(a,14); \
+ c ^= b; c -= rot(b,24); \
+}
+
+
+/*-- extern variables --*/
+ // from createHash()
+ char **cellName = NULL;
+
+ // from readAuxFile()
+ char *nodesFile = NULL;
+ char *netsFile = NULL;
+ char *wtsFile = NULL;
+ char *sclFile = NULL;
+ char *plFile = NULL;
+ char *benchmarkName = NULL;
+
+ // from readNodesFile()
+ int movableNodes, numTerminals;
+ float averageCellWidth;
+ float *cellWidth = NULL;
+ float *cellHeight = NULL;
+ float *cellArea = NULL;
+
+ // from readNetsFile()
+ int numNets, numPins;
+ int *netlist = NULL;
+ int *netlistIndex = NULL;
+ float *xPinOffset = NULL;
+ float *yPinOffset = NULL;
+ char **netName = NULL;
+
+ // from readPlFile()
+ float *xCellCoord = NULL;
+ float *yCellCoord = NULL;
+ char **cellOrientation = NULL;
+
+ // from readSclFile()
+ ROW *core_row = NULL;
+ int numRows, numRowBlockages;
+ float siteOriginY, siteEndY, coreHeight;
+ float siteOriginX, siteEndX, coreWidth;
+ float minX, maxX, minY, maxY;
+ float coreRowHeight;
+ float *xRowBlockage = NULL;
+ float *yRowBlockage = NULL;
+ float *widthRowBlockage = NULL;
+
+ // from readWtsFile()
+ float *netWeight = NULL;
+
+
+/*-- global variables --*/
+ typedef struct nodesHash NODES;
+ struct nodesHash {
+ char *name;
+ unsigned long index;
+ };
+ NODES **NodesInfo = NULL;
+ NODES **NetsInfo = NULL;
+ long hashSize, hashBits;
+ unsigned long *RN = NULL;
+ unsigned char *hashFlag = NULL;
+
+ int numNodes;
+ char error_text[BUFFERSIZE];
+
+
+/*-- functions --*/
+ void createHash(char benchmarkPath[], char nodesFile[]);
+ inline uint32_t get_hashfunc(const void *key, size_t length, uint32_t initval);
+ void freeHash();
+ void readAuxFile(char benchmarkPath[], char auxFile[]);
+ inline long getIndex(char temp[]);
+ void readNodesFile(char benchmarkPath[], char nodesFile[]);
+ void readNetsFile(char benchmarkPath[], char netsFile[]);
+ void readPlFile(char benchmarkPath[], char plFile[]);
+ void readSclFile(char benchmarkPath[], char sclFile[]);
+ void readWtsFile(char benchmarkPath[], char wtsFile[], int net_weights);
+ void writePlFile(char outputDir[], char fileName[], float xCoord[], float yCoord[],
+ int totalNodes);
+
+
+/* -----------------------------------------------------------
+ Reads the .nodes file and creates a hash linking cell name
+ to cell index for all the nodes in the circuit
+ (movable nodes + fixed nodes + I/O pads)
+
+ creates extern vars:
+ cellName[]
+----------------------------------------------------------- */
+void createHash(char benchmarkPath[], char nodesFile[])
+{
+ FILE *fp;
+ char file_name[BUFFERSIZE], temp[BUFFERSIZE], node_type[50];
+ char line[LINESIZE];
+ float nodeWidth, nodeHeight;
+ long j, nonpin_ptr, pin_ptr;
+ long R, hashfunc, RN_index;
+ int node_count;
+
+
+ strcpy(file_name, benchmarkPath);
+ strcat(file_name, "/");
+ strcat(file_name, nodesFile);
+
+ if((fp=fopen(file_name, "r")) == NULL) {
+ sprintf(error_text, "bookshelf_IO: Cannot open: %s file", file_name);
+ runtimeError(error_text);
+ }
+
+ numNodes = numTerminals = 0;
+ while(!feof(fp)) {
+ fgets(line, LINESIZE, fp);
+ sscanf(line, "%s\t%*s\n", temp);
+
+ if(strlen(line) < 5 || temp[0] == '#' || strcmp(temp, "UCLA") == 0)
+ continue;
+
+ if(strcmp(temp, "NumNodes") == 0) {
+ sscanf(line, "NumNodes\t:\t%d\n", &numNodes);
+ } else if(strcmp(temp, "NumTerminals") == 0) {
+ sscanf(line, "NumTerminals\t:\t%d\n", &numTerminals);
+ break;
+ } else {}
+ }
+ fclose(fp);
+
+ if(numNodes == 0) {
+ sprintf(error_text, "bookshelf_IO: NumNodes = %d", numNodes);
+ runtimeError(error_text);
+ }
+
+ // defining and allocating hash variables
+ hashBits = 3+(long)(log(numNodes)/log(2));
+ hashSize = hashsize(hashBits);
+
+ if(NodesInfo == NULL) {
+ NodesInfo = (NODES **) malloc(hashSize*sizeof(NODES *));
+ if(!NodesInfo)
+ runtimeError("bookshelf_IO: allocation failure in createNodesHash()");
+ } else {
+ runtimeError("bookshelf_IO: NodesHash is not NULL");
+ }
+ for(j=0; j= hashSize) {
+ sprintf(error_text, "bookshelf_IO: Cannot fill %s in hash table", temp);
+ runtimeError(error_text);
+ }
+
+ NodesInfo[hashfunc] = (NODES *) malloc(sizeof(NODES));
+ NodesInfo[hashfunc]->name = cellName[pin_ptr];
+ NodesInfo[hashfunc]->index = pin_ptr;
+ hashFlag[hashfunc] = 1;
+
+ pin_ptr++;
+
+ } else {
+
+ // create array to save cell name
+ cellName[nonpin_ptr] = (char *) malloc((strlen(temp)+1)*sizeof(char));
+ strcpy(cellName[nonpin_ptr], temp);
+
+ // create a hash table for name searching
+ hashfunc = (long)get_hashfunc(cellName[nonpin_ptr],
+ strlen(cellName[nonpin_ptr])*sizeof(char),
+ 13);
+ hashfunc = (hashfunc & hashmask(hashBits));
+
+ RN_index = 1;
+ while(hashFlag[hashfunc] != 0 && RN_index < hashSize) {
+ hashfunc = ((hashfunc + RN[RN_index]) & hashmask(hashBits));
+ RN_index++;
+ }
+
+ if(hashfunc >= hashSize) {
+ sprintf(error_text, "bookshelf_IO: Cannot fill %s in hash table", temp);
+ runtimeError(error_text);
+ }
+
+ NodesInfo[hashfunc] = (NODES *) malloc(sizeof(NODES));
+ NodesInfo[hashfunc]->name = cellName[nonpin_ptr];
+ NodesInfo[hashfunc]->index = nonpin_ptr;
+ hashFlag[hashfunc] = 1;
+
+ nonpin_ptr++;
+ }
+ }
+
+ fclose(fp);
+ if(node_count != numNodes) {
+ sprintf(error_text, "bookshelf_IO: NumNodes (%d) != Number of Node descriptions (%d)",
+ numNodes, node_count);
+ runtimeError(error_text);
+ }
+}
+
+
+/* -----------------------------------------------------------------------
+ hash function generator
+
+ By Bob Jenkins, 2006. bob_jenkins@burtleburtle.net. You may use this
+ code any way you wish, private, educational, or commercial. It's free.
+ http://burtleburtle.net/bob/hash/doobs.html
+----------------------------------------------------------------------- */
+inline uint32_t get_hashfunc(const void *key, size_t length, uint32_t initval)
+{
+ uint32_t a,b,c; // internal state
+
+
+ // Set up the internal state
+ a = b = c = 0xdeadbeef + ((uint32_t)length) + initval;
+
+ // need to read the key one byte at a time
+ const uint8_t *k = (const uint8_t *)key;
+
+ // all but the last block: affect some 32 bits of (a,b,c)
+ while (length > 12) {
+ a += k[0];
+ a += ((uint32_t)k[1])<<8;
+ a += ((uint32_t)k[2])<<16;
+ a += ((uint32_t)k[3])<<24;
+ b += k[4];
+ b += ((uint32_t)k[5])<<8;
+ b += ((uint32_t)k[6])<<16;
+ b += ((uint32_t)k[7])<<24;
+ c += k[8];
+ c += ((uint32_t)k[9])<<8;
+ c += ((uint32_t)k[10])<<16;
+ c += ((uint32_t)k[11])<<24;
+ mix(a,b,c);
+ length -= 12;
+ k += 12;
+ }
+
+ // last block: affect all 32 bits of (c)
+ switch(length) { // all the case statements fall through
+ case 12: c+=((uint32_t)k[11])<<24;
+ case 11: c+=((uint32_t)k[10])<<16;
+ case 10: c+=((uint32_t)k[9])<<8;
+ case 9 : c+=k[8];
+ case 8 : b+=((uint32_t)k[7])<<24;
+ case 7 : b+=((uint32_t)k[6])<<16;
+ case 6 : b+=((uint32_t)k[5])<<8;
+ case 5 : b+=k[4];
+ case 4 : a+=((uint32_t)k[3])<<24;
+ case 3 : a+=((uint32_t)k[2])<<16;
+ case 2 : a+=((uint32_t)k[1])<<8;
+ case 1 : a+=k[0];
+ break;
+ case 0 : return c;
+ }
+
+ final(a,b,c);
+
+ return c;
+}
+
+
+/* -----------------------------------------------------------
+ frees hash elements
+----------------------------------------------------------- */
+void freeHash()
+{
+ int j;
+
+
+ for(j=0; jname) == 0) {
+ break;
+ } else {
+ hashfunc = ((hashfunc + RN[RN_index]) & hashmask(hashBits));
+ RN_index++;
+ }
+ }
+
+ if(RN_index >= hashSize) {
+ sprintf(error_text, "bookshelf_IO: Cannot find %s in hash table", temp);
+ runtimeError(error_text);
+ }
+
+ return NodesInfo[hashfunc]->index;
+}
+
+
+/* -----------------------------------------------------------
+ Reads the .nodes file to get cell widths and heights
+
+ creates extern vars:
+ movableNodes, numTerminals, averageCellWidth,
+ cellWidth[], cellHeight[], cellArea[]
+----------------------------------------------------------- */
+void readNodesFile(char benchmarkPath[], char nodesFile[])
+{
+ FILE *fp;
+ char file_name[BUFFERSIZE], temp[BUFFERSIZE], node_type[50];
+ char line[LINESIZE];
+ long nodeIndex;
+ float nodeWidth, nodeHeight, sumWidth;
+ int node_count;
+
+
+ strcpy(file_name, benchmarkPath);
+ strcat(file_name, "/");
+ strcat(file_name, nodesFile);
+
+ if((fp=fopen(file_name, "r")) == NULL) {
+ sprintf(error_text, "bookshelf_IO: Cannot open: %s file", file_name);
+ runtimeError(error_text);
+ }
+// printf("Reading %s ...\n", nodesFile);
+
+ movableNodes = numNodes - numTerminals; // global var - num of movable cells
+ if(cellWidth == NULL && cellHeight == NULL && cellArea == NULL) {
+ cellWidth = vector(1, numNodes); // global vector giving cell widths
+ cellHeight = vector(1, numNodes); // global vector giving cell heights
+ cellArea = vector(1, numNodes); // global vector giving cell areas
+ } else {
+ runtimeError("bookshelf_IO: allocation error in readNodesFile()");
+ }
+
+ sumWidth = 0;
+ node_count = 0;
+
+ while(!feof(fp)) {
+ *line = '\0';
+ fgets(line, LINESIZE, fp);
+ sscanf(line, "%s\t%*s\n", temp);
+
+ // intermediate lines can be blanks or begin with #
+ if(strlen(line) < 5 || temp[0] == '#' || strcmp(temp, "UCLA") == 0)
+ continue;
+
+ if(strcmp(temp, "NumNodes") == 0 || strcmp(temp, "NumTerminals") == 0)
+ continue;
+
+ *node_type = '\0';
+ sscanf(line, "%s%f%f%s\n", temp, &nodeWidth, &nodeHeight, node_type);
+ node_count++;
+
+ nodeIndex = getIndex(temp);
+
+ // store cellwidth, cellheight and cellarea corresponding to nodeIndex
+ cellWidth[nodeIndex] = nodeWidth;
+ cellHeight[nodeIndex] = nodeHeight;
+ cellArea[nodeIndex] = nodeWidth*nodeHeight;
+ if(nodeIndex <= movableNodes)
+ sumWidth += nodeWidth;
+ }
+
+ // find average cell width
+ averageCellWidth = sumWidth/movableNodes;
+ averageCellWidth *= 100;
+ averageCellWidth = (int)averageCellWidth;
+ averageCellWidth /= 100;
+
+ fclose(fp);
+ if(node_count != numNodes) {
+ sprintf(error_text, "bookshelf_IO: NumNodes (%d) != Number of Node descriptions (%d)",
+ numNodes, node_count);
+ runtimeError(error_text);
+ }
+
+#if(DEBUG)
+int i;
+for(i=1; i<=movableNodes+numTerminals; i++) {
+ printf("%d %s %.2f %.2f %.2f\n", i, cellName[i], cellWidth[i], cellHeight[i], cellArea[i]);
+}
+
+printf("Avg Cell Width: %.2f \n", averageCellWidth);
+#endif
+}
+
+
+/* -----------------------------------------------------------
+ Reads the .nets file to get the netlist information
+
+ creates extern vars:
+ numNets, numPins,
+ xPinOffset[], yPinOffset[], netlist[], netlistIndex[]
+----------------------------------------------------------- */
+void readNetsFile(char benchmarkPath[], char netsFile[])
+{
+ FILE *fp;
+ char file_name[BUFFERSIZE], temp[BUFFERSIZE], nodeName[BUFFERSIZE], pinDirection[5];
+ char line[LINESIZE];
+ long nodeIndex;
+ int degree, prevElements, netNo, k, startPointer;
+ float xOffset, yOffset;
+
+
+ strcpy(file_name, benchmarkPath);
+ strcat(file_name, "/");
+ strcat(file_name, netsFile);
+
+ if((fp=fopen(file_name, "r"))==NULL) {
+ sprintf(error_text, "bookshelf_IO: Cannot open %s file", file_name);
+ runtimeError(error_text);
+ }
+
+ numNets = numPins = 0;
+ while(!feof(fp)) {
+ fgets(line, LINESIZE, fp);
+ sscanf(line, "%s\t%*s\n", temp);
+
+ if(strlen(line) < 5 || temp[0] == '#' || strcmp(temp, "UCLA") == 0)
+ continue;
+
+ if(strcmp(temp, "NumNets") == 0) {
+ sscanf(line, "NumNets\t:\t%d\n", &numNets);
+ } else if(strcmp(temp, "NumPins") == 0) {
+ sscanf(line, "NumPins\t:\t%d\n", &numPins);
+ break;
+ } else {}
+ }
+ fclose(fp);
+
+ if(numNets == 0 || numPins == 0) {
+ sprintf(error_text, "bookshelf_IO: NumNets = %d, NumPins = %d ", numNets, numPins);
+ runtimeError(error_text);
+ }
+
+ if(netlist == NULL && xPinOffset == NULL && yPinOffset == NULL &&
+ netlistIndex == NULL) {
+ // stores the netlist and pin offsets relative to the center of the cells
+ netlist = ivector(1,numPins+1);
+ xPinOffset = vector(1,numPins+1);
+ yPinOffset = vector(1,numPins+1);
+
+ // index vector for the netlist and offset vectors
+ netlistIndex = ivector(0,numNets+1);
+ } else {
+ runtimeError("bookshelf_IO: allocation error in readNetsFile()");
+ }
+
+ // inverse map b/w net name and net no
+ netName = (char **) malloc((numNets+1)*sizeof(char *));
+
+ if((fp=fopen(file_name, "r"))==NULL) {
+ sprintf(error_text, "bookshelf_IO: Cannot open %s file", file_name);
+ runtimeError(error_text);
+ }
+// printf("Reading %s ...\n", netsFile);
+
+ startPointer = k = 1;
+ netlistIndex[0] = 1;
+ prevElements = 0;
+ netNo = 0;
+
+ while(!feof(fp)) {
+ *line = '\0';
+ fgets(line, LINESIZE, fp);
+ sscanf(line, "%s\t%*s\n", temp);
+
+ if(strlen(line) < 5 || temp[0] == '#' || strcmp(temp, "UCLA") == 0)
+ continue;
+
+ if(strcmp(temp, "NumNets") == 0 || strcmp(temp, "NumPins") == 0)
+ continue;
+
+ if(strcmp(temp, "NetDegree") == 0) {
+ netNo++;
+ *temp = '\0';
+ sscanf(line, "NetDegree\t:\t%d\t%s\n", °ree, temp);
+ if(strcmp(temp, "") == 0)
+ sprintf(temp, "net_%d", netNo);
+ netName[netNo] = (char *) malloc((strlen(temp)+1)*sizeof(char));
+ strcpy(netName[netNo], temp);
+
+ netlistIndex[netNo] = netlistIndex[netNo-1] + prevElements;
+ startPointer = netlistIndex[netNo];
+ prevElements = degree;
+ k = 1;
+ } else {
+ xOffset = yOffset = 0.0;
+ *pinDirection = '\0';
+
+ sscanf(line, "%s%s", nodeName, pinDirection);
+ if(pinDirection[0] == ':')
+ sscanf(line, "%*s%*s%f%f", &xOffset, &yOffset);
+ else
+ sscanf(line, "%s%s%*s%f%f", nodeName, pinDirection, &xOffset, &yOffset);
+
+ if(strcmp(pinDirection, "") == 0 || pinDirection[0] == ':')
+ strcpy(pinDirection, "B");
+
+ nodeIndex = getIndex(nodeName);
+
+ netlist[startPointer+k-1] = nodeIndex;
+ xPinOffset[startPointer+k-1] = xOffset;
+ yPinOffset[startPointer+k-1] = yOffset;
+ k++;
+ }
+ }
+ netlistIndex[numNets+1] = netlistIndex[numNets] + prevElements;
+ netlist[netlistIndex[numNets+1]] = 0;
+
+ fclose(fp);
+ if(netNo != numNets) {
+ sprintf(error_text, "bookshelf_IO: NumNets (%d) != Number of Net descriptions (%d)",
+ numNets, netNo);
+ runtimeError(error_text);
+ }
+
+ if(netlistIndex[numNets+1]-1 != numPins) {
+ sprintf(error_text, "bookshelf_IO: NumPins (%d) != Number of Pin descriptions (%d)",
+ numPins, netlistIndex[numNets+1]-1);
+ runtimeError(error_text);
+ }
+
+#if(DEBUG)
+int i, j;
+for(i=1; i<=numNets; i++) {
+ printf("**%d** ", netlistIndex[i+1]-netlistIndex[i]);
+ for(j=netlistIndex[i]; j 99) {
+ printf("Row (%d) at coordinate (%.2f) has more than 100 subrows \n",
+ row_count, core_row[row_count].y_low);
+ printf("Please decrease the number of subrows by \n");
+ printf("creating dummy fixed nodes for the row blockages\n");
+ runtimeError("bookshelf_IO: threshold reached for #subrows per row");
+ }
+ sscanf(line, "%*s\t:\t%f\t%*s\t:\t%d\n", &subroworigin, &totalSites);
+ core_row[row_count].subrow_origin[subrow_count] = subroworigin;
+ core_row[row_count].subrow_end[subrow_count] = subroworigin + totalSites*core_row[row_count].siteSpacing;
+ subrow_count++;
+ } else if(strcmp(temp, "End")==0) {
+ break;
+ } else {
+ sprintf(error_text, "bookshelf_IO: Unknown parameter: %s", temp);
+ runtimeError(error_text);
+ }
+ } while(1);
+
+ core_row[row_count].subrow_count = subrow_count;
+ core_row[row_count].x_low = core_row[row_count].subrow_origin[0];
+ core_row[row_count].x_high = core_row[row_count].subrow_end[subrow_count-1];
+ if(core_row[row_count].siteWidth < 0.0)
+ core_row[row_count].siteWidth = core_row[row_count].siteSpacing;
+
+ row_count++;
+ }
+ }
+
+ siteOriginX = core_row[0].x_low;
+ siteEndX = core_row[0].x_high;
+ for(j=1; j siteEndX)
+ siteEndX = core_row[j].x_high;
+ }
+ siteOriginY = core_row[0].y_low;
+ siteEndY = core_row[row_count-1].y_low + core_row[row_count-1].height; // possible that height=0 for some rows in Bookshelf
+
+ coreRowHeight = (siteEndY-siteOriginY)/numRows;
+ coreHeight = siteEndY - siteOriginY; // height of placement area
+ coreWidth = siteEndX - siteOriginX; // width of placement area
+
+
+ // getting row blockage related information
+ rowBlockageCount = 0;
+ for(j=0; j 1) {
+ subrow_count = core_row[j].subrow_count;
+ if(core_row[j].subrow_origin[0] > siteOriginX) {
+ rowBlockageCount++;
+ }
+
+ if(core_row[j].subrow_end[subrow_count-1] < siteEndX) {
+ rowBlockageCount++;
+ }
+
+ for(k=1; k siteOriginX) {
+ rowBlockageCount++;
+ }
+
+ // blockage is at right end of the row
+ if(core_row[j].x_high < siteEndX) {
+ rowBlockageCount++;
+ }
+ }
+ }
+
+ xRowBlockage = vector(1, rowBlockageCount+1);
+ yRowBlockage = vector(1, rowBlockageCount+1);
+ widthRowBlockage = vector(1, rowBlockageCount+1);
+
+ numRowBlockages = 0;
+ if(rowBlockageCount > 0) {
+ for(j=0; j 1) {
+ subrow_count = core_row[j].subrow_count;
+ if(core_row[j].subrow_origin[0] > siteOriginX) {
+ numRowBlockages++;
+ xRowBlockage[numRowBlockages] = siteOriginX + 0.5*(core_row[j].subrow_origin[0] - siteOriginX);
+ yRowBlockage[numRowBlockages] = core_row[j].y_low + 0.5*core_row[j].height;
+ widthRowBlockage[numRowBlockages] = core_row[j].subrow_origin[0] - siteOriginX;
+ }
+
+ if(core_row[j].subrow_end[subrow_count-1] < siteEndX) {
+ numRowBlockages++;
+ xRowBlockage[numRowBlockages] = core_row[j].subrow_end[subrow_count-1] +
+ 0.5*(siteEndX - core_row[j].subrow_end[subrow_count-1]);
+ yRowBlockage[numRowBlockages] = core_row[j].y_low + 0.5*core_row[j].height;
+ widthRowBlockage[numRowBlockages] = siteEndX - core_row[j].subrow_end[subrow_count-1];
+ }
+
+ for(k=1; k siteOriginX) {
+ numRowBlockages++;
+ xRowBlockage[numRowBlockages] = siteOriginX + 0.5*(core_row[j].x_low - siteOriginX);
+ yRowBlockage[numRowBlockages] = core_row[j].y_low + 0.5*core_row[j].height;
+ widthRowBlockage[numRowBlockages] = core_row[j].x_low - siteOriginX;
+ }
+
+ // blockage is at right end of the row
+ if(core_row[j].x_high < siteEndX) {
+ numRowBlockages++;
+ xRowBlockage[numRowBlockages] = core_row[j].x_high + 0.5*(siteEndX - core_row[j].x_high);
+ yRowBlockage[numRowBlockages] = core_row[j].y_low + 0.5*core_row[j].height;
+ widthRowBlockage[numRowBlockages] = siteEndX - core_row[j].x_high;
+ }
+ }
+ }
+
+ if(numRowBlockages != rowBlockageCount) {
+ runtimeError("bookshelf_IO: error during createRowBlockage()");
+ }
+ }
+
+
+ // getting the chip dimensions (if there are perimeter IOs)
+ maxX = siteEndX;
+ minX = siteOriginX;
+ maxY = siteEndY;
+ minY = siteOriginY;
+ for(j=movableNodes+1; j<=numNodes; j++) {
+ if(xCellCoord[j] > maxX) maxX = xCellCoord[j];
+ else if(xCellCoord[j] < minX) minX = xCellCoord[j];
+
+ if(yCellCoord[j] > maxY) maxY = yCellCoord[j];
+ else if(yCellCoord[j] < minY) minY = yCellCoord[j];
+ }
+
+ fclose(fp);
+ if(row_count != numRows) {
+ sprintf(error_text, "bookshelf_IO: NumRows (%d) != Number of Row descriptions (%d)", numRows, row_count);
+ runtimeError(error_text);
+ }
+}
+
+
+/* -----------------------------------------------------------
+ Creates a hash linking netname to netNo
+ Reads the .wts file to get net-weights
+
+ creates extern vars:
+ netWeight[]
+----------------------------------------------------------- */
+void readWtsFile(char benchmarkPath[], char wtsFile[], int net_weights)
+{
+ FILE *fp;
+ char file_name[BUFFERSIZE], temp[BUFFERSIZE];
+ char line[LINESIZE];
+ float weight;
+ long netNo, j;
+ long R, hashfunc, RN_index;
+
+
+ if(netWeight == NULL) {
+ netWeight = vector(1, numNets);
+ for(netNo=1; netNo<=numNets; netNo++)
+ netWeight[netNo] = 1.0;
+ } else {
+ runtimeError("bookshelf_IO: allocation error in readWtsFile()");
+ }
+
+ if(net_weights) {
+
+ // defining hash variables
+ hashBits = 3+(long)(log(numNets)/log(2));
+ hashSize = hashsize(hashBits);
+
+ if(NetsInfo == NULL) {
+ NetsInfo = (NODES **) malloc(hashSize*sizeof(NODES *));
+ if(!NetsInfo)
+ runtimeError("bookshelf_IO: allocation failure in createNetsHash()");
+ } else {
+ runtimeError("bookshelf_IO: NetsHash is not NULL");
+ }
+ for(j=0; j= hashSize) {
+ sprintf(error_text, "bookshelf_IO: Cannot fill %s in hash table", netName[netNo]);
+ runtimeError(error_text);
+ }
+
+ NetsInfo[hashfunc] = (NODES *) malloc(sizeof(NODES));
+ NetsInfo[hashfunc]->name = netName[netNo];
+ NetsInfo[hashfunc]->index = netNo;
+ hashFlag[hashfunc] = 1;
+ }
+
+ strcpy(file_name, benchmarkPath);
+ strcat(file_name, "/");
+ strcat(file_name, wtsFile);
+
+ if((fp=fopen(file_name, "r")) == NULL) {
+ sprintf(error_text, "bookshelf_IO: Cannot open: %s file", file_name);
+ runtimeError(error_text);
+ }
+// printf("Reading %s ...\n", wtsFile);
+
+ while(!feof(fp)) {
+ *line = '\0';
+ fgets(line, LINESIZE, fp);
+ sscanf(line, "%s\t%*s\n", temp);
+
+ if(strlen(line) < 5 || temp[0] == '#' || strcmp(temp, "UCLA") == 0)
+ continue;
+
+ sscanf(line, "%s%f\n", temp, &weight);
+
+ // find the netNo corresponding to temp
+ hashfunc = (long)get_hashfunc(temp, strlen(temp)*sizeof(char), 13);
+ hashfunc = (hashfunc & hashmask(hashBits));
+
+ RN_index = 1;
+ while(RN_index < hashSize) {
+ if(NetsInfo[hashfunc] && strcmp(temp, NetsInfo[hashfunc]->name) == 0) {
+ break;
+ } else {
+ hashfunc = ((hashfunc + RN[RN_index]) & hashmask(hashBits));
+ RN_index++;
+ }
+ }
+
+ if(RN_index >= hashSize) {
+ sprintf(error_text, "bookshelf_IO: Cannot find %s in hash table", temp);
+ runtimeError(error_text);
+ }
+
+ netNo = NetsInfo[hashfunc]->index;
+
+ // store netWeight corresponding to netNo
+ netWeight[netNo] = weight;
+ }
+
+ fclose(fp);
+
+ for(j=0; j
#include
#include
+namespace Flute {
+
dl_t dl_alloc()
{
dl_t dl = (dl_t)malloc(sizeof(dl_s));
@@ -159,3 +161,5 @@ void dl_sort(dl_t dl, size_t el_size, int(*compar)(void *, void *))
}
}
}
+
+} // Flute namespace.
diff --git a/knik/src/flute-3.1/src/knik/dl.h b/flute/src/3.1/dl.h
old mode 100644
new mode 100755
similarity index 98%
rename from knik/src/flute-3.1/src/knik/dl.h
rename to flute/src/3.1/dl.h
index afa71614..4b108205
--- a/knik/src/flute-3.1/src/knik/dl.h
+++ b/flute/src/3.1/dl.h
@@ -1,9 +1,11 @@
-#ifndef DL_H
-#define DL_H
+#ifndef FLUTE_DL_H
+#define FLUTE_DL_H
#include
#include
+namespace Flute {
+
typedef struct dl_el_s {
struct dl_el_s *prev, *next;
} dl_el;
@@ -177,4 +179,6 @@ void dl_sort(dl_t dl, size_t el_size, int(*compar)(void *, void *));
} dl_endfor; \
}
+} // Flute namespace.
+
#endif
diff --git a/knik/src/flute-3.1/src/err.cpp b/flute/src/3.1/err.cpp
old mode 100644
new mode 100755
similarity index 90%
rename from knik/src/flute-3.1/src/err.cpp
rename to flute/src/3.1/err.cpp
index 59cb4ff1..e3f951f2
--- a/knik/src/flute-3.1/src/err.cpp
+++ b/flute/src/3.1/err.cpp
@@ -1,6 +1,8 @@
#include
#include
+namespace Flute {
+
/**************************************************************************/
/*
print error message and continue
@@ -26,3 +28,4 @@ char* msg
exit(1);
}
+} // Flute namespace.
diff --git a/flute/src/3.1/err.h b/flute/src/3.1/err.h
new file mode 100755
index 00000000..772f02ce
--- /dev/null
+++ b/flute/src/3.1/err.h
@@ -0,0 +1,16 @@
+#ifndef FLUTE_ERR_H
+#define FLUTE_ERR_H
+
+namespace Flute {
+
+void err_msg(
+char* msg
+);
+
+void err_exit(
+char* msg
+);
+
+} // Flute namespace.
+
+#endif
diff --git a/flute/src/3.1/flute-ckt.cpp b/flute/src/3.1/flute-ckt.cpp
new file mode 100755
index 00000000..ad9cc1c6
--- /dev/null
+++ b/flute/src/3.1/flute-ckt.cpp
@@ -0,0 +1,98 @@
+#include
+#include
+#include
+#include "bookshelf_IO.h"
+#include "memAlloc.h"
+#include "flute.h"
+
+using namespace Flute;
+
+float HPwl();
+float flutewl();
+
+int main (int argc, char *argv[])
+{
+ char benchmarkPath[BUFFERSIZE], auxFile[BUFFERSIZE], placefile[BUFFERSIZE];
+
+ if(argc != 4) {
+ printf("Usage: %s \n",
+ argv[0]);
+ printf(" is the benchmark file directory.\n");
+ printf(" is the bookshelf format auxiliary file");
+ printf(" (assume in ).\n");
+ printf(" is the placement file");
+ printf(" (assume in current directory).\n");
+ exit(1);
+ }
+
+ strcpy(benchmarkPath, argv[1]);
+ strcpy(auxFile, argv[2]);
+ strcpy(placefile, argv[3]);
+
+ readAuxFile(benchmarkPath, auxFile);
+ createHash(benchmarkPath, nodesFile);
+ readNodesFile(benchmarkPath, nodesFile);
+ readNetsFile(benchmarkPath, netsFile);
+ readPlFile(".", placefile);
+ freeHash();
+
+ readLUT();
+
+ printf("Half-perimeter wirelength: %.2f\n", HPwl());
+ printf("FLUTE wirelength : %.2f\n", flutewl());
+}
+
+float HPwl()
+{
+ float totx, toty, xu, xl, yu, yl, xOffset, yOffset;
+ int i, j, k;
+
+ totx = 0.0; toty = 0.0;
+ for (j=1; j<=numNets; j++) {
+ xl = yl = 1e9;
+ xu = yu = -1e9;
+ for (k=netlistIndex[j]; k
+#include
+#include "flute.h"
+
+using namespace Flute;
+
+int main()
+{
+ int d=0;
+ int x[MAXD], y[MAXD];
+ Tree flutetree;
+ int flutewl;
+
+ while (!feof(stdin)) {
+ scanf("%d %d\n", &x[d], &y[d]);
+ d++;
+ }
+ readLUT();
+
+ flutetree = flute(d, x, y, ACCURACY);
+ printf("FLUTE wirelength = %d\n", flutetree.length);
+
+ flutewl = flute_wl(d, x, y, ACCURACY);
+ printf("FLUTE wirelength (without RSMT construction) = %d\n", flutewl);
+}
diff --git a/knik/src/flute-3.1/src/flute.cpp b/flute/src/3.1/flute.cpp
old mode 100644
new mode 100755
similarity index 91%
rename from knik/src/flute-3.1/src/flute.cpp
rename to flute/src/3.1/flute.cpp
index d29127aa..b9fb7f56
--- a/knik/src/flute-3.1/src/flute.cpp
+++ b/flute/src/3.1/flute.cpp
@@ -1,29 +1,22 @@
-// include added to be coriolis compliant
-#include
-using std::string;
-
-#include "hurricane/Error.h"
-using Hurricane::Error;
-
-#include "crlcore/Environment.h"
-#include "crlcore/AllianceFramework.h"
-using CRL::Environment;
-using CRL::AllianceFramework;
-
-// originals include
#include
#include
#include
#include
-#include "knik/flute.h"
+#include
+using std::min;
+using std::max;
-#if D<=7
+#include "flute.h"
+
+namespace Flute {
+
+#if DPARAM<=7
#define MGROUP 5040/4 // Max. # of groups, 7! = 5040
#define MPOWV 15 // Max. # of POWVs per group
-#elif D==8
+#elif DPARAM==8
#define MGROUP 40320/4 // Max. # of groups, 8! = 40320
#define MPOWV 33 // Max. # of POWVs per group
-#elif D==9
+#elif DPARAM==9
#define MGROUP 362880/4 // Max. # of groups, 9! = 362880
#define MPOWV 79 // Max. # of POWVs per group
#endif
@@ -33,11 +26,11 @@ struct csoln
{
unsigned char parent;
unsigned char seg[11]; // Add: 0..i, Sub: j..10; seg[i+1]=seg[j-1]=0
- unsigned char rowcol[D-2]; // row = rowcol[]/16, col = rowcol[]%16,
- unsigned char neighbor[2*D-2];
+ unsigned char rowcol[DPARAM-2]; // row = rowcol[]/16, col = rowcol[]%16,
+ unsigned char neighbor[2*DPARAM-2];
};
-struct csoln *LUT[D+1][MGROUP]; // storing 4 .. D
-int numsoln[D+1][MGROUP];
+struct csoln *LUT[DPARAM+1][MGROUP]; // storing 4 .. D
+int numsoln[DPARAM+1][MGROUP];
struct point
{
@@ -45,31 +38,32 @@ struct point
int o;
};
-void readLUT();
+void readLUT(string directory);
DTYPE flute_wl(int d, DTYPE x[], DTYPE y[], int acc);
DTYPE flutes_wl_LD(int d, DTYPE xs[], DTYPE ys[], int s[]);
DTYPE flutes_wl_MD(int d, DTYPE xs[], DTYPE ys[], int s[], int acc);
DTYPE flutes_wl_RDP(int d, DTYPE xs[], DTYPE ys[], int s[], int acc);
-FTree flute(int d, DTYPE x[], DTYPE y[], int acc);
-FTree flutes_LD(int d, DTYPE xs[], DTYPE ys[], int s[]);
-FTree flutes_MD(int d, DTYPE xs[], DTYPE ys[], int s[], int acc);
-FTree flutes_RDP(int d, DTYPE xs[], DTYPE ys[], int s[], int acc);
-FTree dmergetree(FTree t1, FTree t2);
-FTree hmergetree(FTree t1, FTree t2, int s[]);
-FTree vmergetree(FTree t1, FTree t2);
-void local_refinement(FTree *tp, int p);
-DTYPE wirelength(FTree t);
-void printtree(FTree t);
-void plottree(FTree t);
+Tree flute(int d, DTYPE x[], DTYPE y[], int acc);
+Tree flutes_LD(int d, DTYPE xs[], DTYPE ys[], int s[]);
+Tree flutes_MD(int d, DTYPE xs[], DTYPE ys[], int s[], int acc);
+Tree flutes_RDP(int d, DTYPE xs[], DTYPE ys[], int s[], int acc);
+Tree dmergetree(Tree t1, Tree t2);
+Tree hmergetree(Tree t1, Tree t2, int s[]);
+Tree vmergetree(Tree t1, Tree t2);
+void local_refinement(Tree *tp, int p);
+DTYPE wirelength(Tree t);
+void printtree(Tree t);
+void plottree(Tree t);
-
-void readLUT()
+void readLUT( string directory )
{
unsigned char charnum[256], line[32], *linep, c;
FILE *fpwv, *fprt;
struct csoln *p;
int d, i, j, k, kk, ns, nn;
+ init_param();
+
for (i=0; i<=255; i++) {
if ('0'<=i && i<='9')
charnum[i] = i - '0';
@@ -79,33 +73,30 @@ void readLUT()
charnum[i] = 0;
}
- // added by d2 for coriolis : need to find the right path of .dat files.
- Environment* env = AllianceFramework::get()->getEnvironment();
+
+ string file = POWVFILE;
+ if (not directory.empty()) file.insert( 0, directory + "/share/flute/3.1/" );
- string POWVFILE_string = env->getCORIOLIS_TOP();
- POWVFILE_string += "/share/coriolis2/flute-3.1/";
- POWVFILE_string += POWVFILE;
-
- fpwv=fopen(POWVFILE_string.c_str(), "r");
- if (fpwv == NULL)
- throw Error ( "flute::readLUT(): cannot find/open file:\n"
- " %s."
- , POWVFILE_string.c_str()
- );
+ fpwv=fopen(file.c_str(), "r");
+ if (fpwv == NULL) {
+ printf( "[ERROR] flute::readLUT(): Cannot find or open file:\n"
+ " \"%s\"\n", file.c_str());
+ exit(1);
+ }
#if ROUTING==1
- string POSTFILE_string = env->getCORIOLIS_TOP();
- POSTFILE_string += "/share/coriolis2/flute-3.1/";
- POSTFILE_string += POSTFILE;
- fprt=fopen(POSTFILE_string.c_str(), "r");
- if (fprt == NULL)
- throw Error ( "flute::readLUT(): cannot find/open file:\n"
- " %s."
- , POSTFILE_string.c_str()
- );
+ file = POSTFILE;
+ if (not directory.empty()) file.insert( 0, directory + "/share/flute/3.1/" );
+
+ fprt=fopen(file.c_str(), "r");
+ if (fprt == NULL) {
+ printf( "[ERROR] flute::readLUT(): Cannot find or open file:\n"
+ " \"%s\"\n", file.c_str());
+ exit(1);
+ }
#endif
- for (d=4; d<=D; d++) {
+ for (d=4; d<=DPARAM; d++) {
fscanf(fpwv, "d=%d\n", &d);
#if ROUTING==1
fscanf(fprt, "d=%d\n", &d);
@@ -149,17 +140,13 @@ void readLUT()
}
}
}
-
- fclose ( fpwv );
- fclose ( fprt );
}
-
DTYPE flute_wl(int d, DTYPE x[], DTYPE y[], int acc)
{
DTYPE xs[MAXD], ys[MAXD], minval, l, xu, xl, yu, yl;
int s[MAXD];
- int i, j, minidx;
+ int i, j, k, minidx;
struct point pt[MAXD], *ptp[MAXD], *tmpp;
if (d==2)
@@ -206,20 +193,17 @@ DTYPE flute_wl(int d, DTYPE x[], DTYPE y[], int acc)
}
#if REMOVE_DUPLICATE_PIN==1
- {
- int k;
- ptp[d] = &pt[d];
- ptp[d]->x = ptp[d]->y = -999999;
- j = 0;
- for (i=0; ix == ptp[i]->x; k++)
- if (ptp[k]->y == ptp[i]->y) // pins k and i are the same
- break;
- if (ptp[k]->x != ptp[i]->x)
- ptp[j++] = ptp[i];
- }
- d = j;
+ ptp[d] = &pt[d];
+ ptp[d]->x = ptp[d]->y = -999999;
+ j = 0;
+ for (i=0; ix == ptp[i]->x; k++)
+ if (ptp[k]->y == ptp[i]->y) // pins k and i are the same
+ break;
+ if (ptp[k]->x != ptp[i]->x)
+ ptp[j++] = ptp[i];
}
+ d = j;
#endif
for (i=0; ix = ptp[d]->y = -999999;
- j = 0;
- for (i=0; ix == ptp[i]->x; k++)
- if (ptp[k]->y == ptp[i]->y) // pins k and i are the same
- break;
- if (ptp[k]->x != ptp[i]->x)
- ptp[j++] = ptp[i];
- }
- d = j;
+ ptp[d] = &pt[d];
+ ptp[d]->x = ptp[d]->y = -999999;
+ j = 0;
+ for (i=0; ix == ptp[i]->x; k++)
+ if (ptp[k]->y == ptp[i]->y) // pins k and i are the same
+ break;
+ if (ptp[k]->x != ptp[i]->x)
+ ptp[j++] = ptp[i];
}
+ d = j;
#endif
for (i=0; ideg;
root = tp->branch[p].n;
@@ -1406,7 +1387,7 @@ void local_refinement(FTree *tp, int p)
}
}
- if (4 <= dd && dd <= D) {
+ if (4 <= dd && dd <= DPARAM) {
// Find Steiner nodes that are directly connected to root
ii=dd;
for (i=0; i
+
+namespace Flute {
+
+ using std::string;
+
/*****************************/
/* User-Defined Parameters */
@@ -18,22 +26,22 @@
/*****************************/
/* User-Callable Functions */
/*****************************/
-// void readLUT();
+// void readLUT(string);
// DTYPE flute_wl(int d, DTYPE x[], DTYPE y[], int acc);
// DTYPE flutes_wl(int d, DTYPE xs[], DTYPE ys[], int s[], int acc);
-// FTree flute(int d, DTYPE x[], DTYPE y[], int acc);
-// FTree flutes(int d, DTYPE xs[], DTYPE ys[], int s[], int acc);
-// DTYPE wirelength(FTree t);
-// void printtree(FTree t);
-// void plottree(FTree t);
+// Tree flute(int d, DTYPE x[], DTYPE y[], int acc);
+// Tree flutes(int d, DTYPE xs[], DTYPE ys[], int s[], int acc);
+// DTYPE wirelength(Tree t);
+// void printtree(Tree t);
+// void plottree(Tree t);
/*************************************/
/* Internal Parameters and Functions */
/*************************************/
#define POWVFILE "POWV9.dat" // LUT for POWV (Wirelength Vector)
-#define POSTFILE "POST9.dat" // LUT for POST (Steiner FTree)
-#define D 9 // LUT is used for d <= D, D <= 9
+#define POSTFILE "POST9.dat" // LUT for POST (Steiner Tree)
+#define DPARAM 9 // LUT is used for d <= D, D <= 9
#define TAU(A) (8+1.3*(A))
#define D1(A) (25+120/((A)*(A))) // flute_mr is used for D1 < d <= D2
#define D2(A) ((A)<=6 ? 500 : 75+5*(A))
@@ -44,7 +52,7 @@ typedef struct
int n; // index of neighbor
} Branch;
-struct FTree
+struct Tree
{
int deg; // degree
DTYPE length; // total wirelength
@@ -52,24 +60,24 @@ struct FTree
};
// User-Callable Functions
-extern void readLUT();
+extern void readLUT(string directory);
extern DTYPE flute_wl(int d, DTYPE x[], DTYPE y[], int acc);
//Macro: DTYPE flutes_wl(int d, DTYPE xs[], DTYPE ys[], int s[], int acc);
-extern FTree flute(int d, DTYPE x[], DTYPE y[], int acc);
-//Macro: FTree flutes(int d, DTYPE xs[], DTYPE ys[], int s[], int acc);
-extern DTYPE wirelength(FTree t);
-extern void printtree(FTree t);
-extern void plottree(FTree t);
+extern Tree flute(int d, DTYPE x[], DTYPE y[], int acc);
+//Macro: Tree flutes(int d, DTYPE xs[], DTYPE ys[], int s[], int acc);
+extern DTYPE wirelength(Tree t);
+extern void printtree(Tree t);
+extern void plottree(Tree t);
// Other useful functions
extern void init_param();
extern DTYPE flutes_wl_LD(int d, DTYPE xs[], DTYPE ys[], int s[]);
extern DTYPE flutes_wl_MD(int d, DTYPE xs[], DTYPE ys[], int s[], int acc);
extern DTYPE flutes_wl_RDP(int d, DTYPE xs[], DTYPE ys[], int s[], int acc);
-extern FTree flutes_LD(int d, DTYPE xs[], DTYPE ys[], int s[]);
-extern FTree flutes_MD(int d, DTYPE xs[], DTYPE ys[], int s[], int acc);
-extern FTree flutes_HD(int d, DTYPE xs[], DTYPE ys[], int s[], int acc);
-extern FTree flutes_RDP(int d, DTYPE xs[], DTYPE ys[], int s[], int acc);
+extern Tree flutes_LD(int d, DTYPE xs[], DTYPE ys[], int s[]);
+extern Tree flutes_MD(int d, DTYPE xs[], DTYPE ys[], int s[], int acc);
+extern Tree flutes_HD(int d, DTYPE xs[], DTYPE ys[], int s[], int acc);
+extern Tree flutes_RDP(int d, DTYPE xs[], DTYPE ys[], int s[], int acc);
#if REMOVE_DUPLICATE_PIN==1
#define flutes_wl(d, xs, ys, s, acc) flutes_wl_RDP(d, xs, ys, s, acc)
@@ -81,19 +89,20 @@ extern FTree flutes_RDP(int d, DTYPE xs[], DTYPE ys[], int s[], int acc);
#define flutes_wl_ALLD(d, xs, ys, s, acc) flutes_wl_LMD(d, xs, ys, s, acc)
#define flutes_ALLD(d, xs, ys, s, acc) \
- (d<=D ? flutes_LD(d, xs, ys, s) \
+ (d<=DPARAM ? flutes_LD(d, xs, ys, s) \
: (d<=D1(acc) ? flutes_MD(d, xs, ys, s, acc) \
: flutes_HD(d, xs, ys, s, acc)))
#define flutes_wl_LMD(d, xs, ys, s, acc) \
- (d<=D ? flutes_wl_LD(d, xs, ys, s) : flutes_wl_MD(d, xs, ys, s, acc))
+ (d<=DPARAM ? flutes_wl_LD(d, xs, ys, s) : flutes_wl_MD(d, xs, ys, s, acc))
#define flutes_LMD(d, xs, ys, s, acc) \
- (d<=D ? flutes_LD(d, xs, ys, s) : flutes_MD(d, xs, ys, s, acc))
+ (d<=DPARAM ? flutes_LD(d, xs, ys, s) : flutes_MD(d, xs, ys, s, acc))
-#define max(x,y) ((x)>(y)?(x):(y))
-#define min(x,y) ((x)<(y)?(x):(y))
-#define abs(x) ((x)<0?(-x):(x))
+//#define max(x,y) ((x)>(y)?(x):(y))
+//#define min(x,y) ((x)<(y)?(x):(y))
+//#define abs(x) ((x)<0?(-x):(x))
#define ADIFF(x,y) ((x)>(y)?(x-y):(y-x)) // Absolute difference
-#endif
+} // Flute namespace.
+#endif /* FLUTE_FLUTE_H */
diff --git a/knik/src/flute-3.1/src/flute_mst.cpp b/flute/src/3.1/flute_mst.cpp
old mode 100644
new mode 100755
similarity index 90%
rename from knik/src/flute-3.1/src/flute_mst.cpp
rename to flute/src/3.1/flute_mst.cpp
index 938c78c3..117c0cdd
--- a/knik/src/flute-3.1/src/flute_mst.cpp
+++ b/flute/src/3.1/flute_mst.cpp
@@ -4,9 +4,16 @@
#include
#include
#include
-#include "knik/dl.h"
-#include "knik/flute.h"
-#include "knik/mst2.h"
+#include
+using std::min;
+using std::max;
+
+#include "dl.h"
+#include "flute.h"
+#include "mst2.h"
+
+
+namespace Flute {
#define INFNTY INT_MAX
@@ -14,7 +21,7 @@
#define MR_FOR_SMALL_CASES_ONLY 1
#if MR_FOR_SMALL_CASES_ONLY
#define MAXPART D2M // max partition of an MST
-#define MAXT (D2M/D*2)
+#define MAXT (D2M/DPARAM*2)
#else
#define MAXPART (d/9*2) //(MAXD/THD*2) // max partition of an MST
#define MAXPART2 ((t1.deg+t2.deg)/9*2)
@@ -37,9 +44,9 @@ dl_t ht[D2M+1]; // hash table of subtrees indexed by degree
unsigned int curr_mark=0;
-FTree wmergetree(FTree t1, FTree t2, int *order1, int *order2, DTYPE cx, DTYPE cy, int acc);
-FTree xmergetree(FTree t1, FTree t2, int *order1, int *order2, DTYPE cx, DTYPE cy);
-void color_tree(FTree t, int *color);
+Tree wmergetree(Tree t1, Tree t2, int *order1, int *order2, DTYPE cx, DTYPE cy, int acc);
+Tree xmergetree(Tree t1, Tree t2, int *order1, int *order2, DTYPE cx, DTYPE cy);
+void color_tree(Tree t, int *color);
int longest_path_edge(int i, int j, int *e, int *p, int *es);
void preprocess_edges(int num_edges, int *edges, DTYPE *len,
int *e, int *p, int *es);
@@ -134,10 +141,12 @@ void extract_heap(node_pair *np)
void init_param()
{
+ int i;
+
heap = (node_pair*)malloc(sizeof(node_pair)*(max_heap_size+1));
}
-FTree reftree; // reference for qsort
+Tree reftree; // reference for qsort
int cmp_branch(const void *a, const void *b) {
int n;
DTYPE x1, x2, x3;
@@ -155,7 +164,7 @@ int cmp_branch(const void *a, const void *b) {
return (x1 <= x2) ? -1 : 1;
}
-void update_dist2(FTree t, DTYPE **dist, DTYPE longest,
+void update_dist2(Tree t, DTYPE **dist, DTYPE longest,
int *host, int *min_node1, int *min_node2,
int **nb)
{
@@ -541,14 +550,14 @@ void build_rmst(long d, DTYPE *x, DTYPE *y, int *edges, int *inMST)
/* cached version */
-FTree flutes_c(int d, DTYPE *xs, DTYPE *ys, int *s, int acc)
+Tree flutes_c(int d, DTYPE *xs, DTYPE *ys, int *s, int acc)
{
int i;
//int orig_ht_flag;
- FTree t, tdup;
+ Tree t, tdup;
#if USE_HASHING
- dl_forall(FTree, ht[d], t) {
+ dl_forall(Tree, ht[d], t) {
for (i=0; i=0; i--) {
tdup.branch[i] = t.branch[i];
}
- dl_prepend(FTree, ht[d], tdup);
+ dl_prepend(Tree, ht[d], tdup);
#endif
return t;
}
-FTree flute_mr(int d, DTYPE *xs, DTYPE *ys, int *s,
+Tree flute_mr(int d, DTYPE *xs, DTYPE *ys, int *s,
int acc, int rounds, DTYPE **dist,
DTYPE *threshold_x, DTYPE *threshold_y,
DTYPE *threshold,
@@ -595,7 +604,7 @@ FTree flute_mr(int d, DTYPE *xs, DTYPE *ys, int *s,
int i, j, k, m, n, itr, node1, node2;
DTYPE min_dist, longest;
DTYPE dist1, dist2;
- FTree t, best_t, *subtree, ttmp;
+ Tree t, best_t, *subtree, ttmp;
DTYPE min_x, max_x;
#if MR_FOR_SMALL_CASES_ONLY
@@ -770,7 +779,7 @@ FTree flute_mr(int d, DTYPE *xs, DTYPE *ys, int *s,
}
}
- subtree = (FTree*)malloc(num_subtree*sizeof(FTree));
+ subtree = (Tree*)malloc(num_subtree*sizeof(Tree));
for (i=1; i<=num_subtree; i++) {
if (tree_size[subroot[i-1]] <= 1) {
subtree[i-1].deg = 0;
@@ -845,7 +854,7 @@ FTree flute_mr(int d, DTYPE *xs, DTYPE *ys, int *s,
#if USE_HASHING
if (new_ht) {
for (i=0; i<=d; i++) {
- dl_forall(FTree, ht[i], ttmp) {
+ dl_forall(Tree, ht[i], ttmp) {
free(ttmp.branch);
} dl_endfor;
dl_free(ht[i]);
@@ -856,12 +865,12 @@ FTree flute_mr(int d, DTYPE *xs, DTYPE *ys, int *s,
return best_t;
}
-FTree flute_am(int d, DTYPE *xs, DTYPE *ys, int *s, int acc,
+Tree flute_am(int d, DTYPE *xs, DTYPE *ys, int *s, int acc,
DTYPE *threshold_x, DTYPE *threshold_y, DTYPE *threshold)
{
int i, j, k, m, n, itr, node1, node2;
DTYPE smallest_gap, gap;
- FTree t, t0, *subtree;
+ Tree t, t0, *subtree;
int prev_effort;
/*
int num_subtree, subroot[MAXPART], suproot[MAXPART], isSuperRoot[MAXD];
@@ -1027,7 +1036,7 @@ FTree flute_am(int d, DTYPE *xs, DTYPE *ys, int *s, int acc,
}
}
- subtree = (FTree*)malloc(num_subtree*sizeof(FTree));
+ subtree = (Tree*)malloc(num_subtree*sizeof(Tree));
for (i=1; i<=num_subtree; i++) {
if (tree_size[subroot[i-1]] <= 1) {
subtree[i-1].deg = 0;
@@ -1063,10 +1072,10 @@ FTree flute_am(int d, DTYPE *xs, DTYPE *ys, int *s, int acc,
return t;
}
-FTree flutes_HD(int d, DTYPE *xs, DTYPE *ys, int *s, int acc)
+Tree flutes_HD(int d, DTYPE *xs, DTYPE *ys, int *s, int acc)
{
int i, A, orig_D3;
- FTree t;
+ Tree t;
//DTYPE *dist[MAXD], *dist_base;
DTYPE **dist, *dist_base;
DTYPE threshold, threshold_x, threshold_y;
@@ -1124,7 +1133,7 @@ FTree flutes_HD(int d, DTYPE *xs, DTYPE *ys, int *s, int acc)
return t;
}
-int pickWin(FTree t, DTYPE cx, DTYPE cy, int inWin[])
+int pickWin(Tree t, DTYPE cx, DTYPE cy, int inWin[])
{
#if MR_FOR_SMALL_CASES_ONLY
int i, j, n, dd, cnt, stack[D2M*2], top=0, prev, curr, next;
@@ -1251,9 +1260,9 @@ int pickWin(FTree t, DTYPE cx, DTYPE cy, int inWin[])
/* merge tree t2 into tree t1, which have shared common nodes. The intention
is to add the non-common tree nodes of t2 into t1, as well as the
associated steiner nodes */
-FTree merge_into(FTree t1, FTree t2, int common[], int nc, int *o1, int *o2)
+Tree merge_into(Tree t1, Tree t2, int common[], int nc, int *o1, int *o2)
{
- FTree t;
+ Tree t;
DTYPE cx, cy;
#if MR_FOR_SMALL_CASES_ONLY
int i, j, k, d, n, offset, map[2*D2M], reachable[2*D2M];
@@ -1427,10 +1436,10 @@ FTree merge_into(FTree t1, FTree t2, int common[], int nc, int *o1, int *o2)
}
/* simply merge two trees at their common node */
-FTree smergetree(FTree t1, FTree t2, int *o1, int *o2,
+Tree smergetree(Tree t1, Tree t2, int *o1, int *o2,
DTYPE cx, DTYPE cy)
{
- FTree t;
+ Tree t;
int d, i, j, k, n, ci, cn, mapped_cn, prev, curr, next, offset;
#if MR_FOR_SMALL_CASES_ONLY
int o[D2M+MAXPART], map[2*D2M];
@@ -1575,10 +1584,10 @@ FTree smergetree(FTree t1, FTree t2, int *o1, int *o2,
}
/* window-based heuristics */
-FTree wmergetree(FTree t1, FTree t2, int *order1, int *order2,
+Tree wmergetree(Tree t1, Tree t2, int *order1, int *order2,
DTYPE cx, DTYPE cy, int acc)
{
- FTree t, t3, t4;
+ Tree t, t3, t4;
#if MR_FOR_SMALL_CASES_ONLY
int s[D2M], inWin[2*D2M], d, d2, i, ci, n;
int i1, i2, o[D2M], os[D2M], si[D2M];
@@ -1717,19 +1726,19 @@ FTree wmergetree(FTree t1, FTree t2, int *order1, int *order2,
}
/* xmerge heuristics */
-typedef struct FTreeNode_s{
- struct FTreeNode_s *parent;
+typedef struct TreeNode_s{
+ struct TreeNode_s *parent;
dl_t children;
int order, id;
unsigned int mark;
DTYPE x, y;
DTYPE blen; // length of this edge (i.e. branch length)
// longest edge from here, use child node of an edge to represent it
- struct FTreeNode_s *e;
+ struct TreeNode_s *e;
DTYPE len; // len of current e
-} FTreeNode;
+} TreeNode;
-void redirect(FTree t, DTYPE cx, DTYPE cy)
+void redirect(Tree t, DTYPE cx, DTYPE cy)
{
int i, root, prev, curr, next;
@@ -1756,15 +1765,15 @@ void redirect(FTree t, DTYPE cx, DTYPE cy)
t.branch[root].n = root;
}
-void update_subtree(FTreeNode *p, int id)
+void update_subtree(TreeNode *p, int id)
{
- FTreeNode *child, *grandp;
+ TreeNode *child, *grandp;
dl_t subtree=dl_alloc();
- dl_append(FTreeNode*, subtree, p);
+ dl_append(TreeNode*, subtree, p);
while (dl_length(subtree)>0) {
- dl_pop_first(FTreeNode*, subtree, p);
+ dl_pop_first(TreeNode*, subtree, p);
p->e = p;
grandp = p->parent;
if (grandp) {
@@ -1781,23 +1790,23 @@ void update_subtree(FTreeNode *p, int id)
p->id = id;
}
- dl_forall(FTreeNode*, p->children, child) {
- dl_prepend(FTreeNode*, subtree, child);
+ dl_forall(TreeNode*, p->children, child) {
+ dl_prepend(TreeNode*, subtree, child);
} dl_endfor;
}
dl_free(subtree);
}
-FTreeNode *createRootedFTree(FTree t, int *order, int id, dl_t list_of_nodes)
+TreeNode *createRootedTree(Tree t, int *order, int id, dl_t list_of_nodes)
{
int i, dd, n;
- FTreeNode *root=0, **nodes, *p;
+ TreeNode *root=0, **nodes, *p;
dd = t.deg*2-2;
- nodes = (FTreeNode**)malloc(sizeof(FTreeNode*)*dd);
+ nodes = (TreeNode**)malloc(sizeof(TreeNode*)*dd);
for (i=0; imark = curr_mark;
nodes[i]->children = dl_alloc();
}
@@ -1820,7 +1829,7 @@ FTreeNode *createRootedFTree(FTree t, int *order, int id, dl_t list_of_nodes)
} else {
p = nodes[n];
nodes[i]->parent = p;
- dl_append(FTreeNode*, p->children, nodes[i]);
+ dl_append(TreeNode*, p->children, nodes[i]);
}
nodes[i]->order = (i < t.deg) ? order[i] : -1;
nodes[i]->id = id;
@@ -1836,7 +1845,7 @@ FTreeNode *createRootedFTree(FTree t, int *order, int id, dl_t list_of_nodes)
ADIFF(t.branch[i].x, t.branch[n].x)+ADIFF(t.branch[i].y, t.branch[n].y);
*/
- dl_append(FTreeNode*, list_of_nodes, nodes[i]);
+ dl_append(TreeNode*, list_of_nodes, nodes[i]);
}
//assert(root);
@@ -1854,11 +1863,11 @@ FTreeNode *createRootedFTree(FTree t, int *order, int id, dl_t list_of_nodes)
return root;
}
-void freeFTree(FTreeNode *t)
+void freeTree(TreeNode *t)
{
- FTreeNode *child;
- dl_forall(FTreeNode *, t->children, child) {
- freeFTree(child);
+ TreeNode *child;
+ dl_forall(TreeNode *, t->children, child) {
+ freeTree(child);
} dl_endfor;
dl_free(t->children);
free(t);
@@ -1866,15 +1875,15 @@ void freeFTree(FTreeNode *t)
int cmpNodeByYX(const void* a, const void* b)
{
- DTYPE ay = (*(FTreeNode**)a)->y;
- DTYPE by = (*(FTreeNode**)b)->y;
+ DTYPE ay = (*(TreeNode**)a)->y;
+ DTYPE by = (*(TreeNode**)b)->y;
DTYPE ax, bx;
if (ay < by) return -1;
if (ay > by) return 1;
- ax = (*(FTreeNode**)a)->x;
- bx = (*(FTreeNode**)b)->x;
+ ax = (*(TreeNode**)a)->x;
+ bx = (*(TreeNode**)b)->x;
if (ax < bx) return -1;
if (ax > bx) return 1;
@@ -1883,25 +1892,25 @@ int cmpNodeByYX(const void* a, const void* b)
int cmpNodeByXY(const void* a, const void* b)
{
- DTYPE ax = (*(FTreeNode**)a)->x;
- DTYPE bx = (*(FTreeNode**)b)->x;
+ DTYPE ax = (*(TreeNode**)a)->x;
+ DTYPE bx = (*(TreeNode**)b)->x;
DTYPE ay, by;
if (ax < bx) return -1;
if (ax > bx) return 1;
- ay = (*(FTreeNode**)a)->y;
- by = (*(FTreeNode**)b)->y;
+ ay = (*(TreeNode**)a)->y;
+ by = (*(TreeNode**)b)->y;
if (ay < by) return -1;
if (ay > by) return 1;
return 0;
}
-void remove_child(dl_t children_list, FTreeNode* c)
+void remove_child(dl_t children_list, TreeNode* c)
{
- FTreeNode *child;
- dl_forall(FTreeNode*, children_list, child) {
+ TreeNode *child;
+ dl_forall(TreeNode*, children_list, child) {
if (child==c) {
dl_delete_current();
break;
@@ -1909,13 +1918,13 @@ void remove_child(dl_t children_list, FTreeNode* c)
} dl_endfor;
}
-void cleanFTree(FTreeNode* tn)
+void cleanTree(TreeNode* tn)
{
/*
- FTreeNode *c, *p;
+ TreeNode *c, *p;
- dl_forall(FTreeNode*, tn->children, c) {
- cleanFTree(c);
+ dl_forall(TreeNode*, tn->children, c) {
+ cleanTree(c);
} dl_endfor;
p = tn->parent;
@@ -1928,9 +1937,9 @@ void cleanFTree(FTreeNode* tn)
dl_free(tn->children);
free(tn);
} else if (dl_length(tn->children)<=1) {
- c = dl_first(FTreeNode*, tn->children);
+ c = dl_first(TreeNode*, tn->children);
c->parent = p;
- dl_append(FTreeNode*, p->children, c);
+ dl_append(TreeNode*, p->children, c);
remove_child(p->children, tn);
dl_free(tn->children);
free(tn);
@@ -1938,15 +1947,15 @@ void cleanFTree(FTreeNode* tn)
*/
// non-recursive version
- FTreeNode *c, *p;
+ TreeNode *c, *p;
dl_t nlist=dl_alloc();
- dl_append(FTreeNode*, nlist, tn);
+ dl_append(TreeNode*, nlist, tn);
while (dl_length(nlist)>0) {
- dl_pop_first(FTreeNode*, nlist, tn);
- dl_forall(FTreeNode*, tn->children, c) {
- dl_append(FTreeNode*, nlist, c);
+ dl_pop_first(TreeNode*, nlist, tn);
+ dl_forall(TreeNode*, tn->children, c) {
+ dl_append(TreeNode*, nlist, c);
} dl_endfor;
p = tn->parent;
@@ -1956,9 +1965,9 @@ void cleanFTree(FTreeNode* tn)
dl_free(tn->children);
free(tn);
} else if (dl_length(tn->children)<=1) {
- c = dl_first(FTreeNode*, tn->children);
+ c = dl_first(TreeNode*, tn->children);
c->parent = p;
- dl_append(FTreeNode*, p->children, c);
+ dl_append(TreeNode*, p->children, c);
remove_child(p->children, tn);
dl_free(tn->children);
free(tn);
@@ -1971,19 +1980,19 @@ void cleanFTree(FTreeNode* tn)
int cmpNodeByOrder(void* a, void* b)
{
- int ax = (*(FTreeNode**)a)->order;
- int bx = (*(FTreeNode**)b)->order;
+ int ax = (*(TreeNode**)a)->order;
+ int bx = (*(TreeNode**)b)->order;
if (ax < bx) return -1;
if (ax > bx) return 1;
return 0;
}
-FTree mergeRootedFTrees(FTreeNode *tn1, FTreeNode *tn2, int *order1)
+Tree mergeRootedTrees(TreeNode *tn1, TreeNode *tn2, int *order1)
{
int i, n, redundant;
- FTree t;
- FTreeNode *child, *p;
+ Tree t;
+ TreeNode *child, *p;
dl_t list_of_nodes=dl_alloc();
dl_t pin_nodes=dl_alloc(), steiner_nodes=dl_alloc();
@@ -1991,26 +2000,26 @@ FTree mergeRootedFTrees(FTreeNode *tn1, FTreeNode *tn2, int *order1)
/* merge tn2 to tn1 */
while (dl_length(tn2->children)>0) {
- dl_pop_first(FTreeNode*, tn2->children, child);
+ dl_pop_first(TreeNode*, tn2->children, child);
child->parent = tn1;
- dl_append(FTreeNode*, tn1->children, child);
+ dl_append(TreeNode*, tn1->children, child);
}
dl_free(tn2->children);
free(tn2);
- cleanFTree(tn1);
+ cleanTree(tn1);
- /* convert tn1 back to a FTree */
+ /* convert tn1 back to a Tree */
- dl_append(FTreeNode*, list_of_nodes, tn1);
+ dl_append(TreeNode*, list_of_nodes, tn1);
do {
- dl_pop_first(FTreeNode*, list_of_nodes, child);
+ dl_pop_first(TreeNode*, list_of_nodes, child);
if (child->order < 0) {
if (dl_length(child->children)==1) { /* redundant steiner node */
- p = dl_first(FTreeNode*, child->children);
+ p = dl_first(TreeNode*, child->children);
p->parent = child->parent;
/* note that p->parent's children list is already gone */
- dl_append(FTreeNode*, list_of_nodes, p);
+ dl_append(TreeNode*, list_of_nodes, p);
dl_free(child->children);
free(child);
continue;
@@ -2019,24 +2028,24 @@ FTree mergeRootedFTrees(FTreeNode *tn1, FTreeNode *tn2, int *order1)
free(child);
continue;
}
- dl_append(FTreeNode*, steiner_nodes, child);
+ dl_append(TreeNode*, steiner_nodes, child);
} else {
- dl_append(FTreeNode*, pin_nodes, child);
+ dl_append(TreeNode*, pin_nodes, child);
}
dl_concat(list_of_nodes, child->children);
} while (dl_length(list_of_nodes)>0);
dl_free(list_of_nodes);
- dl_sort(pin_nodes, sizeof(FTreeNode*), cmpNodeByOrder);
+ dl_sort(pin_nodes, sizeof(TreeNode*), cmpNodeByOrder);
i=0;
- dl_forall(FTreeNode*, pin_nodes, child) {
+ dl_forall(TreeNode*, pin_nodes, child) {
child->id = i++;
} dl_endfor;
t.deg = i;
- dl_forall(FTreeNode*, steiner_nodes, child) {
+ dl_forall(TreeNode*, steiner_nodes, child) {
child->id = i++;
} dl_endfor;
@@ -2053,7 +2062,7 @@ FTree mergeRootedFTrees(FTreeNode *tn1, FTreeNode *tn2, int *order1)
t.branch[tn1->id].n = -1;
- dl_forall(FTreeNode*, pin_nodes, child) {
+ dl_forall(TreeNode*, pin_nodes, child) {
i = child->id;
if (child->order >= 0) {
order1[i] = child->order;
@@ -2075,7 +2084,7 @@ FTree mergeRootedFTrees(FTreeNode *tn1, FTreeNode *tn2, int *order1)
}
}
} dl_endfor;
- dl_forall(FTreeNode*, steiner_nodes, child) {
+ dl_forall(TreeNode*, steiner_nodes, child) {
i = child->id;
if (child->order >= 0) {
order1[i] = child->order;
@@ -2107,12 +2116,12 @@ FTree mergeRootedFTrees(FTreeNode *tn1, FTreeNode *tn2, int *order1)
}
} dl_endfor;
- dl_forall(FTreeNode*, pin_nodes, child) {
+ dl_forall(TreeNode*, pin_nodes, child) {
free(child);
} dl_endfor;
dl_free(pin_nodes);
- dl_forall(FTreeNode*, steiner_nodes, child) {
+ dl_forall(TreeNode*, steiner_nodes, child) {
free(child);
} dl_endfor;
dl_free(steiner_nodes);
@@ -2121,32 +2130,32 @@ FTree mergeRootedFTrees(FTreeNode *tn1, FTreeNode *tn2, int *order1)
return t;
}
-void collect_nodes(FTreeNode* tn, dl_t nlist)
+void collect_nodes(TreeNode* tn, dl_t nlist)
{
/*
- FTreeNode* c;
+ TreeNode* c;
- dl_append(FTreeNode*, nlist, tn);
- dl_forall(FTreeNode*, tn->children, c) {
+ dl_append(TreeNode*, nlist, tn);
+ dl_forall(TreeNode*, tn->children, c) {
collect_nodes(c, nlist);
}dl_endfor;
*/
// non-recursive version
- FTreeNode* c;
+ TreeNode* c;
dl_el *curr;
- dl_append(FTreeNode*, nlist, tn);
+ dl_append(TreeNode*, nlist, tn);
for (curr=nlist->last; curr; curr=curr->next) {
- tn = dl_data(FTreeNode*, curr);
- dl_forall(FTreeNode*, tn->children, c) {
- dl_append(FTreeNode*, nlist, c);
+ tn = dl_data(TreeNode*, curr);
+ dl_forall(TreeNode*, tn->children, c) {
+ dl_append(TreeNode*, nlist, c);
}dl_endfor;
}
}
typedef struct {
- FTreeNode *n1, *n2;
+ TreeNode *n1, *n2;
DTYPE new_x, new_y, gain;
} xdata;
@@ -2159,10 +2168,10 @@ int cmpXdata(void *a, void *b)
return 0;
}
-inline FTreeNode *cedge_lca(FTreeNode* n1, FTreeNode* n2, DTYPE *len, int *n2ton1)
+inline TreeNode *cedge_lca(TreeNode* n1, TreeNode* n2, DTYPE *len, int *n2ton1)
{
int i;
- FTreeNode *curr, *lca, *e;
+ TreeNode *curr, *lca, *e;
curr_mark++;
@@ -2236,7 +2245,7 @@ inline FTreeNode *cedge_lca(FTreeNode* n1, FTreeNode* n2, DTYPE *len, int *n2ton
}
-FTreeNode *critical_edge(FTreeNode* n1, FTreeNode* n2, DTYPE *len, int *n2ton1)
+TreeNode *critical_edge(TreeNode* n1, TreeNode* n2, DTYPE *len, int *n2ton1)
{
if (n1->id != n2->id) {
n1 = n1->parent;
@@ -2254,9 +2263,9 @@ FTreeNode *critical_edge(FTreeNode* n1, FTreeNode* n2, DTYPE *len, int *n2ton1)
return cedge_lca(n1, n2, len, n2ton1);
}
-void splice2(FTreeNode *n1, FTreeNode *n2, FTreeNode *e)
+void splice2(TreeNode *n1, TreeNode *n2, TreeNode *e)
{
- FTreeNode *curr, *prev, *next, *s;
+ TreeNode *curr, *prev, *next, *s;
//assert(n2->parent);
//assert(e->id==n2->id);
@@ -2267,7 +2276,7 @@ void splice2(FTreeNode *n1, FTreeNode *n2, FTreeNode *e)
while (prev != e) {
remove_child(curr->children, prev);
curr->parent = prev;
- dl_append(FTreeNode*, prev->children, curr);
+ dl_append(TreeNode*, prev->children, curr);
prev = curr;
curr = next;
next = curr->parent;
@@ -2275,31 +2284,31 @@ void splice2(FTreeNode *n1, FTreeNode *n2, FTreeNode *e)
remove_child(curr->children, prev);
n2->parent = n1;
- dl_append(FTreeNode*, n1->children, n2);
+ dl_append(TreeNode*, n1->children, n2);
update_subtree(n1, n1->parent->id);
}
-void cut_and_splice(FTreeNode *n1, FTreeNode *n2,
+void cut_and_splice(TreeNode *n1, TreeNode *n2,
DTYPE new_x, DTYPE new_y,
DTYPE *x1, DTYPE *y1, DTYPE *x2, DTYPE *y2,
- FTreeNode *e, int n2ton1)
+ TreeNode *e, int n2ton1)
{
- FTreeNode *p1, *node, *s;
+ TreeNode *p1, *node, *s;
/* new steiner node */
p1 = n1->parent;
remove_child(p1->children, n1);
- node = (FTreeNode*)malloc(sizeof(FTreeNode));
+ node = (TreeNode*)malloc(sizeof(TreeNode));
node->x = new_x;
node->y = new_y;
node->mark = curr_mark;
node->parent = p1;
- dl_append(FTreeNode*, p1->children, node);
+ dl_append(TreeNode*, p1->children, node);
n1->parent = node;
node->children = dl_alloc();
- dl_append(FTreeNode*, node->children, n1);
+ dl_append(TreeNode*, node->children, n1);
node->order = -1;
node->e = n1->e;
@@ -2320,7 +2329,7 @@ void cut_and_splice(FTreeNode *n1, FTreeNode *n2,
/* n2 is a pin, need to replicate a steiner node */
s = n2->parent;
if (s->x!=n2->x || s->y!=n2->y) {
- s = (FTreeNode*)malloc(sizeof(FTreeNode));
+ s = (TreeNode*)malloc(sizeof(TreeNode));
s->mark = curr_mark;
s->order = -1;
s->id = n2->id;
@@ -2338,11 +2347,11 @@ void cut_and_splice(FTreeNode *n1, FTreeNode *n2,
n2->blen = 0;
remove_child(n2->parent->children, n2);
- dl_append(FTreeNode*, n2->parent->children, s);
+ dl_append(TreeNode*, n2->parent->children, s);
s->parent = n2->parent;
n2->parent = s;
s->children = dl_alloc();
- dl_append(FTreeNode*, s->children, n2);
+ dl_append(TreeNode*, s->children, n2);
}
n2 = s;
}
@@ -2355,17 +2364,17 @@ void cut_and_splice(FTreeNode *n1, FTreeNode *n2,
}
typedef struct {
- FTreeNode *n1, *n2;
+ TreeNode *n1, *n2;
DTYPE min_dist, new_x, new_y;
int n2ton1;
} splice_info;
-DTYPE exchange_branches_order_x(int num_nodes, FTreeNode **nodes,
+DTYPE exchange_branches_order_x(int num_nodes, TreeNode **nodes,
DTYPE threshold_x, DTYPE threshold_y,
DTYPE max_len)
{
int n2ton1;
- FTreeNode *n1, *p1, *n2, *p2, *node, *e, *s;
+ TreeNode *n1, *p1, *n2, *p2, *node, *e, *s;
DTYPE x1, x2, y1, y2, min_dist, new_x, new_y, len;
DTYPE gain=0;
int i, j, curr_row, next_header, num_rows, start, end, mid;
@@ -2512,12 +2521,12 @@ DTYPE exchange_branches_order_x(int num_nodes, FTreeNode **nodes,
return gain;
}
-DTYPE exchange_branches_order_y(int num_nodes, FTreeNode **nodes,
+DTYPE exchange_branches_order_y(int num_nodes, TreeNode **nodes,
DTYPE threshold_x, DTYPE threshold_y,
DTYPE max_len)
{
int n2ton1;
- FTreeNode *n1, *p1, *n2, *p2, *node, *e, *s;
+ TreeNode *n1, *p1, *n2, *p2, *node, *e, *s;
DTYPE x1, x2, y1, y2, min_dist, new_x, new_y, len;
DTYPE gain=0;
int i, j, curr_row, next_header, num_rows, start, end, mid;
@@ -2664,12 +2673,12 @@ DTYPE exchange_branches_order_y(int num_nodes, FTreeNode **nodes,
}
/* cross exchange branches after merging */
-FTree xmergetree(FTree t1, FTree t2, int *order1, int *order2,
+Tree xmergetree(Tree t1, Tree t2, int *order1, int *order2,
DTYPE cx, DTYPE cy)
{
int i, num, cnt, order_by_x=1;
- FTree t;
- FTreeNode *tn1, *tn2, *n1, *p1, **nodes;
+ Tree t;
+ TreeNode *tn1, *tn2, *n1, *p1, **nodes;
dl_t list_of_nodes=dl_alloc();
DTYPE threshold_x, threshold_y;
DTYPE min_x, max_x, max_len, len, gain;
@@ -2687,18 +2696,18 @@ FTree xmergetree(FTree t1, FTree t2, int *order1, int *order2,
redirect(t2, cx, cy);
curr_mark = 0;
- tn1 = createRootedFTree(t1, order1, 1, list_of_nodes);
- tn2 = createRootedFTree(t2, order2, 2, list_of_nodes);
+ tn1 = createRootedTree(t1, order1, 1, list_of_nodes);
+ tn2 = createRootedTree(t2, order2, 2, list_of_nodes);
num = dl_length(list_of_nodes);
- nodes = (FTreeNode**)malloc(sizeof(FTreeNode*)*num);
+ nodes = (TreeNode**)malloc(sizeof(TreeNode*)*num);
i = 0;
- dl_forall(FTreeNode*, list_of_nodes, n1) {
+ dl_forall(TreeNode*, list_of_nodes, n1) {
nodes[i++] = n1;
} dl_endfor;
dl_clear(list_of_nodes);
- qsort(nodes, num, sizeof(FTreeNode*), cmpNodeByYX);
+ qsort(nodes, num, sizeof(TreeNode*), cmpNodeByYX);
max_len = 0;
min_x = max_x = nodes[0]->x;
@@ -2748,19 +2757,19 @@ FTree xmergetree(FTree t1, FTree t2, int *order1, int *order2,
free(nodes);
num = dl_length(list_of_nodes);
- nodes = (FTreeNode**)malloc(sizeof(FTreeNode*)*num);
+ nodes = (TreeNode**)malloc(sizeof(TreeNode*)*num);
i = 0;
- dl_forall(FTreeNode*, list_of_nodes, n1) {
+ dl_forall(TreeNode*, list_of_nodes, n1) {
nodes[i++] = n1;
} dl_endfor;
dl_clear(list_of_nodes);
if (order_by_x) {
order_by_x = 0;
- qsort(nodes, num, sizeof(FTreeNode*), cmpNodeByXY);
+ qsort(nodes, num, sizeof(TreeNode*), cmpNodeByXY);
} else {
order_by_x = 1;
- qsort(nodes, num, sizeof(FTreeNode*), cmpNodeByYX);
+ qsort(nodes, num, sizeof(TreeNode*), cmpNodeByYX);
}
}
}
@@ -2768,7 +2777,7 @@ FTree xmergetree(FTree t1, FTree t2, int *order1, int *order2,
dl_free(list_of_nodes);
free(nodes);
- t = mergeRootedFTrees(tn1, tn2, order1);
+ t = mergeRootedTrees(tn1, tn2, order1);
free(t1.branch);
free(t2.branch);
@@ -2776,3 +2785,5 @@ FTree xmergetree(FTree t1, FTree t2, int *order1, int *order2,
return t;
}
+} // Flute namespace.
+
diff --git a/knik/src/flute-3.1/src/knik/global.h b/flute/src/3.1/global.h
old mode 100644
new mode 100755
similarity index 60%
rename from knik/src/flute-3.1/src/knik/global.h
rename to flute/src/3.1/global.h
index 96f8f89b..69dab0e1
--- a/knik/src/flute-3.1/src/knik/global.h
+++ b/flute/src/3.1/global.h
@@ -1,8 +1,10 @@
-#ifndef _GLOBAL_H_
-#define _GLOBAL_H_
+#ifndef FLUTE_GLOBAL_H
+#define FLUTE_GLOBAL_H
#include
+namespace Flute {
+
#define TRUE 1
#define FALSE 0
#define MAXLONG 0x7fffffffL
@@ -16,4 +18,6 @@ typedef struct point Point;
typedef long nn_array[8];
-#endif /* _GLOBAL_H_ */
+} // Flute namespace.
+
+#endif /* FLUTE_GLOBAL_H */
diff --git a/knik/src/flute-3.1/src/heap.cpp b/flute/src/3.1/heap.cpp
old mode 100644
new mode 100755
similarity index 96%
rename from knik/src/flute-3.1/src/heap.cpp
rename to flute/src/3.1/heap.cpp
index d46fafd9..011b0cae
--- a/knik/src/flute-3.1/src/heap.cpp
+++ b/flute/src/3.1/heap.cpp
@@ -5,9 +5,10 @@
*/
#include
-#include "knik/heap.h"
-#include "knik/err.h"
+#include "heap.h"
+#include "err.h"
+namespace Flute {
Heap* _heap = (Heap*)NULL;
long _max_heap_size = 0;
@@ -24,7 +25,7 @@ void allocate_heap( long n )
_heap = (Heap*)realloc( (void*)_heap, (size_t)(n+1)*sizeof(Heap) );
if( ! _heap )
{
- err_exit( (char*)"Cannot reallocate memory in allocate_heap!" );
+ err_exit( "Cannot reallocate memory in allocate_heap!" );
}
_max_heap_size = n;
}
@@ -175,3 +176,4 @@ long heap_delete_min()
/****************************************************************************/
+} // Flute namespace.
diff --git a/knik/src/flute-3.1/src/knik/heap.h b/flute/src/3.1/heap.h
old mode 100644
new mode 100755
similarity index 83%
rename from knik/src/flute-3.1/src/knik/heap.h
rename to flute/src/3.1/heap.h
index eaa51294..70d8b488
--- a/knik/src/flute-3.1/src/knik/heap.h
+++ b/flute/src/3.1/heap.h
@@ -1,8 +1,10 @@
-#ifndef _HEAP_H_
-#define _HEAP_H_
+#ifndef FLUTE_HEAP_H
+#define FLUTE_HEAP_H
#include "global.h"
+namespace Flute {
+
struct heap_info
{
long key;
@@ -28,4 +30,6 @@ void heap_insert( long p, long key );
void heap_decrease_key( long p, long new_key );
long heap_delete_min();
-#endif /* _HEAP_H_ */
+} // Flute namespace.
+
+#endif /* FLUTE_HEAP_H */
diff --git a/knik/src/flute-3.1/LICENSE.txt b/flute/src/3.1/license.txt
old mode 100644
new mode 100755
similarity index 95%
rename from knik/src/flute-3.1/LICENSE.txt
rename to flute/src/3.1/license.txt
index 6ed104e9..1951adf2
--- a/knik/src/flute-3.1/LICENSE.txt
+++ b/flute/src/3.1/license.txt
@@ -21,7 +21,7 @@ met. These conditions require a modest attribution to Dr. Chris C. N. Chu
the Author's attribution information, which includes:
(a) Dr. Chris C. N. Chu ("AUTHOR"),
(b) Iowa State University ("PROFESSIONAL IDENTIFICATION"), and
- (c) http://home.eng.iastate.edu/~cnchu/ ("URL").
+ (c) http://home.engineering.iastate.edu/~cnchu/ ("URL").
2. Users who intend to use the Code for commercial purposes will notify
Author prior to such commercial use.
diff --git a/flute/src/3.1/memAlloc.cpp b/flute/src/3.1/memAlloc.cpp
new file mode 100755
index 00000000..52dfd7f5
--- /dev/null
+++ b/flute/src/3.1/memAlloc.cpp
@@ -0,0 +1,468 @@
+/* --------------------------------------------------------------------------
+ Public domain memory allocation and de-allocation routines.
+ Taken from Appendix B of:
+ Numerical Recipes in C: The Art of Scientific Computing, Second Edition,
+ Cambridge University Press, 1992
+----------------------------------------------------------------------------*/
+#include
+#include
+#include
+
+#include "memAlloc.h"
+
+namespace Flute {
+
+#define MEM_END 1
+#define FREE_ARG char*
+
+void runtimeError(char error_text[])
+/* error handler */
+{
+ fprintf(stderr, "ERROR: %s \n", error_text);
+ fprintf(stderr, "Aborting !! \n");
+ fflush(stdout);
+ fflush(stderr);
+ exit(1);
+}
+
+float *vector(long nl, long nh)
+/* allocate a float vector with subscript range v[nl..nh] */
+{
+ float *v;
+ v=(float *)malloc((size_t) ((nh-nl+1+MEM_END)*sizeof(float)));
+ if (!v) runtimeError("allocation failure in vector()");
+ return v-nl+MEM_END;
+}
+
+int *ivector(long nl, long nh)
+/* allocate an int vector with subscript range v[nl..nh] */
+{
+ int *v;
+ v=(int *)malloc((size_t) ((nh-nl+1+MEM_END)*sizeof(int)));
+ if (!v) runtimeError("allocation failure in ivector()");
+ return v-nl+MEM_END;
+}
+
+unsigned char *cvector(long nl, long nh)
+/* allocate an unsigned char vector with subscript range v[nl..nh] */
+{
+ unsigned char *v;
+ v=(unsigned char *)malloc((size_t) ((nh-nl+1+MEM_END)*sizeof(unsigned char)));
+ if (!v) runtimeError("allocation failure in cvector()");
+ return v-nl+MEM_END;
+}
+
+unsigned long *lvector(long nl, long nh)
+/* allocate an unsigned long vector with subscript range v[nl..nh] */
+{
+ unsigned long *v;
+ v=(unsigned long *)malloc((size_t) ((nh-nl+1+MEM_END)*sizeof(long)));
+ if (!v) runtimeError("allocation failure in lvector()");
+ return v-nl+MEM_END;
+}
+
+double *dvector(long nl, long nh)
+/* allocate a double vector with subscript range v[nl..nh] */
+{
+ double *v;
+ v=(double *)malloc((size_t) ((nh-nl+1+MEM_END)*sizeof(double)));
+ if (!v) runtimeError("allocation failure in dvector()");
+ return v-nl+MEM_END;
+}
+
+float **matrix(long nrl, long nrh, long ncl, long nch)
+/* allocate a float matrix with subscript range m[nrl..nrh][ncl..nch] */
+{
+ long i, nrow=nrh-nrl+1,ncol=nch-ncl+1;
+ float **m;
+
+ /* allocate pointers to rows */
+ m=(float **) malloc((size_t)((nrow+MEM_END)*sizeof(float*)));
+ if (!m) runtimeError("allocation failure 1 in matrix()");
+ m += MEM_END;
+ m -= nrl;
+
+ /* allocate rows and set pointers to them */
+ m[nrl]=(float *) malloc((size_t)((nrow*ncol+MEM_END)*sizeof(float)));
+ if (!m[nrl]) runtimeError("allocation failure 2 in matrix()");
+ m[nrl] += MEM_END;
+ m[nrl] -= ncl;
+ for(i=nrl+1;i<=nrh;i++) m[i]=m[i-1]+ncol;
+ /* return pointer to array of pointers to rows */
+ return m;
+}
+
+double **dmatrix(long nrl, long nrh, long ncl, long nch)
+/* allocate a double matrix with subscript range m[nrl..nrh][ncl..nch] */
+{
+ long i, nrow=nrh-nrl+1,ncol=nch-ncl+1;
+ double **m;
+
+ /* allocate pointers to rows */
+ m=(double **) malloc((size_t)((nrow+MEM_END)*sizeof(double*)));
+ if (!m) runtimeError("allocation failure 1 in dmatrix()");
+ m += MEM_END;
+ m -= nrl;
+
+ /* allocate rows and set pointers to them */
+ m[nrl]=(double *) malloc((size_t)((nrow*ncol+MEM_END)*sizeof(double)));
+ if (!m[nrl]) runtimeError("allocation failure 2 in dmatrix()");
+ m[nrl] += MEM_END;
+ m[nrl] -= ncl;
+
+ for(i=nrl+1;i<=nrh;i++) m[i]=m[i-1]+ncol;
+
+ /* return pointer to array of pointers to rows */
+ return m;
+}
+
+int **imatrix(long nrl, long nrh, long ncl, long nch)
+/* allocate a int matrix with subscript range m[nrl..nrh][ncl..nch] */
+{
+ long i, nrow=nrh-nrl+1,ncol=nch-ncl+1;
+ int **m;
+
+ /* allocate pointers to rows */
+ m=(int **) malloc((size_t)((nrow+MEM_END)*sizeof(int*)));
+ if (!m) runtimeError("allocation failure 1 in imatrix()");
+ m += MEM_END;
+ m -= nrl;
+
+ /* allocate rows and set pointers to them */
+ m[nrl]=(int *) malloc((size_t)((nrow*ncol+MEM_END)*sizeof(int)));
+ if (!m[nrl]) runtimeError("allocation failure 2 in imatrix()");
+ m[nrl] += MEM_END;
+ m[nrl] -= ncl;
+
+ for(i=nrl+1;i<=nrh;i++) m[i]=m[i-1]+ncol;
+
+ /* return pointer to array of pointers to rows */
+ return m;
+}
+
+
+char **cmatrix(long nrl, long nrh, long ncl, long nch)
+/* allocate a char matrix with subscript range m[nrl..nrh][ncl..nch] */
+{
+ long i, nrow=nrh-nrl+1,ncol=nch-ncl+1;
+ char **m;
+
+ /* allocate pointers to rows */
+ m=(char **) malloc((size_t)((nrow+MEM_END)*sizeof(char*)));
+ if (!m) runtimeError("allocation failure 1 in cmatrix()");
+ m += MEM_END;
+ m -= nrl;
+
+ /* allocate rows and set pointers to them */
+ m[nrl]=(char *) malloc((size_t)((nrow*ncol+MEM_END)*sizeof(char)));
+ if (!m[nrl]) runtimeError("allocation failure 2 in cmatrix()");
+ m[nrl] += MEM_END;
+ m[nrl] -= ncl;
+
+ for(i=nrl+1;i<=nrh;i++) m[i]=m[i-1]+ncol;
+
+ /* return pointer to array of pointers to rows */
+ return m;
+}
+
+
+unsigned long **lmatrix(long nrl, long nrh, long ncl, long nch)
+/* allocate a int matrix with subscript range m[nrl..nrh][ncl..nch] */
+{
+ long i, nrow=nrh-nrl+1,ncol=nch-ncl+1;
+ unsigned long **m;
+
+ /* allocate pointers to rows */
+ m=(unsigned long **) malloc((size_t)((nrow+MEM_END)*sizeof(long*)));
+ if (!m) runtimeError("allocation failure 1 in lmatrix()");
+ m += MEM_END;
+ m -= nrl;
+
+ /* allocate rows and set pointers to them */
+ m[nrl]=(unsigned long *) malloc((size_t)((nrow*ncol+MEM_END)*sizeof(long)));
+ if (!m[nrl]) runtimeError("allocation failure 2 in lmatrix()");
+ m[nrl] += MEM_END;
+ m[nrl] -= ncl;
+
+ for(i=nrl+1;i<=nrh;i++) m[i]=m[i-1]+ncol;
+
+ /* return pointer to array of pointers to rows */
+ return m;
+}
+
+
+float **submatrix(float **a, long oldrl, long oldrh, long oldcl, long oldch,
+ long newrl, long newcl)
+/* point a submatrix [newrl..][newcl..] to a[oldrl..oldrh][oldcl..oldch] */
+{
+ long i,j,nrow=oldrh-oldrl+1,ncol=oldcl-newcl;
+ float **m;
+
+ /* allocate array of pointers to rows */
+ m=(float **) malloc((size_t) ((nrow+MEM_END)*sizeof(float*)));
+ if (!m) runtimeError("allocation failure in submatrix()");
+ m += MEM_END;
+ m -= newrl;
+
+ /* set pointers to rows */
+ for(i=oldrl,j=newrl;i<=oldrh;i++,j++) m[j]=a[i]+ncol;
+
+ /* return pointer to array of pointers to rows */
+ return m;
+}
+
+float **convert_matrix(float *a, long nrl, long nrh, long ncl, long nch)
+/* allocate a float matrix m[nrl..nrh][ncl..nch] that points to the matrix
+declared in the standard C manner as a[nrow][ncol], where nrow=nrh-nrl+1
+and ncol=nch-ncl+1. The routine should be called with the address
+&a[0][0] as the first argument. */
+{
+ long i,j,nrow=nrh-nrl+1,ncol=nch-ncl+1;
+ float **m;
+
+ /* allocate pointers to rows */
+ m=(float **) malloc((size_t) ((nrow+MEM_END)*sizeof(float*)));
+ if (!m) runtimeError("allocation failure in convert_matrix()");
+ m += MEM_END;
+ m -= nrl;
+
+ /* set pointers to rows */
+ m[nrl]=a-ncl;
+ for(i=1,j=nrl+1;i *(float *)j)
+ return 1;
+ else
+ return 0;
+}
+
+
+int comp_int(const void *i, const void *j) {
+ return *(int *)i - *(int *)j;
+}
+
+} // Flute namespace.
diff --git a/flute/src/3.1/memAlloc.h b/flute/src/3.1/memAlloc.h
new file mode 100755
index 00000000..ac6813ff
--- /dev/null
+++ b/flute/src/3.1/memAlloc.h
@@ -0,0 +1,94 @@
+/* --------------------------------------------------------------------------
+ Public domain memory allocation and de-allocation routine header file.
+ Taken from Appendix B of:
+ Numerical Recipes in C: The Art of Scientific Computing, Second Edition,
+ Cambridge University Press, 1992
+----------------------------------------------------------------------------*/
+#ifndef FLUTE_MEMALLOC_H
+#define FLUTE_MEMALLOC_H
+
+namespace Flute {
+
+static float sqrarg;
+#define SQR(a) ((sqrarg=(a)) == 0.0 ? 0.0 : sqrarg*sqrarg)
+
+static double dsqrarg;
+#define DSQR(a) ((dsqrarg=(a)) == 0.0 ? 0.0 : dsqrarg*dsqrarg)
+
+static double dmaxarg1,dmaxarg2;
+#define DMAX(a,b) (dmaxarg1=(a),dmaxarg2=(b),(dmaxarg1) > (dmaxarg2) ?\
+(dmaxarg1) : (dmaxarg2))
+
+static double dminarg1,dminarg2;
+#define DMIN(a,b) (dminarg1=(a),dminarg2=(b),(dminarg1) < (dminarg2) ?\
+(dminarg1) : (dminarg2))
+
+static float maxarg1,maxarg2;
+#define FMAX(a,b) (maxarg1=(a),maxarg2=(b),(maxarg1) > (maxarg2) ?\
+(maxarg1) : (maxarg2))
+
+static float minarg1,minarg2;
+#define FMIN(a,b) (minarg1=(a),minarg2=(b),(minarg1) < (minarg2) ?\
+(minarg1) : (minarg2))
+
+static long lmaxarg1,lmaxarg2;
+#define LMAX(a,b) (lmaxarg1=(a),lmaxarg2=(b),(lmaxarg1) > (lmaxarg2) ?\
+(lmaxarg1) : (lmaxarg2))
+
+static long lminarg1,lminarg2;
+#define LMIN(a,b) (lminarg1=(a),lminarg2=(b),(lminarg1) < (lminarg2) ?\
+(lminarg1) : (lminarg2))
+
+static int imaxarg1,imaxarg2;
+#define IMAX(a,b) (imaxarg1=(a),imaxarg2=(b),(imaxarg1) > (imaxarg2) ?\
+(imaxarg1) : (imaxarg2))
+
+static int iminarg1,iminarg2;
+#define IMIN(a,b) (iminarg1=(a),iminarg2=(b),(iminarg1) < (iminarg2) ?\
+(iminarg1) : (iminarg2))
+
+#define SIGN(a,b) ((b) >= 0.0 ? fabs(a) : -fabs(a))
+#define MAX(a,b) ((a)>(b) ? (a) : (b))
+#define MIN(a,b) ((a)<(b) ? (a) : (b))
+
+void runtimeError(char error_text[]);
+float *vector(long nl, long nh);
+int *ivector(long nl, long nh);
+unsigned char *cvector(long nl, long nh);
+unsigned long *lvector(long nl, long nh);
+double *dvector(long nl, long nh);
+float **matrix(long nrl, long nrh, long ncl, long nch);
+double **dmatrix(long nrl, long nrh, long ncl, long nch);
+int **imatrix(long nrl, long nrh, long ncl, long nch);
+char **cmatrix(long nrl, long nrh, long ncl, long nch);
+unsigned long **lmatrix(long nrl, long nrh, long ncl, long nch);
+float **submatrix(float **a, long oldrl, long oldrh, long oldcl, long oldch,
+ long newrl, long newcl);
+float **convert_matrix(float *a, long nrl, long nrh, long ncl, long nch);
+float ***f3tensor(long nrl, long nrh, long ncl, long nch, long ndl, long ndh);
+unsigned long ***lmatrix3D(long nrl, long nrh, long ncl, long nch, long ndl, long ndh);
+int ***imatrix3D(int nrl, int nrh, int ncl, int nch, int ndl, int ndh);
+
+void free_vector(float *v, long nl, long nh);
+void free_ivector(int *v, long nl, long nh);
+void free_cvector(unsigned char *v, long nl, long nh);
+void free_lvector(unsigned long *v, long nl, long nh);
+void free_dvector(double *v, long nl, long nh);
+void free_matrix(float **m, long nrl, long nrh, long ncl, long nch);
+void free_dmatrix(double **m, long nrl, long nrh, long ncl, long nch);
+void free_imatrix(int **m, long nrl, long nrh, long ncl, long nch);
+void free_cmatrix(char **m, long nrl, long nrh, long ncl, long nch);
+void free_lmatrix(unsigned long **m, long nrl, long nrh, long ncl, long nch);
+void free_submatrix(float **b, long nrl, long nrh, long ncl, long nch);
+void free_convert_matrix(float **b, long nrl, long nrh, long ncl, long nch);
+void free_f3tensor(float ***t, long nrl, long nrh, long ncl, long nch,
+ long ndl, long ndh);
+void free_lmatrix3D(unsigned long ***t, long nrl, long nrh, long ncl, long nch,
+ long ndl, long ndh);
+void free_imatrix3D(int ***t, int nrl, int nrh, int ncl, int nch, int ndl, int ndh);
+int comp_float(const void *i, const void *j);
+int comp_int(const void *i, const void *j);
+
+} // Flute namespace.
+
+#endif /* FLUTE_MEMALLOC_H */
diff --git a/knik/src/flute-3.1/src/mst2.cpp b/flute/src/3.1/mst2.cpp
old mode 100644
new mode 100755
similarity index 92%
rename from knik/src/flute-3.1/src/mst2.cpp
rename to flute/src/3.1/mst2.cpp
index a3fa0e9b..af59592b
--- a/knik/src/flute-3.1/src/mst2.cpp
+++ b/flute/src/3.1/mst2.cpp
@@ -1,13 +1,13 @@
#include
#include
#include
-#include "knik/global.h"
-#include "knik/neighbors.h"
-#include "knik/dist.h"
-#include "knik/heap.h"
-#include "knik/err.h"
-
+#include "global.h"
+#include "neighbors.h"
+#include "dist.h"
+#include "heap.h"
+#include "err.h"
+namespace Flute {
void mst2_package_init( long n )
{
@@ -90,3 +90,4 @@ void mst2
/****************************************************************************/
/****************************************************************************/
+} // Flute namespace.
diff --git a/knik/src/flute-3.1/src/knik/mst2.h b/flute/src/3.1/mst2.h
old mode 100644
new mode 100755
similarity index 62%
rename from knik/src/flute-3.1/src/knik/mst2.h
rename to flute/src/3.1/mst2.h
index e4650515..85312ed2
--- a/knik/src/flute-3.1/src/knik/mst2.h
+++ b/flute/src/3.1/mst2.h
@@ -1,11 +1,15 @@
-#ifndef _MST2_H_
-#define _MST2_H_
+#ifndef FLUTE_MST2_H
+#define FLUTE_MST2_H
#include "global.h"
+namespace Flute {
+
void mst2_package_init( long n );
void mst2_package_done();
void mst2( long n, Point* pt, long* parent );
+} // Flute namespace.
+
#endif
diff --git a/knik/src/flute-3.1/src/neighbors.cpp b/flute/src/3.1/neighbors.cpp
old mode 100644
new mode 100755
similarity index 98%
rename from knik/src/flute-3.1/src/neighbors.cpp
rename to flute/src/3.1/neighbors.cpp
index 0f9f823c..620e7bb5
--- a/knik/src/flute-3.1/src/neighbors.cpp
+++ b/flute/src/3.1/neighbors.cpp
@@ -1,9 +1,11 @@
#include
#include
#include
-#include "knik/global.h"
-#include "knik/err.h"
-#include "knik/dist.h"
+#include "global.h"
+#include "err.h"
+#include "dist.h"
+
+namespace Flute {
long octant
(
@@ -39,7 +41,7 @@ void allocate_nn_arrays( long n )
aux = (long*)realloc( (void*)aux, (size_t)n*sizeof(long) );
if( !nn || !sheared || !sorted || !aux )
{
- err_exit( (char*)"Cannot allocate memory in allocate_nn_arrays!" );
+ err_exit( "Cannot allocate memory in allocate_nn_arrays!" );
}
max_arrays_size = n;
}
@@ -525,3 +527,4 @@ void check_nn
/***************************************************************************/
/***************************************************************************/
+} // Flute namespace.
diff --git a/knik/src/flute-3.1/src/knik/neighbors.h b/flute/src/3.1/neighbors.h
old mode 100644
new mode 100755
similarity index 66%
rename from knik/src/flute-3.1/src/knik/neighbors.h
rename to flute/src/3.1/neighbors.h
index 491a0a94..95c1ba1e
--- a/knik/src/flute-3.1/src/knik/neighbors.h
+++ b/flute/src/3.1/neighbors.h
@@ -1,5 +1,11 @@
+
+#ifndef FLUTE_NEIGHBORS_H
+#define FLUTE_NEIGHBORS_H
+
#include "global.h"
+namespace Flute {
+
void allocate_nn_arrays( long n );
void deallocate_nn_arrays();
@@ -17,3 +23,6 @@ void dq_nearest_neighbors
nn_array* nn
);
+} // Flute namespace.
+
+#endif /* FLUTE_NEIGHBORS_H */
diff --git a/flute/src/3.1/rand-pts.cpp b/flute/src/3.1/rand-pts.cpp
new file mode 100755
index 00000000..24f7df4c
--- /dev/null
+++ b/flute/src/3.1/rand-pts.cpp
@@ -0,0 +1,35 @@
+#include
+#include
+#include
+
+int main(int ac, char *av[])
+{
+ int d=10, tmp, i;
+ int PNUM = 0;
+
+ for (i=1; i] [-n] []\n", av[0]);
+ printf(" Output random points ");
+ printf("as lines of coordinate pairs.\n");
+ printf(" Default is 10.\n");
+ printf(" -r\t Randomize. Use getpid() as seed.\n");
+ printf(" -s\t Set random seed to .\n");
+ printf(" -n\t Write first before the random points.\n");
+ exit(-1);
+ }
+ }
+
+ if (PNUM)
+ printf("%d\n", d);
+ for (i=1; i<=d; i++)
+ printf("%4d %4d\n", (int) random()%10000, (int) random()%10000);
+}
diff --git a/flute/src/CMakeLists.txt b/flute/src/CMakeLists.txt
new file mode 100644
index 00000000..c6ffb1a4
--- /dev/null
+++ b/flute/src/CMakeLists.txt
@@ -0,0 +1,2 @@
+
+ add_subdirectory(3.1)
diff --git a/hurricane/doc/analog/MainPage.dox b/hurricane/doc/analog/MainPage.dox
index 1d3d8ba1..f8ec3cde 100644
--- a/hurricane/doc/analog/MainPage.dox
+++ b/hurricane/doc/analog/MainPage.dox
@@ -69,33 +69,45 @@ Instance* instance = cell->getSlaveInstances().getFirst();
*
* For the Transistor device:
*
- * -# The netlist is fixed and generated (in C++) in the Transistor, by
- * instanciating one MetaTransistor.
- * -# The layout is generated on the fly by calling the relevant
- * python sceript.
- * -# The parameters, which are commons to all the Transistor based
- * devices are created in TransistorFamily. The parameters are created
- * through the Device parameter factory and stored at the Device level.
- * A pointer to the concrete type of Parameter is also kept at the
- * TransistorFamily level.
- * -# The Device::getParameters() method is implemented at this level
- * and returns a TransistorArguments pointer.
- * -# Parameters are used to set up the Device characteristics, either
- * programmatically or through the Pharos
graphical
- * interface.
- * -# Arguments
, on the other hand, are mostly used to
- * transmit the setting of a Device (i.e. it's Parameters values)
- * to the Python script in charge of the layout generation.
- * Arguments have Python wrapper PyArguments, and it is copies of
- * the values that are transmitted.
+ * -# The netlist is fixed and generated (in C++) in the Transistor, by
+ * instanciating one MetaTransistor.
+ *
+ * -# The layout is generated on the fly by calling the relevant
+ * python script.
+ *
+ * -# The parameters, which are commons to all the Transistor based
+ * devices are created in TransistorFamily. The parameters are created
+ * through the Device parameter factory and stored at the Device level.
+ * A pointer to the concrete type of Parameter is also kept at the
+ * TransistorFamily level.
+ *
+ * -# The Device::getParameters() method is implemented at this level
+ * and returns a reference to the set of parameters.
+ *
+ * -# Parameters are used to set up the Device characteristics, either
+ * programmatically or through the graphical interface.
+ *
+ * The layout Python generation scripts also uses the Parameter
+ * to know the settings of a device.
+ *
+ * Deprecateds:
+ *
+ * -# Arguments
where fully redundant with Parameters, so
+ * we did remove them.
+ *
+ * The Arguments must be removed from the UML schema.
*
*
* \subsection ssecOpenQuestions Open questions
*
- * -# As Arguments are used to transmit parameters, why not simply
- * encapsulate Parameters in a Python wrapper? Thus completly
- * suppressing Arguments. And by the way, using pointers to
- * to make the relationship bi-directionnal (event if it's not
- * needed now).
+ * -# In Bora::channelRouting, what is implemented is in fact an
+ * interval tree (or segment tree). We should try to use their
+ * \c Boost implementation.
+ *
+ * -# In Bora::SlicingTree, whe should merge the list of user nodes
+ * (devices and hierarchical) with the routing nodes (channels and
+ * struts) to unify the underlying management. This sould enable
+ * us to move lots method implementation \e upward in the class
+ * hierarchy.
*/
diff --git a/hurricane/src/hurricane/Cell.cpp b/hurricane/src/hurricane/Cell.cpp
index 60e9df28..ecd577c9 100644
--- a/hurricane/src/hurricane/Cell.cpp
+++ b/hurricane/src/hurricane/Cell.cpp
@@ -1575,16 +1575,30 @@ Cell::NetMap::NetMap()
{
}
-Name Cell::NetMap::_getKey(Net* net) const
+const Name& Cell::NetMap::_getKey(Net* net) const
// ***************************************
{
return net->getName();
}
-unsigned Cell::NetMap::_getHashValue(Name name) const
-// **************************************************
+unsigned Cell::NetMap::_getHashValue(const Name& name) const
+// *********************************************************
{
- return (unsigned int)name._getSharedName()->getId() / 8;
+ unsigned long hash = 0;
+ unsigned long sum4 = 0;
+ const string& s = name._getSharedName()->_getSString();
+ for ( size_t i=0 ; igetId() / 8;
}
Net* Cell::NetMap::_getNextElement(Net* net) const
diff --git a/hurricane/src/hurricane/DBo.cpp b/hurricane/src/hurricane/DBo.cpp
index 7393df2d..382828a9 100644
--- a/hurricane/src/hurricane/DBo.cpp
+++ b/hurricane/src/hurricane/DBo.cpp
@@ -30,6 +30,7 @@
#include "hurricane/Initializer.h"
+#include "hurricane/Timer.h"
#include "hurricane/DBo.h"
#include "hurricane/Entity.h"
#include "hurricane/Property.h"
@@ -44,8 +45,101 @@ namespace Hurricane {
// Class : "Hurricane::DBo".
- DBo::DBo (): _propertySet()
- { }
+ unsigned int DBo::_memoryLimit = 0;
+ unsigned long DBo::_flags = 0;
+ unsigned int DBo::_nextId = 0;
+ unsigned int DBo::_idCounterLimit = 0;
+ unsigned int DBo::_idCounter = 1;
+
+
+ void DBo::setIdCounterLimit ( unsigned int limit )
+ { _idCounterLimit = limit; }
+
+
+ void DBo::setMemoryLimit ( unsigned int limit )
+ { _memoryLimit = limit; }
+
+
+ unsigned int DBo::getIdCounter ()
+ { return _idCounter; }
+
+
+ bool DBo::inForcedIdMode ()
+ { return _flags & ForcedIdMode; }
+
+
+ void DBo::enableForcedIdMode ()
+ {
+ if (_flags & ForcedIdMode) return;
+ if (_idCounter != 1) {
+ throw Error( "DBo::enableForcedIdMode(): DataBase must be reset before forcind ids." );
+ }
+ _flags |= ForcedIdMode;
+ }
+
+
+ void DBo::disableForcedIdMode ()
+ {
+ if (not (_flags & ForcedIdMode)) return;
+ _flags &= ~ForcedIdMode;
+ }
+
+
+ void DBo::setNextId ( unsigned int nid )
+ {
+ if (not (_flags & ForcedIdMode)) {
+ cerr << Error("DBo::setNextId(): Not in forced id mode, ignored.") << endl;
+ return;
+ }
+ _nextId = nid;
+ if (nid > _idCounter) _idCounter = nid;
+ _flags |= NextIdSet;
+ }
+
+
+ unsigned int DBo::getNextId ()
+ {
+ if (_flags & ForcedIdMode) {
+ if (_flags & NextIdSet) {
+ _flags &= ~NextIdSet;
+ cdebug_log(18,0) << demangle(typeid(*this).name())
+ << "::getNextId(): Consuming the preset id:" << _nextId << endl;
+ return _nextId;
+ } else {
+ throw Error("DBo::getNextId(): Next id is not set, while in forced id mode.");
+ }
+ }
+
+ return ++_idCounter;
+ }
+
+
+
+ DBo::DBo ()
+ : _id (getNextId())
+ , _propertySet()
+ {
+ if (_idCounterLimit and (_id > _idCounterLimit)) {
+ throw Error( "DBo::DBo(): Identifier counter has reached user's limit (%d)."
+ , _idCounterLimit );
+ }
+ if (_idCounter == std::numeric_limits::max()) {
+ throw Error( "DBo::DBo(): Identifier counter has reached type limit (%d bits)."
+ , std::numeric_limits::digits );
+ }
+
+ size_t memorySize = Timer::getMemorySize();
+ if (_memoryLimit and ((memorySize >> 20) > _memoryLimit)) {
+ throw Error( "DBo::DBo(): Program has reached maximum allowed limit of %dMb."
+ , _memoryLimit );
+ }
+
+ // if (_id % 10000 == 0) {
+ // cerr << "Reached id:" << _id << " " << Timer::getStringMemory(memorySize) << endl;
+ // }
+ // if (_id == 75060)
+ // cerr << "DBo::DBo() " << this << endl;
+ }
DBo::~DBo ()
@@ -91,6 +185,17 @@ namespace Hurricane {
}
+ void DBo::setId ( unsigned int id )
+ {
+ if (_flags & ForcedIdMode) {
+ _id = id;
+ if (_id > _idCounter) _idCounter = _id;
+ } else {
+ throw Error("DBo::setId(): Attempt to set id while not in forced id mode.");
+ }
+ }
+
+
void DBo::put ( Property* property )
{
if ( !property )
@@ -181,14 +286,15 @@ namespace Hurricane {
string DBo::_getString () const
{
- return "<" + _getTypeName() + ">";
+ return "";
}
Record* DBo::_getRecord () const
{
Record* record = new Record ( getString(this) );
- record->add ( getSlot("_propertySet", &_propertySet) );
+ record->add( getSlot("_id" , _id ) );
+ record->add( getSlot("_propertySet", &_propertySet) );
return record;
}
diff --git a/hurricane/src/hurricane/Entity.cpp b/hurricane/src/hurricane/Entity.cpp
index a042a179..f8c1a5d8 100644
--- a/hurricane/src/hurricane/Entity.cpp
+++ b/hurricane/src/hurricane/Entity.cpp
@@ -19,7 +19,6 @@
#include
#include "hurricane/Error.h"
-#include "hurricane/Timer.h"
#include "hurricane/Entity.h"
#include "hurricane/Quark.h"
#include "hurricane/Cell.h"
@@ -34,99 +33,16 @@ namespace Hurricane {
// ****************************************************************************************************
- unsigned int Entity::_memoryLimit = 0;
- unsigned long Entity::_flags = 0;
- unsigned int Entity::_nextId = 0;
- unsigned int Entity::_idCounterLimit = 0;
- unsigned int Entity::_idCounter = 1;
-
-
- void Entity::setIdCounterLimit ( unsigned int limit )
- { _idCounterLimit = limit; }
-
-
- void Entity::setMemoryLimit ( unsigned int limit )
- { _memoryLimit = limit; }
-
-
- unsigned int Entity::getIdCounter ()
- { return _idCounter; }
-
-
- bool Entity::inForcedIdMode ()
- { return _flags & ForcedIdMode; }
-
-
- void Entity::enableForcedIdMode ()
- {
- if (_flags & ForcedIdMode) return;
- if (_idCounter != 1) {
- throw Error( "Entity::enableForcedIdMode(): DataBase must be reset before forcind ids." );
- }
- _flags |= ForcedIdMode;
- }
-
-
- void Entity::disableForcedIdMode ()
- {
- if (not (_flags & ForcedIdMode)) return;
- _flags &= ~ForcedIdMode;
- }
-
-
- void Entity::setNextId ( unsigned int nid )
- {
- if (not (_flags & ForcedIdMode)) {
- cerr << Error("Entity::setNextId(): Not in forced id mode, ignored.") << endl;
- return;
- }
- _nextId = nid;
- if (nid > _idCounter) _idCounter = nid;
- _flags |= NextIdSet;
- }
-
-
- unsigned int Entity::getNextId ()
- {
- if (_flags & ForcedIdMode) {
- if (_flags & NextIdSet) {
- _flags &= ~NextIdSet;
- cdebug_log(18,0) << demangle(typeid(*this).name())
- << "::getNextId(): Consuming the preset id:" << _nextId << endl;
- return _nextId;
- } else {
- throw Error("Entity::getNextId(): Next id is not set, while in forced id mode.");
- }
- }
-
- return _idCounter++;
- }
-
-
Entity::Entity()
: Inherit()
- , _id (getNextId())
+ { }
+
+
+ void Entity::_postCreate()
{
- if (_idCounterLimit and (_id > _idCounterLimit)) {
- throw Error( "Entity::Entity(): Identifier counter has reached user's limit (%d)."
- , _idCounterLimit );
- }
- if (_idCounter == std::numeric_limits::max()) {
- throw Error( "Entity::Entity(): Identifier counter has reached type limit (%d bits)."
- , std::numeric_limits::digits );
- }
+ Inherit::_postCreate();
- size_t memorySize = Timer::getMemorySize();
- if (_memoryLimit and ((memorySize >> 20) > _memoryLimit)) {
- throw Error( "Entity::Entity(): Program has reached maximum allowed limit of %dMb."
- , _memoryLimit );
- }
-
- // if (_id % 10000 == 0) {
- // cerr << "Reached id:" << _id << " " << Timer::getStringMemory(memorySize) << endl;
- // }
- // if (_id == 75060)
- // cerr << "Entity::Entity() " << this << endl;
+ //cerr << _getString() << endl;
}
@@ -174,17 +90,6 @@ namespace Hurricane {
}
- void Entity::setId ( unsigned int id )
- {
- if (_flags & ForcedIdMode) {
- _id = id;
- if (_id > _idCounter) _idCounter = _id;
- } else {
- throw Error("Entity::setId(): Attempt to set id while not in forced id mode.");
- }
- }
-
-
void Entity::_toJson ( JsonWriter* writer ) const
{
Inherit::_toJson( writer );
@@ -196,7 +101,6 @@ namespace Hurricane {
string Entity::_getString() const
{
string s = Inherit::_getString();
- s.insert( 1, "id:"+getString(_id)+" " );
return s;
}
@@ -205,7 +109,6 @@ namespace Hurricane {
{
Record* record = Inherit::_getRecord();
if (record) {
- record->add( getSlot("_id", _id) );
Occurrence occurrence = Occurrence(this);
if (occurrence.hasProperty())
record->add( getSlot("Occurrence", occurrence) );
diff --git a/hurricane/src/hurricane/Instance.cpp b/hurricane/src/hurricane/Instance.cpp
index 2f88d3f3..37f5cbb4 100644
--- a/hurricane/src/hurricane/Instance.cpp
+++ b/hurricane/src/hurricane/Instance.cpp
@@ -182,19 +182,19 @@ Instance::Instance(Cell* cell, const Name& name, Cell* masterCell, const Transfo
_nextOfCellSlaveInstanceSet(NULL)
{
if (!_cell)
- throw Error("Can't create " + _TName("Instance") + " : null cell");
+ throw Error("Instance::Instance(): Can't create " + _TName("Instance") + ", NULL cell");
if (name.isEmpty())
- throw Error("Can't create " + _TName("Instance") + " : empty name");
+ throw Error("Instance::Instance(): Can't create " + _TName("Instance") + ", empty name");
if (_cell->getInstance(_name))
- throw Error("Can't create " + _TName("Instance") + " " + getString(_name) + " : already exists");
+ throw Error("Instance::Instance(): Can't create " + _TName("Instance") + " " + getString(_name) + ", already exists");
if (!_masterCell)
- throw Error("Can't create " + _TName("Instance") + " : null master cell");
+ throw Error("Instance::Instance(): Can't create " + _TName("Instance") + ", NULL master cell");
if (secureFlag && _cell->isCalledBy(_masterCell))
- throw Error("Can't create " + _TName("Instance") + " : cyclic construction");
+ throw Error("Instance::Instance(): Can't create " + _TName("Instance") + ", cyclic construction");
}
Instance* Instance::create(Cell* cell, const Name& name, Cell* masterCell, bool secureFlag)
diff --git a/hurricane/src/hurricane/Layer.cpp b/hurricane/src/hurricane/Layer.cpp
index 2bb977e1..bc51373d 100644
--- a/hurricane/src/hurricane/Layer.cpp
+++ b/hurricane/src/hurricane/Layer.cpp
@@ -56,6 +56,7 @@ namespace Hurricane {
, _minimalSpacing(minimalSpacing)
, _nextOfTechnologyLayerMap(NULL)
, _symbolic(false)
+ , _blockage(false)
{
if ( !_technology )
throw Error ( "Can't create " + _TName("Layer") + " : null technology" );
diff --git a/hurricane/src/hurricane/Property.cpp b/hurricane/src/hurricane/Property.cpp
index f3a5d17f..a2ad9f02 100644
--- a/hurricane/src/hurricane/Property.cpp
+++ b/hurricane/src/hurricane/Property.cpp
@@ -226,10 +226,11 @@ namespace Hurricane {
void SharedProperty::_preDestroy ()
{
- for ( size_t i=0 ; i<_ownerSet.size() ; ++i ) {
- _ownerSet[i]->_onDestroyed(this);
- _ownerSet[i] = NULL;
- }
+ for ( DBo* owner : _ownerSet ) owner->_onDestroyed( this );
+ // for ( size_t i=0 ; i<_ownerSet.size() ; ++i ) {
+ // _ownerSet[i]->_onDestroyed(this);
+ // _ownerSet[i] = NULL;
+ // }
_ownerSet.clear();
// while (!_ownerSet.empty()) {
@@ -244,36 +245,24 @@ namespace Hurricane {
void SharedProperty::_erase ( DBo* owner )
{
- for ( size_t i=0 ; i<_ownerSet.size() ; ++i ) {
- if (_ownerSet[i] == owner) {
- std::swap( _ownerSet[i], _ownerSet[_ownerSet.size()-1] );
- _ownerSet.pop_back();
- }
+ auto iowner = _ownerSet.find( owner );
+ if (iowner != _ownerSet.end()) {
+ _ownerSet.erase( iowner );
}
}
void SharedProperty::onCapturedBy ( DBo* owner )
{
- for ( DBo* dbo : _ownerSet ) {
- if (dbo == owner) return;
- }
- _ownerSet.push_back( owner );
-
- //_ownerSet.insert(owner);
+ if (_ownerSet.find(owner) != _ownerSet.end()) return;
+ _ownerSet.insert(owner);
}
void SharedProperty::onReleasedBy ( DBo* owner )
{
- for ( size_t i=0 ; i<_ownerSet.size() ; ++i ) {
- if (_ownerSet[i] == owner) {
- std::swap( _ownerSet[i], _ownerSet[_ownerSet.size()-1] );
- _ownerSet.pop_back();
- }
- }
- //_ownerSet.erase(owner);
-
+ auto iowner = _ownerSet.find( owner );
+ if (iowner != _ownerSet.end()) _ownerSet.erase( owner );
if (_ownerSet.empty()) onNotOwned();
}
diff --git a/hurricane/src/hurricane/Timer.cpp b/hurricane/src/hurricane/Timer.cpp
index 3507b219..4155863e 100644
--- a/hurricane/src/hurricane/Timer.cpp
+++ b/hurricane/src/hurricane/Timer.cpp
@@ -249,18 +249,19 @@ namespace Hurricane {
string s;
unsigned int hours = (unsigned int)duration / 3600;
- if ( hours )
+ if (hours)
s += getString(hours) + "h ";
unsigned int minutes = ((unsigned int)duration % 3600) / 60;
- if ( hours || minutes )
+ if (hours or minutes)
s += getString(minutes) + "m ";
double seconds = duration;
- if ( hours || minutes ) {
+ if (hours or minutes) {
minutes = ((unsigned int)duration) / 60;
seconds = duration - ((float)minutes * 60.0);
}
+ seconds = std::round(seconds * 100.0) / 100.0;
s += getString((float)seconds) + "s";
diff --git a/hurricane/src/hurricane/hurricane/BasicLayer.h b/hurricane/src/hurricane/hurricane/BasicLayer.h
index 4e34943c..d3c475f5 100644
--- a/hurricane/src/hurricane/hurricane/BasicLayer.h
+++ b/hurricane/src/hurricane/hurricane/BasicLayer.h
@@ -140,7 +140,7 @@ namespace Hurricane {
inline unsigned BasicLayer::getGds2Layer () const { return _gds2Layer; }
inline unsigned BasicLayer::getGds2Datatype () const { return _gds2Datatype; }
inline const Name& BasicLayer::getRealName () const { return _realName; }
- inline void BasicLayer::setBlockageLayer ( BasicLayer* layer) { _blockageLayer = layer; }
+ inline void BasicLayer::setBlockageLayer ( BasicLayer* layer) { _blockageLayer = layer; layer->setBlockage(true); }
inline void BasicLayer::setGds2Layer ( unsigned int number ) { _gds2Layer=number; }
inline void BasicLayer::setGds2Datatype ( unsigned int number ) { _gds2Datatype=number; }
inline void BasicLayer::setRealName ( const char* realName) { _realName = realName; }
diff --git a/hurricane/src/hurricane/hurricane/Cell.h b/hurricane/src/hurricane/hurricane/Cell.h
index fbad248b..7aecbe10 100644
--- a/hurricane/src/hurricane/hurricane/Cell.h
+++ b/hurricane/src/hurricane/hurricane/Cell.h
@@ -265,15 +265,15 @@ class Cell : public Entity {
};
- public: class NetMap : public IntrusiveMap {
- // **************************************************
+ public: class NetMap : public IntrusiveMapConst {
+ // *********************************************************
- public: typedef IntrusiveMap Inherit;
+ public: typedef IntrusiveMapConst Inherit;
public: NetMap();
- public: virtual Name _getKey(Net* net) const;
- public: virtual unsigned _getHashValue(Name name) const;
+ public: virtual const Name& _getKey(Net* net) const;
+ public: virtual unsigned _getHashValue(const Name& name) const;
public: virtual Net* _getNextElement(Net* net) const;
public: virtual void _setNextElement(Net* net, Net* nextNet) const;
diff --git a/hurricane/src/hurricane/hurricane/Collection.h b/hurricane/src/hurricane/hurricane/Collection.h
index 9a6042ac..1f3b5664 100644
--- a/hurricane/src/hurricane/hurricane/Collection.h
+++ b/hurricane/src/hurricane/hurricane/Collection.h
@@ -206,6 +206,7 @@ template class Collection {
class iterator {
public:
iterator ( Locator* l ) : _locator(l) {}
+ ~iterator () { delete _locator; }
bool operator== ( const iterator& o) const { return not (*this != o); }
iterator& operator++ () { _locator->progress(); return *this; }
Type operator* () { return _locator->getElement(); }
diff --git a/hurricane/src/hurricane/hurricane/DBo.h b/hurricane/src/hurricane/hurricane/DBo.h
index 0d12dd70..4a4096d4 100644
--- a/hurricane/src/hurricane/hurricane/DBo.h
+++ b/hurricane/src/hurricane/hurricane/DBo.h
@@ -45,43 +45,70 @@ namespace Hurricane {
class DBo {
public:
- virtual void destroy ();
- inline set& _getPropertySet ();
- void _onDestroyed ( Property* property );
- Property* getProperty ( const Name& ) const;
- Properties getProperties () const;
- inline bool hasProperty () const;
- void put ( Property* );
- void remove ( Property* );
- void removeProperty ( const Name& );
- void clearProperties ();
- virtual string _getTypeName () const;
- virtual string _getString () const;
- virtual Record* _getRecord () const;
- virtual void _toJson ( JsonWriter* ) const;
- virtual void _toJsonCollections ( JsonWriter* ) const;
- virtual void _toJsonSignature ( JsonWriter* ) const;
- void toJson ( JsonWriter* ) const;
- void toJsonSignature ( JsonWriter* ) const;
-
- private:
- mutable set _propertySet;
-
+ enum DBoFlags { ForcedIdMode = (1<<0)
+ , NextIdSet = (1<<1)
+ };
+ public:
+ static void setMemoryLimit ( unsigned int );
+ static void setIdCounterLimit ( unsigned int );
+ static unsigned int getIdCounter ();
+ unsigned int getNextId ();
+ static void setNextId ( unsigned int );
+ static bool inForcedIdMode ();
+ static void enableForcedIdMode ();
+ static void disableForcedIdMode ();
+ static void useIdCounter2 ();
+ public:
+ virtual void destroy ();
+ inline set& _getPropertySet ();
+ void _onDestroyed ( Property* property );
+ inline unsigned int getId () const;
+ Property* getProperty ( const Name& ) const;
+ Properties getProperties () const;
+ inline bool hasProperty () const;
+ void setId ( unsigned int );
+ void put ( Property* );
+ void remove ( Property* );
+ void removeProperty ( const Name& );
+ void clearProperties ();
+ virtual string _getTypeName () const;
+ virtual string _getString () const;
+ virtual Record* _getRecord () const;
+ virtual void _toJson ( JsonWriter* ) const;
+ virtual void _toJsonCollections ( JsonWriter* ) const;
+ virtual void _toJsonSignature ( JsonWriter* ) const;
+ void toJson ( JsonWriter* ) const;
+ void toJsonSignature ( JsonWriter* ) const;
protected:
- DBo ();
- virtual ~DBo ();
- virtual void _postCreate ();
- virtual void _preDestroy ();
-
- private:
- DBo ( const DBo& );
- DBo& operator= ( const DBo& );
+ DBo ();
+ virtual ~DBo ();
+ virtual void _postCreate ();
+ virtual void _preDestroy ();
+ private:
+ DBo ( const DBo& );
+ DBo& operator= ( const DBo& );
+ private:
+ static unsigned int _memoryLimit;
+ static unsigned long _flags;
+ static unsigned int _nextId;
+ static unsigned int _idCounter;
+ static unsigned int _idCounterLimit;
+ unsigned int _id;
+ mutable set _propertySet;
+ public:
+ struct CompareById : public std::binary_function {
+ inline bool operator() ( const DBo* lhs, const DBo* rhs ) const;
+ };
};
// Inline Functions.
inline set& DBo::_getPropertySet () { return _propertySet; }
inline bool DBo::hasProperty () const { return !_propertySet.empty(); }
+ inline unsigned int DBo::getId () const { return _id; }
+
+ inline bool DBo::CompareById::operator() ( const DBo* lhs, const DBo* rhs ) const
+ { return ((lhs)?lhs->getId():0) < ((rhs)?rhs->getId():0); }
// -------------------------------------------------------------------
diff --git a/hurricane/src/hurricane/hurricane/Entity.h b/hurricane/src/hurricane/hurricane/Entity.h
index 8ba92e52..02e206ed 100644
--- a/hurricane/src/hurricane/hurricane/Entity.h
+++ b/hurricane/src/hurricane/hurricane/Entity.h
@@ -39,51 +39,20 @@ namespace Hurricane {
{
public:
typedef DBo Inherit;
- public:
- enum EntityFlags { ForcedIdMode = (1<<0)
- , NextIdSet = (1<<1)
- };
- public:
- static void setMemoryLimit ( unsigned int );
- static void setIdCounterLimit ( unsigned int );
- static unsigned int getIdCounter ();
- unsigned int getNextId ();
- static void setNextId ( unsigned int );
- static bool inForcedIdMode ();
- static void enableForcedIdMode ();
- static void disableForcedIdMode ();
public:
- inline unsigned int getId () const;
virtual Cell* getCell () const = 0;
virtual Box getBoundingBox () const = 0;
- void setId ( unsigned int );
virtual void _toJson ( JsonWriter* ) const;
virtual string _getString () const;
virtual Record* _getRecord () const;
Quark* _getQuark ( SharedPath* sharedPath = NULL ) const;
protected:
Entity ();
+ virtual void _postCreate ();
virtual void _preDestroy ();
- private:
- static unsigned int _memoryLimit;
- static unsigned long _flags;
- static unsigned int _nextId;
- static unsigned int _idCounter;
- static unsigned int _idCounterLimit;
- unsigned int _id;
-
- public:
- struct CompareById : public std::binary_function {
- inline bool operator() ( const Entity* lhs, const Entity* rhs ) const;
- };
};
- inline unsigned int Entity::getId () const { return _id; }
- inline bool Entity::CompareById::operator() ( const Entity* lhs, const Entity* rhs ) const
- { return ((lhs)?lhs->getId():0) < ((rhs)?rhs->getId():0); }
-
-
// -------------------------------------------------------------------
// Class : "Hurricane::JsonEntity".
diff --git a/hurricane/src/hurricane/hurricane/IntrusiveMap.h b/hurricane/src/hurricane/hurricane/IntrusiveMap.h
index 31c84223..7ca44572 100644
--- a/hurricane/src/hurricane/hurricane/IntrusiveMap.h
+++ b/hurricane/src/hurricane/hurricane/IntrusiveMap.h
@@ -507,6 +507,487 @@ inline void jsonWrite ( JsonWriter* w, const std::string& key, Hurricane::Intru
w->endArray();
}
+
+
+
+namespace Hurricane {
+
+// ****************************************************************************************************
+// IntrusiveMapConst declaration
+// ****************************************************************************************************
+
+template class IntrusiveMapConst {
+// ********************************************************
+
+// Types
+// *****
+
+ class Elements : public Collection {
+ // *****************************************
+
+ // Types
+ // *****
+
+ public: typedef Collection Inherit;
+
+ public: class Locator : public Hurricane::Locator {
+ // ********************************************************
+
+ // Types
+ // *****
+
+ public: typedef Hurricane::Locator Inherit;
+
+ // Attributes
+ // **********
+
+ private: const IntrusiveMapConst* _map;
+ private: unsigned _index;
+ private: Element* _element;
+
+ // Constructors
+ // ************
+
+ public: Locator(const IntrusiveMapConst* map = NULL)
+ // ********************************************
+ : Inherit(),
+ _map(map),
+ _index(0),
+ _element(NULL)
+ {
+ if (_map) {
+ unsigned length = _map->_getLength();
+ do {
+ _element = _map->_getArray()[_index++];
+ } while (!_element && (_index < length));
+ }
+ };
+
+ public: Locator(const Locator& locator)
+ // ************************************
+ : Inherit(),
+ _map(locator._map),
+ _index(locator._index),
+ _element(locator._element)
+ {
+ };
+
+ // Operators
+ // *********
+
+ public: Locator& operator=(const Locator& locator)
+ // ***********************************************
+ {
+ _map = locator._map;
+ _index = locator._index;
+ _element = locator._element;
+ return *this;
+ };
+
+ // Accessors
+ // *********
+
+ public: virtual Element* getElement() const
+ // ****************************************
+ {
+ return _element;
+ };
+
+ public: virtual Hurricane::Locator* getClone() const
+ // ***********************************************************
+ {
+ return new Locator(*this);
+ };
+
+ // Predicates
+ // **********
+
+ public: virtual bool isValid() const
+ // *********************************
+ {
+ return (_element != NULL);
+ };
+
+ // Updators
+ // ********
+
+ public: virtual void progress()
+ // ****************************
+ {
+ if (_element) {
+ cdebug_log(0,0) << "IntrusiveMapConst::progress() from:"
+ << " -> " << tsetw(4) << _index
+ << " + " << _map->_getHashValue(_map->_getKey(_element))
+ << "/" << _map->_getKey(_element) << ":" << _element << endl;
+
+ _element = _map->_getNextElement(_element);
+ if (!_element) {
+ unsigned length = _map->_getLength();
+ if (_index < length) {
+ do {
+ cdebug_log(0,0) << "next bucket: " << _index+1 << endl;
+ _element = _map->_getArray()[_index++];
+ } while (!_element && (_index < length));
+ }
+
+ if (_element)
+ cdebug_log(0,0) << "IntrusiveMapConst::progress() to:"
+ << " -> " << tsetw(4) << _index
+ << " + " << _map->_getHashValue(_map->_getKey(_element))
+ << "/" << _map->_getKey(_element) << ":" << _element << endl;
+ }
+ }
+ };
+
+ // Others
+ // ******
+
+ public: virtual string _getString() const
+ // **************************************
+ {
+ string s = "<" + _TName("IntrusiveMapConst::Elements::Locator");
+ if (_map) s += " " + getString(_map);
+ s += ">";
+ return s;
+ };
+
+ };
+
+ // Attributes
+ // **********
+
+ private: const IntrusiveMapConst* _map;
+
+ // Constructors
+ // ************
+
+ public: Elements(const IntrusiveMapConst* map = NULL)
+ // *********************************************
+ : Inherit(),
+ _map(map)
+ {
+ };
+
+ public: Elements(const Elements& elements)
+ // ***************************************
+ : Inherit(),
+ _map(elements._map)
+ {
+ };
+
+ // Operators
+ // *********
+
+ public: Elements& operator=(const Elements& elements)
+ // **************************************************
+ {
+ _map = elements._map;
+ return *this;
+ };
+
+ // Accessors
+ // *********
+
+ public: virtual Collection* getClone() const
+ // ***************************************************
+ {
+ return new Elements(*this);
+ };
+
+ public: virtual Hurricane::Locator* getLocator() const
+ // *************************************************************
+ {
+ return new Locator(_map);
+ };
+
+ // Others
+ // ******
+
+ public: virtual string _getString() const
+ // **************************************
+ {
+ string s = "<" + _TName("IntrusiveMapConst::Elements");
+ if (_map) s += " " + getString(_map);
+ s += ">";
+ return s;
+ };
+
+ };
+
+// Attributes
+// **********
+
+ private: unsigned _size;
+ private: unsigned _length;
+ private: Element** _array;
+
+// Constructors
+// ************
+
+ public: IntrusiveMapConst()
+ // *******************
+ : _size(0),
+ _length(1),
+ _array(new Element*[1])
+ {
+ _array[0] = NULL;
+ };
+
+ private: IntrusiveMapConst(const IntrusiveMapConst& map); // not implemented to forbid copy
+
+// Destructor
+// **********
+
+ public: virtual ~IntrusiveMapConst()
+ // ****************************
+ {
+ for (unsigned index = 0; index < _length; index++) {
+ Element* element = _array[index];
+ while (element) {
+ _array[index] = _getNextElement(element);
+ _setNextElement(element, NULL);
+ element = _array[index];
+ }
+ _array[index] = NULL;
+ }
+ delete[] _array;
+ };
+
+// Operators
+// *********
+
+ private: IntrusiveMapConst& operator=(const IntrusiveMapConst& map); // not implemented to forbid assignment
+
+// Accessors
+// *********
+
+ public: Element* getElement(const Key& key) const
+ // **********************************************
+ {
+ unsigned index = (_getHashValue(key) / 8) % _length;
+ Element* element = _array[index];
+ while (element && (_getKey(element) != key)) element = _getNextElement(element);
+ return element;
+ };
+
+ public: Elements getElements() const
+ // *********************************
+ {
+ return Elements(this);
+ };
+
+// Predicates
+// **********
+
+ public: bool isEmpty() const
+ // *************************
+ {
+ return (_size == 0);
+ };
+
+// Overridables
+// ************
+
+ public: virtual const Key& _getKey(Element* element) const = 0;
+
+ public: virtual unsigned _getHashValue(const Key& key) const = 0;
+
+ // public: virtual Element* _getNextElement(Element* element) const = 0; // AD
+ public: virtual Element* _getNextElement(Element* element) const
+ // *************************************************************
+ {
+ throw Error(_TName("IntrusiveMapConst") + "::_getNextElement(...) : should be overrided");
+ return NULL;
+ };
+
+ // public: virtual void _setNextElement(Element* element, Element* nextElement) const = 0; // AD
+ public: virtual void _setNextElement(Element* element, Element* nextElement) const
+ // *******************************************************************************
+ {
+ throw Error(_TName("IntrusiveMapConst") + "::_setNextElement(...) : should be overrided");
+ };
+
+// Others
+// ******
+
+ public: string _getTypeName() const
+ // ********************************
+ {
+ return _TName("IntrusiveMapConst");
+ }
+
+ public: string _getString() const
+ // ******************************
+ {
+ if (isEmpty())
+ return "<" + _getTypeName() + " empty>";
+ else
+ return "<" + _getTypeName() + " " + getString(_size) + ">";
+ };
+
+ public: Record* _getRecord() const
+ // *************************
+ {
+ Record* record = NULL;
+ if (!isEmpty()) {
+ record = new Record(getString(this));
+ unsigned n = 1;
+ for (unsigned index = 0; index < _length; index++) {
+ n = 1;
+ Element* element = _array[index];
+ while (element) {
+ record->add(getSlot(getString(index) + ":" + getString(n++), element));
+ element = _getNextElement(element);
+ }
+ }
+ }
+ return record;
+ };
+
+ public: unsigned _getSize() const
+ // ******************************
+ {
+ return _size;
+ };
+
+ public: unsigned _getLength() const
+ // ********************************
+ {
+ return _length;
+ };
+
+ public: Element** _getArray() const
+ // ********************************
+ {
+ return _array;
+ };
+
+ public: bool _contains(Element* element) const
+ // *******************************************
+ {
+ unsigned index = (_getHashValue(_getKey(element)) / 8) % _length;
+ Element* currentElement = _array[index];
+ while (currentElement && (currentElement != element))
+ currentElement = _getNextElement(currentElement);
+ return (currentElement != NULL);
+ };
+
+ public: void _insert(Element* element)
+ // ***********************************
+ {
+ if (!_contains(element)) {
+ unsigned index = (_getHashValue(_getKey(element)) / 8) % _length;
+ _setNextElement(element, _array[index]);
+ _array[index] = element;
+ _size++;
+ _resize();
+ }
+ };
+
+ public: void _remove(Element* element)
+ // ***********************************
+ {
+ if (_contains(element)) {
+ unsigned index = (_getHashValue(_getKey(element)) / 8) % _length;
+ Element* currentElement = _array[index];
+ if (currentElement) {
+ if (currentElement == element) {
+ _array[index] = _getNextElement(element);
+ _setNextElement(element, NULL);
+ _size--;
+ }
+ else {
+ while (_getNextElement(currentElement) && (_getNextElement(currentElement) != element))
+ currentElement = _getNextElement(currentElement);
+ if (currentElement && (_getNextElement(currentElement) == element)) {
+ _setNextElement(currentElement, _getNextElement(element));
+ _setNextElement(element, NULL);
+ _size--;
+ }
+ }
+ }
+ }
+ };
+
+ public: void _resize()
+ // *******************
+ {
+ unsigned newLength = _length;
+ double ratio = (double)_size / (double)_length;
+ if (ratio < 3.0) newLength = max(_size / 8, (unsigned)1);
+ else if (ratio > 10.0) newLength = min(_size / 5, (unsigned)512);
+
+ if (newLength != _length) {
+ cdebug_log(0,0) << "IntrusiveMapConst::_resize() " << _length << " -> " << newLength << endl;
+
+ unsigned oldLength = _length;
+ Element** oldArray = _array;
+ _length = newLength;
+ _array = new Element* [_length];
+ memset( _array, 0, _length * sizeof(Element*) );
+
+ for ( unsigned index = 0; index < oldLength; ++index ) {
+ Element* element = oldArray[index];
+ if (not element)
+ cdebug_log(0,0) << "| entry:" << tsetw(4) << index << " empty" << endl;
+
+ while ( element ) {
+ Element* nextElement = _getNextElement(element);
+ unsigned newIndex = (_getHashValue(_getKey(element)) / 8) % _length;
+ _setNextElement(element, _array[newIndex]);
+ _array[ newIndex ] = element;
+
+ cdebug_log(0,0) << "| entry:" << tsetw(4) << index
+ << " -> " << tsetw(4) << newIndex
+ << " + " << _getHashValue(_getKey(element))
+ << "/" << _getKey(element) << ":" << element << endl;
+
+ element = nextElement;
+ }
+ }
+ delete [] oldArray;
+ }
+ };
+
+};
+
+
+ template
+ inline GenericCollection getCollection(const IntrusiveMapConst& intrusiveMap)
+ // ********************************************************************************************
+ {
+ return intrusiveMap.getElements();
+ }
+
+
+} // End of Hurricane namespace.
+
+
+template
+inline std::string getString ( Hurricane::IntrusiveMapConst* intrusiveMap )
+ { return intrusiveMap->_getString(); }
+
+template
+inline std::string getString ( const Hurricane::IntrusiveMapConst* intrusiveMap )
+ { return intrusiveMap->_getString(); }
+
+template
+inline Hurricane::Record* getRecord ( Hurricane::IntrusiveMapConst* intrusiveMap )
+ { return intrusiveMap->_getRecord(); }
+
+template
+inline Hurricane::Record* getRecord ( const Hurricane::IntrusiveMapConst* intrusiveMap )
+ { return intrusiveMap->_getRecord(); }
+
+
+template
+inline void jsonWrite ( JsonWriter* w, const std::string& key, Hurricane::IntrusiveMapConst* intrusiveMap )
+{
+ w->key( key );
+ w->startArray();
+ for ( Element* element : intrusiveMap->getElements() ) jsonWrite( w, element );
+ w->endArray();
+}
#endif // HURRICANE_INTRUSIVE_MAP
diff --git a/hurricane/src/hurricane/hurricane/Layer.h b/hurricane/src/hurricane/hurricane/Layer.h
index ab3358e5..bbc873af 100644
--- a/hurricane/src/hurricane/hurricane/Layer.h
+++ b/hurricane/src/hurricane/hurricane/Layer.h
@@ -93,9 +93,11 @@ namespace Hurricane {
bool contains ( const Layer* layer ) const;
bool intersect ( const Layer* layer ) const;
inline bool isSymbolic () const;
+ inline bool isBlockage () const;
// Updators
void setName ( const Name& name );
inline void setSymbolic ( bool );
+ inline void setBlockage ( bool );
void setMinimalSize ( const DbU::Unit& minimalSize );
void setMinimalSpacing ( const DbU::Unit& minimalSpacing );
virtual void setEnclosure ( const BasicLayer* layer, DbU::Unit, uint32_t flags );
@@ -122,6 +124,7 @@ namespace Hurricane {
DbU::Unit _minimalSpacing;
Layer* _nextOfTechnologyLayerMap;
bool _symbolic;
+ bool _blockage;
protected:
// Internal: Constructors & Destructors.
@@ -143,6 +146,7 @@ namespace Hurricane {
// Inline Functions.
inline bool Layer::isSymbolic () const { return _symbolic; }
+ inline bool Layer::isBlockage () const { return _blockage; }
inline bool Layer::above ( const Layer* layer ) const { return _mask > layer->getMask(); }
inline bool Layer::below ( const Layer* layer ) const { return _mask < layer->getMask(); }
inline Technology* Layer::getTechnology () const { return _technology; }
@@ -152,6 +156,7 @@ namespace Hurricane {
inline const DbU::Unit& Layer::getMinimalSize () const { return _minimalSize; }
inline const DbU::Unit& Layer::getMinimalSpacing () const { return _minimalSpacing; }
inline void Layer::setSymbolic ( bool state ) { _symbolic = state; }
+ inline void Layer::setBlockage ( bool state ) { _blockage = state; }
inline Layer* Layer::_getNextOfTechnologyLayerMap () const { return _nextOfTechnologyLayerMap; }
inline void Layer::_setMask ( const Mask& mask ) { _mask = mask; }
inline void Layer::_setExtractMask ( const Mask& extractMask ) { _extractMask = extractMask; }
diff --git a/hurricane/src/hurricane/hurricane/Property.h b/hurricane/src/hurricane/hurricane/Property.h
index 3672db72..51fa4861 100644
--- a/hurricane/src/hurricane/hurricane/Property.h
+++ b/hurricane/src/hurricane/hurricane/Property.h
@@ -396,8 +396,8 @@ namespace Hurricane {
unsigned int _count;
};
public:
- typedef vector DBoSet;
- typedef map OrphanedMap;
+ typedef set DBoSet;
+ typedef map OrphanedMap;
public:
static const OrphanedMap& getOrphaneds ();
static SharedProperty* getOrphaned ( const string& );
diff --git a/hurricane/src/hurricane/hurricane/Rectilinear.h b/hurricane/src/hurricane/hurricane/Rectilinear.h
index 670e4a85..1df05c38 100644
--- a/hurricane/src/hurricane/hurricane/Rectilinear.h
+++ b/hurricane/src/hurricane/hurricane/Rectilinear.h
@@ -48,34 +48,39 @@ namespace Hurricane {
typedef Component Super;
public:
- static Rectilinear* create ( Net*, const Layer*, const vector& );
- // Accessors.
- virtual bool isNonRectangle () const;
- virtual DbU::Unit getX () const;
- virtual DbU::Unit getY () const;
- virtual Box getBoundingBox () const;
- virtual Box getBoundingBox ( const BasicLayer* ) const;
- virtual size_t getPointsSize () const;
- virtual Point getPoint ( size_t i ) const;
- virtual const Layer* getLayer () const;
- inline Points getContour () const;
+ static Rectilinear* create ( Net*, const Layer*, const vector& );
+ // Accessors.
+ virtual bool isNonRectangle () const;
+ virtual DbU::Unit getX () const;
+ virtual DbU::Unit getY () const;
+ virtual Box getBoundingBox () const;
+ virtual Box getBoundingBox ( const BasicLayer* ) const;
+ virtual size_t getPointsSize () const;
+ virtual Point getPoint ( size_t i ) const;
+ virtual const Layer* getLayer () const;
+ inline Points getContour () const;
+ inline const vector& getPoints () const;
// Mutators.
- void setLayer ( const Layer* );
- virtual void translate ( const DbU::Unit& dx, const DbU::Unit& dy );
- void setPoints ( const vector& );
- // Hurricane management.
- virtual void _toJson ( JsonWriter* ) const;
- static JsonObject* getJsonObject ( unsigned long flags );
- virtual string _getTypeName () const;
- virtual string _getString () const;
- virtual Record* _getRecord () const;
+ void setLayer ( const Layer* );
+ virtual void translate ( const DbU::Unit& dx, const DbU::Unit& dy );
+ void setPoints ( const vector& );
+ // Hurricane management.
+ virtual void _toJson ( JsonWriter* ) const;
+ static JsonObject* getJsonObject ( unsigned long flags );
+ virtual string _getTypeName () const;
+ virtual string _getString () const;
+ virtual Record* _getRecord () const;
protected:
- Rectilinear ( Net*, const Layer*, const vector& );
+ Rectilinear ( Net*, const Layer*, const vector& );
private:
const Layer* _layer;
vector _points;
};
+
+ inline Points Rectilinear::getContour () const { return new VectorCollection(_points); }
+ inline const vector& Rectilinear::getPoints () const { return _points; }
+
// -------------------------------------------------------------------
// Class : "JsonRoutingRectilinear".
diff --git a/hurricane/src/hurricane/hurricane/Technology.h b/hurricane/src/hurricane/hurricane/Technology.h
index 9da35d69..7d1c1273 100644
--- a/hurricane/src/hurricane/hurricane/Technology.h
+++ b/hurricane/src/hurricane/hurricane/Technology.h
@@ -44,6 +44,9 @@
#include "hurricane/DeviceDescriptor.h"
#include "hurricane/ModelDescriptor.h"
#include "hurricane/Rule.h"
+#include "hurricane/UnitRule.h"
+#include "hurricane/PhysicalRule.h"
+#include "hurricane/TwoLayersPhysicalRule.h"
namespace Hurricane {
@@ -55,9 +58,6 @@ namespace Hurricane {
class BasicLayer;
class RegularLayer;
class ViaLayer;
- class UnitRule;
- class PhysicalRule;
- class TwoLayersPhysicalRule;
// -------------------------------------------------------------------
@@ -71,9 +71,12 @@ namespace Hurricane {
typedef set DeviceDescriptors;
typedef set ModelDescriptors;
public:
- struct RuleNameCompare:
- public std::binary_function {
- bool operator() ( const Rule* rule1, const Rule* rule2 ) const
+ struct RuleNameCompare {
+ inline bool operator() ( const PhysicalRule* rule1 , const PhysicalRule* rule2 ) const
+ { return rule1->getName() < rule2->getName(); }
+ inline bool operator() ( const UnitRule* rule1 , const UnitRule* rule2 ) const
+ { return rule1->getName() < rule2->getName(); }
+ inline bool operator() ( const Rule* rule1 , const Rule* rule2 ) const
{ return rule1->getName() < rule2->getName(); }
};
public:
diff --git a/hurricane/src/isobar/PyInstance.cpp b/hurricane/src/isobar/PyInstance.cpp
index c552a6d5..84016b1e 100644
--- a/hurricane/src/isobar/PyInstance.cpp
+++ b/hurricane/src/isobar/PyInstance.cpp
@@ -51,7 +51,7 @@ extern "C" {
#if defined(__PYTHON_MODULE__)
- static Instance::PlacementStatus PyInt_AsPlacementStatus ( PyObject* object )
+ extern Instance::PlacementStatus PyInt_AsPlacementStatus ( PyObject* object )
{
switch ( PyAny_AsLong(object) ) {
case Instance::PlacementStatus::UNPLACED : return ( Instance::PlacementStatus(Instance::PlacementStatus::UNPLACED) );
@@ -80,35 +80,37 @@ extern "C" {
PyObject* arg1 = NULL;
PyObject* arg2 = NULL;
PyObject* arg3 = NULL;
+ PyObject* arg4 = NULL;
HTRY
- __cs.init( "Instance.create" );
- if (not PyArg_ParseTuple(args,"O&O&O&|O&:Instance.create"
- ,Converter,&arg0
- ,Converter,&arg1
- ,Converter,&arg2
- ,Converter,&arg3
- )) {
- PyErr_SetString( ConstructorError, "Instance.create(): Invalid number of parameters." );
+ __cs.init( "Instance.create" );
+ if (not PyArg_ParseTuple(args,"O&O&O&|O&O&:Instance.create"
+ ,Converter,&arg0
+ ,Converter,&arg1
+ ,Converter,&arg2
+ ,Converter,&arg3
+ ,Converter,&arg4
+ )) {
+ PyErr_SetString( ConstructorError, "Instance.create(): Invalid number of parameters." );
+ return NULL;
+ }
+
+ if (__cs.getObjectIds() == ":ent:string:ent") {
+ instance = Instance::create( PYCELL_O(arg0)
+ , Name(PyString_AsString(arg1))
+ , PYCELL_O(arg2)
+ );
+ } else if (__cs.getObjectIds() == ":ent:string:ent:transfo:int") {
+ instance = Instance::create( PYCELL_O(arg0)
+ , Name(PyString_AsString(arg1))
+ , PYCELL_O(arg2)
+ , *PYTRANSFORMATION_O(arg3)
+ , PyInt_AsPlacementStatus(arg4)
+ );
+ } else {
+ PyErr_SetString( ConstructorError, "Instance.create(): Bad type of parameter(s)." );
return NULL;
- }
-
- if (__cs.getObjectIds() == ":ent:string:ent") {
- instance = Instance::create( PYCELL_O(arg0)
- , Name(PyString_AsString(arg1))
- , PYCELL_O(arg2)
- );
- } else if (__cs.getObjectIds() == ":ent:string:ent:transfo") {
- instance = Instance::create( PYCELL_O(arg0)
- , Name(PyString_AsString(arg1))
- , PYCELL_O(arg2)
- , *PYTRANSFORMATION_O(arg3)
- , Instance::PlacementStatus::PLACED
- );
- } else {
- PyErr_SetString( ConstructorError, "Instance.create(): Bad type of parameter(s)." );
- return NULL;
- }
+ }
HCATCH
return PyInstance_Link( instance );
diff --git a/hurricane/src/isobar/PyLayer.cpp b/hurricane/src/isobar/PyLayer.cpp
index c264b837..7d34d57d 100644
--- a/hurricane/src/isobar/PyLayer.cpp
+++ b/hurricane/src/isobar/PyLayer.cpp
@@ -313,6 +313,7 @@ extern "C" {
predicateFromLayer ( contains ,PyLayer,Layer)
predicateFromLayer ( intersect ,PyLayer,Layer)
predicateFromVoid ( isSymbolic ,PyLayer,Layer)
+ predicateFromVoid ( isBlockage ,PyLayer,Layer)
accessorDbuFromOptBasicLayer( getExtentionCap ,PyLayer,Layer)
accessorDbuFromOptBasicLayer( getExtentionWidth,PyLayer,Layer)
accessorCollectionFromVoid ( getBasicLayers ,PyLayer,Layer,BasicLayer)
@@ -335,6 +336,7 @@ extern "C" {
updatorFromBasicLayerDbu(setExtentionCap ,PyLayer,Layer)
updatorFromBasicLayerDbu(setExtentionWidth,PyLayer,Layer)
DirectSetBoolAttribute (PyLayer_setSymbolic,setSymbolic,PyLayer,Layer)
+ DirectSetBoolAttribute (PyLayer_setBlockage,setBlockage,PyLayer,Layer)
// Standart destroy (Attribute).
DBoDestroyAttribute(PyLayer_destroy, PyLayer)
@@ -387,10 +389,14 @@ extern "C" {
, "Tells if the layer share some BasicLayer with the one passed as argument." }
, { "isSymbolic" , (PyCFunction)PyLayer_isSymbolic , METH_NOARGS
, "Tells if the layer is the symbolic one for this BasicLayer." }
+ , { "isBlockage" , (PyCFunction)PyLayer_isBlockage , METH_NOARGS
+ , "Tells if the layer represent blockage." }
, { "setName" , (PyCFunction)PyLayer_setName , METH_VARARGS
, "Allows to change the layer name." }
, { "setSymbolic" , (PyCFunction)PyLayer_setSymbolic , METH_VARARGS
, "Sets the layer as the symbolic one." }
+ , { "setBlockage" , (PyCFunction)PyLayer_setBlockage , METH_VARARGS
+ , "Sets the layer as blockage." }
, { "setMinimalSize" , (PyCFunction)PyLayer_setMinimalSize , METH_VARARGS
, "Sets the layer minimal size (width)." }
, { "setMinimalSpacing" , (PyCFunction)PyLayer_setMinimalSpacing , METH_VARARGS
diff --git a/hurricane/src/isobar/PyPlacementStatus.cpp b/hurricane/src/isobar/PyPlacementStatus.cpp
index 4239936f..b7c57e1d 100644
--- a/hurricane/src/isobar/PyPlacementStatus.cpp
+++ b/hurricane/src/isobar/PyPlacementStatus.cpp
@@ -101,6 +101,17 @@ extern "C" {
LoadObjectConstant(PyTypePlacementStatus.tp_dict,Instance::PlacementStatus::PLACED ,"PLACED");
LoadObjectConstant(PyTypePlacementStatus.tp_dict,Instance::PlacementStatus::FIXED ,"FIXED");
}
+
+
+ extern Instance::PlacementStatus PyInt_AsPlacementStatus ( PyObject* object ) {
+ switch ( PyAny_AsLong(object) ) {
+ case Instance::PlacementStatus::UNPLACED : return Instance::PlacementStatus::UNPLACED;
+ case Instance::PlacementStatus::PLACED : return Instance::PlacementStatus::PLACED;
+ case Instance::PlacementStatus::FIXED : return Instance::PlacementStatus::FIXED;
+ }
+
+ return Instance::PlacementStatus::UNPLACED;
+ }
#endif // Shared Library Code Part.
diff --git a/hurricane/src/isobar/PySegment.cpp b/hurricane/src/isobar/PySegment.cpp
index 66506fa3..f62c6dc4 100644
--- a/hurricane/src/isobar/PySegment.cpp
+++ b/hurricane/src/isobar/PySegment.cpp
@@ -73,7 +73,7 @@ extern "C" {
if (pyReturnHook == NULL) return NULL;
PyObject* pyHook = NULL;
- if (not PyArg_ParseTuple(args,"O:Hook.merge", &pyHook)) return NULL;
+ if (not PyArg_ParseTuple(args,"O:Segment.getOppositetHook", &pyHook)) return NULL;
Hook* hook = PYHOOK_O(pyHook);
@@ -85,6 +85,29 @@ extern "C" {
}
+ static PyObject* PySegment_getOppositeAnchor ( PySegment *self, PyObject* args )
+ {
+ cdebug_log(20,0) << "PySegment_getOppositeAnchor()" << endl;
+ METHOD_HEAD ( "Segment.getOppositeAnchor()" )
+
+ Component* opposite = NULL;
+ PyObject* pyOpposite = NULL;
+ PyComponent* pyComponent = NULL;
+ if (not PyArg_ParseTuple(args,"O:Segment.getOppositeAnchor", &pyComponent)) return NULL;
+
+ Component* anchor = PYCOMPONENT_O(pyComponent);
+
+ HTRY
+ opposite = segment->getOppositeAnchor( anchor );
+ if (opposite) pyOpposite = PyEntity_NEW( opposite );
+ else
+ Py_RETURN_NONE;
+ HCATCH
+
+ return pyOpposite;
+ }
+
+
static PyObject* PySegment_getSource ( PySegment *self )
{
cdebug_log(20,0) << "PySegment_getSource()" << endl;
@@ -164,6 +187,7 @@ extern "C" {
{ { "getSourceHook" , (PyCFunction)PySegment_getSourceHook , METH_NOARGS , "Return the nested source Hook." }
, { "getTargetHook" , (PyCFunction)PySegment_getTargetHook , METH_NOARGS , "Return the nested target Hook." }
, { "getOppositeHook" , (PyCFunction)PySegment_getOppositeHook , METH_VARARGS, "Return the nested Hook opposite of the argument hook." }
+ , { "getOppositeAnchor" , (PyCFunction)PySegment_getOppositeAnchor, METH_VARARGS, "Return the opposite component anchor." }
, { "getSource" , (PyCFunction)PySegment_getSource , METH_NOARGS , "Return the Segment source component (or None)." }
, { "getTarget" , (PyCFunction)PySegment_getTarget , METH_NOARGS , "Return the Segment target component (or None)." }
, { "getSourceX" , (PyCFunction)PySegment_getSourceX , METH_NOARGS , "Return the Segment source X value." }
@@ -212,7 +236,5 @@ extern "C" {
} // End of extern "C".
-
-
} // End of Isobar namespace.
diff --git a/hurricane/src/isobar/hurricane/isobar/PyPlacementStatus.h b/hurricane/src/isobar/hurricane/isobar/PyPlacementStatus.h
index 9d16fbc0..a0d89996 100644
--- a/hurricane/src/isobar/hurricane/isobar/PyPlacementStatus.h
+++ b/hurricane/src/isobar/hurricane/isobar/PyPlacementStatus.h
@@ -37,12 +37,13 @@ namespace Isobar {
// -------------------------------------------------------------------
// Functions & Types exported to "PyHurricane.ccp".
- extern PyTypeObject PyTypePlacementStatus;
- extern PyMethodDef PyPlacementStatus_Methods[];
+ extern PyTypeObject PyTypePlacementStatus;
+ extern PyMethodDef PyPlacementStatus_Methods[];
- extern PyObject* PyPlacementStatus_Link ( Hurricane::Instance::PlacementStatus* );
- extern void PyPlacementStatus_LinkPyType ();
- extern void PyPlacementStatus_postModuleInit ();
+ extern PyObject* PyPlacementStatus_Link ( Hurricane::Instance::PlacementStatus* );
+ extern void PyPlacementStatus_LinkPyType ();
+ extern void PyPlacementStatus_postModuleInit ();
+ extern Hurricane::Instance::PlacementStatus PyInt_AsPlacementStatus ( PyObject* );
#define IsPyPlacementStatus(v) ( (v)->ob_type == &PyTypePlacementStatus )
diff --git a/hurricane/src/viewer/CellPrinter.cpp b/hurricane/src/viewer/CellPrinter.cpp
index 8a18a9c0..ff05e88c 100644
--- a/hurricane/src/viewer/CellPrinter.cpp
+++ b/hurricane/src/viewer/CellPrinter.cpp
@@ -14,18 +14,21 @@
// +-----------------------------------------------------------------+
-#include
-#include
-#include
-#include
-#include
-#include
-#include "vlsisapd/configuration/Configuration.h"
-#include "hurricane/DataBase.h"
-#include "hurricane/Cell.h"
-#include "hurricane/viewer/Graphics.h"
-#include "hurricane/viewer/CellPrinter.h"
-#include "hurricane/viewer/PaletteWidget.h"
+#include
+#include
+#include
+#include
+#include
+#include
+#include "vlsisapd/configuration/Configuration.h"
+#include "hurricane/DataBase.h"
+#include "hurricane/BasicLayer.h"
+#include "hurricane/Technology.h"
+#include "hurricane/ExtensionSlice.h"
+#include "hurricane/Cell.h"
+#include "hurricane/viewer/Graphics.h"
+#include "hurricane/viewer/CellPrinter.h"
+#include "hurricane/viewer/PaletteWidget.h"
namespace Hurricane {
@@ -79,6 +82,7 @@ namespace Hurricane {
setCentralWidget( _cellWidget );
_palette->readGraphics ();
+ _cellWidget->setPrinter( true );
_cellWidget->bindToPalette( _palette );
_cellWidget->refresh();
}
@@ -88,12 +92,38 @@ namespace Hurricane {
{
_screenCellWidget = cellWidget;
+ array labels = { "fallback"
+ , "rubber"
+ , "phantom"
+ , "boundaries"
+ , "marker"
+ , "grid"
+ , "spot"
+ , "ghost"
+ , "text.ruler"
+ , "text.cell"
+ , "text.instance"
+ , "text.components"
+ , "text.references"
+ , "undef"
+ };
+
+ for ( string label : labels )
+ _cellWidget->setLayerVisible( label
+ , _screenCellWidget->isLayerVisible(label) );
+
+ for ( const BasicLayer* layer : DataBase::getDB()->getTechnology()->getBasicLayers() )
+ _cellWidget->setLayerVisible( layer->getName()
+ , _screenCellWidget->isLayerVisible( layer->getName() ));
+
shared_ptr clone ( _screenCellWidget->getStateClone() );
- _cellWidget->setState ( clone );
- _cellWidget->setLayerVisible("grid" , _screenCellWidget->isLayerVisible("grid" ));
- _cellWidget->setLayerVisible("text.instance" , _screenCellWidget->isLayerVisible("text.instance" ));
- _cellWidget->setLayerVisible("text.component", _screenCellWidget->isLayerVisible("text.component"));
- _cellWidget->setLayerVisible("rubber" , _screenCellWidget->isLayerVisible("rubber" ));
+ _cellWidget->setState( clone );
+
+ _cellWidget->copyDrawExtensionGos( _screenCellWidget );
+
+ for ( ExtensionSlice* extension : cellWidget->getCell()->getExtensionSlices() )
+ _cellWidget->setLayerVisible( extension->getName()
+ , _screenCellWidget->isLayerVisible( extension->getName() ));
}
diff --git a/hurricane/src/viewer/CellViewer.cpp b/hurricane/src/viewer/CellViewer.cpp
index 42958018..a124011d 100644
--- a/hurricane/src/viewer/CellViewer.cpp
+++ b/hurricane/src/viewer/CellViewer.cpp
@@ -205,12 +205,17 @@ namespace Hurricane {
{ return findChild(_getAbsWidgetPath(relativePath)) != NULL; }
- QMenu* CellViewer::_getParentMenu( const QString& absolutePath ) const
+ QAction* CellViewer::getMenuAction( const QString& relativePath ) const
+ { return findChild(_getAbsWidgetPath(relativePath)); }
+
+
+ QAction* CellViewer::_getParentMenu( const QString& absolutePath ) const
{
- QString parentPath = absolutePath.section('.',0,-2);
- QMenu* parentMenu = findChild(parentPath);
+ QString parentPath = absolutePath.section('.',0,-2);
+ QAction* parentMenu = findChild(parentPath);
if (parentMenu == NULL) {
if (parentPath != "viewer") {
+ cerr << "parentPath:\"" << parentPath.toStdString() << "\"" << endl;
cerr << Warning( "CellViewer::_getParentMenu() - Missing parent menu for %s."
, absolutePath.toStdString().c_str() ) << endl;
}
@@ -220,35 +225,45 @@ namespace Hurricane {
}
- QMenu* CellViewer::addMenu ( const QString& path, string text, unsigned int flags )
+ QAction* CellViewer::addMenu ( const QString& path, string text, unsigned int flags )
{
QString absolutePath = _getAbsWidgetPath( path );
- QMenu* menu = findChild(absolutePath);
+ QAction* actionMenu = findChild(absolutePath);
- if (menu != NULL) return menu;
+ if (actionMenu != NULL) return actionMenu;
+ QMenu* menu = new QMenu ( tr(text.c_str()), this );
+
if (flags & TopMenu) {
- menu = menuBar()->addMenu( tr(text.c_str()) );
- menu->setObjectName( absolutePath );
+ actionMenu = menuBar()->addMenu( menu );
+ actionMenu->setObjectName( absolutePath );
} else {
- QMenu* parentMenu = _getParentMenu( absolutePath );
+ menu->setStyleSheet( "font-family: Bitstream Vera Sans Mono" );
+
+ QAction* parentMenu = _getParentMenu( absolutePath );
if (parentMenu == NULL) return NULL;
- menu = parentMenu->addMenu( tr(text.c_str()) );
- menu->setObjectName( absolutePath );
+ actionMenu = parentMenu->menu()->addMenu( menu );
+ actionMenu->setObjectName( absolutePath );
}
- return menu;
+ return actionMenu;
}
- bool CellViewer::addToMenu ( const QString& path )
+ bool CellViewer::addToMenu ( const QString& path, QString beforePath )
{
if (not path.endsWith("====")) return false;
- QMenu* menu = _getParentMenu( _getAbsWidgetPath(path) );
- if (menu == NULL) return false;
+ QString absolutePath = _getAbsWidgetPath( path );
+ QAction* menuAction = _getParentMenu( absolutePath );
+ if (menuAction == NULL) return false;
+
+ QAction* before = getMenuAction( beforePath );
+ QAction* action = new QAction( this );
+ action->setSeparator ( true );
+ action->setObjectName( absolutePath );
+ menuAction->menu()->insertAction( before, action );
- menu->addSeparator();
return true;
}
@@ -257,12 +272,13 @@ namespace Hurricane {
, string text
, string textTip
, std::function< void() > callback
- , QIcon icon )
+ , QIcon icon
+ , QString beforePath )
{
QString absolutePath = _getAbsWidgetPath( path );
QAction* action = findChild(absolutePath);
if (action == NULL) {
- QMenu* parentMenu = _getParentMenu( absolutePath );
+ QAction* parentMenu = _getParentMenu( absolutePath );
if (parentMenu == NULL) return NULL;
action = new QAction( tr(text.c_str()), this );
@@ -270,7 +286,9 @@ namespace Hurricane {
action->setStatusTip ( tr(textTip.c_str()) );
action->setVisible ( true );
if (not icon.isNull()) action->setIcon( icon );
- parentMenu->addAction( action );
+
+ QAction* before = getMenuAction( beforePath );
+ parentMenu->menu()->insertAction( before, action );
_actionCallbacks.insert( make_pair(absolutePath,boost::any(callback)) );
connect( action, SIGNAL(triggered()), this, SLOT(doAction()) );
@@ -282,7 +300,8 @@ namespace Hurricane {
QAction* CellViewer::addToMenu ( const QString& path
, string text
, string textTip
- , string scriptPath )
+ , string scriptPath
+ , QString beforePath )
{
QString absolutePath = _getAbsWidgetPath( path );
QAction* action = findChild(absolutePath);
@@ -292,9 +311,10 @@ namespace Hurricane {
action->setStatusTip ( tr(textTip.c_str()) );
action->setVisible ( true );
- QMenu* parentMenu = _getParentMenu( absolutePath );
+ QAction* parentMenu = _getParentMenu( absolutePath );
if (parentMenu != NULL) {
- parentMenu->addAction( action );
+ QAction* before = getMenuAction( beforePath );
+ parentMenu->menu()->insertAction( before, action );
} else if (absolutePath == "viewer") {
addAction( action );
}
@@ -313,6 +333,7 @@ namespace Hurricane {
, QIcon icon
//, QWidget* receiver
//, SlotMethod slotMethod
+ , QString beforePath
)
{
QString absolutePath = _getAbsWidgetPath( path );
@@ -325,9 +346,10 @@ namespace Hurricane {
action->setVisible ( true );
if (not icon.isNull()) action->setIcon( icon );
- QMenu* parentMenu = _getParentMenu( absolutePath );
+ QAction* parentMenu = _getParentMenu( absolutePath );
if (parentMenu != NULL) {
- parentMenu->addAction( action );
+ QAction* before = getMenuAction( beforePath );
+ parentMenu->menu()->insertAction( before, action );
} else if (absolutePath == "viewer") {
addAction( action );
}
@@ -538,13 +560,13 @@ namespace Hurricane {
);
connect( action, SIGNAL(triggered()), this, SLOT(runScriptWidget()) );
- action = addToMenu( "tools.stressScript"
- , tr("Python Stress Script")
- , tr("Run Python Stress Script (50 times...).")
- , QKeySequence()
- , QIcon(":/images/python-logo-v3.png")
- );
- connect( action, SIGNAL(triggered()), this, SLOT(runStressScript()) );
+ // action = addToMenu( "tools.stressScript"
+ // , tr("Python Stress Script")
+ // , tr("Run Python Stress Script (50 times...).")
+ // , QKeySequence()
+ // , QIcon(":/images/python-logo-v3.png")
+ // );
+ // connect( action, SIGNAL(triggered()), this, SLOT(runStressScript()) );
}
diff --git a/hurricane/src/viewer/CellWidget.cpp b/hurricane/src/viewer/CellWidget.cpp
index e0983de3..6b334fc4 100644
--- a/hurricane/src/viewer/CellWidget.cpp
+++ b/hurricane/src/viewer/CellWidget.cpp
@@ -677,13 +677,13 @@ namespace Hurricane {
if ( (rectangle.width() > 4) and (rectangle.height() > 4) ) {
QPolygon contour;
for ( Point point : component->getContour() )
- contour << _cellWidget->dbuToScreenPoint( point );
+ contour << _cellWidget->dbuToScreenPoint( transformation.getPoint(point) );
_cellWidget->drawScreenPolygon( contour );
if ( component->isManhattanized()
and (_cellWidget->dbuToScreenLength(DbU::getPolygonStep()) > 4) ) {
for ( Point point : component->getMContour() )
- contour << _cellWidget->dbuToScreenPoint( point );
+ contour << _cellWidget->dbuToScreenPoint( transformation.getPoint(point) );
_cellWidget->drawScreenPolygon( contour );
// const Polygon* polygon = dynamic_cast( component );
@@ -1094,6 +1094,7 @@ namespace Hurricane {
, _mousePosition (0,0)
, _spot (this)
, _state (new State(NULL))
+ , _isPrinter (false)
, _cellChanged (true)
, _selectionHasChanged (false)
, _delaySelectionChanged(0)
@@ -1312,10 +1313,10 @@ namespace Hurricane {
//static bool timedout;
//static Timer timer;
- if ( not isVisible() ) return;
+ if (not isVisible()) return;
DataBase* database = DataBase::getDB();
- if ( database ) _technology = database->getTechnology ();
+ if (database) _technology = database->getTechnology();
//timer.start ();
//timedout = false;
@@ -1323,22 +1324,22 @@ namespace Hurricane {
_cellChanged = false;
_redrawRectCount = 0;
- pushCursor ( Qt::BusyCursor );
+ pushCursor( Qt::BusyCursor );
- if ( not ( _selectionHasChanged and _state->showSelection() ) or _cellModificated ) {
- _spot.setRestore ( false );
+ if ( not (_selectionHasChanged and _state->showSelection()) or _cellModificated ) {
+ _spot.setRestore( false );
//_drawingPlanes.copyToSelect ( redrawArea );
_drawingPlanes.select ( PlaneId::Normal );
_drawingPlanes.begin ();
- _drawingPlanes.painter().setPen ( Qt::NoPen );
- _drawingPlanes.painter().setBackground ( Graphics::getBrush("background") );
- _drawingPlanes.painter().setClipRect ( redrawArea );
- _drawingPlanes.painter().eraseRect ( redrawArea );
+ _drawingPlanes.painter().setPen ( Qt::NoPen );
+ _drawingPlanes.painter().setBackground( Graphics::getBrush("background") );
+ _drawingPlanes.painter().setClipRect ( redrawArea );
+ _drawingPlanes.painter().eraseRect ( redrawArea );
- setDarkening ( (_state->showSelection()) ? Graphics::getDarkening() : DisplayStyle::HSVr() );
+ setDarkening( (_state->showSelection()) ? Graphics::getDarkening() : DisplayStyle::HSVr() );
- if ( getCell() ) {
- Box redrawBox = screenToDbuBox ( redrawArea );
+ if (getCell()) {
+ Box redrawBox = screenToDbuBox( redrawArea );
_drawingQuery.resetGoCount ();
_drawingQuery.resetExtensionGoCount();
@@ -1347,106 +1348,112 @@ namespace Hurricane {
_drawingQuery.setArea ( redrawBox );
_drawingQuery.setTransformation ( Transformation() );
- forEach ( BasicLayer*, iLayer, _technology->getBasicLayers() ) {
- _drawingPlanes.setPen ( Graphics::getPen ((*iLayer)->getName(),getDarkening()) );
- _drawingPlanes.setBrush ( Graphics::getBrush((*iLayer)->getName(),getDarkening()) );
+ for ( BasicLayer* layer : _technology->getBasicLayers() ) {
+ _drawingPlanes.setPen ( Graphics::getPen (layer->getName(),getDarkening()) );
+ _drawingPlanes.setBrush( Graphics::getBrush(layer->getName(),getDarkening()) );
- if ( isDrawable((*iLayer)->getName()) ) {
- _drawingQuery.setBasicLayer ( *iLayer );
- _drawingQuery.setFilter ( getQueryFilter().unset(Query::DoMasterCells
- |Query::DoRubbers
- |Query::DoMarkers
- |Query::DoExtensionGos) );
- _drawingQuery.doQuery ();
+ if ( isDrawable(layer->getName()) ) {
+ _drawingQuery.setBasicLayer( layer );
+ _drawingQuery.setFilter ( getQueryFilter().unset(Query::DoMasterCells
+ |Query::DoRubbers
+ |Query::DoMarkers
+ |Query::DoExtensionGos) );
+ _drawingQuery.doQuery ();
}
- if ( _enableRedrawInterrupt ) QApplication::processEvents();
- if ( _redrawManager.interrupted() ) {
- //cerr << "CellWidget::redraw() - interrupt after " << (*iLayer)->getName() << endl;
+ if (_enableRedrawInterrupt) QApplication::processEvents();
+ if (_redrawManager.interrupted()) {
+ //cerr << "CellWidget::redraw() - interrupt after " << layer->getName() << endl;
break;
}
//if ( timeout("redraw [layer]",timer,10.0,timedout) ) break;
}
if ( /*not timeout("redraw [boundaries]",timer,10.0,timedout) and*/ (not _redrawManager.interrupted()) ) {
- if ( isDrawable("boundaries") ) {
- _drawingPlanes.setPen ( Graphics::getPen ("boundaries",getDarkening()) );
- _drawingPlanes.setBrush ( Graphics::getBrush("boundaries",getDarkening()) );
+ if (isDrawable("boundaries")) {
+ _drawingPlanes.setPen ( Graphics::getPen ("boundaries",getDarkening()) );
+ _drawingPlanes.setBrush( Graphics::getBrush("boundaries",getDarkening()) );
- _drawingQuery.setBasicLayer ( NULL );
- _drawingQuery.setFilter ( getQueryFilter().unset(Query::DoComponents
- |Query::DoRubbers
- |Query::DoMarkers
- |Query::DoExtensionGos) );
- _drawingQuery.doQuery ();
+ _drawingQuery.setBasicLayer( NULL );
+ _drawingQuery.setFilter ( getQueryFilter().unset(Query::DoComponents
+ |Query::DoRubbers
+ |Query::DoMarkers
+ |Query::DoExtensionGos) );
+ _drawingQuery.doQuery ();
}
}
if ( /*not timeout("redraw [markers]",timer,10.0,timedout) and*/ (not _redrawManager.interrupted()) ) {
if ( isDrawable("text.reference") ) {
- _drawingPlanes.setPen ( Graphics::getPen ("text.reference",getDarkening()) );
- _drawingPlanes.setBrush ( Graphics::getBrush("text.reference",getDarkening()) );
+ _drawingPlanes.setPen ( Graphics::getPen ("text.reference",getDarkening()) );
+ _drawingPlanes.setBrush( Graphics::getBrush("text.reference",getDarkening()) );
- _drawingQuery.setBasicLayer ( NULL );
- _drawingQuery.setFilter ( getQueryFilter().unset(Query::DoComponents
- |Query::DoExtensionGos
- |Query::DoMasterCells) );
- _drawingQuery.doQuery ();
+ _drawingQuery.setBasicLayer( NULL );
+ _drawingQuery.setFilter ( getQueryFilter().unset(Query::DoComponents
+ |Query::DoRubbers
+ |Query::DoMarkers
+ |Query::DoExtensionGos
+ |Query::DoMasterCells) );
+ _drawingQuery.doQuery ();
}
}
if ( /*not timeout("redraw [rubbers]",timer,10.0,timedout) and*/ (not _redrawManager.interrupted()) ) {
- if ( isDrawable("rubber") ) {
- _drawingPlanes.setPen ( Graphics::getPen ("rubber",getDarkening()) );
- _drawingPlanes.setBrush ( Graphics::getBrush("rubber",getDarkening()) );
+ if (isDrawable("rubber")) {
+ _drawingPlanes.setPen ( Graphics::getPen ("rubber",getDarkening()) );
+ _drawingPlanes.setBrush( Graphics::getBrush("rubber",getDarkening()) );
- _drawingQuery.setBasicLayer ( NULL );
- _drawingQuery.setFilter ( getQueryFilter().unset(Query::DoComponents
- |Query::DoExtensionGos
- |Query::DoMasterCells
- |Query::DoMarkers) );
- _drawingQuery.doQuery ();
+ _drawingQuery.setBasicLayer( NULL );
+ _drawingQuery.setFilter ( getQueryFilter().unset(Query::DoComponents
+ |Query::DoMarkers
+ |Query::DoExtensionGos
+ |Query::DoMasterCells) );
+ _drawingQuery.doQuery ();
}
}
- if ( _enableRedrawInterrupt ) QApplication::processEvents();
+ if (_enableRedrawInterrupt) QApplication::processEvents();
if ( /*not timeout("redraw [text.instances]",timer,10.0,timedout) and*/ (not _redrawManager.interrupted()) ) {
- if ( isDrawable("text.instance") ) {
- _drawingPlanes.setPen ( Graphics::getPen ("text.instance",getDarkening()) );
- _drawingPlanes.setBrush ( Graphics::getBrush("text.instance",getDarkening()) );
- _drawingPlanes.setBackground ( Graphics::getBrush("boundaries" ,getDarkening()) );
- _textDrawingQuery.setArea ( redrawBox );
- _textDrawingQuery.setTransformation ( Transformation() );
- _textDrawingQuery.doQuery ();
+ if (isDrawable("text.instance")) {
+ _drawingPlanes.setPen ( Graphics::getPen ("text.instance",getDarkening()) );
+ _drawingPlanes.setBrush ( Graphics::getBrush("text.instance",getDarkening()) );
+ _drawingPlanes.setBackground ( Graphics::getBrush("boundaries" ,getDarkening()) );
+ _textDrawingQuery.setArea ( redrawBox );
+ _textDrawingQuery.setTransformation( Transformation() );
+ _textDrawingQuery.doQuery ();
}
}
//_drawingQuery.setFilter ( getQueryFilter() & ~Query::DoMasterCells );
- forEach ( ExtensionSlice*, islice, getCell()->getExtensionSlices() ) {
- if ( _enableRedrawInterrupt ) QApplication::processEvents();
+ for ( ExtensionSlice* slice : getCell()->getExtensionSlices() ) {
+ if (_enableRedrawInterrupt) QApplication::processEvents();
if ( /*timeout("redraw [extension]",timer,10.0,timedout) or*/ (_redrawManager.interrupted()) ) break;
- if ( isDrawableExtension((*islice)->getName()) ) {
- _drawingQuery.setExtensionMask ( (*islice)->getMask() );
- _drawingQuery.setDrawExtensionGo ( (*islice)->getName() );
- _drawingQuery.setFilter ( getQueryFilter().set(Query::DoExtensionGos).unset(Query::DoMasterCells) );
- _drawingQuery.doQuery ();
+ if (isDrawableExtension(slice->getName())) {
+ _drawingQuery.setExtensionMask ( slice->getMask() );
+ _drawingQuery.setDrawExtensionGo( slice->getName() );
+ _drawingQuery.setFilter ( getQueryFilter().set (Query::DoExtensionGos)
+ .unset(Query::DoComponents
+ |Query::DoRubbers
+ |Query::DoMarkers
+ |Query::DoMasterCells) );
+ _drawingQuery.doQuery ();
}
}
}
- _drawingPlanes.end ();
+ _drawingPlanes.end();
_cellModificated = false;
}
- if ( isDrawable("grid") ) drawGrid ( redrawArea );
- if ( isDrawable("text.ruler") ) drawRulers ( redrawArea );
+ if (isDrawable("grid")) drawGrid ( redrawArea );
+ if (isDrawable("text.ruler")) drawRulers( redrawArea );
- setDarkening ( 100 );
- if ( _state->showSelection() )
- redrawSelection ( redrawArea );
+ setDarkening( 100 );
+ if (_state->showSelection())
+ redrawSelection( redrawArea );
- popCursor ();
- repaint ();
+ popCursor();
+ repaint();
//timer.stop ();
//cerr << "CellWidget::redraw() - " << _redrawRectCount
@@ -1568,8 +1575,8 @@ namespace Hurricane {
void CellWidget::setLayerVisible ( const Name& layer, bool visible )
{
- if ( !_palette ) return;
- _palette->setItemVisible ( layer, visible );
+ if (not _palette) return;
+ _palette->setItemVisible( layer, visible );
}
@@ -1586,8 +1593,8 @@ namespace Hurricane {
//DbU::Unit unity = symbolicMode() ? DbU::lambda(1.0) : DbU::grid(10.0);
DbU::Unit unity = DbU::lambda(1.0);
- return (!item || item->isItemVisible())
- && ( Graphics::getThreshold(name) < getScale()*unity );
+ if (not item) return false;
+ return item->isItemVisible() and (Graphics::getThreshold(name) < getScale()*unity);
}
@@ -1595,7 +1602,8 @@ namespace Hurricane {
{
PaletteItem* item = (_palette) ? _palette->find(layerName) : NULL;
- return !item || item->isItemVisible();
+ if (not item) return false;
+ return item->isItemVisible();
}
@@ -1604,8 +1612,8 @@ namespace Hurricane {
PaletteItem* item = (_palette) ? _palette->find(extensionName) : NULL;
DbU::Unit unity = DbU::lambda(1.0);
- return (not item or item->isItemVisible())
- and ( Graphics::getThreshold(extensionName) < getScale()*unity );
+ if (not item) return false;
+ return item->isItemVisible() and (Graphics::getThreshold(extensionName) < getScale()*unity);
}
diff --git a/hurricane/src/viewer/PyCellViewer.cpp b/hurricane/src/viewer/PyCellViewer.cpp
index 4752a7ae..f7bd4300 100644
--- a/hurricane/src/viewer/PyCellViewer.cpp
+++ b/hurricane/src/viewer/PyCellViewer.cpp
@@ -107,22 +107,27 @@ extern "C" {
cdebug_log(20,0) << "PyCellViewer_addToMenu()" << endl;
HTRY
- METHOD_HEAD("CellViewer.addToMenu()")
-
- char* path = NULL;
- char* text = NULL;
- char* textTip = NULL;
- char* scriptPath = NULL;
- if (not PyArg_ParseTuple(args,"s|sss:CellViewer.addToMenu()", &path, &text, &textTip, &scriptPath)) {
- PyErr_SetString ( ConstructorError, "CellViewer.addToMenu(): Takes one or four arguments exactly." );
- return NULL;
- }
-
- if (text != NULL) {
- if (cw->addToMenu( path, text, textTip, scriptPath )) Py_RETURN_TRUE;
- } else {
- if (cw->addToMenu( path )) Py_RETURN_TRUE;
- }
+ METHOD_HEAD("CellViewer.addToMenu()")
+
+ char* nullBefore = "";
+ char* path = NULL;
+ char* text = NULL;
+ char* textTip = NULL;
+ char* scriptPath = NULL;
+ char* before = NULL;
+ if (not PyArg_ParseTuple( args, "s|ssss:CellViewer.addToMenu()"
+ , &path, &text, &textTip, &scriptPath, &before)) {
+ PyErr_SetString ( ConstructorError, "CellViewer.addToMenu(): Takes either one or five arguments." );
+ return NULL;
+ }
+
+ if (before == NULL) before = nullBefore;
+
+ if (text != NULL) {
+ if (cw->addToMenu( path, text, textTip, scriptPath, before )) Py_RETURN_TRUE;
+ } else {
+ if (cw->addToMenu( path, before )) Py_RETURN_TRUE;
+ }
HCATCH
Py_RETURN_FALSE;
diff --git a/hurricane/src/viewer/hurricane/viewer/CellViewer.h b/hurricane/src/viewer/hurricane/viewer/CellViewer.h
index 9d7524e3..6ad78ffe 100644
--- a/hurricane/src/viewer/hurricane/viewer/CellViewer.h
+++ b/hurricane/src/viewer/hurricane/viewer/CellViewer.h
@@ -94,25 +94,30 @@ namespace Hurricane {
QMenu* createDebugMenu ();
bool hasMenu ( const QString& path ) const;
bool hasMenuAction ( const QString& path ) const;
- QMenu* addMenu ( const QString& path
+ QAction* getMenuAction ( const QString& path ) const;
+ QAction* addMenu ( const QString& path
, std::string text
, unsigned int flags=NoFlags
);
- bool addToMenu ( const QString& path );
+ bool addToMenu ( const QString& path
+ , QString beforePath="" );
QAction* addToMenu ( const QString& path
- , std::string text
- , std::string textTip
+ , std::string text
+ , std::string textTip
, std::function< void() >
- , QIcon icon=QIcon() );
+ , QIcon icon=QIcon()
+ , QString beforePath="" );
QAction* addToMenu ( const QString& path
- , std::string text
- , std::string textTip
- , std::string scriptPath );
+ , std::string text
+ , std::string textTip
+ , std::string scriptPath
+ , QString beforePath="" );
QAction* addToMenu ( QString path
, QString text
, QString textTip
, const QKeySequence& shortCut
- , QIcon icon =QIcon());
+ , QIcon icon =QIcon()
+ , QString beforePath="" );
inline void setEnableRedrawInterrupt ( bool );
inline void setApplicationName ( const QString& );
inline Observer* getCellObserver ();
@@ -166,7 +171,7 @@ namespace Hurricane {
void rebuildHistory ();
private:
QString _getAbsWidgetPath ( const QString& relPath ) const;
- QMenu* _getParentMenu ( const QString& ) const;
+ QAction* _getParentMenu ( const QString& ) const;
void _runScript ( QString scriptPath );
protected:
diff --git a/hurricane/src/viewer/hurricane/viewer/CellWidget.h b/hurricane/src/viewer/hurricane/viewer/CellWidget.h
index 5fc41f07..a176e958 100644
--- a/hurricane/src/viewer/hurricane/viewer/CellWidget.h
+++ b/hurricane/src/viewer/hurricane/viewer/CellWidget.h
@@ -162,6 +162,7 @@ namespace Hurricane {
// Painter control & Hurricane objects drawing primitives.
inline void setEnableRedrawInterrupt ( bool );
inline void addDrawExtensionGo ( const Name&, InitExtensionGo_t*, DrawExtensionGo_t* );
+ inline void copyDrawExtensionGos ( const CellWidget* );
inline QPainter& getPainter ( size_t plane=PlaneId::Working );
inline const DisplayStyle::HSVr& getDarkening () const;
inline void copyToPrinter ( int xpaper, int ypaper, QPrinter*, PainterCb_t& );
@@ -176,6 +177,8 @@ namespace Hurricane {
bool isDrawableExtension ( const Name& );
bool isSelectable ( const Name& ) const;
bool isSelectable ( const Layer* ) const;
+ bool isPrinter () const;
+ void setPrinter ( bool );
inline void setDarkening ( const DisplayStyle::HSVr& );
inline void setPen ( const QPen& , size_t plane=PlaneId::Working );
void drawBox ( DbU::Unit, DbU::Unit, DbU::Unit, DbU::Unit );
@@ -452,6 +455,7 @@ namespace Hurricane {
, InitExtensionGo_t*
, DrawExtensionGo_t*
);
+ inline void copyDrawExtensionGos ( const DrawingQuery& );
void setDrawExtensionGo ( const Name& );
virtual bool hasMasterCellCallback () const;
virtual bool hasGoCallback () const;
@@ -647,6 +651,7 @@ namespace Hurricane {
QPoint _mousePosition;
Spot _spot;
shared_ptr _state;
+ bool _isPrinter;
bool _cellChanged;
bool _selectionHasChanged;
int _delaySelectionChanged;
@@ -706,6 +711,10 @@ namespace Hurricane {
{ _drawExtensionGos[name] = make_pair(initExtensionGo,drawExtensionGo); }
+ inline void CellWidget::DrawingQuery::copyDrawExtensionGos ( const CellWidget::DrawingQuery& other )
+ { _drawExtensionGos = other._drawExtensionGos; }
+
+
inline void CellWidget::DrawingQuery::resetGoCount ()
{ _goCount = 0; }
@@ -1145,7 +1154,11 @@ namespace Hurricane {
, InitExtensionGo_t* initExtensionGo
, DrawExtensionGo_t* drawExtensionGo
)
- { _drawingQuery.addDrawExtensionGo ( name, initExtensionGo, drawExtensionGo ); }
+ { _drawingQuery.addDrawExtensionGo( name, initExtensionGo, drawExtensionGo ); }
+
+
+ inline void CellWidget::copyDrawExtensionGos ( const CellWidget* other )
+ { _drawingQuery.copyDrawExtensionGos( other->_drawingQuery ); }
inline void CellWidget::setStartLevel ( int level )
@@ -1404,6 +1417,14 @@ namespace Hurricane {
{ _darkening = darkening; }
+ inline bool CellWidget::isPrinter () const
+ { return _isPrinter; }
+
+
+ inline void CellWidget::setPrinter ( bool state )
+ { _isPrinter = state; }
+
+
inline bool CellWidget::timeout ( const char* fname, const Timer& timer, double timeout, bool& timedout ) const
{
if ( timedout ) return true;
diff --git a/katabatic/CMakeLists.txt b/katabatic/CMakeLists.txt
index fdb45f0f..f37e40eb 100644
--- a/katabatic/CMakeLists.txt
+++ b/katabatic/CMakeLists.txt
@@ -18,6 +18,7 @@
find_package(PythonLibs 2 REQUIRED)
find_package(PythonSitePackages REQUIRED)
+ find_package(FLUTE REQUIRED)
find_package(VLSISAPD REQUIRED)
find_package(HURRICANE REQUIRED)
find_package(CORIOLIS REQUIRED)
diff --git a/katana/CMakeLists.txt b/katana/CMakeLists.txt
index 52129e56..d5a437c1 100644
--- a/katana/CMakeLists.txt
+++ b/katana/CMakeLists.txt
@@ -23,6 +23,7 @@
find_package(PythonLibs 2 REQUIRED)
find_package(PythonSitePackages REQUIRED)
find_package(LEFDEF REQUIRED)
+ find_package(FLUTE REQUIRED)
find_package(VLSISAPD REQUIRED)
find_package(HURRICANE REQUIRED)
find_package(CORIOLIS REQUIRED)
diff --git a/katana/src/CMakeLists.txt b/katana/src/CMakeLists.txt
index e0e50adc..e416bdeb 100644
--- a/katana/src/CMakeLists.txt
+++ b/katana/src/CMakeLists.txt
@@ -5,6 +5,7 @@
${CORIOLIS_INCLUDE_DIR}
${HURRICANE_INCLUDE_DIR}
${CONFIGURATION_INCLUDE_DIR}
+ ${FLUTE_INCLUDE_DIR}
${WtX_INCLUDE_DIR}
${Boost_INCLUDE_DIRS}
${PYTHON_INCLUDE_PATH}
@@ -95,6 +96,7 @@
${CIF_LIBRARY}
${AGDS_LIBRARY}
${UTILITIES_LIBRARY}
+ ${FLUTE_LIBRARIES}
${LEFDEF_LIBRARIES}
${OA_LIBRARIES}
${QtX_LIBRARIES}
diff --git a/katana/src/GlobalRoute.cpp b/katana/src/GlobalRoute.cpp
index fb80e7bc..36155378 100644
--- a/katana/src/GlobalRoute.cpp
+++ b/katana/src/GlobalRoute.cpp
@@ -14,8 +14,10 @@
// +-----------------------------------------------------------------+
+#include "flute.h"
#include "hurricane/Warning.h"
#include "hurricane/Breakpoint.h"
+#include "hurricane/RoutingPad.h"
#include "hurricane/Cell.h"
#include "anabatic/Dijkstra.h"
#include "katana/Block.h"
@@ -33,10 +35,13 @@ namespace {
using std::left;
using std::right;
using Hurricane::DbU;
- using Hurricane::DbU;
+ using Hurricane::Interval;
using Hurricane::Net;
+ using Anabatic::Flags;
using Anabatic::Edge;
+ using Anabatic::GCell;
using Anabatic::Vertex;
+ using Anabatic::AnabaticEngine;
class DigitalDistance {
@@ -76,7 +81,8 @@ namespace {
}
float congestionCost = 1.0;
- float congestion = (float)edge->getRealOccupancy() / (float)edge->getCapacity();
+ float congestion = ((float)edge->getRealOccupancy() + edge->getEstimateOccupancy())
+ / (float)edge->getCapacity();
if (not source->getGCell()->isChannelRow() or not target->getGCell()->isChannelRow())
congestionCost += _h / (1.0 + std::exp(_k * (congestion - 1.0)));
@@ -84,10 +90,19 @@ namespace {
float viaCost = 0.0;
if ( source->getFrom()
and (source->getFrom()->isHorizontal() xor edge->isHorizontal())
- and not source->hasGContact(_net) ) {
+ /*and not source->hasGContact(_net)*/ ) {
viaCost += 2.5;
}
+
+ float realCongestion = (float)edge->getRealOccupancy() / (float)edge->getCapacity();
+ float historicCost = edge->getHistoricCost();
+ if (realCongestion <= 1.0)
+ historicCost += edge->getEstimateOccupancy() * realCongestion;
+ else
+ historicCost += edge->getEstimateOccupancy() * exp( log(8) * (realCongestion - 1.0) );
+ //const_cast(edge)->setHistoricCost( historicCost );
+
float edgeDistance = (float)edge->getDistance();
if ( (source->getGCell()->isChannelRow() and target->getGCell()->isStdCellRow())
or (source->getGCell()->isStdCellRow() and target->getGCell()->isChannelRow()) )
@@ -96,8 +111,16 @@ namespace {
float hvScaling = (edge->isHorizontal()) ? _hScaling : 1.0 ;
float distance
= (float)source->getDistance()
- + (congestionCost + viaCost + edge->getHistoricCost()) * edgeDistance * hvScaling;
+ + (congestionCost + viaCost + historicCost) * edgeDistance * hvScaling;
+ cdebug_log(112,0) << "distance:"
+ << DbU::getValueString(source->getDistance()) << " + ("
+ << congestionCost << " + "
+ << viaCost << " + "
+ << edge->getHistoricCost() << ") * "
+ << DbU::getValueString(edgeDistance) << " * "
+ << hvScaling
+ << endl;
// Edge* sourceFrom = source->getFrom();
// if (sourceFrom) {
// distance += ((sourceFrom->isHorizontal() xor edge->isHorizontal()) ? 3.0 : 0.0) * (float)Edge::unity;
@@ -122,6 +145,25 @@ namespace {
}
+ void updateEstimateDensityOfPath ( AnabaticEngine* anabatic, GCell* source, GCell* target, double weight )
+ {
+ Interval hoverlap = source->getHSide().getIntersection( target->getHSide() );
+ Interval voverlap = source->getVSide().getIntersection( target->getVSide() );
+ bool straightLine = not (hoverlap.isEmpty() and voverlap.isEmpty());
+ double cost = ((straightLine) ? 1.0 : 0.5) * weight;
+
+ for ( Edge* edge : anabatic->getEdgesUnderPath(source,target,Flags::NorthPath) ) {
+ edge->incEstimateOccupancy( cost );
+ }
+
+ if (not straightLine) {
+ for ( Edge* edge : anabatic->getEdgesUnderPath(source,target,Flags::NoFlags) ) {
+ edge->incEstimateOccupancy( cost );
+ }
+ }
+ }
+
+
} // Anonymous namespace.
@@ -133,6 +175,11 @@ namespace Katana {
using Hurricane::Timer;
using Hurricane::Occurrence;
using Hurricane::Transformation;
+ using Hurricane::Horizontal;
+ using Hurricane::Vertical;
+ using Hurricane::Contact;
+ using Hurricane::RoutingPad;
+ using Hurricane::RoutingPad;
using Hurricane::Instance;
using Anabatic::EngineState;
using Anabatic::Dijkstra;
@@ -187,6 +234,76 @@ namespace Katana {
}
+ void KatanaEngine::updateEstimateDensity ( NetData* netData, double weight )
+ {
+ // if ( (netData->getNet()->getName() != "ialu.inv_x2_sig")
+ // and (netData->getNet()->getName() != "ra(0)")
+ // and (netData->getNet()->getName() != "iram.oa2a22_x2_11_sig")) return;
+
+ vector targets;
+ for ( Component* component : netData->getNet()->getComponents() ) {
+ RoutingPad* rp = dynamic_cast( component );
+ if (rp) {
+ if (not getConfiguration()->selectRpComponent(rp))
+ cerr << Warning( "KatanaEngine::updateEstimateDensity(): %s has no components on grid.", getString(rp).c_str() ) << endl;
+
+ Point center = rp->getBoundingBox().getCenter();
+ GCell* gcell = getGCellUnder( center );
+
+ targets.push_back( gcell );
+ }
+ }
+
+ switch ( targets.size() ) {
+ case 0:
+ case 1:
+ return;
+ case 2:
+ updateEstimateDensityOfPath( this, targets[0], targets[1], weight );
+ return;
+ default:
+ { int accuracy = 3;
+ int* xs = new int [targets.size()];
+ int* ys = new int [targets.size()];
+
+ for ( size_t itarget=0 ; itargetgetCenter();
+ xs[ itarget ] = center.getX();
+ ys[ itarget ] = center.getY();
+ }
+
+ Flute::Tree tree = Flute::flute( targets.size(), xs, ys, accuracy );
+
+ for ( size_t i=0 ; (int)i < 2*tree.deg - 2 ; ++i ) {
+ size_t j = tree.branch[i].n;
+ GCell* source = getGCellUnder( tree.branch[i].x, tree.branch[i].y );
+ GCell* target = getGCellUnder( tree.branch[j].x, tree.branch[j].y );
+
+ if (not source) {
+ cerr << Error( "KatanaEngine::updateEstimateDensity(): No GCell under (%s,%s) for %s."
+ , DbU::getValueString((DbU::Unit)tree.branch[i].x).c_str()
+ , DbU::getValueString((DbU::Unit)tree.branch[i].y).c_str()
+ , getString(netData->getNet()).c_str()
+ ) << endl;
+ continue;
+ }
+ if (not target) {
+ cerr << Error( "KatanaEngine::updateEstimateDensity(): No GCell under (%s,%s) for %s."
+ , DbU::getValueString((DbU::Unit)tree.branch[j].x).c_str()
+ , DbU::getValueString((DbU::Unit)tree.branch[j].y).c_str()
+ , getString(netData->getNet()).c_str()
+ ) << endl;
+ continue;
+ }
+
+ updateEstimateDensityOfPath( this, source, target, weight );
+ }
+ }
+ return;
+ }
+ }
+
+
void KatanaEngine::runGlobalRouter ()
{
if (getState() >= EngineState::EngineGlobalLoaded)
@@ -195,6 +312,16 @@ namespace Katana {
openSession();
annotateGlobalGraph();
+ for ( NetData* netData : getNetOrdering() ) {
+ if (netData->isGlobalRouted() or netData->isExcluded()) continue;
+
+ updateEstimateDensity( netData, 1.0 );
+ netData->setGlobalEstimated( true );
+ }
+
+ // Session::close();
+ // Breakpoint::stop( 1, "After global routing estimation." );
+ // openSession();
startMeasures();
cmess1 << " o Running global routing." << endl;
@@ -218,9 +345,16 @@ namespace Katana {
do {
cmess2 << " [" << setfill(' ') << setw(3) << iteration << "] nets:";
+ long wireLength = 0;
+ long viaCount = 0;
+
netCount = 0;
for ( NetData* netData : getNetOrdering() ) {
- if (netData->isGlobalRouted()) continue;
+ if (netData->isGlobalRouted() or netData->isExcluded()) continue;
+ if (netData->isGlobalEstimated()) {
+ updateEstimateDensity( netData, -1.0 );
+ netData->setGlobalEstimated( false );
+ }
distance->setNet( netData->getNet() );
dijkstra->load( netData->getNet() );
@@ -228,13 +362,20 @@ namespace Katana {
++netCount;
}
cmess2 << left << setw(6) << netCount;
- cmess2 << " ovEdges:" << setw(4) << ovEdges.size();
- for ( Edge* edge : ovEdges ) computeNextHCost( edge, edgeHInc );
+ computeGlobalWireLength( wireLength, viaCount );
+ cmess2 << " nWL:" << setw(7) << (wireLength /*+ viaCount*3*/);
+ cmess2 << " VIAs:" << setw(7) << viaCount;
- // Session::close();
- // Breakpoint::stop( 1, "Before riping up overflowed edges." );
- // openSession();
+ size_t overflow = ovEdges.size();
+ for ( Edge* edge : ovEdges ) {
+ edge->setHistoricCost( edge->getHistoricCost() + edgeHInc );
+ //computeNextHCost( edge, edgeHInc );
+ }
+
+ //Session::close();
+ //Breakpoint::stop( 1, "Before riping up overflowed edges." );
+ //openSession();
netCount = 0;
if (iteration < globalIterations - 1) {
@@ -256,10 +397,12 @@ namespace Katana {
dijkstra->setSearchAreaHalo( Session::getSliceHeight()*3 );
}
+ cmess2 << " ovE:" << setw(4) << overflow;
+
cmess2 << " ripup:" << setw(4) << netCount << right;
suspendMeasures();
- cmess2 << " " << setw(10) << Timer::getStringTime (getTimer().getCombTime())
- << " " << setw( 6) << Timer::getStringMemory(getTimer().getIncrease()) << endl;
+ cmess2 << " " << setw(5) << Timer::getStringTime (getTimer().getCombTime())
+ << " " << setw(6) << Timer::getStringMemory(getTimer().getIncrease()) << endl;
resumeMeasures();
++iteration;
@@ -302,5 +445,45 @@ namespace Katana {
}
+ void KatanaEngine::computeGlobalWireLength ( long& wireLength, long& viaCount )
+ {
+ const Layer* hLayer = getConfiguration()->getGHorizontalLayer();
+ const Layer* vLayer = getConfiguration()->getGVerticalLayer();
+ const Layer* cLayer = getConfiguration()->getGContactLayer();
+
+ DbU::Unit hWireLength = 0;
+ DbU::Unit vWireLength = 0;
+
+ for ( NetData* netData : getNetOrdering() ) {
+ if (not netData->isGlobalRouted()) continue;
+
+ for ( Component* component : netData->getNet()->getComponents() ) {
+ if (component->getLayer() == hLayer) {
+ hWireLength += static_cast( component )->getLength();
+ } else {
+ if (component->getLayer() == vLayer) {
+ vWireLength += static_cast( component )->getLength();
+ } else {
+ if (component->getLayer() == cLayer) {
+ Contact* contact = static_cast( component );
+ size_t gslaves = 0;
+
+ for ( Component* slave : contact->getSlaveComponents().getSubSet() ) {
+ if (slave->getLayer() == vLayer) { ++viaCount; break; }
+ // if (slave->getLayer() == hLayer) {
+ // ++gslaves;
+ // if (gslaves >= 2) { ++viaCount; break; }
+ // }
+ }
+ }
+ }
+ }
+ }
+ }
+
+ wireLength = hWireLength / GCell::getMatrixHSide();
+ wireLength += vWireLength / GCell::getMatrixVSide();
+ }
+
} // Katana namespace.
diff --git a/katana/src/GraphicKatanaEngine.cpp b/katana/src/GraphicKatanaEngine.cpp
index 5a826b9d..abedcac0 100644
--- a/katana/src/GraphicKatanaEngine.cpp
+++ b/katana/src/GraphicKatanaEngine.cpp
@@ -92,28 +92,36 @@ namespace Katana {
painter.setBrush( Graphics::getColorScale( ColorScale::Fire ).getBrush( density, widget->getDarkening() ) );
painter.drawRect( pixelBb );
} else {
- if ( (pixelBb.width() > 150) or (pixelBb.height() > 150) ) {
- painter.setPen ( pen );
- painter.setBrush( Graphics::getBrush("Anabatic::GCell",widget->getDarkening()) );
- painter.drawRect( pixelBb );
+ int fontScale = 0;
+ int halfHeight = 20;
+ int halfWidth = 80;
+ if (widget->isPrinter()) {
+ fontScale = -5;
+ halfHeight = 9;
+ halfWidth = 39;
+
+ }
+
+ painter.setPen ( pen );
+ painter.setBrush( Graphics::getBrush("Anabatic::GCell",widget->getDarkening()) );
+ painter.drawRect( pixelBb );
- if ( (pixelBb.width() > 300) and (pixelBb.height() > 100) ) {
- QString text = QString("id:%1").arg(gcell->getId());
- QFont font = Graphics::getFixedFont( QFont::Bold );
- painter.setFont(font);
+ if ( (pixelBb.width() > 2*halfWidth) and (pixelBb.height() > 2*halfHeight) ) {
+ QString text = QString("%1").arg(gcell->getId());
+ QFont font = Graphics::getFixedFont( QFont::Normal, false, false, fontScale );
+ painter.setFont(font);
- pen.setWidth( 1 );
- painter.setPen( pen );
+ pen.setWidth( 1 );
+ painter.setPen( pen );
- painter.save ();
- painter.translate( widget->dbuToScreenPoint(bb.getCenter().getX(), bb.getCenter().getY()) );
- painter.drawRect ( QRect( -80, -25, 160, 50 ) );
- painter.drawText ( QRect( -80, -25, 160, 50 )
- , text
- , QTextOption(Qt::AlignCenter)
- );
- painter.restore ();
- }
+ painter.save ();
+ painter.translate( widget->dbuToScreenPoint(bb.getCenter().getX(), bb.getCenter().getY()) );
+ painter.drawRect ( QRect( -halfWidth, -halfHeight, 2*halfWidth, 2*halfHeight ) );
+ painter.drawText ( QRect( -halfWidth, -halfHeight, 2*halfWidth, 2*halfHeight )
+ , text
+ , QTextOption(Qt::AlignCenter)
+ );
+ painter.restore ();
}
}
}
@@ -140,11 +148,16 @@ namespace Katana {
if (edge) {
Box bb = edge->getBoundingBox();
uint32_t occupancy = 255;
- if (edge->getRealOccupancy() < edge->getCapacity())
- occupancy = (uint32_t)( 255.0 * ( (float)edge->getRealOccupancy() / (float)edge->getCapacity() ) );
+ //if (edge->getRealOccupancy() < edge->getCapacity())
+ // occupancy = (uint32_t)( 255.0 * ( (float)edge->getRealOccupancy() / (float)edge->getCapacity() ) );
+
+ float edgeOccupancy = edge->getEstimateOccupancy() + (float)edge->getRealOccupancy();
+
+ if ((unsigned int)edgeOccupancy < edge->getCapacity())
+ occupancy = (uint32_t)( 255.0 * (edgeOccupancy / (float)edge->getCapacity()) );
QPainter& painter = widget->getPainter();
- if (edge->getRealOccupancy() > edge->getCapacity()) {
+ if ((unsigned int)edgeOccupancy > edge->getCapacity()) {
QColor color ( Qt::cyan );
painter.setPen( DisplayStyle::darken(color,widget->getDarkening()) );
}
@@ -160,7 +173,11 @@ namespace Katana {
if (fontHeight > ((edge->isHorizontal()) ? pixelBb.height() : pixelBb.width()) + 4) return;
- QString text = QString("%1/%2").arg(edge->getRealOccupancy()).arg(edge->getCapacity());
+ //QString text = QString("%1/%2").arg(edge->getRealOccupancy()).arg(edge->getCapacity());
+ QString text = QString("%1/%2 %3")
+ .arg( edgeOccupancy )
+ .arg( edge->getCapacity() )
+ .arg( edge->getHistoricCost() );
QColor color ( (occupancy > 170) ? Qt::black : Qt::white );
painter.setPen (DisplayStyle::darken(color,widget->getDarkening()));
painter.setFont(font);
@@ -342,54 +359,60 @@ namespace Katana {
_viewer = viewer;
- if (_viewer->hasMenuAction("placeAndRoute.katana.route")) {
+ if (not _viewer->hasMenuAction("beta"))
+ _viewer->addMenu( "beta", "Beta", CellViewer::TopMenu );
+ if (not _viewer->hasMenuAction("beta.placeAndRoute"))
+ _viewer->addMenu( "beta.placeAndRoute", "P&&R" );
+
+ if (_viewer->hasMenuAction("beta.placeAndRoute.route")) {
cerr << Warning( "GraphicKatanaEngine::addToMenu() - Katana detailed router already hooked in." ) << endl;
return;
}
- _viewer->addMenu ( "placeAndRoute.katana" , "Katana" );
- _viewer->addMenu ( "placeAndRoute.katana.stepByStep", "&Step by step" );
+ _viewer->addMenu ( "beta.placeAndRoute.stepByStep", "&Step by step" );
- _viewer->addToMenu( "placeAndRoute.katana.route"
- , "Katana - &Route"
+ _viewer->addToMenu( "beta.placeAndRoute.route"
+ , "&Route . . . . . [Katana]"
, "Route the design (global & detailed)"
, std::bind(&GraphicKatanaEngine::_route,this)
+ , QIcon()
+ , "beta.placeAndRoute.stepByStep"
);
- _viewer->addToMenu( "placeAndRoute.katana.stepByStep.========" );
- _viewer->addToMenu( "placeAndRoute.katana.stepByStep.detailedPreRoute"
- , "Katana - Detailed Pre-Route"
+ _viewer->addToMenu( "beta.placeAndRoute.stepByStep.========" );
+ _viewer->addToMenu( "beta.placeAndRoute.stepByStep.detailedPreRoute"
+ , "Detailed Pre-Route . [Katana]"
, "Run the Katana detailed router on pre-routed nets"
, std::bind(&GraphicKatanaEngine::_runNegociatePreRouted,this)
);
- _viewer->addToMenu( "placeAndRoute.katana.stepByStep.globalRoute"
- , "Katana - &Global Route"
+ _viewer->addToMenu( "beta.placeAndRoute.stepByStep.globalRoute"
+ , "&Global Route . . . [Katana]"
, "Run the Katana global router"
, std::bind(&GraphicKatanaEngine::_globalRoute,this)
);
- _viewer->addToMenu( "placeAndRoute.katana.stepByStep.detailedRoute"
- , "Katana - &Detailed Route"
+ _viewer->addToMenu( "beta.placeAndRoute.stepByStep.detailedRoute"
+ , "&Detailed Route . . [Katana]"
, "Run the Katana detailed router"
, std::bind(&GraphicKatanaEngine::_detailRoute,this)
);
- _viewer->addToMenu( "placeAndRoute.katana.stepByStep.finalize"
- , "Katana - &Finalize Routing"
+ _viewer->addToMenu( "beta.placeAndRoute.stepByStep.finalize"
+ , "&Finalize Routing . [Katana]"
, "Closing Routing"
, std::bind(&GraphicKatanaEngine::_finalize,this)
);
- _viewer->addToMenu( "placeAndRoute.katana.stepByStep.dumpMeasures"
- , "Katana - Dump &Measures"
+ _viewer->addToMenu( "beta.placeAndRoute.stepByStep.dumpMeasures"
+ , "Dump &Measures . . [Katana]"
, "Dumping Measurements on the disk"
, std::bind(&GraphicKatanaEngine::_dumpMeasures,this)
);
- _viewer->addToMenu( "placeAndRoute.katana.stepByStep.save"
- , "Katana - &Save Design"
+#if NO_NEED_OF_IT_NOW
+ _viewer->addToMenu( "beta.placeAndRoute.stepByStep.save"
+ , "&Save Design"
, "Save routed design (temporary hack)"
, std::bind(&GraphicKatanaEngine::_save,this)
);
-#if NO_NEED_OF_IT_NOW
- _viewer->addToMenu( "placeAndRoute.katana.stepByStep.runTest"
- , "Katana - Run &Test"
+ _viewer->addToMenu( "beta.placeAndRoute.stepByStep.runTest"
+ , "Run &Test"
, "Run Test Program (symmetric routing of gmChamla)"
, std::bind(&GraphicKatanaEngine::_runTest,this)
);
diff --git a/katana/src/KatanaEngine.cpp b/katana/src/KatanaEngine.cpp
index e01dceca..aa353894 100644
--- a/katana/src/KatanaEngine.cpp
+++ b/katana/src/KatanaEngine.cpp
@@ -18,6 +18,7 @@
#include
#include
#include
+#include "flute.h"
#include "vlsisapd/utilities/Path.h"
#include "hurricane/DebugSession.h"
#include "hurricane/UpdateSession.h"
@@ -198,6 +199,9 @@ namespace Katana {
void KatanaEngine::_postCreate ()
{
Super::_postCreate ();
+
+ // Flute: load POWV9.dat & POST9.dat
+ Flute::readLUT( System::getPath("coriolis_top").toString() );
}
diff --git a/katana/src/PowerRails.cpp b/katana/src/PowerRails.cpp
index 0c6fdb63..a3957548 100644
--- a/katana/src/PowerRails.cpp
+++ b/katana/src/PowerRails.cpp
@@ -638,7 +638,9 @@ namespace {
// - plane->getLayerGauge()->getHalfWireWidth()
// - DbU::fromLambda(0.1);
DbU::Unit delta = plane->getLayerGauge()->getObstacleDw() - DbU::fromLambda(0.1);
- DbU::Unit extension = layer->getExtentionCap();
+ DbU::Unit extension = layer->getExtentionCap() - plane->getLayerGauge()->getLayer()->getMinimalSpacing()/2;
+ //DbU::Unit extension = layer->getExtentionCap() - plane->getLayerGauge()->getHalfPitch() + getHalfWireWidth();
+ //DbU::Unit extension = layer->getExtentionCap();
//DbU::Unit extension = Session::getExtentionCap();
//unsigned int type = plane->getLayerGauge()->getType();
const Box& coronaBb = plane->getKatanaEngine()->getChipTools().getCoronaBb();
diff --git a/katana/src/ProtectRoutingPads.cpp b/katana/src/ProtectRoutingPads.cpp
index a3ec57f3..ffa29f2d 100644
--- a/katana/src/ProtectRoutingPads.cpp
+++ b/katana/src/ProtectRoutingPads.cpp
@@ -178,7 +178,7 @@ namespace Katana {
for ( Net* net : getCell()->getNets() ) {
if (net->isSupply()) continue;
- DebugSession::open( net, 140, 150 );
+ DebugSession::open( net, 145, 150 );
NetData* data = getNetData( net );
if (data and data->isFixed()) continue;
diff --git a/katana/src/PyKatanaEngine.cpp b/katana/src/PyKatanaEngine.cpp
index 671c0227..b6cf4092 100644
--- a/katana/src/PyKatanaEngine.cpp
+++ b/katana/src/PyKatanaEngine.cpp
@@ -14,6 +14,7 @@
// +-----------------------------------------------------------------+
+#include "hurricane/isobar/PyNet.h"
#include "hurricane/isobar/PyCell.h"
#include "hurricane/viewer/PyCellViewer.h"
#include "hurricane/viewer/ExceptionWidget.h"
@@ -41,6 +42,8 @@ namespace Katana {
using Hurricane::Error;
using Hurricane::Warning;
using Hurricane::ExceptionWidget;
+ using Isobar::__cs;
+ using Isobar::Converter;
using Isobar::ProxyProperty;
using Isobar::ProxyError;
using Isobar::ConstructorError;
@@ -48,6 +51,7 @@ namespace Katana {
using Isobar::HurricaneWarning;
using Isobar::ParseOneArg;
using Isobar::ParseTwoArg;
+ using Isobar::PyNet;
using Isobar::PyCell;
using Isobar::PyCell_Link;
using Isobar::PyCellViewer;
@@ -135,8 +139,8 @@ extern "C" {
METHOD_HEAD( "KatanaEngine.setViewer()" )
PyObject* pyViewer = NULL;
- if (not PyArg_ParseTuple(args,"O:EtesianEngine.setViewer()",&pyViewer)) {
- PyErr_SetString( ConstructorError, "Bad parameters given to EtesianEngine.setViewer()." );
+ if (not PyArg_ParseTuple(args,"O:KatanaEngine.setViewer()",&pyViewer)) {
+ PyErr_SetString( ConstructorError, "Bad parameters given to KatanaEngine.setViewer()." );
return NULL;
}
if (IsPyCellViewer(pyViewer)) {
@@ -168,6 +172,29 @@ extern "C" {
}
+ static PyObject* PyKatanaEngine_exclude ( PyKatanaEngine* self, PyObject* args )
+ {
+ cdebug_log(40,0) << "PyKatanaEngine_exclude ()" << endl;
+
+ HTRY
+ METHOD_HEAD( "KatanaEngine.exclude()" )
+
+ PyObject* arg0;
+ __cs.init ("KatanaEngine.exclude");
+
+ if (not PyArg_ParseTuple(args, "O&:KatanaEngine.exclude", Converter, &arg0)) {
+ PyErr_SetString( ConstructorError, "Bad parameters given to KatanaEngine.exclude()." );
+ return NULL;
+ }
+
+ if (__cs.getObjectIds() == STRING_ARG) { katana->exclude( PyString_AsString(arg0) ); }
+ else if (__cs.getObjectIds() == NET_ARG ) { katana->exclude( PYNET_O(arg0) ); }
+ HCATCH
+
+ Py_RETURN_NONE;
+ }
+
+
PyObject* PyKatanaEngine_runGlobalRouter ( PyKatanaEngine* self )
{
cdebug_log(40,0) << "PyKatanaEngine_runGlobalRouter()" << endl;
@@ -230,7 +257,7 @@ extern "C" {
failure = ExceptionWidget::catchAllWrapper( std::bind(&KatanaEngine::layerAssign,katana,flags) );
if (failure) {
- PyErr_SetString( HurricaneError, "EtesianEngine::place() has thrown an exception (C++)." );
+ PyErr_SetString( HurricaneError, "KatanaEngine::layerAssign() has thrown an exception (C++)." );
return NULL;
}
} else {
@@ -275,7 +302,7 @@ extern "C" {
if (PyArg_ParseTuple(args,"I:KatanaEngine.runNegociate", &flags)) {
if (katana->getViewer()) {
if (ExceptionWidget::catchAllWrapper( std::bind(&KatanaEngine::runNegociate,katana,flags) )) {
- PyErr_SetString( HurricaneError, "EtesianEngine::runNegociate() has thrown an exception (C++)." );
+ PyErr_SetString( HurricaneError, "KatanaEngine::runNegociate() has thrown an exception (C++)." );
return NULL;
}
} else {
@@ -309,6 +336,8 @@ extern "C" {
, "Associate a Viewer to this KatanaEngine." }
, { "digitalInit" , (PyCFunction)PyKatanaEngine_digitalInit , METH_NOARGS
, "Setup Katana for digital routing." }
+ , { "exclude" , (PyCFunction)PyKatanaEngine_exclude , METH_VARARGS
+ , "Exclude a net from routing." }
, { "printConfiguration" , (PyCFunction)PyKatanaEngine_printConfiguration , METH_NOARGS
, "Display on the console the configuration of Katana." }
, { "getToolSuccess" , (PyCFunction)PyKatanaEngine_getToolSuccess , METH_NOARGS
diff --git a/katana/src/RoutingEvent.cpp b/katana/src/RoutingEvent.cpp
index a586963b..05f4980f 100644
--- a/katana/src/RoutingEvent.cpp
+++ b/katana/src/RoutingEvent.cpp
@@ -602,7 +602,8 @@ namespace Katana {
cdebug_log(159,0) << "| " << perpandicular << endl;
fsm.addAction( perpandicular, SegmentAction::SelfInsert );
DataNegociate* data = perpandicular->getDataNegociate();
- if (data) data->setState( DataNegociate::Repair );
+ if (data and (data->getState() < DataNegociate::Repair))
+ data->setState( DataNegociate::Repair );
}
}
fsm.doActions();
diff --git a/katana/src/SymmetricRoute.cpp b/katana/src/SymmetricRoute.cpp
index e7168907..fc0ff782 100644
--- a/katana/src/SymmetricRoute.cpp
+++ b/katana/src/SymmetricRoute.cpp
@@ -137,7 +137,7 @@ namespace {
if (not _data) return false;
if (not _data->isValid()) return _data->isValid();
- DebugSession::open( _data->getNet(), 144, 146 );
+ DebugSession::open( _data->getNet(), 145, 146 );
// Temporary.
//_data->setSymAxis( _katana->getCell()->getAbutmentBox().getCenter().getX() );
diff --git a/katana/src/Track.cpp b/katana/src/Track.cpp
index 6c1b8c52..56ba691b 100644
--- a/katana/src/Track.cpp
+++ b/katana/src/Track.cpp
@@ -392,9 +392,9 @@ namespace Katana {
Interval Track::getFreeInterval ( DbU::Unit position, Net* net ) const
{
- uint32_t state;
- size_t begin;
- size_t end;
+ uint32_t state = 0;
+ size_t begin = 0;
+ size_t end = 0;
if (_segments.empty()) return Interval(_min,_max);
@@ -429,6 +429,8 @@ namespace Katana {
}
if (not (state & EndIsTrackMax) ) {
+ if (state & EndIsNextSegmentMin) ++end;
+
if (_segments[end]->getNet() == net) {
getNext( end, net );
@@ -439,6 +441,7 @@ namespace Katana {
setMaximalFlags( state, EndIsSegmentMin );
}
}
+ cdebug_log(155,0) << "end:" << end << " state:" << state << endl;
}
cdebug_tabw(155,-1);
diff --git a/katana/src/katana/KatanaEngine.h b/katana/src/katana/KatanaEngine.h
index 85c44487..0540c489 100644
--- a/katana/src/katana/KatanaEngine.h
+++ b/katana/src/katana/KatanaEngine.h
@@ -44,6 +44,7 @@ namespace Katana {
using Hurricane::CellViewer;
using CRL::RoutingGauge;
using Anabatic::AnabaticEngine;
+ using Anabatic::NetData;
class Block;
class Track;
@@ -123,8 +124,10 @@ namespace Katana {
void digitalInit ();
void analogInit ();
void pairSymmetrics ();
+ void updateEstimateDensity ( NetData*, double weight );
void runNegociate ( Flags flags=Flags::NoFlags );
void runGlobalRouter ();
+ void computeGlobalWireLength ( long& wireLength, long& viaCount );
void runTest ();
virtual void finalizeLayout ();
void _runKatanaInit ();
diff --git a/kite/CMakeLists.txt b/kite/CMakeLists.txt
index dea5d107..ba298a44 100644
--- a/kite/CMakeLists.txt
+++ b/kite/CMakeLists.txt
@@ -19,6 +19,7 @@
find_package(LibXml2 REQUIRED)
find_package(PythonLibs 2 REQUIRED)
find_package(PythonSitePackages REQUIRED)
+ find_package(FLUTE REQUIRED)
find_package(VLSISAPD REQUIRED)
find_package(LEFDEF REQUIRED)
find_package(HURRICANE REQUIRED)
diff --git a/kite/src/CMakeLists.txt b/kite/src/CMakeLists.txt
index 7b7d1ca1..2c05d319 100644
--- a/kite/src/CMakeLists.txt
+++ b/kite/src/CMakeLists.txt
@@ -5,6 +5,7 @@
${CORIOLIS_INCLUDE_DIR}
${HURRICANE_INCLUDE_DIR}
${CONFIGURATION_INCLUDE_DIR}
+ ${FLUTE_INCLUDE_DIR}
${WtX_INCLUDE_DIR}
${Boost_INCLUDE_DIRS}
${PYTHON_INCLUDE_PATH}
@@ -85,6 +86,7 @@
${CIF_LIBRARY}
${AGDS_LIBRARY}
${UTILITIES_LIBRARY}
+ ${FLUTE_LIBRARIES}
${LEFDEF_LIBRARIES}
${OA_LIBRARIES}
${QtX_LIBRARIES}
diff --git a/kite/src/GraphicKiteEngine.cpp b/kite/src/GraphicKiteEngine.cpp
index 8cfa41ae..d166ebdb 100644
--- a/kite/src/GraphicKiteEngine.cpp
+++ b/kite/src/GraphicKiteEngine.cpp
@@ -285,57 +285,59 @@ namespace Kite {
}
_viewer->addToMenu( "placeAndRoute.route"
- , "Kite - &Route"
- , "Route the design (global & detailed)"
+ , "&Route"
+ , "Complete routing of the design (global, detailed and finalize) [Kite]"
, std::bind(&GraphicKiteEngine::_route,this)
+ , QIcon()
+ , "placeAndRoute.stepByStep"
);
_viewer->addToMenu( "placeAndRoute.stepByStep.========" );
_viewer->addToMenu( "placeAndRoute.stepByStep.wipeoutRouting"
- , "Kite - Erase Previous Routing"
+ , "Erase Previous Routing"
, "Erase any previously routed wires"
, std::bind(&GraphicKiteEngine::_wipeoutRouting,this)
);
_viewer->addToMenu( "placeAndRoute.stepByStep.detailedPreRoute"
- , "Kite - Detailed Pre-Route"
- , "Run the Kite detailed router on pre-routed nets"
+ , "Detailed Pre-Route"
+ , "Run the detailed router on global pre-routed nets [Kite]"
, std::bind(&GraphicKiteEngine::_runNegociatePreRouted,this)
);
_viewer->addToMenu( "placeAndRoute.stepByStep.globalRoute"
- , "Kite - &Global Route"
- , "Run the Knik global router"
+ , "&Global Route"
+ , "Run the global router [nik]"
, std::bind(&GraphicKiteEngine::_globalRoute,this)
);
_viewer->addToMenu( "placeAndRoute.stepByStep.loadGlobalRouting"
- , "Kite - &Load Global Routing"
- , "Load a solution for the global routing (.kgr)"
+ , "&Load Global Routing"
+ , "Load a solution for the global routing (.kgr) [Knik]"
, std::bind(&GraphicKiteEngine::_loadGlobalSolution,this)
);
_viewer->addToMenu( "placeAndRoute.stepByStep.saveGlobalRouting"
- , "Kite - &Save Global Routing"
- , "Save a global router solution (.kgr)"
+ , "&Save Global Routing"
+ , "Save a global router solution (.kgr) [Knik]"
, std::bind(&GraphicKiteEngine::_saveGlobalSolution,this)
);
_viewer->addToMenu( "placeAndRoute.stepByStep.detailedRoute"
- , "Kite - &Detailed Route"
- , "Run the Kite detailed router"
+ , "&Detailed Route"
+ , "Run the detailed router [Kite]"
, std::bind(&GraphicKiteEngine::_detailRoute,this)
);
_viewer->addToMenu( "placeAndRoute.stepByStep.finalize"
- , "Kite - &Finalize Routing"
- , "Closing Routing"
+ , "&Finalize Routing"
+ , "Cleanup all routing related data structures [Kite]"
, std::bind(&GraphicKiteEngine::_finalize,this)
);
_viewer->addToMenu( "placeAndRoute.stepByStep.dumpMeasures"
- , "Kite - Dump &Measures"
- , "Dumping Measurements on the disk"
+ , "Dump &Measures"
+ , "Dumping Measurements on the disk [Kite]"
, std::bind(&GraphicKiteEngine::_dumpMeasures,this)
);
- _viewer->addToMenu( "placeAndRoute.stepByStep.save"
- , "Kite - &Save Design"
- , "Save routed design (temporary hack)"
- , std::bind(&GraphicKiteEngine::_save,this)
- );
+ // _viewer->addToMenu( "placeAndRoute.stepByStep.save"
+ // , "&Save Design"
+ // , "Save routed design (temporary hack)"
+ // , std::bind(&GraphicKiteEngine::_save,this)
+ // );
}
diff --git a/kite/src/KiteEngine.cpp b/kite/src/KiteEngine.cpp
index 91c57f50..9ed668f1 100644
--- a/kite/src/KiteEngine.cpp
+++ b/kite/src/KiteEngine.cpp
@@ -593,6 +593,16 @@ namespace Kite {
if (istate.second->isMixedPreRoute())
preRouteds.insert( make_pair(istate.first, istate.second->getNet()) );
}
+ //for ( Net* net : getCell()->getNets() ) {
+ // if (net->getName() == "ialu.aux28") continue;
+ // if (net->getName() == "iram.not_aux109") continue;
+ // if (net->getName() == "s(0)") continue;
+ // if (net->getName() == "s(3)") continue;
+ // if (net->getName() == "r(1)") continue;
+ // if (net->getName() == "r(2)") continue;
+
+ // preRouteds.insert( make_pair(net->getName(), net) );
+ //}
_knik->run( preRouteds );
}
diff --git a/knik/CMakeLists.txt b/knik/CMakeLists.txt
index 66064dc3..97d68038 100644
--- a/knik/CMakeLists.txt
+++ b/knik/CMakeLists.txt
@@ -16,9 +16,10 @@
setup_boost(program_options filesystem python regex)
setup_qt()
- find_package(VLSISAPD REQUIRED)
+ find_package(FLUTE REQUIRED)
+ find_package(VLSISAPD REQUIRED)
find_package(HURRICANE REQUIRED)
- find_package(CORIOLIS REQUIRED)
+ find_package(CORIOLIS REQUIRED)
add_subdirectory(src)
add_subdirectory(cmake_modules)
diff --git a/knik/src/CMakeLists.txt b/knik/src/CMakeLists.txt
index e4019571..a952177c 100644
--- a/knik/src/CMakeLists.txt
+++ b/knik/src/CMakeLists.txt
@@ -3,6 +3,7 @@
# include ( ${QT_USE_FILE} )
include_directories ( ${KNIK_SOURCE_DIR}/src
${KNIK_SOURCE_DIR}/src/flute-3.1/src
+ ${FLUTE_INCLUDE_DIR}
${HURRICANE_INCLUDE_DIR}
${CORIOLIS_INCLUDE_DIR}
${UTILITIES_INCLUDE_DIR}
@@ -39,35 +40,12 @@
KnikEngine.cpp
GraphicKnikEngine.cpp
)
- set ( fluteIncludes flute-3.1/src/knik/flute.h
- flute-3.1/src/knik/dl.h
- flute-3.1/src/knik/mst2.h
- flute-3.1/src/knik/err.h
- flute-3.1/src/knik/heap.h
- flute-3.1/src/knik/dist.h
- flute-3.1/src/knik/global.h
- flute-3.1/src/knik/neighbors.h
- )
- set ( fluteCpps flute-3.1/src/flute.cpp
- flute-3.1/src/flute_mst.cpp
- flute-3.1/src/dist.cpp
- flute-3.1/src/dl.cpp
- flute-3.1/src/err.cpp
- flute-3.1/src/mst2.cpp
- flute-3.1/src/heap.cpp
- flute-3.1/src/neighbors.cpp
- )
qtX_wrap_cpp ( mocCpps ${mocIncludes} )
- add_library ( flute ${fluteCpps} )
- set_target_properties ( flute PROPERTIES VERSION 3.1 SOVERSION 3 )
- target_link_libraries ( flute ${HURRICANE_LIBRARIES}
- ${CORIOLIS_LIBRARIES}
- )
add_library ( knik ${cpps} ${mocCpps} )
set_target_properties ( knik PROPERTIES VERSION 1.0 SOVERSION 1 )
- target_link_libraries ( knik flute
+ target_link_libraries ( knik ${FLUTE_LIBRARY}
${HURRICANE_PYTHON_LIBRARIES}
${HURRICANE_GRAPHICAL_LIBRARIES}
${HURRICANE_LIBRARIES}
@@ -83,9 +61,6 @@
${PYTHON_LIBRARIES} -lutil
)
- install ( TARGETS knik flute DESTINATION lib${LIB_SUFFIX} )
+ install ( TARGETS knik DESTINATION lib${LIB_SUFFIX} )
install ( FILES ${includes}
- ${mocIncludes}
- ${fluteIncludes} DESTINATION include/coriolis2/knik )
- install ( FILES flute-3.1/etc/POST9.dat
- flute-3.1/etc/POWV9.dat DESTINATION share/coriolis2/flute-3.1 )
+ ${mocIncludes} DESTINATION include/coriolis2/knik )
diff --git a/knik/src/Graph.cpp b/knik/src/Graph.cpp
index a4e12972..91335776 100644
--- a/knik/src/Graph.cpp
+++ b/knik/src/Graph.cpp
@@ -4,6 +4,8 @@
#include
#include
+#include "flute.h"
+
#include "hurricane/DebugSession.h"
#include "hurricane/Warning.h"
#include "hurricane/Error.h"
@@ -33,7 +35,6 @@
#include "knik/VEdge.h"
#include "knik/KnikEngine.h"
-#include "knik/flute.h"
//#define __USE_SLICINGTREE__
#define __USE_MATRIXVERTEX__
@@ -1524,14 +1525,14 @@ void Graph::Monotonic()
//#endif
}
-FTree* Graph::createFluteTree()
+Tree* Graph::createFluteTree()
// ****************************
{
int accuracy = 3; // accuracy for flute (by default 3)
int d = _vertexes_to_route.size(); // degre du net, ie nombre de routingPads
int *x = new int [d]; // x coordinates of the vertexes
int *y = new int [d]; // y coordinates of the vertexes
- FTree* flutetree = new FTree; // the flute Steiner Tree
+ Tree* flutetree = new Tree; // the flute Steiner Tree
//cout << "Net : " << _working_net << endl;
// scans _working_net to find x,y coordinates and fill x, y and d
@@ -1548,7 +1549,7 @@ FTree* Graph::createFluteTree()
assert ( d == cpt );
- *flutetree = flute ( d, x, y, accuracy );
+ *flutetree = Flute::flute ( d, x, y, accuracy );
//printtree ( flutetree );
//plottree ( flutetree );
//cout << endl;
@@ -1561,9 +1562,9 @@ void Graph::UpdateEstimateCongestion ( bool create )
if ( _vertexes_to_route.size() < 2 )
return;
//cerr << "Running FLUTE for net : " << _working_net << endl;
- unique_ptr flutetree ( createFluteTree() );
+ unique_ptr flutetree ( createFluteTree() );
- //parcours des branches du FTree pour créer la congestion estimée
+ //parcours des branches du Tree pour créer la congestion estimée
for ( int i = 0 ; i < 2*flutetree->deg-2 ; i++ ) {
// int sourceX = flutetree->branch[i].x;
// int sourceY = flutetree->branch[i].y;
diff --git a/knik/src/KnikEngine.cpp b/knik/src/KnikEngine.cpp
index 8e026b1c..325fd3b1 100644
--- a/knik/src/KnikEngine.cpp
+++ b/knik/src/KnikEngine.cpp
@@ -15,6 +15,7 @@
#include
+#include "flute.h"
#include "hurricane/Warning.h"
#include "hurricane/Property.h"
#include "hurricane/NetRoutingProperty.h"
@@ -40,7 +41,6 @@
#include "knik/RoutingGrid.h"
#include "knik/NetExtension.h"
#include "knik/KnikEngine.h"
-#include "knik/flute.h"
#define MAX_RUNTIME 86400
@@ -134,7 +134,7 @@ void KnikEngine::_postCreate()
Inherit::_postCreate();
// For Flute : readLUT to be able to use POWV9.dat & POST9.dat
- readLUT();
+ Flute::readLUT( AllianceFramework::get()->getEnvironment()->getCORIOLIS_TOP() );
return;
}
diff --git a/knik/src/flute-3.1/src/knik/err.h b/knik/src/flute-3.1/src/knik/err.h
deleted file mode 100644
index a35724e6..00000000
--- a/knik/src/flute-3.1/src/knik/err.h
+++ /dev/null
@@ -1,12 +0,0 @@
-#ifndef _ERR_H_
-#define _ERR_H_
-
-void err_msg(
-char* msg
-);
-
-void err_exit(
-char* msg
-);
-
-#endif
diff --git a/knik/src/knik/Graph.h b/knik/src/knik/Graph.h
index 6d8eaf82..b8bc6c5c 100644
--- a/knik/src/knik/Graph.h
+++ b/knik/src/knik/Graph.h
@@ -28,7 +28,11 @@
#include "knik/SlicingTree.h"
#include "knik/RoutingGrid.h"
-struct FTree;
+namespace Flute {
+ struct Tree;
+}
+using Flute::Tree;
+
namespace Knik {
@@ -153,7 +157,7 @@ namespace Knik {
int initRouting ( Net* net );
void Dijkstra ();
void Monotonic ();
- FTree* createFluteTree ();
+ Tree* createFluteTree ();
void CleanRoutingState ();
void UpdateEstimateCongestion ( bool create = false );
void UpdateMaxEstimateCongestion ();
diff --git a/tutorial/python/runDemo.py b/tutorial/python/runDemo.py
index 3c8e9e01..40d8f7df 100644
--- a/tutorial/python/runDemo.py
+++ b/tutorial/python/runDemo.py
@@ -141,9 +141,9 @@ def runDemo ( cell, editor ):
def unicornHook ( **kw ):
editor = kw['editor']
editor.addMenu( 'tutorials' , 'Tutorials', Viewer.CellViewer.TopMenu )
- editor.addMenu( 'tutorials.plugins', 'Plugins' , Viewer.CellViewer.NoFlags )
- plugins.kwUnicornHook( 'tutorials.plugins.runDemo'
- , 'Tutorial - Run Demo (Python flavor)'
+ #editor.addMenu( 'tutorials.plugins', 'Plugins' , Viewer.CellViewer.NoFlags )
+ plugins.kwUnicornHook( 'tutorials.runDemo'
+ , 'Run Demo (Python flavor)'
, 'Launch runDemo() in the Tutorial Python plugin.'
, sys.modules[__name__].__file__
, **kw
diff --git a/unicorn/CMakeLists.txt b/unicorn/CMakeLists.txt
index 1e20a760..6a93dd34 100644
--- a/unicorn/CMakeLists.txt
+++ b/unicorn/CMakeLists.txt
@@ -20,6 +20,7 @@
find_package(PythonSitePackages REQUIRED)
find_package(LEFDEF REQUIRED)
find_package(COLOQUINTE)
+ find_package(FLUTE REQUIRED)
find_package(VLSISAPD REQUIRED)
find_package(HURRICANE REQUIRED)
find_package(CORIOLIS REQUIRED)
diff --git a/unicorn/python/unicornInit.py b/unicorn/python/unicornInit.py
index 4cb2e7a1..012c507a 100644
--- a/unicorn/python/unicornInit.py
+++ b/unicorn/python/unicornInit.py
@@ -67,7 +67,7 @@ def unicornConfigure ( **kw ):
print WarningMessage( 'The menu has already been created.' )
return
- editor.addMenu( 'plugins', 'Plu&gins', Viewer.CellViewer.TopMenu )
+ #editor.addMenu( 'plugins', 'Plu&gins', Viewer.CellViewer.TopMenu )
for pluginFile in os.listdir( pluginsDir ):
if pluginFile == "__init__.py": continue
diff --git a/unicorn/src/CMakeLists.txt b/unicorn/src/CMakeLists.txt
index fe8fab2d..fcb98b4b 100644
--- a/unicorn/src/CMakeLists.txt
+++ b/unicorn/src/CMakeLists.txt
@@ -64,6 +64,7 @@
${UTILITIES_LIBRARY}
${CONFIGURATION_LIBRARY}
${COLOQUINTE_LIBRARIES}
+ ${FLUTE_LIBRARIES}
${LEFDEF_LIBRARIES}
${OA_LIBRARIES}
${QtX_LIBRARIES}
diff --git a/unicorn/src/UnicornGui.cpp b/unicorn/src/UnicornGui.cpp
index 1cf14f46..a7f19462 100644
--- a/unicorn/src/UnicornGui.cpp
+++ b/unicorn/src/UnicornGui.cpp
@@ -98,7 +98,7 @@ namespace Unicorn {
_importCell.setDialog( _importDialog );
_importCell.addImporter ( "JSON (experimental)" , std::bind( &Cell::fromJson , placeholders::_1 ) );
- _importCell.addImporter ( "BLIF (Yosys/ABC)" , std::bind( &Blif::load , placeholders::_1 ) );
+ _importCell.addImporter ( "BLIF (Yosys/ABC)" , std::bind( &Blif::load , placeholders::_1, true ) );
_importCell.addImporter ( "ACM/SIGDA (aka MCNC, .bench)", std::bind( &AcmSigda::load , placeholders::_1 ) );
_importCell.addImporter ( "ISPD'04 (Bookshelf)" , std::bind( &Ispd04::load , placeholders::_1 ) );
_importCell.addImporter ( "ISPD'05 (Bookshelf)" , std::bind( &Ispd05::load , placeholders::_1 ) );
@@ -186,6 +186,8 @@ namespace Unicorn {
, tr("Library Manager")
, tr("Browse through Views, Cells & Libraries")
, QKeySequence(tr("CTRL+M"))
+ , QIcon()
+ , "tools.script"
);
connect( action, SIGNAL(triggered()), _libraryManager, SLOT(toggleShow()) );
connect( this , SIGNAL(cellLoadedFromDisk(Cell*)), _libraryManager, SLOT(updateLibrary(Cell*)) );
diff --git a/unicorn/src/cgt.py b/unicorn/src/cgt.py
index d62dcc17..9383a3a5 100755
--- a/unicorn/src/cgt.py
+++ b/unicorn/src/cgt.py
@@ -16,6 +16,7 @@ try:
import Katabatic
import Kite
import Bora
+ import Tutorial
import Unicorn
except ImportError, e:
serror = str(e)
@@ -114,6 +115,7 @@ if __name__ == '__main__':
parser.add_option( '-D', '--core-dump' , action='store_true', dest='coreDump' , help='Enable core-dump when a crash occurs.')
parser.add_option( '-L', '--log-mode' , action='store_true', dest='logMode' , help='Disable ANSI escape sequences in console output.')
parser.add_option( '-t', '--text' , action='store_true', dest='textMode' , help='Run in command line mode.')
+ parser.add_option( '-K', '--use-katana' , action='store_true', dest='useKatana' , help='Use Katana instead of Knik/Kite router.')
parser.add_option( '-m', '--margin' , type='float' , dest='margin' , help='Percentage of free area to add to the minimal placement area.')
parser.add_option( '-P', '--place' , action='store_true', dest='place' , help='Run the analytical placer (Etesian).')
parser.add_option( '-G', '--global-route' , action='store_true', dest='globalRoute' , help='Run the global router (Knik).')
@@ -129,7 +131,8 @@ if __name__ == '__main__':
(options, args) = parser.parse_args()
args.insert(0, 'cgt')
- flags = 0
+ useKatana = False
+ flags = 0
if options.noInit:
flags |= CRL.AllianceFramework.NoPythonInit
@@ -151,6 +154,7 @@ if __name__ == '__main__':
if options.vTracksLocal: Cfg.getParamInt ('kite.vTracksReservedLocal').setInt(options.vTracksLocal)
if options.eventsLimit: Cfg.getParamInt ('kite.eventsLimit' ).setInt(options.eventsLimit)
if options.topRoutingLayer: Cfg.getParamString ('katabatic.topRoutingLayer').setString(options.topRoutingLayer)
+ if options.useKatana: useKatana = True
loadGlobal = options.loadGlobal
saveGlobal = options.saveGlobal
@@ -183,10 +187,11 @@ if __name__ == '__main__':
unicorn = Unicorn.UnicornGui.create()
unicorn.setApplicationName ('cgt')
- unicorn.registerTool (Katana.GraphicKatanaEngine.grab())
unicorn.registerTool (Etesian.GraphicEtesianEngine.grab())
unicorn.registerTool (Kite.GraphicKiteEngine.grab())
+ unicorn.registerTool (Katana.GraphicKatanaEngine.grab())
unicorn.registerTool (Bora.GraphicBoraEngine.grab())
+ unicorn.registerTool (Tutorial.GraphicTutorialEngine.grab())
#unicorn.setAnonNetSelectable(False)
unicorn.setLayerVisible ("grid" , False);
unicorn.setLayerVisible ("text.instance" , False);
@@ -196,8 +201,8 @@ if __name__ == '__main__':
runScript(options.script,unicorn)
setCgtBanner(unicorn.getBanner())
- print unicorn.getBanner()
- print credits()
+ #print unicorn.getBanner()
+ #print credits()
if cell: unicorn.setCell(cell)
unicorn.show()
@@ -214,6 +219,21 @@ if __name__ == '__main__':
if detailRoute and not (loadGlobal or globalRoute): globalRoute = True
runKiteTool = loadGlobal or globalRoute or detailRoute
+ if useKatana and runKiteTool:
+ runKiteTool = False
+
+ katana = Katana.KatanaEngine.create( cell )
+ #katana.printConfiguration ()
+ katana.digitalInit ()
+ #katana.runNegociatePreRouted()
+ katana.runGlobalRouter ()
+ katana.loadGlobalRouting ( Anabatic.EngineLoadGrByNet )
+ katana.layerAssign ( Anabatic.EngineNoNetLayerAssign )
+ katana.runNegociate ( Katana.Flags.NoFlags )
+ kiteSuccess = katana.getToolSuccess()
+ #katana.finalizeLayout()
+ katana.destroy()
+
if runKiteTool:
if loadGlobal: globalFlags = Kite.KtLoadGlobalRouting
else: globalFlags = Kite.KtBuildGlobalRouting
diff --git a/unittests/CMakeLists.txt b/unittests/CMakeLists.txt
index 789013cd..405db044 100644
--- a/unittests/CMakeLists.txt
+++ b/unittests/CMakeLists.txt
@@ -23,6 +23,7 @@
find_package(Libexecinfo REQUIRED)
find_package(PythonLibs 2 REQUIRED)
find_package(PythonSitePackages REQUIRED)
+ find_package(LEFDEF)
find_package(VLSISAPD REQUIRED)
find_package(HURRICANE REQUIRED)
find_package(CORIOLIS REQUIRED)
| | | | | |