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'