diff --git a/bootstrap/build.conf b/bootstrap/build.conf
index 1641c3a4..3b6a5bc0 100644
--- a/bootstrap/build.conf
+++ b/bootstrap/build.conf
@@ -5,7 +5,7 @@
projectdir = 'coriolis-2.x'
-projects = [ { 'name' : "coloquinte"
+projects = [ { 'name' : "importeds"
, 'tools' : [ "Coloquinte" ]
, 'repository': 'https://github.com/alnurn/Coloquinte' }
diff --git a/bootstrap/coriolisEnv.py b/bootstrap/coriolisEnv.py
index db4ff274..7a9f6c5e 100755
--- a/bootstrap/coriolisEnv.py
+++ b/bootstrap/coriolisEnv.py
@@ -38,6 +38,8 @@ def guessOs ():
osSlsoc6x = re.compile (".*Linux.*(el|slsoc)6.*")
osSLSoC5x_64 = re.compile (".*Linux.*el5.*x86_64.*")
osSLSoC5x = re.compile (".*Linux.*(el5|2.6.23.13.*SoC).*")
+ osFedora_64 = re.compile (".*Linux.*fc.*x86_64.*")
+ osFedora = re.compile (".*Linux.*fc.*")
osLinux_64 = re.compile (".*Linux.*x86_64.*")
osLinux = re.compile (".*Linux.*")
osDarwin = re.compile (".*Darwin.*")
@@ -70,6 +72,11 @@ def guessOs ():
libDir = "lib64"
elif osSLSoC5x.match(lines[0]):
osType = "Linux.SLSoC5x"
+ elif osFedora_64.match(lines[0]):
+ osType = "Linux.fc_64"
+ libDir = "lib64"
+ elif osFedora.match(lines[0]):
+ osType = "Linux.fc"
elif osUbuntu1004.match(lines[0]):
osType = "Linux.Ubuntu1004"
elif osUbuntu1004_64.match(lines[0]):
@@ -195,6 +202,7 @@ if __name__ == "__main__":
if osType.startswith("Linux.SL") \
or osType.startswith("Linux.sl") \
or osType.startswith("Linux.el") \
+ or osType.startswith("Linux.fc") \
or osType.startswith("Darwin") \
or osType.startswith("Cygwin"):
sitePackagesDir = "%s/python%s/site-packages" % (absLibDir,version)
diff --git a/crlcore/etc/cmos/etesian.conf b/crlcore/etc/cmos/etesian.conf
new file mode 100644
index 00000000..3e9270d8
--- /dev/null
+++ b/crlcore/etc/cmos/etesian.conf
@@ -0,0 +1,5 @@
+# -*- Mode:Python; explicit-buffer-name: "etesian.conf" -*-
+
+import helpers
+
+execfile( helpers.sysConfDir+'/common/etesian.conf' )
diff --git a/crlcore/etc/common/etesian.conf b/crlcore/etc/common/etesian.conf
new file mode 100644
index 00000000..e7d3880e
--- /dev/null
+++ b/crlcore/etc/common/etesian.conf
@@ -0,0 +1,37 @@
+# -*- Mode:Python; explicit-buffer-name: "etesian.conf" -*-
+
+# Etesian parameters.
+parametersTable = \
+ ( ('etesian.aspectRatio' , TypePercentage, 100 , { 'min':10, 'max':1000 } )
+ , ('etesian.spaceMargin' , TypePercentage, 5 )
+ , ('etesian.uniformDensity' , TypeBool , False )
+ , ('etesian.routingDriven' , TypeBool , False )
+ , ("etesian.effort" , TypeEnumerate , 2
+ , { 'values':( ("Fast" , 1)
+ , ("Standard" , 2)
+ , ("High" , 3)
+ , ("Extreme" , 4) ) }
+ )
+ , ("etesian.graphics" , TypeEnumerate , 2
+ , { 'values':( ("Show every step" , 1)
+ , ("Show lower bound" , 2)
+ , ("Show result only" , 3) ) }
+ )
+ )
+
+
+layoutTable = \
+ ( (TypeTab , 'Etesian', 'etesian')
+
+ , (TypeTitle , 'Placement area')
+ , (TypeOption, "etesian.aspectRatio" , "Aspect Ratio, X/Y (%)", 0 )
+ , (TypeOption, "etesian.spaceMargin" , "Space Margin" , 1 )
+ , (TypeRule ,)
+
+ , (TypeTitle , 'Etesian - Placer')
+ , (TypeOption, "etesian.uniformDensity" , "Uniform density" , 0 )
+ , (TypeOption, "etesian.routingDriven" , "Routing driven" , 0 )
+ , (TypeOption, "etesian.effort" , "Placement effort" , 1 )
+ , (TypeOption, "etesian.graphics" , "Placement view" , 1 )
+ , (TypeRule ,)
+ )
diff --git a/crlcore/etc/scmos_deep_018/etesian.conf b/crlcore/etc/scmos_deep_018/etesian.conf
new file mode 100644
index 00000000..3e9270d8
--- /dev/null
+++ b/crlcore/etc/scmos_deep_018/etesian.conf
@@ -0,0 +1,5 @@
+# -*- Mode:Python; explicit-buffer-name: "etesian.conf" -*-
+
+import helpers
+
+execfile( helpers.sysConfDir+'/common/etesian.conf' )
diff --git a/crlcore/etc/scn6m_deep_09/etesian.conf b/crlcore/etc/scn6m_deep_09/etesian.conf
new file mode 100644
index 00000000..3e9270d8
--- /dev/null
+++ b/crlcore/etc/scn6m_deep_09/etesian.conf
@@ -0,0 +1,5 @@
+# -*- Mode:Python; explicit-buffer-name: "etesian.conf" -*-
+
+import helpers
+
+execfile( helpers.sysConfDir+'/common/etesian.conf' )
diff --git a/crlcore/etc/vsc200/etesian.conf b/crlcore/etc/vsc200/etesian.conf
new file mode 100644
index 00000000..3e9270d8
--- /dev/null
+++ b/crlcore/etc/vsc200/etesian.conf
@@ -0,0 +1,5 @@
+# -*- Mode:Python; explicit-buffer-name: "etesian.conf" -*-
+
+import helpers
+
+execfile( helpers.sysConfDir+'/common/etesian.conf' )
diff --git a/crlcore/src/crlcore/coriolisInit.py b/crlcore/src/crlcore/coriolisInit.py
index c928d6e5..23143ba1 100644
--- a/crlcore/src/crlcore/coriolisInit.py
+++ b/crlcore/src/crlcore/coriolisInit.py
@@ -116,6 +116,7 @@ def coriolisConfigure():
, (helpers.sysConfDir+'/'+symbolicTechno+'/hMetis.conf' , SystemFile|ConfigurationHelper)
, (helpers.sysConfDir+'/'+symbolicTechno+'/nimbus.conf' , SystemFile|ConfigurationHelper)
, (helpers.sysConfDir+'/'+symbolicTechno+'/mauka.conf' , SystemFile|ConfigurationHelper)
+ , (helpers.sysConfDir+'/'+symbolicTechno+'/etesian.conf' , SystemFile|ConfigurationHelper)
, (helpers.sysConfDir+'/'+symbolicTechno+'/kite.conf' , SystemFile|ConfigurationHelper)
, (helpers.sysConfDir+'/'+symbolicTechno+'/stratus1.conf', SystemFile|ConfigurationHelper)
, (helpers.sysConfDir+'/'+symbolicTechno+'/plugins.conf' , SystemFile|ConfigurationHelper)
diff --git a/crlcore/src/crlcore/helpers/etesian.py b/crlcore/src/crlcore/helpers/etesian.py
new file mode 100644
index 00000000..264a2c56
--- /dev/null
+++ b/crlcore/src/crlcore/helpers/etesian.py
@@ -0,0 +1,27 @@
+
+import Cfg
+
+print " - Loading Mauka configuration."
+
+# Etesian parameters.
+Cfg.getParamPercentage("etesian.aspectRatio" ).setPercentage(100 )
+Cfg.getParamPercentage("etesian.spaceMargin" ).setPercentage(5 )
+Cfg.getParamBool ("etesian.uniformDensity").setBool (False )
+Cfg.getParamBool ("etesian.routingDriven").setBool (False )
+
+layout = Cfg.Configuration.get().getLayout()
+# Etesian tab layout.
+layout.addTab ( "Etesian", "etesian" )
+
+layout.addTitle ( "Etesian", "Placement area" )
+layout.addParameter ( "Etesian", "etesian.aspectRatio" , "Aspect Ratio, X/Y (%)", 0 )
+layout.addParameter ( "Etesian", "etesian.spaceMargin" , "Space Margin" , 1 )
+layout.addRule ( "Etesian" )
+
+layout.addTitle ( "Etesian", "Etesian - Placer" )
+layout.addParameter ( "Etesian", "etesian.uniformDensity" , "Occupy whole placement area" , 0 )
+layout.addParameter ( "Etesian", "etesian.routingDriven" , "Routing driven" , 0 )
+layout.addParameter ( "Etesian", "etesian.effort" , "Placement effort" , 1 )
+layout.addParameter ( "Etesian", "etesian.graphics" , "Placement view" , 1 )
+layout.addRule ( "Etesian" )
+
diff --git a/cumulus/src/plugins/ChipPlugin.py b/cumulus/src/plugins/ChipPlugin.py
index f7aba5b1..53e07dc6 100644
--- a/cumulus/src/plugins/ChipPlugin.py
+++ b/cumulus/src/plugins/ChipPlugin.py
@@ -147,7 +147,7 @@ class PlaceCore ( chip.Configuration.ChipConfWrapper ):
mauka.destroy()
else:
etesian = Etesian.EtesianEngine.create( coreCell )
- etesian.place( Etesian.EtesianEngine.SlowMotion )
+ etesian.place()
etesian.destroy()
ht.connectLeaf()
@@ -161,7 +161,7 @@ class PlaceCore ( chip.Configuration.ChipConfWrapper ):
mauka.destroy()
else:
etesian = Etesian.EtesianEngine.create( coreCell )
- etesian.place( Etesian.EtesianEngine.SlowMotion )
+ etesian.place()
etesian.destroy()
return
diff --git a/cumulus/src/plugins/ClockTreePlugin.py b/cumulus/src/plugins/ClockTreePlugin.py
index dea9b3fd..a17402a5 100755
--- a/cumulus/src/plugins/ClockTreePlugin.py
+++ b/cumulus/src/plugins/ClockTreePlugin.py
@@ -94,8 +94,8 @@ def ScriptMain ( **kw ):
cellGauge = framework.getCellGauge()
if cell.getAbutmentBox().isEmpty():
- spaceMargin = Cfg.getParamPercentage('nimbus.spaceMargin').asPercentage() / 100.0 + 0.02
- aspectRatio = Cfg.getParamPercentage('nimbus.aspectRatio').asPercentage() / 100.0
+ spaceMargin = Cfg.getParamPercentage('etesian.spaceMargin').asPercentage() / 100.0 + 0.02
+ aspectRatio = Cfg.getParamPercentage('etesian.aspectRatio').asPercentage() / 100.0
clocktree.ClockTree.computeAbutmentBox( cell, spaceMargin, aspectRatio, cellGauge )
if editor: editor.fit()
@@ -109,7 +109,7 @@ def ScriptMain ( **kw ):
mauka.destroy()
else:
etesian = Etesian.EtesianEngine.create( cell )
- etesian.place( Etesian.EtesianEngine.SlowMotion )
+ etesian.place()
etesian.destroy()
ht.connectLeaf()
diff --git a/documentation/UsersGuide/UsersGuide.rst b/documentation/UsersGuide/UsersGuide.rst
index 3a18cce0..73c33e2b 100644
--- a/documentation/UsersGuide/UsersGuide.rst
+++ b/documentation/UsersGuide/UsersGuide.rst
@@ -18,15 +18,27 @@
.. |Flute| replace:: :sc:`Flute`
.. |MacOS| replace:: :sc:`MacOS`
.. |RHEL6| replace:: :sc:`rhel6`
+.. |RHEL7| replace:: :sc:`rhel7`
.. |SL6| replace:: :sc:`Scientific Linux 6`
+.. |SL7| replace:: :sc:`Scientific Linux 7`
+.. |Scientific Linux| replace:: :sc:`Scientific Linux`
+.. |RedHat| replace:: :sc:`RedHat`
+.. |Fedora| replace:: :sc:`Fedora`
+.. |FC13| replace:: :sc:`fc13`
+.. |Debian| replace:: :sc:`Debian`
+.. |Ubuntu| replace:: :sc:`Ubuntu`
.. |Alexandre| replace:: :sc:`Alexandre`
.. |Belloeil| replace:: :sc:`Belloeil`
.. |Chaput| replace:: :sc:`Chaput`
.. |Chu| replace:: :sc:`Chu`
+.. |Clement| replace:: :sc:`Clement`
.. |Dupuis| replace:: :sc:`Dupuis`
.. |Escassut| replace:: :sc:`Escassut`
+.. |Gouvine| replace:: :sc:`Gouvine`
.. |Masson| replace:: :sc:`Masson`
+.. |Sroka| replace:: :sc:`Sroka`
+.. |Yifei| replace:: :sc:`Yifei`
.. |ANSI| replace:: :sc:`ansi`
.. |MIPS| replace:: :sc:`mips`
@@ -37,6 +49,7 @@
.. |GenLib| replace:: :sc:`GenLib`
.. |Nero| replace:: :sc:`Nero`
.. |Druc| replace:: :cb:`Druc`
+.. |Coloquinte| replace:: :sc:`Coloquinte`
.. |Coriolis| replace:: :sc:`Coriolis`
.. |Coriolis1| replace:: :sc:`Coriolis 1`
.. |Coriolis2| replace:: :sc:`Coriolis 2`
@@ -46,6 +59,7 @@
.. |Nimbus| replace:: :sc:`Nimbus`
.. |hMetis| replace:: :sc:`hMetis`
.. |Mauka| replace:: :sc:`Mauka`
+.. |Etesian| replace:: :sc:`Etesian`
.. |Knik| replace:: :sc:`Knik`
.. |Katabatic| replace:: :sc:`Katabatic`
.. |Kite| replace:: :sc:`Kite`
@@ -65,12 +79,6 @@
.. |UTF-8| replace:: :sc:`utf-8`
.. |Python| replace:: :sc:`Python`
.. |Linux| replace:: :sc:`Linux`
-.. |Scientific Linux| replace:: :sc:`Scientific Linux`
-.. |RedHat| replace:: :sc:`RedHat`
-.. |Fedora| replace:: :sc:`Fedora`
-.. |FC13| replace:: :sc:`fc13`
-.. |Debian| replace:: :sc:`Debian`
-.. |Ubuntu| replace:: :sc:`Ubuntu`
.. |MacPorts| replace:: :sc:`MacPorts`
.. |devtoolset2| replace:: :cb:`devtoolset2`
.. |boost| replace:: :cb:`boost`
@@ -79,6 +87,9 @@
.. |svn| replace:: :cb:`svn`
.. |git| replace:: :cb:`git`
.. |rpm| replace:: :cb:`rpm`
+.. |gdb| replace:: :cb:`gdb`
+
+.. |CTRL_L| replace:: :fboxtt:`CTRL+L`
.. URLs
.. _FGR: http://vlsicad.eecs.umich.edu/BK/FGR/
@@ -154,8 +165,8 @@ Credits & License
Rémy Escassut &
Christian Masson
- Mauka
- Christophe Alexandre
+ Etesian
+ Gabriel Gouvine
Stratus
Sophie Belloeil
@@ -174,7 +185,7 @@ Credits & License
\begin{center}\begin{minipage}[t]{.8\textwidth}
\noindent\DUrole{sc}{Hurricane} \dotfill Rémy \DUrole{sc}{Escassut} \&
Christian \DUrole{Masson} \\
- \noindent\DUrole{sc}{Mauka} \dotfill Christophe \DUrole{sc}{Alexandre} \\
+ \noindent\DUrole{sc}{Etesian} \dotfill Gabriel \DUrole{sc}{Gouvine} \\
\noindent\DUrole{sc}{Stratus} \dotfill Sophie \DUrole{sc}{Belloeil} \\
\noindent\DUrole{sc}{Knik} \dotfill Damien \DUrole{sc}{Dupuis} \\
\noindent\DUrole{sc}{Kite},
@@ -184,11 +195,14 @@ Credits & License
|medskip|
-The |Hurricane| data-base is copyright© |Bull| 2000-2014 and is
+The |Hurricane| data-base is copyright© |Bull| 2000-2015 and is
released under the terms of the |LGPL| license. All other tools are
-copyright© |UPMC| 2008-2014 and released under the |GPL|
+copyright© |UPMC| 2008-2015 and released under the |GPL|
license.
+Others important contributors to |Coriolis| are Christophe |Alexandre|,
+Hugo |Clement|, Marek |Sroka| and Wu |Yifei|.
+
The |Knik| router makes use of the |Flute| software, which is
copyright© Chris C. N. |Chu| from the Iowa State University
(http://home.eng.iastate.edu/~cnchu/).
@@ -270,6 +284,21 @@ Release **v2.0.1**
achieve a speedup factor greater than 20...
+Release **v3.0**
+~~~~~~~~~~~~~~~~
+
+#. Replace the old simulated annealing placer |Mauka| by an analytic placer
+ |Etesian|.
+#. The multiples user defined configuration files are now grouped under
+ a common hidden (dot) directory ``.coriolis2`` and the file extension
+ is back from ``.conf`` to ``.py``.
+#. Under |RHEL7| / |SL7|, there is a known bug in the graphical visualizer.
+ When shifting to the left, the right-half part of the screen gets
+ badly redrawn. Uses |CTRL_L| to refresh. It will be corrected as soon
+ as possible.
+
+
+
|newpage|
@@ -290,9 +319,8 @@ Main building prerequisites:
* boost
* libxml2
* yacc & lex.
-* Qt 4
+* Qt 4 or Qt 5.
* LEF/DEF (optional).
-* hMetis (optional).
* doxygen.
* latex
* latex2html.
@@ -314,11 +342,15 @@ automatically created either by |ccb| or the build system.
+--------------------------+-----------------------------------------------------------------------------+
| | Sources root | | ~/coriolis-2.x/src |
| | **under git** | | ~/coriolis-2.x/src/coriolis |
+| | **under git** | | ~/coriolis-2.x/src/importeds/Coloquinte |
+--------------------------+-----------------------------------------------------------------------------+
| **Architecture Dependant Build** |
+--------------------------+-----------------------------------------------------------------------------+
+| | Linux, SL 7, 64 bits | | ~/coriolis-2.x/Linux.el7_64/Release.Shared/build/ |
| | Linux, SL 6, 32 bits | | ~/coriolis-2.x/Linux.slsoc6x/Release.Shared/build/ |
| | Linux, SL 6, 64 bits | | ~/coriolis-2.x/Linux.slsoc6x_64/Release.Shared/build/ |
+| | Linux, Fedora, 64 bits | | ~/coriolis-2.x/Linux.fc_64/Release.Shared/build/ |
+| | Linux, Fedora, 32 bits | | ~/coriolis-2.x/Linux.fc/Release.Shared/build/ |
| | FreeBSD 8, 32 bits | | ~/coriolis-2.x/FreeBSD.8x.i386/Release.Shared/build/ |
| | FreeBSD 8, 64 bits | | ~/coriolis-2.x/FreeBSD.8x.amd64/Release.Shared/build/ |
| | Windows 7, 32 bits | | ~/coriolis-2.x/Cygwin.W7/Release.Shared/build/ |
@@ -355,17 +387,28 @@ The first step is to create the source directory and pull the |git| repository:
dummy@lepka:~$ mkdir -p ~/coriolis-2.x/src
dummy@lepka:~$ cd ~/coriolis-2.x/src
dummy@lepka:~$ git clone https://www-soc.lip6.fr/git/coriolis.git
- dummy@lepka:~$ cd coriolis
+ dummy@lepka:~$ mkdir importeds
+ dummy@lepka:~$ cd importeds
+ dummy@lepka:~$ git clone https://github.com/Coloquinte/Coloquinte.git
+ dummy@lepka:~$ cd ../coriolis
Second and final step, build & install: ::
- dummy@lepka:src$ ./bootstrap/ccp.py --project=coriolis --make="-j4 install"
+ dummy@lepka:src$ ./bootstrap/ccp.py --project=importeds --project=coriolis \
+ --make="-j4 install"
dummy@lepka:src$ ./bootstrap/ccb.py --project=coriolis --doc --make="-j1 install"
We need two steps because the documentation do not support to be generated with
a parallel build. So we compile & install in a first step in ``-j4`` (or whatever)
then we generate the documentation in ``-j1``
+Under |RHEL6| or clones, you must build using the |devtoolset2|: ::
+
+ dummy@lepka:src$ ./bootstrap/ccp.py --project=importeds --project=coriolis \
+ --devtoolset-2 --make="-j4 install"
+
+If you want to uses Qt 5 instead of Qt 4, you may add the ``--qt5`` argument.
+
The complete list of |ccb| functionalities can be accessed with the ``--help`` argument.
It also may be run in graphical mode (``--gui``).
@@ -383,13 +426,16 @@ In the |Coriolis| |git| repository, two branches are present:
command just after the first step: ::
dummy@lepka:~$ git checkout devel
+ dummy@lepka:src$ ./bootstrap/ccp.py --project=importeds --project=coriolis \
+ --make="-j4 install" --debug
Be aware that it may requires newer versions of the dependencies and may introduce
incompatibilites with the stable version.
- Under |RHEL6| or clones, you must build using the |devtoolset2|: ::
+ In the (unlikely) event of a crash of |cgt|, as it is a |Python| script, the right
+ command to run |gdb| on it is: ::
- dummy@lepka:src$ ./bootstrap/ccp.py --project=coriolis --devtoolset-2 --make="-j4 install"
+ dummy@lepka:work$ gdb python core.XXXX
Additionnal Requirement under |MacOS|
@@ -513,11 +559,11 @@ file(s):
+-------+----------------------------------+----------------------------------------------+
| Order | Meaning | File |
+=======+==================================+==============================================+
-| **1** | The system setting | :cb:`/etc/coriolis2/coriolis2_techno.conf` |
+| **1** | The system setting | :cb:`/etc/coriolis2/techno.conf` |
+-------+----------------------------------+----------------------------------------------+
-| **2** | The user's global setting | :cb:`${HOME}/.coriolis2_techno.conf` |
+| **2** | The user's global setting | :cb:`${HOME}/.coriolis2/techno.py` |
+-------+----------------------------------+----------------------------------------------+
-| **3** | The user's local setting | :cb:`/.coriolis2_techno.conf` |
+| **3** | The user's local setting | :cb:`/.coriolis2/techno.py` |
+-------+----------------------------------+----------------------------------------------+
Thoses files must provides only two variables, the name of the symbolic technology
@@ -545,13 +591,13 @@ by executing, in order, the following file(s):
+=======+==================================+==============================================+
| **1** | The system initialization | :cb:`/etc/coriolis2//.conf` |
+-------+----------------------------------+----------------------------------------------+
-| **2** | The user's global initialization | :cb:`${HOME}/.coriolis2.conf` |
+| **2** | The user's global initialization | :cb:`${HOME}/.coriolis2/settings.py` |
+-------+----------------------------------+----------------------------------------------+
-| **3** | The user's local initialization | :cb:`/.coriolis2.conf` |
+| **3** | The user's local initialization | :cb:`/.coriolis2/settings.py` |
+-------+----------------------------------+----------------------------------------------+
.. note:: *The loading policy is not hard-coded.* It is implemented
- at Python level in :cb:`/etc/coriolis2/coriolisInit.py`, and thus may be easyly be
+ at Python level in :cb:`/etc/coriolis2/coriolisInit.py`, and thus may be easily be
amended to whatever site policy.
The truly mandatory requirement is the existence of :cb:`coriolisInit.py`
@@ -638,22 +684,22 @@ available settings. Some important remarks about thoses settings:
directory in which the system-wide configuration files are locateds.
For a standard installation it would be: ``/soc/coriolis2``.
-* Trick and naming convention about ``SYMBOLIC_TECHNOLOGY``, ``REAL_TECHNOLOGY``
- and ``DISPLAY``. In the previous releases, thoses files where to read by
- |XML| parsers, and still do if you triggers the |XML| compatibility mode.
- But now, they have Python conterparts. In the configuration files, you
- still have to name them as |XML| files, the Python file name will be
- deduced from this one with thoses two translation rules:
-
- #. In the filename, all dots, except for the last (the file extention),
- are replaced by underscores.
-
- #. The ``.xml`` extention is substituted by a ``.conf``.
-
- For the symbolic technology, it would give: ::
-
- /soc/coriolis2/technology.symbolic.xml
- --> /soc/coriolis2/technology_symbolic.conf
+.. * Trick and naming convention about ``SYMBOLIC_TECHNOLOGY``, ``REAL_TECHNOLOGY``
+.. and ``DISPLAY``. In the previous releases, thoses files where to read by
+.. XML parsers, and still do if you triggers the XML compatibility mode.
+.. But now, they have Python conterparts. In the configuration files, you
+.. still have to name them as XML files, the Python file name will be
+.. deduced from this one with thoses two translation rules:
+..
+.. #. In the filename, all dots, except for the last (the file extention),
+.. are replaced by underscores.
+..
+.. #. The ``.xml`` extention is substituted by a ``.conf``.
+..
+.. For the symbolic technology, it would give: ::
+..
+.. /soc/coriolis2/technology.symbolic.xml
+.. --> /soc/coriolis2/technology_symbolic.conf
A typical user's configuration file would be: ::
@@ -677,37 +723,43 @@ All the tools uses the same helper to load their configuration (a.k.a.
configuration files are defined:
* :cb:`misc.conf`: commons settings or not belonging specifically to a tool.
-* :cb:`nimbus.conf`: for the |Nimbus| tool.
-* :cb:`hMetis.conf`: for the |hMetis| wrapper.
-* :cb:`mauka.conf`: for the |Mauka| tool.
+* :cb:`etesian.conf`: for the |Etesian| tool.
* :cb:`kite.conf`: for the |Kite| tool.
* :cb:`stratus1.conf`: for the |stratus1| tool.
-Here is the contents of :cb:`mauka.conf`: ::
+Here is the contents of :cb:`etesian.conf`: ::
- # Mauka parameters.
+ # Etesian parameters.
parametersTable = \
- ( ('mauka.annealingBinMult' , TypePercentage, 5 )
- , ('mauka.annealingNetMult' , TypePercentage, 90 )
- , ('mauka.annealingRowMult' , TypePercentage, 5 )
- , ('mauka.ignorePins' , TypeBool , False )
- , ('mauka.insertFeeds' , TypeBool , True )
- , ('mauka.plotBins' , TypeBool , True )
- , ('mauka.searchRatio' , TypePercentage, 50 )
- , ('mauka.standardAnnealing', TypeBool , False )
+ ( ('etesian.aspectRatio' , TypePercentage, 100 , { 'min':10, 'max':1000 } )
+ , ('etesian.spaceMargin' , TypePercentage, 5 )
+ , ('etesian.uniformDensity' , TypeBool , False )
+ , ('etesian.routingDriven' , TypeBool , False )
+ , ("etesian.effort" , TypeEnumerate , 2
+ , { 'values':( ("Fast" , 1)
+ , ("Standard", 2)
+ , ("High" , 3)
+ , ("Extreme" , 4) ) }
+ )
+ , ("etesian.graphics" , TypeEnumerate , 2
+ , { 'values':( ("Show every step" , 1)
+ , ("Show lower bound" , 2)
+ , ("Show result only" , 3) ) }
+ )
)
layoutTable = \
- ( (TypeTab , 'Mauka', 'mauka')
- # Mauka part.
- , (TypeOption, "mauka.standardAnnealing", "Standart Annealing" , 0 )
- , (TypeOption, "mauka.ignorePins" , "Ignore Pins" , 0 )
- , (TypeOption, "mauka.plotBins" , "Plot Bins" , 0 )
- , (TypeOption, "mauka.insertFeeds" , "Insert Feeds" , 0 )
- , (TypeOption, "mauka.searchRatio" , "Search Ratio (%)" , 1 )
- , (TypeOption, "mauka.annealingNetMult" , "Annealing Net Mult (%)", 1 )
- , (TypeOption, "mauka.annealingBinMult" , "Annealing Bin Mult (%)", 1 )
- , (TypeOption, "mauka.annealingRowMult" , "Annealing Row Mult (%)", 1 )
+ ( (TypeTab , 'Etesian', 'etesian')
+
+ , (TypeTitle , 'Placement area')
+ , (TypeOption, "etesian.aspectRatio" , "Aspect Ratio, X/Y (%)", 0 )
+ , (TypeOption, "etesian.spaceMargin" , "Space Margin" , 1 )
+ , (TypeRule ,)
+ , (TypeTitle , 'Etesian - Placer')
+ , (TypeOption, "etesian.uniformDensity", "Uniform density" , 0 )
+ , (TypeOption, "etesian.routingDriven" , "Routing driven" , 0 )
+ , (TypeOption, "etesian.effort" , "Placement effort" , 1 )
+ , (TypeOption, "etesian.graphics" , "Placement view" , 1 )
, (TypeRule ,)
)
@@ -746,7 +798,7 @@ Hacking the Configuration Files
Asides from the symbols that gets used by the configuration helpers like
:cb:`allianceConfig` or :cb:`parametersTable`, you can put pretty much anything
-in :cb:`/.coriolis2.conf` (that is, written in |Python|).
+in :cb:`/.coriolis2/settings.py` (that is, written in |Python|).
For example: ::
@@ -853,15 +905,12 @@ As for the first release, |Coriolis| can be used only for two purposes :
state.
-Mauka -- Placer
-~~~~~~~~~~~~~~~
+Etesian -- Placer
+~~~~~~~~~~~~~~~~~
-|Mauka| was originally designed to be a recursive quadri-partionner. Unfortunatly
-it is was based on the hMETIS_ library (*not* :sc:`METIS`) which is no longer
-maintained (only an old binary 32 bits version is available).
-
-So now it is only working in simulated annealing, with performances identical to
-the |Alliance| placer :cb:`ocp`. In other words, it is slow...
+The |Etesian| placer is a state of the art (as of 2015) analytical placer. This |Coriolis|
+tool is really an encapsulation of |Coloquinte| which *is* the placer. |Coloquinte|
+is provided a separate library, see the building instructions.
.. note:: *Instance Duplication Problem:* a same logical instance cannot have
two different placements. So, either you manually make a clone of it or you
@@ -1485,19 +1534,49 @@ Small example of Python/Stratus script: ::
# ...
return
- def ScriptMain ( editor=None ):
- if globals().has_key( "__editor" ): editor = __editor
- if editor: setEditor( editor )
+ def ScriptMain ( **kw ):
+ editor = None
+ if kw.has_key('editor') and kw['editor']:
+ editor = kw['editor']
+ stratus.setEditor( editor )
doSomething()
return
if __name__ == "__main__" :
- ScriptMain ()
+ kw = {}
+ success = ScriptMain( **kw )
+ shellSuccess = 0
+ if not success: shellSuccess = 1
+
+ sys.exit( shellSuccess )
+ ScriptMain ()
-This script could be run directly with Python (thanks to the two last lines)
-or through |cgt| in both text and graphical modes through the :cb:`ScriptMain()`
-function.
+This typical script can be executed in two ways:
+
+#. Run directly as a |Python| script, thanks to the ::
+
+ if __name__ == "__main__" :
+
+ part (this is standart |Python|). It is a simple adapter that will
+ calls :cb:`ScriptMain()`.
+#. Through |cgt|, either in text or graphical mode. In that case, the
+ :cb:`ScriptMain()` is directly called trough a sub-interpreter.
+ The arguments of the script are passed through the ``**kw`` dictionnary.
+
+ +----------------------+-----------------------------------------------+
+ | \*\*kw Dictionnary |
+ +----------------------+-----------------------------------------------+
+ | Parameter Key/Name | Contents type |
+ +======================+===============================================+
+ | ``'cell'`` | A Hurricane cell on which to work. Depending |
+ | | on the context, it may be ``None``. |
+ | | For example, when run from |cgt|, it the cell |
+ | | currently loaded in the viewer, if any. |
+ +----------------------+-----------------------------------------------+
+ | ``'editor'`` | The viewer from which the script is run, when |
+ | | lauched through |cgt|. |
+ +----------------------+-----------------------------------------------+
A Simple Example: AM2901
diff --git a/etesian/CMakeLists.txt b/etesian/CMakeLists.txt
index ef071b7f..1737220b 100644
--- a/etesian/CMakeLists.txt
+++ b/etesian/CMakeLists.txt
@@ -11,7 +11,7 @@
find_package(Coloquinte REQUIRED)
find_package(Bootstrap REQUIRED)
setup_project_paths(CORIOLIS)
- setup_project_paths(COLOQUINTE)
+ setup_project_paths(IMPORTEDS)
setup_qt()
set_cmake_policies()
diff --git a/etesian/src/AddFeeds.cpp b/etesian/src/AddFeeds.cpp
index 09382e3f..b998a7af 100644
--- a/etesian/src/AddFeeds.cpp
+++ b/etesian/src/AddFeeds.cpp
@@ -306,7 +306,7 @@ namespace Etesian {
size_t EtesianEngine::findYSpin ()
{
- _flags &= ~YSpinSet;
+ _ySpinSet = false;
_yspinSlice0 = 0;
Box topCellAb = getCell()->getAbutmentBox();
@@ -324,7 +324,7 @@ namespace Etesian {
if (not topCellAb.contains(instanceAb)) continue;
- _flags |= YSpinSet;
+ _ySpinSet = true;
int islice = (instanceAb.getYMin() - getCell()->getAbutmentBox().getYMin()) / getSliceHeight();
@@ -345,11 +345,11 @@ namespace Etesian {
, getString(instance->getName()).c_str()
, getString(instanceTransf.getOrientation()).c_str()
) << endl;
- _flags &= ~YSpinSet;
+ _ySpinSet = false;
break;
}
- if (_flags & YSpinSet) break;
+ if (_ySpinSet) break;
}
}
diff --git a/etesian/src/Configuration.cpp b/etesian/src/Configuration.cpp
index 0341e9c8..5926eefd 100644
--- a/etesian/src/Configuration.cpp
+++ b/etesian/src/Configuration.cpp
@@ -52,19 +52,13 @@ namespace Etesian {
// -------------------------------------------------------------------
// Class : "Etesian::Configuration".
-
- Configuration::Configuration () { }
- Configuration::~Configuration () { }
-
-
-// -------------------------------------------------------------------
-// Class : "Etesian::ConfigurationConcrete".
-
-
- ConfigurationConcrete::ConfigurationConcrete ( const CellGauge* cg )
- : Configuration()
- , _cg (NULL)
- , _flags (0)
+ Configuration::Configuration ( const CellGauge* cg )
+ : _cg ( NULL )
+ , _placeEffort ( static_cast (Cfg::getParamEnumerate ("etesian.effort" , Standard )->asInt()) )
+ , _updateConf ( static_cast (Cfg::getParamEnumerate ("etesian.graphics" , LowerBound )->asInt()) )
+ , _spreadingConf( Cfg::getParamBool ("etesian.uniformDensity", false )->asBool()?ForceUniform:MaxDensity )
+ , _spaceMargin ( Cfg::getParamPercentage("etesian.spaceMargin" , 5.0)->asDouble() )
+ , _aspectRatio ( Cfg::getParamPercentage("etesian.aspectRatio" ,100.0)->asDouble() )
{
if ( cg == NULL ) cg = AllianceFramework::get()->getCellGauge();
@@ -72,41 +66,45 @@ namespace Etesian {
}
- ConfigurationConcrete::ConfigurationConcrete ( const ConfigurationConcrete& other )
- : Configuration()
- , _cg (NULL)
- , _flags (other._flags)
+ Configuration::Configuration ( const Configuration& other )
+ : _cg (NULL)
+ , _placeEffort ( other._placeEffort )
+ , _updateConf ( other._updateConf )
+ , _spreadingConf( other._spreadingConf )
+ , _spaceMargin ( other._spaceMargin )
+ , _aspectRatio ( other._aspectRatio )
{
if ( other._cg ) _cg = other._cg->getClone();
}
- ConfigurationConcrete::~ConfigurationConcrete ()
+ Configuration::~Configuration ()
{
ltrace(89) << "About to delete attribute _cg (CellGauge)." << endl;
_cg->destroy ();
}
- ConfigurationConcrete* ConfigurationConcrete::clone () const { return new ConfigurationConcrete(*this); }
- CellGauge* ConfigurationConcrete::getCellGauge () const { return _cg; }
- bool ConfigurationConcrete::isSlowMotion () const { return _flags & EtesianEngine::SlowMotion; }
- void ConfigurationConcrete::setFlags ( unsigned int flags ) { _flags |= flags; }
- void ConfigurationConcrete::unsetFlags ( unsigned int flags ) { _flags &= ~flags; }
+ Configuration* Configuration::clone () const { return new Configuration(*this); }
- void ConfigurationConcrete::print ( Cell* cell ) const
+ void Configuration::print ( Cell* cell ) const
{
cout << " o Configuration of ToolEngine for Cell <" << cell->getName() << ">" << endl;
- cout << Dots::asIdentifier(" - Cell Gauge",getString(_cg->getName())) << endl;
+ cout << Dots::asIdentifier(" - Cell Gauge" ,getString(_cg->getName())) << endl;
+ cout << Dots::asInt (" - Place Effort" ,_placeEffort ) << endl;
+ cout << Dots::asInt (" - Update Conf" ,_updateConf ) << endl;
+ cout << Dots::asInt (" - Spreading Conf",_spreadingConf) << endl;
+ cout << Dots::asPercentage(" - Space Margin" ,_spaceMargin ) << endl;
+ cout << Dots::asPercentage(" - Aspect Ratio" ,_aspectRatio ) << endl;
}
- string ConfigurationConcrete::_getTypeName () const
- { return "ConfigurationConcrete"; }
+ string Configuration::_getTypeName () const
+ { return "Configuration"; }
- string ConfigurationConcrete::_getString () const
+ string Configuration::_getString () const
{
ostringstream os;
@@ -116,12 +114,16 @@ namespace Etesian {
}
- Record* ConfigurationConcrete::_getRecord () const
+ Record* Configuration::_getRecord () const
{
Record* record = new Record ( _getString() );
- record->add ( getSlot ( "_cg" , _cg ) );
-
- return ( record );
+ record->add ( getSlot( "_cg" , _cg ) );
+ record->add ( getSlot( "_placeEffort" , (int)_placeEffort ) );
+ record->add ( getSlot( "_updateConf" , (int)_updateConf ) );
+ record->add ( getSlot( "_spreadingConf" , (int)_spreadingConf ) );
+ record->add ( getSlot( "_spaceMargin" , _spaceMargin ) );
+ record->add ( getSlot( "_aspectRatio" , _aspectRatio ) );
+ return record;
}
diff --git a/etesian/src/EtesianEngine.cpp b/etesian/src/EtesianEngine.cpp
index dbaea95a..3acb6382 100644
--- a/etesian/src/EtesianEngine.cpp
+++ b/etesian/src/EtesianEngine.cpp
@@ -267,8 +267,9 @@ namespace Etesian {
EtesianEngine::EtesianEngine ( Cell* cell )
: ToolEngine (cell)
- , _configuration(new ConfigurationConcrete())
- , _flags (0)
+ , _configuration(new Configuration())
+ , _placed (false)
+ , _flatDesign (false)
, _timer ()
, _surface ()
, _circuit ()
@@ -365,8 +366,8 @@ namespace Etesian {
void EtesianEngine::setDefaultAb ()
{
- double spaceMargin = Cfg::getParamPercentage("nimbus.spaceMargin", 10.0)->asDouble();
- double aspectRatio = Cfg::getParamPercentage("nimbus.aspectRatio",100.0)->asDouble();
+ double spaceMargin = getSpaceMargin();
+ double aspectRatio = getAspectRatio();
size_t instanceNb = 0;
double cellLength = 0;
@@ -390,13 +391,8 @@ namespace Etesian {
}
double gcellLength = cellLength*(1.0+spaceMargin) / DbU::toLambda( getSliceHeight() );
- double rows = sqrt( gcellLength/aspectRatio );
- if (floor(rows) != rows) rows = floor(rows)+1.0;
- else rows = floor(rows);
-
- double columns = gcellLength / rows;
- if (floor(columns) != columns) columns = floor(columns)+1.0;
- else columns = floor(columns);
+ 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)
@@ -423,8 +419,8 @@ namespace Etesian {
{
//cerr << "EtesianEngine::resetPlacement()" << endl;
- if (_flags & NoPlacement) return;
- _flags |= FlatDesign;
+ if (not _placed) return;
+ _flatDesign = true;
Dots dots ( cmess2, " ", 80, 1000 );
@@ -436,8 +432,8 @@ namespace Etesian {
{
dots.dot();
- if ((_flags & FlatDesign) and not (*ioccurrence).getPath().getTailPath().isEmpty())
- _flags &= ~FlatDesign;
+ if ( _flatDesign and not (*ioccurrence).getPath().getTailPath().isEmpty())
+ _flatDesign = true;
Instance* instance = static_cast((*ioccurrence).getEntity());
Cell* masterCell = instance->getMasterCell();
@@ -459,7 +455,7 @@ namespace Etesian {
if (_cellWidget) _cellWidget->refresh();
- _flags |= NoPlacement;
+ _placed = true;
}
@@ -611,20 +607,22 @@ namespace Etesian {
#endif // HAVE_COLOQUINTE
}
- void EtesianEngine::place ( unsigned int flags )
+ void EtesianEngine::place ()
{
#if HAVE_COLOQUINTE
using namespace coloquinte::gp;
using namespace coloquinte::dp;
- if (flags & SlowMotion) getConfiguration()-> setFlags( SlowMotion );
- else getConfiguration()->unsetFlags( SlowMotion );
-
+ getConfiguration()->print( getCell() );
if (getCell()->getAbutmentBox().isEmpty()) setDefaultAb();
findYSpin();
toColoquinte();
+ Effort placementEffort = getPlaceEffort();
+ GraphicUpdate placementUpdate = getUpdateConf();
+ Density densityConf = getSpreadingConf();
+
cmess1 << " o Running Coloquinte." << endl;
cmess1 << " - Computing initial placement..." << endl;
cmess2 << setfill('0') << right;
@@ -647,13 +645,14 @@ namespace Etesian {
cmess2 << " - Elapsed time:" << timeDelta
<< " HPWL:" << get_HPWL_wirelength( _circuit, _placementUB )
<< "\n "
- << "- Linear Disrupt.:" << get_mean_linear_disruption ( _circuit, _placementLB, _placementLB )
- << " Quad. Disrupt.:" << get_mean_quadratic_disruption( _circuit, _placementLB, _placementLB )
+ << "- Linear Disrupt.:" << get_mean_linear_disruption ( _circuit, _placementLB, _placementUB )
+ << " Quad. Disrupt.:" << get_mean_quadratic_disruption( _circuit, _placementLB, _placementUB )
<< endl;
_placementLB = _placementUB;
_placementLB.selfcheck();
- _updatePlacement( _placementUB );
+ if(placementUpdate == UpdateAll)
+ _updatePlacement( _placementUB );
// Early topology-independent solution + negligible pulling forces to avoid dumb solutions
cmess1 << " o Star (*) Optimization." << endl;
@@ -662,39 +661,50 @@ namespace Etesian {
solve_linear_system( _circuit, _placementLB, solv, 200 );
_progressReport2( startTime, " [--]" );
- _updatePlacement( _placementLB );
+ if(placementUpdate <= LowerBound)
+ _updatePlacement( _placementLB );
cmess1 << " o Simple legalization." << endl;
auto snd_legalizer = region_distribution::uniform_density_distribution(_surface, _circuit, _placementLB);
get_rough_legalization( _circuit, _placementUB, snd_legalizer);
- _updatePlacement( _placementUB );
+ if(placementUpdate == UpdateAll)
+ _updatePlacement( _placementUB );
- int nbr_iterations = 60;
- float_t max_force = 1.5;
- bool full_density = false;
+ int globalIterations;
+ if(placementEffort == Fast)
+ globalIterations = 40;
+ else if(placementEffort == Standard)
+ globalIterations = 70;
+ else if(placementEffort == High)
+ globalIterations = 120;
+ else
+ globalIterations = 250;
- for ( int i=0; i(i+1)/ globalIterations;
+ float_t pulling_force = maxForce * iterProp * iterProp; // More effort at low pulling forces
// Get the system to optimize (tolerance, maximum and minimum pin counts)
// and the pulling forces (threshold distance)
auto solv = get_HPWLF_linear_system ( _circuit, _placementLB, 0.5 * sliceHeight, 2, 100000 )
+ get_linear_pulling_forces( _circuit, _placementUB, _placementLB, pulling_force, 40.0 );
solve_linear_system( _circuit, _placementLB, solv, 400 ); // number of iterations
_progressReport2( startTime, " Linear." );
- _updatePlacement( _placementLB );
// Optimize orientation sometimes
if (i%5 == 0) {
optimize_exact_orientations( _circuit, _placementLB );
_progressReport2( startTime, " Orient." );
- _updatePlacement( _placementLB );
}
+ if(placementUpdate <= LowerBound)
+ _updatePlacement( _placementLB );
// Create a legalizer and bipartition it until we have sufficient precision
- auto legalizer = full_density ?
- region_distribution::full_density_distribution(_surface, _circuit, _placementLB)
- : region_distribution::uniform_density_distribution(_surface, _circuit, _placementLB);
+ auto legalizer = densityConf == ForceUniform ?
+ region_distribution::uniform_density_distribution(_surface, _circuit, _placementLB)
+ : region_distribution::full_density_distribution(_surface, _circuit, _placementLB);
for ( int quad_part=0 ; _circuit.cell_cnt() > 10 * (1 << (quad_part*2)) ; ++quad_part ) { // Until there is about 10 standard cells per region
legalizer.x_bipartition();
legalizer.y_bipartition();
@@ -711,57 +721,71 @@ namespace Etesian {
label.str("");
label << " [" << setw(2) << setfill('0') << i << "] Bipart.";
_progressReport1( startTime, label.str() );
- _updatePlacement( _placementUB );
- if (i >= 2*nbr_iterations/3) {
+ if(placementUpdate == UpdateAll)
+ _updatePlacement( _placementUB );
+
+ if (i >= 2*globalIterations/3) {
auto prec_legalizer = legalize( _circuit, _placementUB, _surface, sliceHeight );
coloquinte::dp::get_result( _circuit, prec_legalizer, _placementUB );
_progressReport1( startTime, " Legal. " );
- _updatePlacement( _placementUB );
+ if(placementUpdate == UpdateAll)
+ _updatePlacement( _placementUB );
}
-
-
}
cmess1 << " o Detailed Placement." << endl;
- index_t legalizeIterations = 3;
- for ( index_t i=0; igetLeafInstanceOccurrences() )
diff --git a/etesian/src/GraphicEtesianEngine.cpp b/etesian/src/GraphicEtesianEngine.cpp
index bbb96e29..2c889b7f 100644
--- a/etesian/src/GraphicEtesianEngine.cpp
+++ b/etesian/src/GraphicEtesianEngine.cpp
@@ -99,7 +99,6 @@ namespace Etesian {
_viewer->clearToolInterrupt();
EtesianEngine* etesian = getForFramework( CreateEngine );
- etesian->getConfiguration()->setFlags( EtesianEngine::SlowMotion );
etesian->resetPlacement();
etesian->place();
}
diff --git a/etesian/src/PyEtesian.cpp b/etesian/src/PyEtesian.cpp
index ff3e6c28..074ebe41 100644
--- a/etesian/src/PyEtesian.cpp
+++ b/etesian/src/PyEtesian.cpp
@@ -88,8 +88,6 @@ extern "C" {
PyModule_AddObject( module, "GraphicEtesianEngine", (PyObject*)&PyTypeGraphicEtesianEngine );
PyEtesianEngine_postModuleInit();
-
- //cerr << "std::string typeid name:" << typeid(string).name() << endl;
}
diff --git a/etesian/src/PyEtesianEngine.cpp b/etesian/src/PyEtesianEngine.cpp
index 4d9fc649..17cf4396 100644
--- a/etesian/src/PyEtesianEngine.cpp
+++ b/etesian/src/PyEtesianEngine.cpp
@@ -101,27 +101,9 @@ extern "C" {
return PyEtesianEngine_Link(etesian);
}
-
- PyObject* PyEtesianEngine_place ( PyEtesianEngine* self, PyObject* args )
- {
- trace << "PyEtesianEngine_place()" << endl;
-
- HTRY
- METHOD_HEAD("EtesianEngine.place()")
- unsigned int flags = 0;
- if (PyArg_ParseTuple(args,"I:EtesianEngine.place", &flags)) {
- etesian->place( flags );
- } else {
- PyErr_SetString(ConstructorError, "EtesianEngine.place(): Invalid number/bad type of parameter.");
- return NULL;
- }
- HCATCH
-
- Py_RETURN_NONE;
- }
-
-
// Standart Accessors (Attributes).
+ DirectVoidMethod(EtesianEngine,etesian,place)
+
// DirectVoidMethod(EtesianEngine,etesian,runNegociate)
// DirectVoidMethod(EtesianEngine,etesian,printConfiguration)
// DirectVoidMethod(EtesianEngine,etesian,saveGlobalSolution)
@@ -135,11 +117,11 @@ extern "C" {
PyMethodDef PyEtesianEngine_Methods[] =
{ { "get" , (PyCFunction)PyEtesianEngine_get , METH_VARARGS|METH_STATIC
- , "Returns the Etesian engine attached to the Cell, None if there isnt't." }
+ , "Returns the Etesian engine attached to the Cell, None if there isn't." }
, { "create" , (PyCFunction)PyEtesianEngine_create , METH_VARARGS|METH_STATIC
- , "Create a Etesian engine on this cell." }
- , { "place" , (PyCFunction)PyEtesianEngine_place , METH_VARARGS
- , "Run the global router (Knik)." }
+ , "Create an Etesian engine on this cell." }
+ , { "place" , (PyCFunction)PyEtesianEngine_place , METH_NOARGS
+ , "Run the placer (Etesian)." }
, { "destroy" , (PyCFunction)PyEtesianEngine_destroy , METH_NOARGS
, "Destroy the associated hurricane object. The python object remains." }
, {NULL, NULL, 0, NULL} /* sentinel */
@@ -165,9 +147,8 @@ extern "C" {
extern void PyEtesianEngine_postModuleInit ()
{
- PyObject* constant;
-
- LoadObjectConstant(PyTypeEtesianEngine.tp_dict,EtesianEngine::SlowMotion,"SlowMotion");
+ //PyObject* constant;
+ //LoadObjectConstant(PyTypeEtesianEngine.tp_dict,EtesianEngine::SlowMotion,"SlowMotion");
}
diff --git a/etesian/src/etesian/Configuration.h b/etesian/src/etesian/Configuration.h
index 8fb0e20c..25d9c692 100644
--- a/etesian/src/etesian/Configuration.h
+++ b/etesian/src/etesian/Configuration.h
@@ -40,68 +40,62 @@ namespace Etesian {
// -------------------------------------------------------------------
-// Class : "Etesian::Configuration" (decorator).
+// Class : "Etesian::Configuration".
+ enum Effort { Fast =1
+ , Standard=2
+ , High =3
+ , Extreme =4
+ };
+ enum GraphicUpdate { UpdateAll =1
+ , LowerBound=2
+ , FinalOnly =3
+ };
+ enum Density { ForceUniform=1
+ , MaxDensity =2
+ };
class Configuration {
public:
// Constructor & Destructor.
- virtual ~Configuration ();
- virtual Configuration* clone () const = 0;
- // Methods.
- virtual CellGauge* getCellGauge () const = 0;
- virtual bool isSlowMotion () const = 0;
- virtual void setFlags ( unsigned int ) = 0;
- virtual void unsetFlags ( unsigned int ) = 0;
- virtual void print ( Cell* ) const = 0;
- virtual Record* _getRecord () const = 0;
- virtual string _getString () const = 0;
- virtual string _getTypeName () const = 0;
- protected:
- Configuration ();
- private:
- Configuration ( const Configuration& );
- Configuration& operator= ( const Configuration& );
- private:
- static Configuration* _default;
- };
-
-
-// -------------------------------------------------------------------
-// Class : "Etesian::ConfigurationConcrete".
-
-
- class ConfigurationConcrete : public Configuration {
- friend class Configuration;
- public:
- // Constructor & Destructor.
- ConfigurationConcrete ( const CellGauge* cg=NULL );
- virtual ~ConfigurationConcrete ();
- virtual ConfigurationConcrete* clone () const;
+ Configuration ( const CellGauge* cg=NULL );
+ ~Configuration ();
+ Configuration* clone () const;
// Methods.
- virtual CellGauge* getCellGauge () const;
- virtual bool isSlowMotion () const;
- virtual void setFlags ( unsigned int );
- virtual void unsetFlags ( unsigned int );
- virtual void print ( Cell* ) const;
- virtual Record* _getRecord () const;
- virtual string _getString () const;
- virtual string _getTypeName () const;
+ inline CellGauge* getCellGauge () const;
+ inline Effort getPlaceEffort () const;
+ inline GraphicUpdate getUpdateConf () const;
+ inline Density getSpreadingConf () const;
+ inline double getSpaceMargin () const;
+ inline double getAspectRatio () const;
+ void print ( Cell* ) const;
+ Record* _getRecord () const;
+ string _getString () const;
+ string _getTypeName () const;
protected:
// Attributes.
- CellGauge* _cg;
- unsigned int _flags;
+ CellGauge* _cg;
+ Effort _placeEffort;
+ GraphicUpdate _updateConf;
+ Density _spreadingConf;
+ double _spaceMargin;
+ double _aspectRatio;
private:
- ConfigurationConcrete ( const ConfigurationConcrete& );
- ConfigurationConcrete& operator= ( const ConfigurationConcrete& );
+ Configuration ( const Configuration& );
+ Configuration& operator= ( const Configuration& );
};
+ inline CellGauge* Configuration::getCellGauge () const { return _cg; }
+ inline Effort Configuration::getPlaceEffort () const { return _placeEffort; }
+ inline GraphicUpdate Configuration::getUpdateConf () const { return _updateConf; }
+ inline Density Configuration::getSpreadingConf () const { return _spreadingConf; }
+ inline double Configuration::getSpaceMargin () const { return _spaceMargin; }
+ inline double Configuration::getAspectRatio () const { return _aspectRatio; }
+
+
} // Etesian namespace.
-
INSPECTOR_P_SUPPORT(Etesian::Configuration);
-INSPECTOR_P_SUPPORT(Etesian::ConfigurationConcrete);
-
#endif // ETESIAN_CONFIGURATION_H
diff --git a/etesian/src/etesian/EtesianEngine.h b/etesian/src/etesian/EtesianEngine.h
index 5e064555..fac2ae03 100644
--- a/etesian/src/etesian/EtesianEngine.h
+++ b/etesian/src/etesian/EtesianEngine.h
@@ -52,24 +52,22 @@ namespace Etesian {
class EtesianEngine : public CRL::ToolEngine {
public:
- enum Flag { NoPlacement=0x0001
- , FlatDesign =0x0002
- , ForceUpdate=0x0004
- , YSpinSet =0x0008
- , SlowMotion =0x0010
- };
public:
static const Name& staticGetName ();
static EtesianEngine* create ( Cell* );
static EtesianEngine* get ( const Cell* );
public:
- inline bool isSlowMotion () const;
virtual Configuration* getConfiguration ();
virtual const Configuration* getConfiguration () const;
virtual const Name& getName () const;
inline CellGauge* getCellGauge () const;
inline DbU::Unit getPitch () const;
inline DbU::Unit getSliceHeight () const;
+ inline Effort getPlaceEffort () const;
+ inline GraphicUpdate getUpdateConf () const;
+ inline Density getSpreadingConf () const;
+ inline double getSpaceMargin () const;
+ inline double getAspectRatio () const;
inline const FeedCells& getFeedCells () const;
inline void setCellWidget ( Hurricane::CellWidget* );
void startMeasures ();
@@ -78,7 +76,7 @@ namespace Etesian {
void setDefaultAb ();
void resetPlacement ();
void toColoquinte ();
- void place ( unsigned int flags=SlowMotion );
+ void place ();
inline void useFeed ( Cell* );
size_t findYSpin ();
void addFeeds ();
@@ -91,7 +89,9 @@ namespace Etesian {
static Name _toolName;
protected:
Configuration* _configuration;
- unsigned int _flags;
+ bool _placed;
+ bool _ySpinSet;
+ bool _flatDesign;
Timer _timer;
coloquinte::box _surface;
coloquinte::netlist _circuit;
@@ -113,20 +113,24 @@ namespace Etesian {
EtesianEngine ( const EtesianEngine& );
EtesianEngine& operator= ( const EtesianEngine& );
private:
- void _updatePlacement ( const coloquinte::placement_t&, unsigned int flags=0 );
+ void _updatePlacement ( const coloquinte::placement_t& );
void _progressReport1 ( time_t startTime, string label ) const;
void _progressReport2 ( time_t startTime, string label ) const;
};
// Inline Functions.
- inline bool EtesianEngine::isSlowMotion () const { return getConfiguration()->isSlowMotion(); }
- inline void EtesianEngine::setCellWidget ( Hurricane::CellWidget* cw ) { _cellWidget = cw; }
- inline CellGauge* EtesianEngine::getCellGauge () const { return getConfiguration()->getCellGauge(); }
- inline DbU::Unit EtesianEngine::getPitch () const { return getCellGauge()->getPitch(); }
- inline DbU::Unit EtesianEngine::getSliceHeight () const { return getCellGauge()->getSliceHeight(); }
- inline void EtesianEngine::useFeed ( Cell* cell ) { _feedCells.useFeed(cell); }
- inline const FeedCells& EtesianEngine::getFeedCells () const { return _feedCells; }
+ inline void EtesianEngine::setCellWidget ( Hurricane::CellWidget* cw ) { _cellWidget = cw; }
+ inline CellGauge* EtesianEngine::getCellGauge () const { return getConfiguration()->getCellGauge(); }
+ inline DbU::Unit EtesianEngine::getPitch () const { return getCellGauge()->getPitch(); }
+ inline DbU::Unit EtesianEngine::getSliceHeight () const { return getCellGauge()->getSliceHeight(); }
+ inline Effort EtesianEngine::getPlaceEffort () const { return getConfiguration()->getPlaceEffort(); }
+ inline GraphicUpdate EtesianEngine::getUpdateConf () const { return getConfiguration()->getUpdateConf(); }
+ inline Density EtesianEngine::getSpreadingConf () const { return getConfiguration()->getSpreadingConf(); }
+ inline double EtesianEngine::getSpaceMargin () const { return getConfiguration()->getSpaceMargin(); }
+ inline double EtesianEngine::getAspectRatio () const { return getConfiguration()->getAspectRatio(); }
+ inline void EtesianEngine::useFeed ( Cell* cell ) { _feedCells.useFeed(cell); }
+ inline const FeedCells& EtesianEngine::getFeedCells () const { return _feedCells; }
// Variables.
diff --git a/unicorn/CMakeLists.txt b/unicorn/CMakeLists.txt
index 1c66f912..fc25aac1 100644
--- a/unicorn/CMakeLists.txt
+++ b/unicorn/CMakeLists.txt
@@ -7,7 +7,7 @@
list(INSERT CMAKE_MODULE_PATH 0 "${DESTDIR}$ENV{CORIOLIS_TOP}/share/cmake/Modules/")
find_package(Bootstrap REQUIRED)
- setup_project_paths(COLOQUINTE)
+ setup_project_paths(IMPORTEDS)
setup_project_paths(CORIOLIS)
set_cmake_policies()
diff --git a/unicorn/src/cgt.py b/unicorn/src/cgt.py
index 8a91ab7a..72d8637f 100755
--- a/unicorn/src/cgt.py
+++ b/unicorn/src/cgt.py
@@ -44,15 +44,13 @@ def credits ():
s = ''
s += ' Tool Credits\n'
s += ' Hurricane .................... Remy Escassut & Christian Masson\n'
- s += ' Nimbus - Infrastructure .......................... Hugo Clement\n'
- s += ' Mauka - Placer ........................... Christophe Alexandre\n'
+ s += ' Etesian - Placer .............................. Gabriel Gouvine\n'
s += ' Knik - Global Router ............................ Damien Dupuis\n'
s += ' Kite - Detailed Router ....................... Jean-Paul Chaput\n\n'
- s += ' hMETIS software credits (used by Mauka)\n'
- s += ' Author ........................................ Georges Karypis\n'
- s += ' Prof. Ident. .......................... University of Minnesota\n'
- s += ' URL .......................... http://glaros.dtc.umn.edu/gkhome\n\n'
+ s += ' Coloquinte software credits (used by Etesian)\n'
+ s += ' Author ........................................ Gabriel Gouvine\n'
+ s += ' URL .............. https://github.com/Coloquinte/Coloquinte.git\n\n'
s += ' FLUTE software credits (used by Knik)\n'
s += ' Author ........................................ Chris C. N. CHU\n'