Adding Configuration support to Etesian.
* Change: In Bootstrap & ccb, the coloquinte project is renamed into "importeds", it will be the home of all the externally devellopped softwares that are needed to build Coriolis. Add explicit support for Fedora ("Linux.fc") and uses site-packages, as everybody else. * New: In CRL Core, in etc/, adds the configuration files for Etesian. * New: In Etesian, activate the Configuration object. Now uses it's own configuration variables instead of borrowing those of Nimbus & Mauka. * Change: In Documentation, updated User's Guide to present Etesian as the placer, instead of Mauka. * Change: In Cumulus, slight change in ClokTreePlugin and ChipPlugin to match the new Etesian/Python interface.
This commit is contained in:
parent
bd3984a313
commit
8566126acc
|
@ -5,7 +5,7 @@
|
|||
|
||||
projectdir = 'coriolis-2.x'
|
||||
|
||||
projects = [ { 'name' : "coloquinte"
|
||||
projects = [ { 'name' : "importeds"
|
||||
, 'tools' : [ "Coloquinte" ]
|
||||
, 'repository': 'https://github.com/alnurn/Coloquinte' }
|
||||
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -0,0 +1,5 @@
|
|||
# -*- Mode:Python; explicit-buffer-name: "etesian.conf<cmos>" -*-
|
||||
|
||||
import helpers
|
||||
|
||||
execfile( helpers.sysConfDir+'/common/etesian.conf' )
|
|
@ -0,0 +1,37 @@
|
|||
# -*- Mode:Python; explicit-buffer-name: "etesian.conf<common>" -*-
|
||||
|
||||
# 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 ,)
|
||||
)
|
|
@ -0,0 +1,5 @@
|
|||
# -*- Mode:Python; explicit-buffer-name: "etesian.conf<cmos>" -*-
|
||||
|
||||
import helpers
|
||||
|
||||
execfile( helpers.sysConfDir+'/common/etesian.conf' )
|
|
@ -0,0 +1,5 @@
|
|||
# -*- Mode:Python; explicit-buffer-name: "etesian.conf<cmos>" -*-
|
||||
|
||||
import helpers
|
||||
|
||||
execfile( helpers.sysConfDir+'/common/etesian.conf' )
|
|
@ -0,0 +1,5 @@
|
|||
# -*- Mode:Python; explicit-buffer-name: "etesian.conf<cmos>" -*-
|
||||
|
||||
import helpers
|
||||
|
||||
execfile( helpers.sysConfDir+'/common/etesian.conf' )
|
|
@ -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)
|
||||
|
|
|
@ -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" )
|
||||
|
|
@ -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
|
||||
|
||||
|
|
|
@ -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()
|
||||
|
|
|
@ -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
|
|||
<span class="right">Rémy <span class="sc">Escassut</span> &
|
||||
Christian <span class="sc">Masson</span></span></p>
|
||||
<br>
|
||||
<p class="credit"><span class="left"><span class="sc">Mauka</span></span>
|
||||
<span class="right">Christophe <span class="sc">Alexandre</span></span></p>
|
||||
<p class="credit"><span class="left"><span class="sc">Etesian</span></span>
|
||||
<span class="right">Gabriel <span class="sc">Gouvine</span></span></p>
|
||||
<br>
|
||||
<p class="credit"><span class="left"><span class="sc">Stratus</span></span>
|
||||
<span class="right">Sophie <span class="sc">Belloeil</span></span></p>
|
||||
|
@ -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/<tool> |
|
||||
| | Linux, SL 6, 32 bits | | ~/coriolis-2.x/Linux.slsoc6x/Release.Shared/build/<tool> |
|
||||
| | Linux, SL 6, 64 bits | | ~/coriolis-2.x/Linux.slsoc6x_64/Release.Shared/build/<tool> |
|
||||
| | Linux, Fedora, 64 bits | | ~/coriolis-2.x/Linux.fc_64/Release.Shared/build/<tool> |
|
||||
| | Linux, Fedora, 32 bits | | ~/coriolis-2.x/Linux.fc/Release.Shared/build/<tool> |
|
||||
| | FreeBSD 8, 32 bits | | ~/coriolis-2.x/FreeBSD.8x.i386/Release.Shared/build/<tool> |
|
||||
| | FreeBSD 8, 64 bits | | ~/coriolis-2.x/FreeBSD.8x.amd64/Release.Shared/build/<tool> |
|
||||
| | Windows 7, 32 bits | | ~/coriolis-2.x/Cygwin.W7/Release.Shared/build/<tool> |
|
||||
|
@ -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:`<CWD>/.coriolis2_techno.conf` |
|
||||
| **3** | The user's local setting | :cb:`<CWD>/.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/<TECHNO>/<TOOL>.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:`<CWD>/.coriolis2.conf` |
|
||||
| **3** | The user's local initialization | :cb:`<CWD>/.coriolis2/settings.py` |
|
||||
+-------+----------------------------------+----------------------------------------------+
|
||||
|
||||
.. note:: *The loading policy is not hard-coded.* It is implemented
|
||||
at Python level in :cb:`/etc/coriolis2/coriolisInit.py`, and thus may be 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:`<CWD>/.coriolis2.conf` (that is, written in |Python|).
|
||||
in :cb:`<CWD>/.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
|
||||
|
|
|
@ -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()
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -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<Effort> (Cfg::getParamEnumerate ("etesian.effort" , Standard )->asInt()) )
|
||||
, _updateConf ( static_cast<GraphicUpdate> (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<Etesian> 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;
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -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<Instance*>((*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<nbr_iterations; ++i ) {
|
||||
float_t pulling_force = (i+1) * max_force / nbr_iterations;
|
||||
float_t maxForce = 1.0;
|
||||
|
||||
for ( int i=0; i<globalIterations; ++i ) {
|
||||
float_t iterProp = static_cast<float_t>(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; i<legalizeIterations; ++i ){
|
||||
ostringstream label;
|
||||
label.str("");
|
||||
label << " [" << setw(2) << setfill('0') << i << "]";
|
||||
index_t detailedIterations;
|
||||
if(placementEffort == Fast)
|
||||
detailedIterations = 1;
|
||||
else if(placementEffort == Standard)
|
||||
detailedIterations = 3;
|
||||
else if(placementEffort == High)
|
||||
detailedIterations = 7;
|
||||
else
|
||||
detailedIterations = 15;
|
||||
for ( index_t i=0; i<detailedIterations; ++i ){
|
||||
ostringstream label;
|
||||
label.str("");
|
||||
label << " [" << setw(2) << setfill('0') << i << "]";
|
||||
|
||||
optimize_exact_orientations( _circuit, _placementUB );
|
||||
_progressReport1( startTime, label.str()+" Oriented ......." );
|
||||
_updatePlacement( _placementUB );
|
||||
optimize_exact_orientations( _circuit, _placementUB );
|
||||
_progressReport1( startTime, label.str()+" Oriented ......." );
|
||||
if(placementUpdate <= LowerBound)
|
||||
_updatePlacement( _placementUB );
|
||||
|
||||
auto legalizer = legalize( _circuit, _placementUB, _surface, sliceHeight );
|
||||
coloquinte::dp::get_result( _circuit, legalizer, _placementUB );
|
||||
_progressReport1( startTime, " Legalized ......" );
|
||||
_updatePlacement( _placementUB );
|
||||
|
||||
swaps_global_HPWL( _circuit, legalizer, 3, 4 );
|
||||
coloquinte::dp::get_result( _circuit, legalizer, _placementUB );
|
||||
_progressReport1( startTime, " Global Swaps ..." );
|
||||
_updatePlacement( _placementUB );
|
||||
|
||||
OSRP_convex_HPWL( _circuit, legalizer );
|
||||
coloquinte::dp::get_result( _circuit, legalizer, _placementUB );
|
||||
_progressReport1( startTime, " Row Optimization" );
|
||||
_updatePlacement( _placementUB );
|
||||
|
||||
swaps_row_HPWL( _circuit, legalizer, 4 );
|
||||
coloquinte::dp::get_result( _circuit, legalizer, _placementUB );
|
||||
_progressReport1( startTime, " Local Swaps ...." );
|
||||
|
||||
if (i == legalizeIterations-1) {
|
||||
row_compatible_orientation( _circuit, legalizer, (_yspinSlice0 == 0) );
|
||||
auto legalizer = legalize( _circuit, _placementUB, _surface, sliceHeight );
|
||||
coloquinte::dp::get_result( _circuit, legalizer, _placementUB );
|
||||
verify_placement_legality( _circuit, _placementUB, _surface );
|
||||
_progressReport1( startTime, " Final Legalize ." );
|
||||
}
|
||||
_progressReport1( startTime, " Legalized ......" );
|
||||
if(placementUpdate <= LowerBound)
|
||||
_updatePlacement( _placementUB );
|
||||
|
||||
_updatePlacement( _placementUB, (i==legalizeIterations-1) ? ForceUpdate : 0 );
|
||||
swaps_global_HPWL( _circuit, legalizer, 3, 4 );
|
||||
coloquinte::dp::get_result( _circuit, legalizer, _placementUB );
|
||||
_progressReport1( startTime, " Global Swaps ..." );
|
||||
if(placementUpdate <= LowerBound)
|
||||
_updatePlacement( _placementUB );
|
||||
|
||||
OSRP_convex_HPWL( _circuit, legalizer );
|
||||
coloquinte::dp::get_result( _circuit, legalizer, _placementUB );
|
||||
_progressReport1( startTime, " Row Optimization" );
|
||||
if(placementUpdate == UpdateAll)
|
||||
_updatePlacement( _placementUB );
|
||||
|
||||
swaps_row_HPWL( _circuit, legalizer, 4 );
|
||||
coloquinte::dp::get_result( _circuit, legalizer, _placementUB );
|
||||
_progressReport1( startTime, " Local Swaps ...." );
|
||||
if(placementUpdate <= LowerBound)
|
||||
_updatePlacement( _placementUB );
|
||||
|
||||
if (i == detailedIterations-1) {
|
||||
row_compatible_orientation( _circuit, legalizer, true );
|
||||
coloquinte::dp::get_result( _circuit, legalizer, _placementUB );
|
||||
verify_placement_legality( _circuit, _placementUB, _surface );
|
||||
_progressReport1( startTime, " Final Legalize ." );
|
||||
}
|
||||
}
|
||||
_updatePlacement( _placementUB );
|
||||
|
||||
cmess1 << " o Adding feed cells." << endl;
|
||||
addFeeds();
|
||||
|
@ -774,7 +798,7 @@ namespace Etesian {
|
|||
cmess1 << ::Dots::asString
|
||||
(" - RMST", DbU::getValueString(get_RSMT_wirelength(_circuit,_placementUB )*getPitch()) ) << endl;
|
||||
|
||||
_flags &= ~NoPlacement;
|
||||
_placed = false;
|
||||
#else
|
||||
cerr << Warning("Coloquinte library wasn't found, Etesian is disabled.") << endl;
|
||||
#endif
|
||||
|
@ -826,11 +850,9 @@ namespace Etesian {
|
|||
}
|
||||
|
||||
|
||||
void EtesianEngine::_updatePlacement ( const coloquinte::placement_t& placement, unsigned int flags )
|
||||
void EtesianEngine::_updatePlacement ( const coloquinte::placement_t& placement )
|
||||
{
|
||||
#if HAVE_COLOQUINTE
|
||||
if ((not isSlowMotion()) and not (flags & ForceUpdate)) return;
|
||||
|
||||
UpdateSession::open();
|
||||
|
||||
forEach ( Occurrence, ioccurrence, getCell()->getLeafInstanceOccurrences() )
|
||||
|
|
|
@ -99,7 +99,6 @@ namespace Etesian {
|
|||
_viewer->clearToolInterrupt();
|
||||
|
||||
EtesianEngine* etesian = getForFramework( CreateEngine );
|
||||
etesian->getConfiguration()->setFlags( EtesianEngine::SlowMotion );
|
||||
etesian->resetPlacement();
|
||||
etesian->place();
|
||||
}
|
||||
|
|
|
@ -88,8 +88,6 @@ extern "C" {
|
|||
PyModule_AddObject( module, "GraphicEtesianEngine", (PyObject*)&PyTypeGraphicEtesianEngine );
|
||||
|
||||
PyEtesianEngine_postModuleInit();
|
||||
|
||||
//cerr << "std::string typeid name:" << typeid(string).name() << endl;
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -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");
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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<coloquinte::int_t> _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.
|
||||
|
|
|
@ -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()
|
||||
|
|
|
@ -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'
|
||||
|
|
Loading…
Reference in New Issue