Compare commits

..

1 Commits

Author SHA1 Message Date
Jean-Paul Chaput 2aaef0c694 Merge branch 'poetry-cleanup' of gitlab.lip6.fr:vlsi-eda/coriolis into poetry-cleanup 2023-02-28 13:52:06 +01:00
1143 changed files with 61690 additions and 24385 deletions

6
.gitmodules vendored
View File

@ -1,6 +0,0 @@
[submodule "coloquinte"]
path = coloquinte
# url = git@github.com:Coloquinte/PlaceRoute.git
url = https://github.com/Coloquinte/PlaceRoute.git
branch = coriolis-submodule
update = merge

View File

@ -40,20 +40,23 @@ Building Coriolis
To build Coriolis, ensure the following prerequisites are met: To build Coriolis, ensure the following prerequisites are met:
* Python 3, * Python 3.
* cmake, * cmake.
* boost, * boost.
* bison & flex, * bison & flex.
* Qt 4 or 5, * Qt 4 or 5.
* libxml2, * libxml2.
* RapidJSON, * RapidJSON
* A C++11 compliant compiler. * A C++11 compliant compiler.
The build system relies on a fixed directory tree from the root The build system relies on a fixed directory tree from the root
of the user currently building it. Thus first step is to get a clone of of the user currently building it. Thus first step is to get a clone of
the repository in the right place. Proceed as follow: :: the repository in the right place. Proceed as follow: ::
ego@home:~$ mkdir -p ~/coriolis-2.x/src/ ego@home:~$ mkdir -p ~/coriolis-2.x/src/support
ego@home:~$ cd ~/coriolis-2.x/src/support
ego@home:~$ git clone http://github.com/miloyip/rapidjson
ego@home:~$ git checkout ec322005072076ef53984462fb4a1075c27c7dfd
ego@home:~$ cd ~/coriolis-2.x/src ego@home:~$ cd ~/coriolis-2.x/src
ego@home:src$ git clone https://gitlab.lip6.fr/vlsi-eda/coriolis.git ego@home:src$ git clone https://gitlab.lip6.fr/vlsi-eda/coriolis.git
ego@home:src$ cd coriolis ego@home:src$ cd coriolis
@ -82,7 +85,7 @@ The ``coriolis`` script detects its location and setups the UNIX
environment appropriately, then lauches ``cgt`` (or *any* command, with the environment appropriately, then lauches ``cgt`` (or *any* command, with the
``--run=<COMMAND>`` option). ``--run=<COMMAND>`` option).
Conversely, you can setup the current shell environment for Coriolis by Conversely, you can setup the current shell environement for Coriolis by
using the helper ``coriolisEnv.py``, then run any Coriolis tool: :: using the helper ``coriolisEnv.py``, then run any Coriolis tool: ::
ego@home:~$ eval `~/coriolis-2.x/src/coriolis/bootstrap/coriolisEnv.py` ego@home:~$ eval `~/coriolis-2.x/src/coriolis/bootstrap/coriolisEnv.py`

View File

@ -7,7 +7,7 @@
option(CHECK_DATABASE "Run database in full check mode (very slow)" OFF) option(CHECK_DATABASE "Run database in full check mode (very slow)" OFF)
option(USE_LIBBFD "Link with BFD libraries to print stack traces" OFF) option(USE_LIBBFD "Link with BFD libraries to print stack traces" OFF)
cmake_minimum_required(VERSION 3.16) cmake_minimum_required(VERSION 3.18)
set(ignoreVariables "${BUILD_DOC} ${CMAKE_INSTALL_DIR}") set(ignoreVariables "${BUILD_DOC} ${CMAKE_INSTALL_DIR}")
@ -18,9 +18,9 @@
set_cmake_policies() set_cmake_policies()
setup_boost(program_options) setup_boost(program_options)
setup_qt() setup_qt()
setup_python()
find_package(Libexecinfo REQUIRED) find_package(Libexecinfo REQUIRED)
find_package(Python 3 REQUIRED COMPONENTS Interpreter Development.Module)
find_package(PythonSitePackages REQUIRED) find_package(PythonSitePackages REQUIRED)
find_package(LEFDEF REQUIRED) find_package(LEFDEF REQUIRED)
find_package(FLUTE REQUIRED) find_package(FLUTE REQUIRED)

View File

@ -9,7 +9,7 @@
option(CHECK_DATABASE "Run database in full check mode (very slow)" OFF) option(CHECK_DATABASE "Run database in full check mode (very slow)" OFF)
option(USE_LIBBFD "Link with BFD libraries to print stack traces" OFF) option(USE_LIBBFD "Link with BFD libraries to print stack traces" OFF)
cmake_minimum_required(VERSION 3.16) cmake_minimum_required(VERSION 3.18)
list(INSERT CMAKE_MODULE_PATH 0 "${DESTDIR}$ENV{CORIOLIS_TOP}/share/cmake/Modules/") list(INSERT CMAKE_MODULE_PATH 0 "${DESTDIR}$ENV{CORIOLIS_TOP}/share/cmake/Modules/")
find_package(Bootstrap REQUIRED) find_package(Bootstrap REQUIRED)
@ -18,8 +18,8 @@
set_cmake_policies() set_cmake_policies()
setup_boost() setup_boost()
setup_qt() setup_qt()
setup_python()
find_package(Python 3 REQUIRED COMPONENTS Interpreter Development.Module)
find_package(PythonSitePackages REQUIRED) find_package(PythonSitePackages REQUIRED)
find_package(FLUTE REQUIRED) find_package(FLUTE REQUIRED)
find_package(HURRICANE REQUIRED) find_package(HURRICANE REQUIRED)

View File

@ -3069,7 +3069,6 @@ namespace Anabatic {
if (wPitch > 1) segment->setFlags( SegWide ); if (wPitch > 1) segment->setFlags( SegWide );
if (source->canDrag() or target->canDrag()) segment->setFlags( SegDrag ); if (source->canDrag() or target->canDrag()) segment->setFlags( SegDrag );
if (dir & Flags::UseNonPref) segment->setFlags( SegNonPref ); if (dir & Flags::UseNonPref) segment->setFlags( SegNonPref );
if (dir.contains(Flags::UseNonPref|Flags::OnVSmall)) segment->setFlags( SegOnVSmall );
return segment; return segment;
} }

View File

@ -90,7 +90,6 @@ endif ( CHECK_DETERMINISM )
${QtX_LIBRARIES} ${QtX_LIBRARIES}
${Boost_LIBRARIES} ${Boost_LIBRARIES}
${LIBXML2_LIBRARIES} ${LIBXML2_LIBRARIES}
${Python3_LIBRARIES}
-lutil -lutil
) )

View File

@ -132,7 +132,6 @@ namespace Anabatic {
const BaseFlags Flags::NoMinLength = (1L << 37); const BaseFlags Flags::NoMinLength = (1L << 37);
const BaseFlags Flags::NoSegExt = (1L << 38); const BaseFlags Flags::NoSegExt = (1L << 38);
const BaseFlags Flags::NullLength = (1L << 39); const BaseFlags Flags::NullLength = (1L << 39);
const BaseFlags Flags::OnVSmall = (1L << 40);
Flags::~Flags () Flags::~Flags ()

View File

@ -277,9 +277,7 @@ namespace Anabatic {
if (flags & (VSmall|UseNonPref)) { if (flags & (VSmall|UseNonPref)) {
cdebug_log(145,0) << "case: UseNonPref" << endl; cdebug_log(145,0) << "case: UseNonPref" << endl;
if (flags & VSmall)
useNonPref.reset( Flags::UseNonPref );
AutoContact* subContact1 = AutoContactTurn::create( gcell, rp->getNet(), Session::getBuildContactLayer(rpDepth+1) ); AutoContact* subContact1 = AutoContactTurn::create( gcell, rp->getNet(), Session::getBuildContactLayer(rpDepth+1) );
AutoSegment::create( rpSourceContact, subContact1, Flags::Vertical|useNonPref ); AutoSegment::create( rpSourceContact, subContact1, Flags::Vertical|useNonPref );
rpSourceContact = subContact1; rpSourceContact = subContact1;
@ -1157,8 +1155,8 @@ namespace Anabatic {
} }
for ( size_t i=1 ; i<rpsM1.size() ; ++i ) { for ( size_t i=1 ; i<rpsM1.size() ; ++i ) {
AutoContact* leftContact = doRp_Access( getGCell(), rpsM1[i-1], HAccess ); AutoContact* leftContact = doRp_Access( getGCell(), getRoutingPads()[i-1], HAccess );
AutoContact* rightContact = doRp_Access( getGCell(), rpsM1[i ], HAccess ); AutoContact* rightContact = doRp_Access( getGCell(), getRoutingPads()[i ], HAccess );
AutoSegment::create( leftContact, rightContact, Flags::Horizontal ); AutoSegment::create( leftContact, rightContact, Flags::Horizontal );
} }

View File

@ -109,7 +109,6 @@ namespace Anabatic {
static const uint64_t SegNonPref = (1L<<37); static const uint64_t SegNonPref = (1L<<37);
static const uint64_t SegAtMinArea = (1L<<38); static const uint64_t SegAtMinArea = (1L<<38);
static const uint64_t SegNoMoveUp = (1L<<39); static const uint64_t SegNoMoveUp = (1L<<39);
static const uint64_t SegOnVSmall = (1L<<40);
// Masks. // Masks.
static const uint64_t SegWeakTerminal = SegStrongTerminal|SegWeakTerminal1|SegWeakTerminal2; static const uint64_t SegWeakTerminal = SegStrongTerminal|SegWeakTerminal1|SegWeakTerminal2;
static const uint64_t SegNotAligned = SegNotSourceAligned|SegNotTargetAligned; static const uint64_t SegNotAligned = SegNotSourceAligned|SegNotTargetAligned;
@ -203,7 +202,6 @@ namespace Anabatic {
inline bool isTerminal () const; inline bool isTerminal () const;
inline bool isUnbreakable () const; inline bool isUnbreakable () const;
inline bool isNonPref () const; inline bool isNonPref () const;
inline bool isNonPrefOnVSmall () const;
inline bool isDrag () const; inline bool isDrag () const;
inline bool isAtMinArea () const; inline bool isAtMinArea () const;
inline bool isNotSourceAligned () const; inline bool isNotSourceAligned () const;
@ -538,7 +536,6 @@ namespace Anabatic {
inline bool AutoSegment::isLocal () const { return not (_flags & SegGlobal); } inline bool AutoSegment::isLocal () const { return not (_flags & SegGlobal); }
inline bool AutoSegment::isUnbreakable () const { return _flags & SegUnbreakable; } inline bool AutoSegment::isUnbreakable () const { return _flags & SegUnbreakable; }
inline bool AutoSegment::isNonPref () const { return _flags & SegNonPref; } inline bool AutoSegment::isNonPref () const { return _flags & SegNonPref; }
inline bool AutoSegment::isNonPrefOnVSmall () const { return (_flags & SegNonPref) and (_flags & SegOnVSmall); }
inline bool AutoSegment::isBipoint () const { return _flags & SegBipoint; } inline bool AutoSegment::isBipoint () const { return _flags & SegBipoint; }
inline bool AutoSegment::isWeakTerminal () const { return (_rpDistance < 2); } inline bool AutoSegment::isWeakTerminal () const { return (_rpDistance < 2); }
inline bool AutoSegment::isWeakTerminal1 () const { return (_rpDistance == 1); } inline bool AutoSegment::isWeakTerminal1 () const { return (_rpDistance == 1); }

View File

@ -110,7 +110,6 @@ namespace Anabatic {
static const BaseFlags NoMinLength ; static const BaseFlags NoMinLength ;
static const BaseFlags NoSegExt ; static const BaseFlags NoSegExt ;
static const BaseFlags NullLength ; static const BaseFlags NullLength ;
static const BaseFlags OnVSmall ;
public: public:
inline Flags ( uint64_t flags = NoFlags ); inline Flags ( uint64_t flags = NoFlags );
inline Flags ( const Hurricane::BaseFlags& ); inline Flags ( const Hurricane::BaseFlags& );

View File

@ -3,7 +3,7 @@
set(CMAKE_LEGACY_CYGWIN_WIN32 0) set(CMAKE_LEGACY_CYGWIN_WIN32 0)
project(Bootstrap) project(Bootstrap)
cmake_minimum_required(VERSION 3.16) cmake_minimum_required(VERSION 3.18)
set(ignoreVariables USE_LIBBFD "${BUILD_DOC} ${CMAKE_INSTALL_DIR}") set(ignoreVariables USE_LIBBFD "${BUILD_DOC} ${CMAKE_INSTALL_DIR}")

View File

@ -1,26 +1,12 @@
#!/bin/bash #!/bin/bash
#. /etc/*-release
#arch="Linux.el9"
#if [ "`echo ${VERSION} | cut -c 1`" == "7" ]; then
# echo "Building for RHEL 7"
# arch="Linux.el7_64"
#fi
arch="Linux.el9"
if [ "`hostname -s`" == "bop" ]; then
echo "Building for RHEL 7"
arch="Linux.el7_64"
fi
nightly="" nightly=""
if [[ "`pwd`" =~ /nightly/ ]]; then if [[ "`pwd`" =~ /nightly/ ]]; then
nightly="/nightly" nightly="/nightly"
fi fi
srcDir=${HOME}${nightly}/coriolis-2.x/src/alliance/alliance/src srcDir=${HOME}${nightly}/coriolis-2.x/src/alliance/alliance/src
commonRoot=${HOME}${nightly}/coriolis-2.x/${arch}/Release.Shared commonRoot=${HOME}${nightly}/coriolis-2.x/Linux.el9/Release.Shared
#commonRoot=${HOME}${nightly}/coriolis-2.x/${arch}/Debug.Shared
buildDir=${commonRoot}/build buildDir=${commonRoot}/build
installDir=${commonRoot}/install installDir=${commonRoot}/install

View File

@ -21,12 +21,11 @@ projects = [
, "etesian" , "etesian"
, "anabatic" , "anabatic"
, "katana" , "katana"
#, "knik" , "knik"
#, "katabatic" , "katabatic"
#, "kite" , "kite"
#, "equinox" , "equinox"
#, "solstice" , "solstice"
, "tramontana"
, "oroshi" , "oroshi"
, "bora" , "bora"
, "karakaze" , "karakaze"

View File

@ -35,13 +35,12 @@ class Builder:
self._noCache = False self._noCache = False
self._ninja = False self._ninja = False
self._clang = False self._clang = False
self._manylinux = False
self._noSystemBoost = False self._noSystemBoost = False
self._macports = False self._macports = False
self._devtoolset = 0 self._devtoolset = 0
self._llvmtoolset = 0 self._llvmtoolset = 0
self._bfd = "OFF" self._bfd = "OFF"
self._qt4 = False self._qt5 = False
self._openmp = False self._openmp = False
self._enableShared = "ON" self._enableShared = "ON"
self._enableDoc = "OFF" self._enableDoc = "OFF"
@ -63,7 +62,6 @@ class Builder:
elif attribute == "noCache": self._noCache = value elif attribute == "noCache": self._noCache = value
elif attribute == "ninja": self._ninja = value elif attribute == "ninja": self._ninja = value
elif attribute == "clang": self._clang = value elif attribute == "clang": self._clang = value
elif attribute == "manylinux": self._manylinux = value
elif attribute == "macports": elif attribute == "macports":
self._macports = value self._macports = value
if value: self._noSystemBoost = True if value: self._noSystemBoost = True
@ -73,7 +71,7 @@ class Builder:
elif attribute == "llvmtoolset": elif attribute == "llvmtoolset":
self._llvmtoolset = value self._llvmtoolset = value
elif attribute == "bfd": self._bfd = value elif attribute == "bfd": self._bfd = value
elif attribute == "qt4": self._qt4 = value elif attribute == "qt5": self._qt5 = value
elif attribute == "openmp": self._openmp = value elif attribute == "openmp": self._openmp = value
elif attribute == "enableDoc": self._enableDoc = value elif attribute == "enableDoc": self._enableDoc = value
elif attribute == "enableShared": self._enableShared = value elif attribute == "enableShared": self._enableShared = value
@ -177,9 +175,8 @@ class Builder:
#, "-D", "BOOST_LIBRARYDIR:STRING=/usr/lib64/boost169" #, "-D", "BOOST_LIBRARYDIR:STRING=/usr/lib64/boost169"
] ]
if self._bfd: command += [ "-D", "USE_LIBBFD:STRING=%s" % self._bfd ] if self._bfd: command += [ "-D", "USE_LIBBFD:STRING=%s" % self._bfd ]
if self._qt4: command += [ "-D", "WITH_QT4:STRING=TRUE" ] if self._qt5: command += [ "-D", "WITH_QT5:STRING=TRUE" ]
if self._openmp: command += [ "-D", "WITH_OPENMP:STRING=TRUE" ] if self._openmp: command += [ "-D", "WITH_OPENMP:STRING=TRUE" ]
if self._manylinux: command += [ "-D", "USE_MANYLINUX:STRING=TRUE" ]
command += [ "-D", "CMAKE_BUILD_TYPE:STRING=%s" % self.buildMode command += [ "-D", "CMAKE_BUILD_TYPE:STRING=%s" % self.buildMode
#, "-D", "BUILD_SHARED_LIBS:STRING=%s" % self.enableShared #, "-D", "BUILD_SHARED_LIBS:STRING=%s" % self.enableShared
, "-D", "CMAKE_INSTALL_PREFIX:STRING=%s" % self.installDir , "-D", "CMAKE_INSTALL_PREFIX:STRING=%s" % self.installDir

View File

@ -2,7 +2,7 @@
# -*- mode:Python -*- # -*- mode:Python -*-
# #
# This file is part of the Coriolis Software. # This file is part of the Coriolis Software.
# Copyright (c) Sorbonne Université 2012-2023, All Rights Reserved # Copyright (c) Sorbonne Université 2012-2021, All Rights Reserved
# #
# +-----------------------------------------------------------------+ # +-----------------------------------------------------------------+
# | C O R I O L I S | # | C O R I O L I S |
@ -122,7 +122,7 @@ class CompileWidget ( QWidget ):
#if self.options.svnStatus: command += [ '--svn-update' ] #if self.options.svnStatus: command += [ '--svn-update' ]
if self.options.enableDoc: command += [ '--doc' ] if self.options.enableDoc: command += [ '--doc' ]
if self.options.devtoolset: command += [ '--devtoolset-8' ] if self.options.devtoolset: command += [ '--devtoolset-8' ]
if self.options.qt4: command += [ '--qt4' ] if self.options.qt5: command += [ '--qt5' ]
if self.options.noCache: command += [ '--no-cache' ] if self.options.noCache: command += [ '--no-cache' ]
if self.options.rmBuild: command += [ '--rm-build' ] if self.options.rmBuild: command += [ '--rm-build' ]
if self.options.verbose: command += [ '--verbose' ] if self.options.verbose: command += [ '--verbose' ]

View File

@ -57,7 +57,7 @@ class OptionsWidget ( QWidget ):
self._make = QCheckBox( 'Build' ) self._make = QCheckBox( 'Build' )
self._enableDoc = QCheckBox( 'Build Documentation' ) self._enableDoc = QCheckBox( 'Build Documentation' )
self._devtoolset = QCheckBox( 'Build with devtoolset 8' ) self._devtoolset = QCheckBox( 'Build with devtoolset 8' )
self._qt4 = QCheckBox( 'Build with Qt 4 (Qt 5 default)' ) self._qt5 = QCheckBox( 'Build with Qt 5 (Qt 4 default)' )
self._noCache = QCheckBox( 'Remove previous CMake cache' ) self._noCache = QCheckBox( 'Remove previous CMake cache' )
self._rmBuild = QCheckBox( 'Cleanup Build Directory' ) self._rmBuild = QCheckBox( 'Cleanup Build Directory' )
self._verbose = QCheckBox( 'Display Compiler Commands' ) self._verbose = QCheckBox( 'Display Compiler Commands' )
@ -83,7 +83,7 @@ class OptionsWidget ( QWidget ):
vLayout.addWidget( self._buildMode ) vLayout.addWidget( self._buildMode )
vLayout.addWidget( self._enableDoc ) vLayout.addWidget( self._enableDoc )
vLayout.addWidget( self._devtoolset ) vLayout.addWidget( self._devtoolset )
vLayout.addWidget( self._qt4 ) vLayout.addWidget( self._qt5 )
vLayout.addWidget( self._noCache ) vLayout.addWidget( self._noCache )
vLayout.addWidget( self._rmBuild ) vLayout.addWidget( self._rmBuild )
vLayout.addStretch() vLayout.addStretch()
@ -121,7 +121,7 @@ class OptionsWidget ( QWidget ):
def _getMake ( self ): return self._make.isChecked() def _getMake ( self ): return self._make.isChecked()
def _getEnableDoc ( self ): return self._enableDoc.isChecked() def _getEnableDoc ( self ): return self._enableDoc.isChecked()
def _getDevtoolset ( self ): return self._devtoolset.isChecked() def _getDevtoolset ( self ): return self._devtoolset.isChecked()
def _getQt4 ( self ): return self._qt4.isChecked() def _getQt5 ( self ): return self._qt5.isChecked()
def _getNoCache ( self ): return self._noCache.isChecked() def _getNoCache ( self ): return self._noCache.isChecked()
def _getRmBuild ( self ): return self._rmBuild.isChecked() def _getRmBuild ( self ): return self._rmBuild.isChecked()
def _getVerbose ( self ): return self._verbose.isChecked() def _getVerbose ( self ): return self._verbose.isChecked()
@ -134,7 +134,7 @@ class OptionsWidget ( QWidget ):
make = property( _getMake ) make = property( _getMake )
enableDoc = property( _getEnableDoc ) enableDoc = property( _getEnableDoc )
devtoolset = property( _getDevtoolset ) devtoolset = property( _getDevtoolset )
qt4 = property( _getQt4 ) qt5 = property( _getQt5 )
noCache = property( _getNoCache ) noCache = property( _getNoCache )
rmBuild = property( _getRmBuild ) rmBuild = property( _getRmBuild )
verbose = property( _getVerbose ) verbose = property( _getVerbose )
@ -146,7 +146,7 @@ class OptionsWidget ( QWidget ):
self._make .setChecked( bool(settings.value('builder/make' )) ) self._make .setChecked( bool(settings.value('builder/make' )) )
self._enableDoc .setChecked( bool(settings.value('builder/enableDoc' )) ) self._enableDoc .setChecked( bool(settings.value('builder/enableDoc' )) )
self._devtoolset .setChecked( bool(settings.value('builder/devtoolset')) ) self._devtoolset .setChecked( bool(settings.value('builder/devtoolset')) )
self._qt4 .setChecked( bool(settings.value('builder/qt4' )) ) self._qt5 .setChecked( bool(settings.value('builder/qt5' )) )
self._noCache .setChecked( bool(settings.value('builder/noCache' )) ) self._noCache .setChecked( bool(settings.value('builder/noCache' )) )
self._rmBuild .setChecked( bool(settings.value('builder/rmBuild' )) ) self._rmBuild .setChecked( bool(settings.value('builder/rmBuild' )) )
self._verbose .setChecked( bool(settings.value('builder/verbose' )) ) self._verbose .setChecked( bool(settings.value('builder/verbose' )) )
@ -169,7 +169,7 @@ class OptionsWidget ( QWidget ):
settings.setValue('builder/make' , self._make .isChecked() ) settings.setValue('builder/make' , self._make .isChecked() )
settings.setValue('builder/enableDoc' , self._enableDoc .isChecked() ) settings.setValue('builder/enableDoc' , self._enableDoc .isChecked() )
settings.setValue('builder/devtoolset', self._devtoolset.isChecked() ) settings.setValue('builder/devtoolset', self._devtoolset.isChecked() )
settings.setValue('builder/qt4' , self._qt4 .isChecked() ) settings.setValue('builder/qt5' , self._qt5 .isChecked() )
settings.setValue('builder/buildMode' , self._buildMode .currentText() ) settings.setValue('builder/buildMode' , self._buildMode .currentText() )
settings.setValue('builder/noCache' , self._noCache .isChecked() ) settings.setValue('builder/noCache' , self._noCache .isChecked() )
settings.setValue('builder/rmBuild' , self._rmBuild .isChecked() ) settings.setValue('builder/rmBuild' , self._rmBuild .isChecked() )

View File

@ -206,12 +206,11 @@ parser.add_option ( "--rm-build" , action="store_true" ,
parser.add_option ( "--macports" , action="store_true" , dest="macports" , help="Build against MacPorts." ) parser.add_option ( "--macports" , action="store_true" , dest="macports" , help="Build against MacPorts." )
parser.add_option ( "--devtoolset" , action="store" , type="int" , dest="devtoolset" , help="Build against TUV Dev Toolset N." ) parser.add_option ( "--devtoolset" , action="store" , type="int" , dest="devtoolset" , help="Build against TUV Dev Toolset N." )
parser.add_option ( "--llvm-toolset" , action="store" , type="int" , dest="llvmtoolset" , help="Build against TUV Dev LLVM Toolset N." ) parser.add_option ( "--llvm-toolset" , action="store" , type="int" , dest="llvmtoolset" , help="Build against TUV Dev LLVM Toolset N." )
parser.add_option ( "--qt4" , action="store_true" , dest="qt4" , help="Build against Qt 4 (default: Qt 5)." ) parser.add_option ( "--qt5" , action="store_true" , dest="qt5" , help="Build against Qt 5 (default: Qt 4)." )
parser.add_option ( "--bfd" , action="store_true" , dest="bfd" , help="Link against BFD to enable stack trace display." ) parser.add_option ( "--bfd" , action="store_true" , dest="bfd" , help="Build against Qt 5 (default: Qt 4)." )
parser.add_option ( "--openmp" , action="store_true" , dest="openmp" , help="Enable the use of OpenMP in Gcc." ) parser.add_option ( "--openmp" , action="store_true" , dest="openmp" , help="Enable the use of OpenMP in Gcc." )
parser.add_option ( "--ninja" , action="store_true" , dest="ninja" , help="Use Ninja instead of UNIX Makefile." ) parser.add_option ( "--ninja" , action="store_true" , dest="ninja" , help="Use Ninja instead of UNIX Makefile." )
parser.add_option ( "--clang" , action="store_true" , dest="clang" , help="Force use of Clang C/C++ compiler instead of system default." ) parser.add_option ( "--clang" , action="store_true" , dest="clang" , help="Force use of Clang C/C++ compiler instead of system default." )
parser.add_option ( "--manylinux" , action="store_true" , dest="manylinux" , help="Build target is manylinux (PyPY)." )
parser.add_option ( "--make" , action="store" , type="string", dest="makeArguments" , help="Arguments to pass to make (ex: \"-j4 install\")." ) parser.add_option ( "--make" , action="store" , type="string", dest="makeArguments" , help="Arguments to pass to make (ex: \"-j4 install\")." )
parser.add_option ( "--project" , action="append" , type="string", dest="projects" , help="The name of a project to build (may appears any number of time)." ) parser.add_option ( "--project" , action="append" , type="string", dest="projects" , help="The name of a project to build (may appears any number of time)." )
parser.add_option ( "-t", "--tool" , action="append" , type="string", dest="tools" , help="The name of a tool to build (may appears any number of time)." ) parser.add_option ( "-t", "--tool" , action="append" , type="string", dest="tools" , help="The name of a tool to build (may appears any number of time)." )
@ -282,8 +281,7 @@ else:
if options.devtoolset: builder.devtoolset = options.devtoolset if options.devtoolset: builder.devtoolset = options.devtoolset
if options.llvmtoolset: builder.llvmtoolset = options.llvmtoolset if options.llvmtoolset: builder.llvmtoolset = options.llvmtoolset
if options.bfd: builder.bfd = "ON" if options.bfd: builder.bfd = "ON"
if options.qt4: builder.qt4 = True if options.qt5: builder.qt5 = True
if options.manylinux: builder.manylinux = True
if options.openmp: builder.openmp = True if options.openmp: builder.openmp = True
if options.makeArguments: builder.makeArguments = options.makeArguments if options.makeArguments: builder.makeArguments = options.makeArguments
#if options.svnMethod: builder.svnMethod = options.svnMethod #if options.svnMethod: builder.svnMethod = options.svnMethod

View File

@ -9,7 +9,6 @@
FindQwt.cmake FindQwt.cmake
FindSphinx.cmake FindSphinx.cmake
FindPelican.cmake FindPelican.cmake
FindCOLOQUINTE.cmake
GetGitRevisionDescription.cmake GetGitRevisionDescription.cmake
GetGitRevisionDescription.cmake.in GetGitRevisionDescription.cmake.in
) )

View File

@ -83,20 +83,20 @@
#set(DEBUG_FLAGS "-g -D_GLIBCXX_DEBUG -D_GLIBCXX_DEBUG_PEDANTIC") #set(DEBUG_FLAGS "-g -D_GLIBCXX_DEBUG -D_GLIBCXX_DEBUG_PEDANTIC")
set(DEBUG_FLAGS "-g") set(DEBUG_FLAGS "-g")
if(CYGWIN) if(CYGWIN)
set(ADDITIONAL_FLAGS "-D_GLIBCXX_USE_C99") set(ADDTIONAL_FLAGS "-D_GLIBCXX_USE_C99")
set(CXX_STANDARD "gnu++17") set(CXX_STANDARD "gnu++11")
else() else()
set(ADDITIONAL_FLAGS "-Wl,--no-undefined") set(ADDTIONAL_FLAGS "")
set(CXX_STANDARD "c++17") set(CXX_STANDARD "c++11")
endif() endif()
#set(CMAKE_C_FLAGS_DEBUG " -Wall -fsanitize=address ${ADDITIONAL_FLAGS} ${DEBUG_FLAGS}" CACHE STRING "C Compiler Debug options." FORCE) #set(CMAKE_C_FLAGS_DEBUG " -Wall -fsanitize=address ${ADDTIONAL_FLAGS} ${DEBUG_FLAGS}" CACHE STRING "C Compiler Debug options." FORCE)
set(CMAKE_C_FLAGS_DEBUG " -Wall ${ADDITIONAL_FLAGS} ${DEBUG_FLAGS}" CACHE STRING "C Compiler Debug options." FORCE) set(CMAKE_C_FLAGS_DEBUG " -Wall ${ADDTIONAL_FLAGS} ${DEBUG_FLAGS}" CACHE STRING "C Compiler Debug options." FORCE)
set(CMAKE_C_FLAGS_RELEASE " -Wall -O2 ${ADDITIONAL_FLAGS} -DNDEBUG" CACHE STRING "C Compiler Release options." FORCE) set(CMAKE_C_FLAGS_RELEASE " -Wall -O2 ${ADDTIONAL_FLAGS} -DNDEBUG" CACHE STRING "C Compiler Release options." FORCE)
#set(CMAKE_C_FLAGS_RELEASE " -Wall -fsanitize=address ${ADDITIONAL_FLAGS} -DNDEBUG" CACHE STRING "C Compiler Release options." FORCE) #set(CMAKE_C_FLAGS_RELEASE " -Wall -fsanitize=address ${ADDTIONAL_FLAGS} -DNDEBUG" CACHE STRING "C Compiler Release options." FORCE)
#set(CMAKE_CXX_FLAGS_DEBUG "-std=${CXX_STANDARD} -Wall -fsanitize=address ${ADDITIONAL_FLAGS} ${DEBUG_FLAGS}" CACHE STRING "C++ Compiler Debug options." FORCE) #set(CMAKE_CXX_FLAGS_DEBUG "-std=${CXX_STANDARD} -Wall -fsanitize=address ${ADDTIONAL_FLAGS} ${DEBUG_FLAGS}" CACHE STRING "C++ Compiler Debug options." FORCE)
set(CMAKE_CXX_FLAGS_DEBUG "-std=${CXX_STANDARD} -Wall ${ADDITIONAL_FLAGS} ${DEBUG_FLAGS}" CACHE STRING "C++ Compiler Debug options." FORCE) set(CMAKE_CXX_FLAGS_DEBUG "-std=${CXX_STANDARD} -Wall ${ADDTIONAL_FLAGS} ${DEBUG_FLAGS}" CACHE STRING "C++ Compiler Debug options." FORCE)
set(CMAKE_CXX_FLAGS_RELEASE "-std=${CXX_STANDARD} -Wall -O2 ${ADDITIONAL_FLAGS} -DNDEBUG" CACHE STRING "C++ Compiler Release options." FORCE) set(CMAKE_CXX_FLAGS_RELEASE "-std=${CXX_STANDARD} -Wall -O2 ${ADDTIONAL_FLAGS} -DNDEBUG" CACHE STRING "C++ Compiler Release options." FORCE)
#set(CMAKE_CXX_FLAGS_RELEASE "-std=${CXX_STANDARD} -Wall -fsanitize=address ${ADDITIONAL_FLAGS} -DNDEBUG" CACHE STRING "C++ Compiler Release options." FORCE) #set(CMAKE_CXX_FLAGS_RELEASE "-std=${CXX_STANDARD} -Wall -fsanitize=address ${ADDTIONAL_FLAGS} -DNDEBUG" CACHE STRING "C++ Compiler Release options." FORCE)
if ( NOT CMAKE_BUILD_TYPE ) if ( NOT CMAKE_BUILD_TYPE )
@ -223,35 +223,11 @@ endif()
endmacro(setup_boost) endmacro(setup_boost)
#
# Setup Python, select detection depending on USE_MANYLINUX.
#
macro(setup_python)
set(pydevelArg "Development")
if (USE_MANYLINUX)
message(STATUS "Build for manylinux")
set(pydevelArg "Development.Module")
endif()
find_package(Python 3 REQUIRED COMPONENTS Interpreter ${pydevelArg} )
endmacro()
# #
# Find Qt, the union of all the modules we need for the whole project. # Find Qt, the union of all the modules we need for the whole project.
# #
macro(setup_qt) macro(setup_qt)
if(WITH_QT4) if(WITH_QT5)
message(STATUS "Attempt to find Qt 4...")
# For Qt4.
#set(QT_USE_QTXML "true")
set(QT_USE_QTSVG "true")
find_package(Qt4 REQUIRED)
include(${QT_USE_FILE})
# ${QT_QTSVG_LIBRARY}
set(QtX_INCLUDE_DIRS ${QT_INCLUDE_DIR})
set(QtX_LIBRARIES ${QT_LIBRARIES})
else()
message(STATUS "Attempt to find Qt 5...") message(STATUS "Attempt to find Qt 5...")
# For Qt5 # For Qt5
find_package(Qt5Core REQUIRED) find_package(Qt5Core REQUIRED)
@ -271,22 +247,32 @@ endif()
${Qt5Core_LIBRARIES} ) ${Qt5Core_LIBRARIES} )
#message(STATUS "QtX_INCLUDE_DIRS: ${QtX_INCLUDE_DIRS}") #message(STATUS "QtX_INCLUDE_DIRS: ${QtX_INCLUDE_DIRS}")
#message(STATUS "QtX_LIBRARIES: ${QtX_LIBRARIES}") #message(STATUS "QtX_LIBRARIES: ${QtX_LIBRARIES}")
else()
message(STATUS "Attempt to find Qt 4...")
# For Qt4.
#set(QT_USE_QTXML "true")
set(QT_USE_QTSVG "true")
find_package(Qt4 REQUIRED)
include(${QT_USE_FILE})
# ${QT_QTSVG_LIBRARY}
set(QtX_INCLUDE_DIRS ${QT_INCLUDE_DIR})
set(QtX_LIBRARIES ${QT_LIBRARIES})
endif() endif()
endmacro() endmacro()
macro(qtX_wrap_cpp variable) macro(qtX_wrap_cpp variable)
if (WITH_QT4) if (WITH_QT5)
qt4_wrap_cpp(${variable} ${ARGN})
else()
qt5_wrap_cpp(${variable} ${ARGN}) qt5_wrap_cpp(${variable} ${ARGN})
else()
qt4_wrap_cpp(${variable} ${ARGN})
endif() endif()
endmacro() endmacro()
macro(qtX_add_resources variable) macro(qtX_add_resources variable)
if (WITH_QT4) if (WITH_QT5)
qt4_add_resources(${variable} ${ARGN})
else()
qt5_add_resources(${variable} ${ARGN}) qt5_add_resources(${variable} ${ARGN})
else()
qt4_add_resources(${variable} ${ARGN})
endif() endif()
endmacro() endmacro()
@ -295,7 +281,15 @@ endif()
# Find Qwt, correlated to the Qt version. # Find Qwt, correlated to the Qt version.
# #
macro(setup_qwt) macro(setup_qwt)
if(WITH_QT4) if(WITH_QT5)
find_path(QWT_INCLUDE_DIR NAMES qwt.h
PATHS /usr/include/qt5
/usr/include
PATH_SUFFIXES qwt )
find_library(QWT_LIBRARY NAMES qwt-qt5 qwt
PATHS /usr/lib64
/usr/lib )
else()
find_path(QWT_INCLUDE_DIR NAMES qwt.h find_path(QWT_INCLUDE_DIR NAMES qwt.h
PATHS /usr/include/qwt-qt4 PATHS /usr/include/qwt-qt4
/opt/local/libexec/qt4/include /opt/local/libexec/qt4/include
@ -306,14 +300,6 @@ endif()
PATHS /opt/local/libexec/qt4/lib PATHS /opt/local/libexec/qt4/lib
/usr/lib64 /usr/lib64
/usr/lib ) /usr/lib )
else()
find_path(QWT_INCLUDE_DIR NAMES qwt.h
PATHS /usr/include/qt5
/usr/include
PATH_SUFFIXES qwt )
find_library(QWT_LIBRARY NAMES qwt-qt5 qwt
PATHS /usr/lib64
/usr/lib )
endif() endif()
if( QWT_INCLUDE_DIR AND QWT_LIBRARY) if( QWT_INCLUDE_DIR AND QWT_LIBRARY)
@ -427,7 +413,7 @@ endif()
add_library( ${clib} ${pyCpps} ) add_library( ${clib} ${pyCpps} )
set_target_properties( ${clib} PROPERTIES VERSION ${version} SOVERSION ${soversion}) set_target_properties( ${clib} PROPERTIES VERSION ${version} SOVERSION ${soversion})
#target_compile_definitions( ${clib} PUBLIC Py_LIMITED_API=1) #target_compile_definitions( ${clib} PUBLIC Py_LIMITED_API=1)
target_link_libraries( ${clib} ${deplibs} ) target_link_libraries( ${clib} ${deplibs} )
install( TARGETS ${clib} DESTINATION lib${LIB_SUFFIX} ) install( TARGETS ${clib} DESTINATION lib${LIB_SUFFIX} )
target_link_options( ${clib} PRIVATE "LINKER:--unresolved-symbols=ignore-all") target_link_options( ${clib} PRIVATE "LINKER:--unresolved-symbols=ignore-all")
@ -441,7 +427,7 @@ endif()
PREFIX "" PREFIX ""
OUTPUT_NAME ${pymodule} OUTPUT_NAME ${pymodule}
) )
#target_compile_definitions( ${pytarget} PUBLIC Py_LIMITED_API=1) #target_compile_definitions( ${pytarget} PUBLIC Py_LIMITED_API=1)
target_link_libraries( ${pytarget} ${pyDeplibs} ) target_link_libraries( ${pytarget} ${pyDeplibs} )
target_link_options( ${pytarget} PRIVATE "LINKER:--unresolved-symbols=ignore-all") target_link_options( ${pytarget} PRIVATE "LINKER:--unresolved-symbols=ignore-all")
@ -466,7 +452,7 @@ endif()
add_library( ${pymodule} MODULE ${pyCpps} ) add_library( ${pymodule} MODULE ${pyCpps} )
set_target_properties( ${pymodule} PROPERTIES PREFIX "" ) set_target_properties( ${pymodule} PROPERTIES PREFIX "" )
target_link_libraries( ${pymodule} ${deplibs} ) target_link_libraries( ${pymodule} ${deplibs} )
#target_compile_definitions( ${pymodule} PUBLIC Py_LIMITED_API=1) # target_compile_definitions( ${pymodule} PUBLIC Py_LIMITED_API=1)
install( TARGETS ${pymodule} DESTINATION ${Python_CORIOLISARCH} ) install( TARGETS ${pymodule} DESTINATION ${Python_CORIOLISARCH} )
if( NOT ("${pyIncludes}" STREQUAL "None") ) if( NOT ("${pyIncludes}" STREQUAL "None") )

View File

@ -9,7 +9,7 @@ if(UNIX AND NOT POETRY)
execute_process(COMMAND "${Python_EXECUTABLE}" "-c" "${SCRIPT}" execute_process(COMMAND "${Python_EXECUTABLE}" "-c" "${SCRIPT}"
RESULT_VARIABLE RETURN_CODE RESULT_VARIABLE RETURN_CODE
OUTPUT_VARIABLE Python_SITEARCH OUTPUT_VARIABLE Python_CORIOLISARCH
OUTPUT_STRIP_TRAILING_WHITESPACE OUTPUT_STRIP_TRAILING_WHITESPACE
) )
@ -19,7 +19,7 @@ if(UNIX AND NOT POETRY)
execute_process(COMMAND "${Python_EXECUTABLE}" "-c" "${SCRIPT}" execute_process(COMMAND "${Python_EXECUTABLE}" "-c" "${SCRIPT}"
RESULT_VARIABLE RETURN_CODE RESULT_VARIABLE RETURN_CODE
OUTPUT_VARIABLE Python_SITELIB OUTPUT_VARIABLE Python_CORIOLISLIB
OUTPUT_STRIP_TRAILING_WHITESPACE OUTPUT_STRIP_TRAILING_WHITESPACE
) )
@ -29,15 +29,12 @@ if(UNIX AND NOT POETRY)
set(FindPythonSitePackages_FOUND FALSE) set(FindPythonSitePackages_FOUND FALSE)
endif(RETURN_CODE EQUAL 0) endif(RETURN_CODE EQUAL 0)
set(Python_CORIOLISARCH "lib${LIB_SUFFIX}/${Python_SITEARCH}/coriolis" set(Python_CORIOLISARCH "lib${LIB_SUFFIX}/${Python_CORIOLISARCH}"
CACHE STRING "Python platform dependent install directory (Coriolis modules)." FORCE) CACHE STRING "Python platform dependent install directory." FORCE)
set(Python_SITELIB "lib${LIB_SUFFIX}/${Python_SITELIB}" set(Python_CORIOLISLIB "lib${LIB_SUFFIX}/${Python_CORIOLISLIB}"
CACHE STRING "Python platform independent install directory." FORCE) CACHE STRING "Python platform independent install directory." FORCE)
set(Python_CORIOLISLIB "${Python_SITELIB}/coriolis"
CACHE STRING "Python platform independent install directory (Coriolis modules)." FORCE)
mark_as_advanced(Python_CORIOLISARCH) mark_as_advanced(Python_CORIOLISARCH)
mark_as_advanced(Python_CORIOLISLIB) mark_as_advanced(Python_CORIOLISLIB)
mark_as_advanced(Python_SITELIB)
if(FindPythonSitePackages_FOUND) if(FindPythonSitePackages_FOUND)
if(NOT FindPythonSitePackages_FIND_QUIETLY) if(NOT FindPythonSitePackages_FIND_QUIETLY)

View File

@ -180,7 +180,7 @@ Development files for the Coriolis 2 package.
%{coriolisTop}/include/vlsisapd/configuration/*.h %{coriolisTop}/include/vlsisapd/configuration/*.h
%{coriolisTop}/include/vlsisapd/dtr/*.h %{coriolisTop}/include/vlsisapd/dtr/*.h
%{coriolisTop}/include/vlsisapd/openChams/*.h %{coriolisTop}/include/vlsisapd/openChams/*.h
%{coriolisTop}/include/coriolis2/coloquinte/*.hpp %{coriolisTop}/include/coriolis2/coloquinte/*.hxx
%{coriolisTop}/include/coriolis2/hurricane/*.h %{coriolisTop}/include/coriolis2/hurricane/*.h
%{coriolisTop}/include/coriolis2/hurricane/viewer/*.h %{coriolisTop}/include/coriolis2/hurricane/viewer/*.h
%{coriolisTop}/include/coriolis2/hurricane/isobar/*.h %{coriolisTop}/include/coriolis2/hurricane/isobar/*.h

View File

@ -17,10 +17,6 @@ reDebugStaticPattern = re.compile( r".*Debug\.Static.*" )
def scrubPath ( pathName ): def scrubPath ( pathName ):
"""
Remove any previous path elements pointing to Coriolis,
so we don't get multiple installed versions tangled together.
"""
pathEnv = os.getenv( pathName ) pathEnv = os.getenv( pathName )
if not pathEnv: return "" if not pathEnv: return ""
pathList = pathEnv.split( ':' ) pathList = pathEnv.split( ':' )
@ -40,31 +36,7 @@ def scrubPath ( pathName ):
return scrubbedEnv return scrubbedEnv
def readLdconfig ():
"""
Read the default paths setup by ldconfig.
.. note:: Disabled now, as it was not the root cause of the
linking problem. Keep as a code example...
"""
ldpath = ''
uname = subprocess.Popen ( ["ldconfig", "-vXN"]
, stdout=subprocess.PIPE
, stderr=subprocess.PIPE )
lines = uname.stdout.readlines()
for rawline in lines:
line = rawline.decode('ascii')
if line[0] != '/': continue
if len(ldpath) > 0: ldpath += ':'
ldpath += line.split(':')[0]
return ldpath
def guessOs (): def guessOs ():
"""
Try to guess under which OS we are running by calling uname.
Also guess if we are using software collections *devtoolset*.
"""
useDevtoolset = False useDevtoolset = False
osEL9 = re.compile (".*Linux.*el9.*x86_64.*") osEL9 = re.compile (".*Linux.*el9.*x86_64.*")
osSlsoc7x_64 = re.compile (".*Linux.*el7.*x86_64.*") osSlsoc7x_64 = re.compile (".*Linux.*el7.*x86_64.*")
@ -130,18 +102,7 @@ def guessOs ():
return ( osType, useDevtoolset ) return ( osType, useDevtoolset )
def guessShell ( defaultShell, osType ): def guessShell ( forcedShell ):
"""
Try to guess the kind shell we are running under, Bourne-like shells
(sh, bash, ksh, zsh) or C-shell likes (csh, tcsh).
Identifies the parent process we are running into, which should be
the shell, and compares to know ones.
.. note:: The SHELL nvironment variable cannot be trusted, it seems
to be set once the user logs in, and if it change afterwards,
it's not updated.
"""
# This environement variable cannot be trusted as it is set once when # This environement variable cannot be trusted as it is set once when
# the user logs in. If aftewards it changes it that variable is *not* # the user logs in. If aftewards it changes it that variable is *not*
# affected :-(. # affected :-(.
@ -157,27 +118,14 @@ def guessShell ( defaultShell, osType ):
, u'/usr/local/bin/csh' , u'/usr/local/bin/csh'
] ]
if shellName is None: if shellName is None:
psCommand = ['ps', '-o', 'comm', '-p', str(os.getppid()) ] psCommand = subprocess.Popen ( ['ps', '-p', str(os.getppid()) ], stdout=subprocess.PIPE )
cmdField = 0 shell = psCommand.stdout.readlines()[1].decode('utf8')[:-1].split()[3].lstrip('-')
if osType.startswith('Cygwin'): whichCommand = subprocess.Popen ( ['which', shell ], stdout=subprocess.PIPE )
psCommand = ['ps', '-p', str(os.getppid()) ] shellPath = whichCommand.stdout.readlines()[0][:-1].decode('utf8')
cmdField = 7 #print( 'GUESSED shellPath={}'.format(shellPath) )
try:
psResult = subprocess.run( psCommand, capture_output=True, check=True )
shell = psResult.stdout.splitlines()[1].decode('utf8').split()[cmdField].lstrip('-')
if shell[0] != '/':
whichCommand = subprocess.run( ['which', shell ], capture_output=True, check=True )
shellPath = whichCommand.stdout.splitlines()[0].decode('utf8')
else:
shellPath = shell
if not options.queryISysRoot and not options.queryInstRoot:
print( 'echo "[GUESSED] shellPath={}";'.format(shellPath) )
except Exception:
shellPath = u'/bin/bash'
print( 'echo "[ERROR] \\"ps\\" command failure, using {}";'.format(shellPath) )
else: else:
shellPath = defaultShell shellPath = forcedShell
print( 'echo "Defaulting to shell {}";'.format(shellPath) ) #print( 'FORCED shellPath={}'.format(shellPath) )
if shellPath in cshBins: if shellPath in cshBins:
#print( 'Matched C-Shell' ) #print( 'Matched C-Shell' )
isBourneShell = False isBourneShell = False
@ -186,6 +134,7 @@ def guessShell ( defaultShell, osType ):
if __name__ == "__main__": if __name__ == "__main__":
osType,useDevtoolset = guessOs() osType,useDevtoolset = guessOs()
buildType = "Release" buildType = "Release"
linkType = "Shared" linkType = "Shared"
@ -214,7 +163,7 @@ if __name__ == "__main__":
if options.shared: linkType = "Shared" if options.shared: linkType = "Shared"
if options.rootDir: rootDir = options.rootDir if options.rootDir: rootDir = options.rootDir
if options.shell: shellName = options.shell if options.shell: shellName = options.shell
shellBin, isBourneShell = guessShell( shellName, osType ) shellBin, isBourneShell = guessShell( shellName )
scriptPath = os.path.abspath( os.path.dirname( sys.argv[0] )) scriptPath = os.path.abspath( os.path.dirname( sys.argv[0] ))
if 'Debug.' in scriptPath: buildType = 'Debug' if 'Debug.' in scriptPath: buildType = 'Debug'
@ -310,7 +259,7 @@ if __name__ == "__main__":
shellMessage = "Using script location Coriolis 2 (%s)" % rootDir shellMessage = "Using script location Coriolis 2 (%s)" % rootDir
if osType.startswith("Cygwin"): if osType.startswith("Cygwin"):
strippedPath = "%s/lib:%s" % ( coriolisTop, strippedPath ) strippedPath = "%s/lib:%s" % ( coriolisTop, libDir, strippedPath )
if not os.path.exists(coriolisTop): if not os.path.exists(coriolisTop):
print( 'echo "[ERROR] coriolisEnv.py, top directory "{}" do not exists."'.format( coriolisTop )) print( 'echo "[ERROR] coriolisEnv.py, top directory "{}" do not exists."'.format( coriolisTop ))
sys.exit( 1 ) sys.exit( 1 )
@ -320,12 +269,11 @@ if __name__ == "__main__":
if os.path.isdir(absLibDir): break if os.path.isdir(absLibDir): break
libDir = None libDir = None
if libDir is None: if libDir is None:
if not options.queryISysRoot and not options.queryInstRoot: print( 'echo "[ERROR] coriolisEnv.py, library directory not found."' )
print( 'echo "[ERROR] coriolisEnv.py, library directory not found."' ) sys.exit( 1 )
sys.exit( 1 )
strippedPath = "%s/bin:%s" % ( coriolisTop, strippedPath ) strippedPath = "%s/bin:%s" % ( coriolisTop, strippedPath )
strippedLibraryPath = "%s:%s" % ( absLibDir , strippedLibraryPath ) strippedLibraryPath = "%s:%s" % ( absLibDir , strippedLibraryPath )
if not options.nopython: if not options.nopython:
pyVersion = sys.version_info pyVersion = sys.version_info
version = "%d.%d" % (pyVersion[0],pyVersion[1]) version = "%d.%d" % (pyVersion[0],pyVersion[1])
@ -340,12 +288,12 @@ if __name__ == "__main__":
if os.path.isdir(pyPackageDir): if os.path.isdir(pyPackageDir):
sitePackagesDir = pyPackageDir sitePackagesDir = pyPackageDir
break break
strippedPythonPath = "%s" % (sitePackagesDir) + strippedPythonPath strippedPythonPath = "%s:" % (sitePackagesDir) + strippedPythonPath
#strippedPythonPath = "%s/crlcore:" % (sitePackagesDir) + strippedPythonPath strippedPythonPath = "%s/crlcore:" % (sitePackagesDir) + strippedPythonPath
#strippedPythonPath = "%s/cumulus:" % (sitePackagesDir) + strippedPythonPath strippedPythonPath = "%s/cumulus:" % (sitePackagesDir) + strippedPythonPath
#strippedPythonPath = "%s/cumulus/plugins:" % (sitePackagesDir) + strippedPythonPath strippedPythonPath = "%s/cumulus/plugins:" % (sitePackagesDir) + strippedPythonPath
#strippedPythonPath = "%s/stratus:" % (sitePackagesDir) + strippedPythonPath strippedPythonPath = "%s/stratus:" % (sitePackagesDir) + strippedPythonPath
#strippedPythonPath = "%s:" % (sysconfDir) + strippedPythonPath strippedPythonPath = "%s:" % (sysconfDir) + strippedPythonPath
shellScriptSh += 'PYTHONPATH="%(PYTHONPATH)s";' \ shellScriptSh += 'PYTHONPATH="%(PYTHONPATH)s";' \
'export PYTHONPATH;' 'export PYTHONPATH;'
shellScriptCsh += 'setenv PYTHONPATH "%(PYTHONPATH)s";' shellScriptCsh += 'setenv PYTHONPATH "%(PYTHONPATH)s";'

View File

@ -129,16 +129,18 @@ def setupPaths ( verbose, debug=False ):
buildType = Path( 'Debug.Shared' if debug else 'Release.Shared' ) buildType = Path( 'Debug.Shared' if debug else 'Release.Shared' )
scriptPath = Path( __file__ ).resolve() scriptPath = Path( __file__ ).resolve()
topDirs = [] topDirs = []
if debug:
topDirs += [ homeDir / 'coriolis-2.x' / osDir / buildType / 'install' topDirs.append( homeDir / 'coriolis-2.x' / osDir / buildType / 'install' )
, Path( '/soc/coriolis2' ) if 'CORIOLIS_TOP' in os.environ:
topDirs.append( Path( os.environ['CORIOLIS_TOP'] ))
if not debug:
topDirs.append( homeDir / 'coriolis-2.x' / osDir / buildType / 'install' )
topDirs += [ Path( '/soc/coriolis2' )
, Path( '/usr' ) , Path( '/usr' )
] ]
if not debug and 'CORIOLIS_TOP' in os.environ:
topDirs.insert( 0, Path( os.environ['CORIOLIS_TOP'] ))
for part in scriptPath.parts: for part in scriptPath.parts:
if part == 'nightly': if part == 'nightly':
topDirs.insert( 0, homeDir / 'nightly' / 'coriolis-2.x' / osDir / buildType / 'install' ) topDirs.append( homeDir / 'nightly' / 'coriolis-2.x' / osDir / buildType / 'install' )
break break
if verbose: if verbose:
print( ' o Self locating Coriolis:' ) print( ' o Self locating Coriolis:' )
@ -154,10 +156,8 @@ def setupPaths ( verbose, debug=False ):
return False return False
os.environ[ 'CORIOLIS_TOP' ] = coriolisTop.as_posix() os.environ[ 'CORIOLIS_TOP' ] = coriolisTop.as_posix()
#if coriolisTop == '/usr': sysconfDir = Path( 'etc', 'coriolis2' ) if coriolisTop == '/usr': sysconfDir = Path( 'etc', 'coriolis2' )
#else: sysconfDir = coriolisTop / 'etc' / 'coriolis2' else: sysconfDir = coriolisTop / 'etc' / 'coriolis2'
if coriolisTop == '/usr': sysconfDir = Path( 'etc' )
else: sysconfDir = coriolisTop / 'etc'
# Setup PATH. # Setup PATH.
binPath = envWriteBack( 'PATH', (coriolisTop/'bin').as_posix() ) binPath = envWriteBack( 'PATH', (coriolisTop/'bin').as_posix() )
@ -205,11 +205,11 @@ def setupPaths ( verbose, debug=False ):
return False return False
pythonPath = '' pythonPath = ''
for packageDir in [ sitePackagesDir for packageDir in [ sitePackagesDir
#, sitePackagesDir / 'crlcore' , sitePackagesDir / 'crlcore'
#, sitePackagesDir / 'cumulus' , sitePackagesDir / 'cumulus'
#, sitePackagesDir / 'cumulus/plugins' , sitePackagesDir / 'cumulus/plugins'
#, sitePackagesDir / 'status' , sitePackagesDir / 'status'
#, sysconfDir , sysconfDir
]: ]:
sys.path.append( str(packageDir) ) sys.path.append( str(packageDir) )
if len(pythonPath): pythonPath += ':' if len(pythonPath): pythonPath += ':'
@ -220,7 +220,7 @@ def setupPaths ( verbose, debug=False ):
def printVariable ( name ): def printVariable ( name ):
if not name in os.environ: if not name in os.environ:
print( '{}:'.format( name )) print( '{:<16}:'.format( name ))
print( '- variable_not_set' ) print( '- variable_not_set' )
return return
values = os.environ[ name ].split( ':' ) values = os.environ[ name ].split( ':' )

View File

@ -232,13 +232,6 @@ class BenchsCommand ( CommandArg ):
def __init__ ( self, benchsDir, fdLog=None ): def __init__ ( self, benchsDir, fdLog=None ):
CommandArg.__init__ ( self, [ '../bin/go.sh' ], wd=benchsDir, fdLog=fdLog ) CommandArg.__init__ ( self, [ '../bin/go.sh' ], wd=benchsDir, fdLog=fdLog )
return return
class PyBenchsCommand ( CommandArg ):
def __init__ ( self, benchsDir, fdLog=None ):
CommandArg.__init__ ( self, [ '../bin/gopy.sh' ], wd=benchsDir, fdLog=fdLog )
return
@ -284,16 +277,6 @@ class GitRepository ( object ):
Command( [ 'git', 'checkout', branch ], self.fdLog ).execute() Command( [ 'git', 'checkout', branch ], self.fdLog ).execute()
return return
def submoduleInit ( self ):
os.chdir( self.localRepoDir )
Command( [ 'git', 'submodule', 'init' ], self.fdLog ).execute()
return
def submoduleUpdate ( self ):
os.chdir( self.localRepoDir )
Command( [ 'git', 'submodule', 'update' ], self.fdLog ).execute()
return
class Configuration ( object ): class Configuration ( object ):
@ -303,7 +286,7 @@ class Configuration ( object ):
, 'homeDir' , 'masterHost' , 'homeDir' , 'masterHost'
, 'debugArg' , 'nightlyMode', 'dockerMode', 'chrootMode' , 'debugArg' , 'nightlyMode', 'dockerMode', 'chrootMode'
, 'rmSource' , 'rmBuild' , 'rmSource' , 'rmBuild'
, 'doGit' , 'doAlliance' , 'doCoriolis', 'doBenchs', 'doPyBenchs', 'doSendReport' , 'doGit' , 'doAlliance' , 'doCoriolis', 'doBenchs', 'doSendReport'
, 'success' , 'rcode' , 'success' , 'rcode'
] ]
SecondaryNames = \ SecondaryNames = \
@ -313,7 +296,7 @@ class Configuration ( object ):
def __init__ ( self ): def __init__ ( self ):
self._sender = 'Jean-Paul.Chaput@soc.lip6.fr' self._sender = 'Jean-Paul.Chaput@soc.lip6.fr'
self._receivers = [ 'Jean-Paul.Chaput@lip6.fr', ] self._receivers = [ 'Jean-Paul.Chaput@lip6.fr', ]
self._supportRepos = [ 'https://github.com/Tencent/rapidjson.git' ] self._supportRepos = [ 'http://github.com/miloyip/rapidjson' ]
self._allianceRepo = 'https://gitlab.lip6.fr/jpc/alliance.git' self._allianceRepo = 'https://gitlab.lip6.fr/jpc/alliance.git'
self._coriolisRepo = 'https://gitlab.lip6.fr/jpc/coriolis.git' self._coriolisRepo = 'https://gitlab.lip6.fr/jpc/coriolis.git'
self._benchsRepo = 'https://gitlab.lip6.fr/jpc/alliance-check-toolkit.git' self._benchsRepo = 'https://gitlab.lip6.fr/jpc/alliance-check-toolkit.git'
@ -326,7 +309,6 @@ class Configuration ( object ):
self._doAlliance = False self._doAlliance = False
self._doCoriolis = False self._doCoriolis = False
self._doBenchs = False self._doBenchs = False
self._doPyBenchs = False
self._doSendReport = False self._doSendReport = False
self._nightlyMode = False self._nightlyMode = False
self._dockerMode = False self._dockerMode = False
@ -450,26 +432,25 @@ class Configuration ( object ):
raise ErrorMessage( 1, [ 'Cannot find <ccb.py>, should be here:' raise ErrorMessage( 1, [ 'Cannot find <ccb.py>, should be here:'
, ' "{}"'.format(self.ccbBin) , ' "{}"'.format(self.ccbBin)
] ) ] )
otherArgs = [] otherArgs = [ '--qt5' ]
if self.debugArg: otherArgs.append( self.debugArg ) if self.debugArg: otherArgs.append( self.debugArg )
if target == 'EL9': if target == 'EL9':
#otherArgs.append( '--project=support' ) otherArgs.append( '--project=support' )
commands.append( CoriolisCommand( self.ccbBin, self.rootDir, 3, otherArgs , fdLog=self.fds['coriolis'] ) ) commands.append( CoriolisCommand( self.ccbBin, self.rootDir, 3, otherArgs , fdLog=self.fds['coriolis'] ) )
#commands.append( CoriolisCommand( self.ccbBin, self.rootDir, 1, otherArgs+['--doc'], fdLog=self.fds['coriolis'] ) ) #commands.append( CoriolisCommand( self.ccbBin, self.rootDir, 1, otherArgs+['--doc'], fdLog=self.fds['coriolis'] ) )
if target == 'SL7_64': if target == 'SL7_64':
otherArgs += [ '--project=support', '--qt4' ] otherArgs.append( '--project=support' )
commands.append( CoriolisCommand( self.ccbBin, self.rootDir, 3, otherArgs , fdLog=self.fds['coriolis'] ) ) commands.append( CoriolisCommand( self.ccbBin, self.rootDir, 3, otherArgs , fdLog=self.fds['coriolis'] ) )
commands.append( CoriolisCommand( self.ccbBin, self.rootDir, 1, otherArgs+['--doc'], fdLog=self.fds['coriolis'] ) ) commands.append( CoriolisCommand( self.ccbBin, self.rootDir, 1, otherArgs+['--doc'], fdLog=self.fds['coriolis'] ) )
elif target == 'SL6_64' or target == 'SL6': elif target == 'SL6_64' or target == 'SL6':
otherArgs += [ '--project=support', '--devtoolset=8', '--qt4' ] otherArgs.append( '--project=support' )
otherArgs.append( '--devtoolset=8' )
commands.append( CoriolisCommand( self.ccbBin, self.rootDir, 6, otherArgs , fdLog=self.fds['coriolis'] ) ) commands.append( CoriolisCommand( self.ccbBin, self.rootDir, 6, otherArgs , fdLog=self.fds['coriolis'] ) )
commands.append( CoriolisCommand( self.ccbBin, self.rootDir, 1, otherArgs+['--doc'], fdLog=self.fds['coriolis'] ) ) commands.append( CoriolisCommand( self.ccbBin, self.rootDir, 1, otherArgs+['--doc'], fdLog=self.fds['coriolis'] ) )
elif target == 'Ubuntu18' or target == 'Debian9' or target == 'Debian10': elif target == 'Ubuntu18' or target == 'Debian9' or target == 'Debian10':
commands.append( CoriolisCommand( self.ccbBin, self.rootDir, 3, otherArgs, fdLog=self.fds['coriolis'] ) ) commands.append( CoriolisCommand( self.ccbBin, self.rootDir, 3, otherArgs, fdLog=self.fds['coriolis'] ) )
if self.doBenchs: if self.doBenchs:
commands.append( BenchsCommand( self.benchsDir, fdLog=self.fds['benchs'] ) ) commands.append( BenchsCommand( self.benchsDir, fdLog=self.fds['benchs'] ) )
if self.doPyBenchs:
commands.append( PyBenchsCommand( self.benchsDir, fdLog=self.fds['benchs'] ) )
return commands return commands
@ -551,8 +532,7 @@ parser.add_option ( "--do-report" , action="store_true" , dest=
parser.add_option ( "--nightly" , action="store_true" , dest="nightly" , help="Perform a nighly build." ) parser.add_option ( "--nightly" , action="store_true" , dest="nightly" , help="Perform a nighly build." )
parser.add_option ( "--docker" , action="store_true" , dest="docker" , help="Perform a build inside a docker container." ) parser.add_option ( "--docker" , action="store_true" , dest="docker" , help="Perform a build inside a docker container." )
parser.add_option ( "--chroot" , action="store_true" , dest="chroot" , help="Perform a build inside a chrooted environment." ) parser.add_option ( "--chroot" , action="store_true" , dest="chroot" , help="Perform a build inside a chrooted environment." )
parser.add_option ( "--benchs" , action="store_true" , dest="benchs" , help="Run the <alliance-checker-toolkit> sanity benchs (make)." ) parser.add_option ( "--benchs" , action="store_true" , dest="benchs" , help="Run the <alliance-checker-toolkit> sanity benchs." )
parser.add_option ( "--pybenchs" , action="store_true" , dest="pybenchs" , help="Run the <alliance-checker-toolkit> sanity benchs (doit)." )
parser.add_option ( "--rm-build" , action="store_true" , dest="rmBuild" , help="Remove the build/install directories." ) parser.add_option ( "--rm-build" , action="store_true" , dest="rmBuild" , help="Remove the build/install directories." )
parser.add_option ( "--rm-source" , action="store_true" , dest="rmSource" , help="Remove the Git source repositories." ) parser.add_option ( "--rm-source" , action="store_true" , dest="rmSource" , help="Remove the Git source repositories." )
parser.add_option ( "--rm-all" , action="store_true" , dest="rmAll" , help="Remove everything (source+build+install)." ) parser.add_option ( "--rm-all" , action="store_true" , dest="rmAll" , help="Remove everything (source+build+install)." )
@ -573,7 +553,6 @@ try:
if options.doAlliance: conf.doAlliance = True if options.doAlliance: conf.doAlliance = True
if options.doCoriolis: conf.doCoriolis = True if options.doCoriolis: conf.doCoriolis = True
if options.benchs: conf.doBenchs = True if options.benchs: conf.doBenchs = True
if options.pybenchs: conf.doPyBenchs = True
if options.doReport: conf.doSendReport = True if options.doReport: conf.doSendReport = True
if options.rmSource or options.rmAll: conf.rmSource = True if options.rmSource or options.rmAll: conf.rmSource = True
if options.rmBuild or options.rmAll: conf.rmBuild = True if options.rmBuild or options.rmAll: conf.rmBuild = True
@ -583,7 +562,6 @@ try:
if conf.doAlliance: conf.openLog( 'alliance' ) if conf.doAlliance: conf.openLog( 'alliance' )
if conf.doCoriolis: conf.openLog( 'coriolis' ) if conf.doCoriolis: conf.openLog( 'coriolis' )
if conf.doBenchs: conf.openLog( 'benchs' ) if conf.doBenchs: conf.openLog( 'benchs' )
if conf.doPyBenchs: conf.openLog( 'benchs' )
if conf.dockerMode: os.environ['USER'] = 'root' if conf.dockerMode: os.environ['USER'] = 'root'
gitSupports = [] gitSupports = []
@ -611,8 +589,6 @@ try:
if conf.rmSource: gitCoriolis.removeLocalRepo() if conf.rmSource: gitCoriolis.removeLocalRepo()
gitCoriolis.clone () gitCoriolis.clone ()
gitCoriolis.checkout( 'devel' ) gitCoriolis.checkout( 'devel' )
gitCoriolis.submoduleInit()
gitCoriolis.submoduleUpdate()
if conf.rmSource: gitBenchs.removeLocalRepo() if conf.rmSource: gitBenchs.removeLocalRepo()
gitBenchs.clone() gitBenchs.clone()

View File

@ -6,7 +6,7 @@
option(BUILD_DOC "Build the documentation (doxygen)" OFF) option(BUILD_DOC "Build the documentation (doxygen)" OFF)
option(USE_LIBBFD "Link with BFD libraries to print stack traces" OFF) option(USE_LIBBFD "Link with BFD libraries to print stack traces" OFF)
cmake_minimum_required(VERSION 3.16) cmake_minimum_required(VERSION 3.18)
set(ignoreVariables "${BUILD_DOC} ${CMAKE_INSTALL_DIR}") set(ignoreVariables "${BUILD_DOC} ${CMAKE_INSTALL_DIR}")
@ -18,9 +18,9 @@
setup_boost(program_options) setup_boost(program_options)
setup_qt() setup_qt()
setup_qwt() setup_qwt()
setup_python()
find_package(Libexecinfo REQUIRED) find_package(Libexecinfo REQUIRED)
find_package(Python 3 REQUIRED COMPONENTS Interpreter Development.Module)
find_package(PythonSitePackages REQUIRED) find_package(PythonSitePackages REQUIRED)
find_package(LEFDEF REQUIRED) find_package(LEFDEF REQUIRED)
find_package(FLUTE REQUIRED) find_package(FLUTE REQUIRED)

View File

@ -1,2 +1,2 @@
install ( FILES initHook.py DESTINATION ${Python_CORIOLISLIB}/bora ) install ( FILES boraInit.py DESTINATION ${Python_CORIOLISLIB}/bora )

View File

@ -2,10 +2,12 @@
try: try:
import sys import sys
import os.path import os.path
from coriolis.helpers.io import ErrorMessage, WarningMessage, catch import helpers.io
import coriolis.Viewer from helpers.io import ErrorMessage
from helpers.io import WarningMessage
import Viewer
except Exception as e: except Exception as e:
catch( e ) helpers.io.catch( e )
sys.exit( 1 ) sys.exit( 1 )
@ -14,12 +16,12 @@ def boraHook ( **kw ):
if 'bora' in kw: if 'bora' in kw:
bora = kw['bora'] bora = kw['bora']
else: else:
print( ErrorMessage( 3, 'bora.initHook(): Must be run from a BoraEngine.' )) print( ErrorMessage( 3, 'boraHook(): Must be run from a BoraEngine.' ))
return return
try: try:
userInit = os.path.join( os.getcwd(), 'coriolis2/bora.py' ) userInit = os.path.join( os.getcwd(), 'coriolis2/bora.py' )
if (os.path.exists(userInit)): if (os.path.exists(userInit)):
exec( open(userInit).read() ) exec( open(userInit).read() )
except Exception as e: except Exception as e:
catch( e ) helpers.io.catch( e )
return return

View File

@ -111,17 +111,17 @@ namespace Bora {
void BoraEngine::_runBoraInit () void BoraEngine::_runBoraInit ()
{ {
Utilities::Path pythonSitePackages = System::getPath("pythonSitePackages"); Utilities::Path pythonSitePackages = System::getPath("pythonSitePackages");
Utilities::Path confFile = "coriolis/bora/initHook.py"; Utilities::Path systemConfDir = pythonSitePackages / "bora";
Utilities::Path systemConfFile = pythonSitePackages / confFile; Utilities::Path systemConfFile = systemConfDir / "boraInit.py";
if (systemConfFile.exists()) { if (systemConfFile.exists()) {
//Isobar::Script::addPath( systemConfDir.toString() ); Isobar::Script::addPath( systemConfDir.toString() );
dbo_ptr<Isobar::Script> script = Isobar::Script::create( confFile.toPyModPath() ); dbo_ptr<Isobar::Script> script = Isobar::Script::create( systemConfFile.stem().toString() );
script->addKwArgument( "bora" , (PyObject*)PyBoraEngine_Link(this) ); script->addKwArgument( "bora" , (PyObject*)PyBoraEngine_Link(this) );
script->runFunction ( "boraHook", getCell() ); script->runFunction ( "boraHook", getCell() );
//Isobar::Script::removePath( systemConfDir.toString() ); Isobar::Script::removePath( systemConfDir.toString() );
} else { } else {
cerr << Warning( "Bora system configuration file:\n <%s> not found." cerr << Warning( "Bora system configuration file:\n <%s> not found."
, systemConfFile.toString().c_str() ) << endl; , systemConfFile.toString().c_str() ) << endl;

View File

@ -1,7 +1,7 @@
// -*- C++ -*- // -*- C++ -*-
// //
// This file is part of the Coriolis Software. // This file is part of the Coriolis Software.
// Copyright (c) Sorbonne Université 2015-2023, All Rights Reserved // Copyright (c) UPMC 2015-2018, All Rights Reserved
// //
// +-----------------------------------------------------------------+ // +-----------------------------------------------------------------+
// | C O R I O L I S | // | C O R I O L I S |
@ -81,20 +81,11 @@ namespace Bora {
: QWidget (parent) : QWidget (parent)
, _viewer (NULL) , _viewer (NULL)
, _plot (new QwtPlot ()) , _plot (new QwtPlot ())
#if QWT_VERSION < 0x060000
, _picker (new QwtPlotPicker( QwtPlot::xBottom // X Axis id.
, QwtPlot::yLeft // Y Axis id.
, QwtPicker::PointSelection
, QwtPicker::CrossRubberBand
, QwtPicker::ActiveOnly
, _plot->canvas()) )
#else
, _picker (new QwtPlotPicker( QwtPlot::xBottom // X Axis id. , _picker (new QwtPlotPicker( QwtPlot::xBottom // X Axis id.
, QwtPlot::yLeft // Y Axis id. , QwtPlot::yLeft // Y Axis id.
, QwtPicker::CrossRubberBand , QwtPicker::CrossRubberBand
, QwtPicker::ActiveOnly , QwtPicker::ActiveOnly
, _plot->canvas()) ) , _plot->canvas()) )
#endif
, _gridDisplay (new QGridLayout()) , _gridDisplay (new QGridLayout())
, _gridLabel () // Label line 2: text , _gridLabel () // Label line 2: text
, _widths (NULL) // Coordinates X for STreeCurve , _widths (NULL) // Coordinates X for STreeCurve
@ -106,9 +97,7 @@ namespace Bora {
, _paretoCurve (new QwtPlotCurve("Pareto")) // Black curve: pareto curve , _paretoCurve (new QwtPlotCurve("Pareto")) // Black curve: pareto curve
, _selectedPoint (new QwtPlotCurve("Selected")) // Red dot : selected placement , _selectedPoint (new QwtPlotCurve("Selected")) // Red dot : selected placement
{ {
#if QWT_VERSION >= 0x060000
_picker->setStateMachine(new QwtPickerClickPointMachine()); _picker->setStateMachine(new QwtPickerClickPointMachine());
#endif
setStyleSheet ( "border: 0px" ); setStyleSheet ( "border: 0px" );
int ptSize = Graphics::isHighDpi() ? 2 : 2; int ptSize = Graphics::isHighDpi() ? 2 : 2;
@ -145,11 +134,7 @@ namespace Bora {
symbol->setStyle( QwtSymbol::Triangle ); symbol->setStyle( QwtSymbol::Triangle );
symbol->setSize ( 6 ); symbol->setSize ( 6 );
symbol->setPen ( dotPen ); symbol->setPen ( dotPen );
#if QWT_VERSION < 0x060000
_STreeCurve->setSymbol( *symbol );
#else
_STreeCurve->setSymbol( symbol ); _STreeCurve->setSymbol( symbol );
#endif
QPen selectPen ( Qt::red ); QPen selectPen ( Qt::red );
selectPen.setWidth( ptSize+2 ); selectPen.setWidth( ptSize+2 );
@ -157,11 +142,7 @@ namespace Bora {
_selectedPoint->setPen ( selectPen ); _selectedPoint->setPen ( selectPen );
_selectedPoint->attach ( _plot ); _selectedPoint->attach ( _plot );
#if QWT_VERSION < 0x060000
connect( _picker, SIGNAL(selected(const QwtDoublePoint&)), this, SLOT(onPointSelect(const QwtDoublePoint&)) );
#else
connect( _picker, SIGNAL(selected(const QPointF&)), this, SLOT(onPointSelect(const QPointF&)) ); connect( _picker, SIGNAL(selected(const QPointF&)), this, SLOT(onPointSelect(const QPointF&)) );
#endif
QVBoxLayout* vLayout = new QVBoxLayout(); QVBoxLayout* vLayout = new QVBoxLayout();
vLayout->addWidget ( _plot ); vLayout->addWidget ( _plot );
@ -289,13 +270,8 @@ namespace Bora {
i++; i++;
} }
#if QWT_VERSION < 0x060000
_STreeCurve->setData ( _widths , _heights , nodeSets->size() );
_paretoCurve->setData( _pareto.xs(), _pareto.ys(), _pareto.size() );
#else
_STreeCurve->setSamples ( _widths , _heights , nodeSets->size() ); _STreeCurve->setSamples ( _widths , _heights , nodeSets->size() );
_paretoCurve->setSamples( _pareto.xs(), _pareto.ys(), _pareto.size() ); _paretoCurve->setSamples( _pareto.xs(), _pareto.ys(), _pareto.size() );
#endif
_STreeCurve->show(); _STreeCurve->show();
_paretoCurve->show(); _paretoCurve->show();
_plot->replot(); _plot->replot();
@ -336,11 +312,7 @@ namespace Bora {
} }
#if QWT_VERSION < 0x060000
void SlicingPlotWidget::onPointSelect ( const QwtDoublePoint& point )
#else
void SlicingPlotWidget::onPointSelect ( const QPointF& point ) void SlicingPlotWidget::onPointSelect ( const QPointF& point )
#endif
{ {
// Clicking on SlicingTree's Pareto Graph: // Clicking on SlicingTree's Pareto Graph:
// 1) Update slicing tree // 1) Update slicing tree
@ -357,13 +329,8 @@ namespace Bora {
cdebug.log(539) << " Selection: [" << point.x() << " " << point.y() << "]" << endl; cdebug.log(539) << " Selection: [" << point.x() << " " << point.y() << "]" << endl;
if ( (iclosest >= 0) and (iclosest < dataSize) ) { if ( (iclosest >= 0) and (iclosest < dataSize) ) {
#if QWT_VERSION < 0x060000
double x = _STreeCurve->x( iclosest );
double y = _STreeCurve->y( iclosest );
#else
double x = _STreeCurve->sample( iclosest ).x(); double x = _STreeCurve->sample( iclosest ).x();
double y = _STreeCurve->sample( iclosest ).y(); double y = _STreeCurve->sample( iclosest ).y();
#endif
ostringstream message; ostringstream message;
message << "(" << DbU::getValueString(x) << "," << DbU::getValueString(y) << ")"; message << "(" << DbU::getValueString(x) << "," << DbU::getValueString(y) << ")";
@ -406,11 +373,7 @@ namespace Bora {
_widthSelected [0] = x; _widthSelected [0] = x;
_heightSelected[0] = y; _heightSelected[0] = y;
#if QWT_VERSION < 0x060000
_selectedPoint->setData ( _widthSelected, _heightSelected, 1 );
#else
_selectedPoint->setSamples ( _widthSelected, _heightSelected, 1 ); _selectedPoint->setSamples ( _widthSelected, _heightSelected, 1 );
#endif
_selectedPoint->show(); _selectedPoint->show();
_plot->replot(); _plot->replot();

View File

@ -1,7 +1,7 @@
// -*- C++ -*- // -*- C++ -*-
// //
// This file is part of the Coriolis Software. // This file is part of the Coriolis Software.
// Copyright (c) Sorbonne Université 2015-2023, All Rights Reserved // Copyright (c) UPMC 2015-2018, All Rights Reserved
// //
// +-----------------------------------------------------------------+ // +-----------------------------------------------------------------+
// | C O R I O L I S | // | C O R I O L I S |
@ -10,11 +10,13 @@
// | Authors : Jean-Paul Chaput, Eric LAO | // | Authors : Jean-Paul Chaput, Eric LAO |
// | E-mail : Jean-Paul.Chaput@lip6.fr | // | E-mail : Jean-Paul.Chaput@lip6.fr |
// | =============================================================== | // | =============================================================== |
// | C++ Header : "./bora/SlicingPlotWidget.h" | // | C++ Header : "./bora/DSlicingNode.h" |
// +-----------------------------------------------------------------+ // +-----------------------------------------------------------------+
#pragma once #ifndef BORA_SLICING_PLOT_WIDGET_H
#define BORA_SLICING_PLOT_WIDGET_H
//Work sround for older qwt releases //Work sround for older qwt releases
#include <QtGlobal> #include <QtGlobal>
#if QT_VERSION >= 0x050400 #if QT_VERSION >= 0x050400
@ -53,11 +55,7 @@ namespace Bora {
void setViewer ( CellViewer* ); void setViewer ( CellViewer* );
void setDatas (); void setDatas ();
public slots: public slots:
#if QWT_VERSION < 0x060000
void onPointSelect ( const QwtDoublePoint& );
#else
void onPointSelect ( const QPointF& ); void onPointSelect ( const QPointF& );
#endif
void updateSelectedPoint ( double x, double y ); void updateSelectedPoint ( double x, double y );
signals: signals:
void updatePlacement ( BoxSet* ); void updatePlacement ( BoxSet* );
@ -80,3 +78,5 @@ namespace Bora {
} // Bora namespace. } // Bora namespace.
#endif // BORA_SLICING_PLOT_WIDGET_H

@ -1 +0,0 @@
Subproject commit 97bb781ba363303fd6b7254c717f621b137b89e3

34
coloquinte/CMakeLists.txt Normal file
View File

@ -0,0 +1,34 @@
# -*- explicit-buffer-name: "CMakeLists.txt<coloquinte>" -*-
set(CMAKE_LEGACY_CYGWIN_WIN32 0)
project(COLOQUINTE)
set(ignoreVariables "${CMAKE_INSTALL_DIR}" "${BUILD_DOC}")
#option(BUILD_DOC "Build the documentation (doxygen)" OFF)
option(USE_LIBBFD "Link with BFD libraries to print stack traces" OFF)
cmake_minimum_required(VERSION 3.18)
list(INSERT CMAKE_MODULE_PATH 0 "${DESTDIR}$ENV{CORIOLIS_TOP}/share/cmake/Modules/")
find_package(Bootstrap REQUIRED)
setup_project_paths(CORIOLIS)
setup_qt()
set_cmake_policies()
setup_boost()
find_package(Libexecinfo REQUIRED)
find_package(Doxygen)
if(WITH_OPENMP)
find_package(OpenMP REQUIRED)
add_definitions(${OpenMP_CXX_FLAGS})
set(CMAKE_MODULE_LINKER_FLAGS "${CMAKE_MODULE_LINKER_FLAGS} ${OpenMP_CXX_FLAGS}")
set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} ${OpenMP_CXX_FLAGS}")
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${OpenMP_CXX_FLAGS}")
endif()
add_subdirectory(src)
add_subdirectory(cmake_modules)
#add_subdirectory(doc)

View File

@ -0,0 +1,2 @@
install ( FILES FindCOLOQUINTE.cmake DESTINATION share/cmake/Modules )

View File

@ -15,14 +15,13 @@ IF(UNIX)
# #
# Look for an installation. # Look for an installation.
# #
FIND_PATH(COLOQUINTE_INCLUDE_PATH NAMES coloquinte/coloquinte.hpp PATHS FIND_PATH(COLOQUINTE_INCLUDE_PATH NAMES coloquinte/netlist.hxx PATHS
# Look in other places. # Look in other places.
${CORIOLIS_DIR_SEARCH} ${CORIOLIS_DIR_SEARCH}
PATH_SUFFIXES include/coriolis2 PATH_SUFFIXES include/coriolis2
# Help the user find it if we cannot. # Help the user find it if we cannot.
DOC "The ${COLOQUINTE_INCLUDE_PATH_DESCRIPTION}" DOC "The ${COLOQUINTE_INCLUDE_PATH_DESCRIPTION}"
) )
MESSAGE( "COL ${COLOQUINTE_INCLUDE_PATH}" )
FIND_LIBRARY(COLOQUINTE_LIBRARY_PATH FIND_LIBRARY(COLOQUINTE_LIBRARY_PATH
NAMES coloquinte NAMES coloquinte

View File

@ -0,0 +1,39 @@
# -*- explicit-buffer-name: "CMakeLists.txt<coloquinte/src>" -*-
include_directories( ${COLOQUINTE_SOURCE_DIR}/src
)
set ( includes coloquinte/circuit.hxx
coloquinte/circuit_helper.hxx
coloquinte/common.hxx
coloquinte/netlist.hxx
coloquinte/solvers.hxx
coloquinte/rough_legalizers.hxx
coloquinte/legalizer.hxx
coloquinte/detailed.hxx
coloquinte/topologies.hxx
coloquinte/optimization_subproblems.hxx
coloquinte/piecewise_linear.hxx
)
set ( cpps circuit.cxx
checkers.cxx
rough_legalizers.cxx
solvers.cxx
optimization_subproblems.cxx
piecewise_linear.cxx
orientation.cxx
detailed.cxx
cell_swapping.cxx
#MCF_opt.cxx
row_opt.cxx
topologies.cxx
lookup_table.cxx
legalizer.cxx
)
add_library ( coloquinte ${cpps} )
set_target_properties( coloquinte PROPERTIES VERSION 1.0 SOVERSION 1 )
install( TARGETS coloquinte DESTINATION lib${LIB_SUFFIX} )
install( FILES ${includes} DESTINATION include/coriolis2/coloquinte )

View File

@ -0,0 +1,185 @@
#include "coloquinte/detailed.hxx"
#include "coloquinte/circuit_helper.hxx"
#include <functional>
namespace coloquinte{
namespace dp{
namespace{
// Tries to swap two cells;
inline bool try_swap(netlist const & circuit, detailed_placement & pl, index_t c1, index_t c2, bool try_flip,
std::function<std::int64_t(netlist const &, detailed_placement const &, std::vector<index_t> const &)> get_nets_cost){
assert(pl.cell_height(c1) == 1 and pl.cell_height(c2) == 1);
assert( (circuit.get_cell(c1).attributes & XMovable) != 0 and (circuit.get_cell(c1).attributes & YMovable) != 0);
assert( (circuit.get_cell(c2).attributes & XMovable) != 0 and (circuit.get_cell(c2).attributes & YMovable) != 0);
auto c1_bnds = pl.get_limit_positions(circuit, c1),
c2_bnds = pl.get_limit_positions(circuit, c2);
// Get the possible positions for a swap
int_t swp_min_c1 = c2_bnds.first,
swp_min_c2 = c1_bnds.first,
swp_max_c1 = c2_bnds.second - circuit.get_cell(c1).size.x,
swp_max_c2 = c1_bnds.second - circuit.get_cell(c2).size.x;
if(swp_max_c1 >= swp_min_c1 and swp_max_c2 >= swp_min_c2){
// Check both orientations of the cell
// Get all the nets involved and uniquify them (nets with more than one pin on the cells)
std::vector<index_t> involved_nets;
for(netlist::pin_t p : circuit.get_cell(c1)){
involved_nets.push_back(p.net_ind);
}
for(netlist::pin_t p : circuit.get_cell(c2)){
involved_nets.push_back(p.net_ind);
}
std::sort(involved_nets.begin(), involved_nets.end());
involved_nets.resize(std::distance(involved_nets.begin(), std::unique(involved_nets.begin(), involved_nets.end())));
// Test the cost for the old position and the cost swapping the cells
std::int64_t old_cost = get_nets_cost(circuit, pl, involved_nets);
// Save the old values
point<int_t> p1 = pl.plt_.positions_[c1];
point<int_t> p2 = pl.plt_.positions_[c2];
point<bool> o1 = pl.plt_.orientations_[c1];
point<bool> o2 = pl.plt_.orientations_[c2];
// Warning: won't work if the two cells don't have the same height
pl.plt_.positions_[c1].x = (swp_min_c1 + swp_max_c1) / 2;
pl.plt_.positions_[c2].x = (swp_min_c2 + swp_max_c2) / 2;
pl.plt_.positions_[c1].y = p2.y;
pl.plt_.positions_[c2].y = p1.y;
// For standard cell placement, we want all the rows to be aligned in the same way
if( (circuit.get_cell(c1).attributes & YFlippable) != 0 and (circuit.get_cell(c2).attributes & YFlippable) != 0)
std::swap(pl.plt_.orientations_[c1].y, pl.plt_.orientations_[c2].y);
if(try_flip and (circuit.get_cell(c1).attributes & XFlippable) != 0 and (circuit.get_cell(c2).attributes & XFlippable) != 0){
index_t bst_ind = 4;
for(index_t i=0; i<4; ++i){
pl.plt_.orientations_[c1].x = i % 2;
pl.plt_.orientations_[c2].x = i / 2;
std::int64_t new_cost = get_nets_cost(circuit, pl, involved_nets);
if(new_cost < old_cost){
old_cost = new_cost;
bst_ind = i;
}
}
// One of the orientations with the new positions was better
if(bst_ind < 4){
pl.swap_standard_cell_topologies(c1, c2);
pl.plt_.orientations_[c1].x = bst_ind % 2;
pl.plt_.orientations_[c2].x = bst_ind / 2;
// We kept the swap
return true;
}
else{
pl.plt_.positions_[c1] = p1;
pl.plt_.positions_[c2] = p2;
pl.plt_.orientations_[c1] = o1;
pl.plt_.orientations_[c2] = o2;
return false;
}
}
else if(get_nets_cost(circuit, pl, involved_nets) < old_cost){
pl.swap_standard_cell_topologies(c1, c2);
return true;
}
else{
// Reset the old values since we didn't swap anything
pl.plt_.positions_[c1] = p1;
pl.plt_.positions_[c2] = p2;
pl.plt_.orientations_[c1] = o1;
pl.plt_.orientations_[c2] = o2;
return false;
}
// A better solution would be
// Check the cost on y depending on the position (extremely simple: two positions for each cell)
// Check the cost on x depending on the position: piecewise linear and relatively complex
// * Get all external pins
// * Get all nets involving only one of the cells: piecewise linear cost for each of them
// * For nets involving the two cells, we have an additional cost
}
else{ // We just cannot swap those two cells without pushing anything
return false;
}
}
inline void generic_swaps_global(netlist const & circuit, detailed_placement & pl, index_t row_extent, index_t cell_extent, bool try_flip,
std::function<std::int64_t(netlist const &, detailed_placement const &, std::vector<index_t> const &)> get_nets_cost){
for(index_t main_row = 0; main_row < pl.row_cnt(); ++main_row){
for(index_t other_row = main_row+1; other_row <= std::min(pl.row_cnt()-1, main_row+row_extent) ; ++other_row){
index_t first_oc = pl.get_first_standard_cell_on_row(other_row); // The first candidate cell to be examined
for(index_t c = pl.get_first_standard_cell_on_row(main_row); c != null_ind; c = pl.get_next_standard_cell_on_row(c, main_row)){
assert(pl.cell_rows_[c] == main_row);
if( (circuit.get_cell(c).attributes & XMovable) == 0) continue; // Don't touch fixed cells
// Number of cells after/before the end of the cell
index_t nb_after = 0;
index_t nb_before = 0;
int_t pos_low = pl.plt_.positions_[c].x - circuit.get_cell(c).size.x,
pos_hgh = pl.plt_.positions_[c].x + 2*circuit.get_cell(c).size.x;
for(index_t oc=first_oc; oc != null_ind and nb_after <= row_extent; oc = pl.get_next_standard_cell_on_row(oc, other_row)){
assert(pl.cell_rows_[oc] == other_row);
if( (circuit.get_cell(oc).attributes & XMovable) == 0) continue; // Don't touche fixed cells
// Count the cells which should trigger stop or shouldn't be used at the next iteration
if(pl.plt_.positions_[oc].x >= pos_hgh) ++nb_after;
if(pl.plt_.positions_[oc].x + circuit.get_cell(oc).size.x <= pos_low) ++ nb_before;
if(try_swap(circuit, pl, c, oc, try_flip, get_nets_cost)){
std::swap(c, oc);
if(c == first_oc) first_oc = oc;
}
}
while(nb_before > cell_extent){
nb_before--;
first_oc = pl.get_next_standard_cell_on_row(first_oc, other_row);
}
}
}
}
pl.selfcheck();
}
} // End anonymous namespace
void swaps_global_HPWL(netlist const & circuit, detailed_placement & pl, index_t row_extent, index_t cell_extent, bool try_flip){
generic_swaps_global(circuit, pl, row_extent, cell_extent, try_flip,
[](netlist const & circuit, detailed_placement const & pl, std::vector<index_t> const & involved_nets) -> std::int64_t{
std::int64_t sum = 0;
for(index_t n : involved_nets){
if(circuit.get_net(n).pin_cnt <= 1) continue;
sum += get_HPWL_length(circuit, pl.plt_, n);
}
return sum;
});
}
void swaps_global_RSMT(netlist const & circuit, detailed_placement & pl, index_t row_extent, index_t cell_extent, bool try_flip){
generic_swaps_global(circuit, pl, row_extent, cell_extent, try_flip,
[](netlist const & circuit, detailed_placement const & pl, std::vector<index_t> const & involved_nets) -> std::int64_t{
std::int64_t sum = 0;
for(index_t n : involved_nets){
if(circuit.get_net(n).pin_cnt <= 1) continue;
sum += get_RSMT_length(circuit, pl.plt_, n);
}
return sum;
});
}
} // namespace dp
} // namespace coloquinte

View File

@ -0,0 +1,96 @@
#include "coloquinte/circuit.hxx"
#include <map>
namespace coloquinte{
void netlist::selfcheck() const{
index_t cell_cnt = cell_areas_.size();
assert(cell_cnt+1 == cell_limits_.size());
assert(cell_cnt == cell_sizes_.size());
assert(cell_cnt == cell_attributes_.size());
assert(cell_cnt == cell_internal_mapping_.size());
index_t net_cnt = net_weights_.size();
assert(net_cnt+1 == net_limits_.size());
assert(net_cnt == net_internal_mapping_.size());
index_t pin_cnt = pin_offsets_.size();
assert(pin_cnt == cell_indexes_.size());
assert(pin_cnt == pin_indexes_.size());
assert(pin_cnt == net_indexes_.size());
for(auto const p : pin_offsets_){
assert(std::isfinite(p.x) and std::isfinite(p.y));
}
}
// For compatibility reasons
void placement_t::selfcheck() const{
}
void verify_placement_legality(netlist const & circuit, placement_t const & pl, box<int_t> surface){
std::vector<box<int_t> > cells;
for(index_t i=0; i<circuit.cell_cnt(); ++i){
auto S = circuit.get_cell(i).size;
cells.push_back(box<int_t>(pl.positions_[i], pl.positions_[i] + S));
// Verify that they are within the placement surface; doesn't take fixed macros into account
if( (circuit.get_cell(i).attributes & XMovable) != 0 or (circuit.get_cell(i).attributes & YMovable) != 0){
assert(cells[i].in(surface));
}
}
// Simple sweepline algorithm to verify that there is no overlap
struct event{
int_t x_min, x_max, y;
index_t cell;
bool removal;
bool operator<(event const o) const{
return y < o.y
or (y == o.y and removal and not o.removal); // Remove before inserting
}
};
std::vector<event> all_events;
for(index_t i=0; i<circuit.cell_cnt(); ++i){
event b, e;
b.cell = i; e.cell = i;
b.x_min = cells[i].x_min; e.x_min = cells[i].x_min;
b.x_max = cells[i].x_max; e.x_max = cells[i].x_max;
b.y = cells[i].y_min; b.removal = false;
e.y = cells[i].y_max; e.removal = true;
if(b.x_max > b.x_min and e.y != b.y){
all_events.push_back(b);
all_events.push_back(e);
}
}
std::sort(all_events.begin(), all_events.end());
// Indexed by beginning of interval, with end of interval and cell within
std::map<int_t, std::pair<int_t, index_t> > active_rectangles;
for(event E : all_events){
if(E.removal){
auto it = active_rectangles.find(E.x_min);
assert(it != active_rectangles.end());
active_rectangles.erase(it);
}
else{ // Find anything that intersects with E; if not, add it
auto it = active_rectangles.lower_bound(E.x_min); // First interval after
if(it != active_rectangles.end()){
assert(it->first >= E.x_max); //Intersection between E.cell and it->second->second
}
if(it != active_rectangles.begin()){
--it;
assert(it->second.first <= E.x_min); //Intersection between E.cell and it->second->second
}
active_rectangles.insert(std::pair<int_t, std::pair<int_t, index_t> >(E.x_min, std::pair<int_t, index_t>(E.x_max, E.cell)));
}
}
}
} // namespace coloquinte

408
coloquinte/src/circuit.cxx Normal file
View File

@ -0,0 +1,408 @@
#include "coloquinte/circuit_helper.hxx"
#include "coloquinte/circuit.hxx"
#include <cmath>
namespace coloquinte{
std::int64_t get_HPWL_length(netlist const & circuit, placement_t const & pl, index_t net_ind){
if(circuit.get_net(net_ind).pin_cnt <= 1) return 0;
auto pins = get_pins_1D(circuit, pl, net_ind);
auto minmaxX = std::minmax_element(pins.x.begin(), pins.x.end()), minmaxY = std::minmax_element(pins.y.begin(), pins.y.end());
return ((minmaxX.second->pos - minmaxX.first->pos) + (minmaxY.second->pos - minmaxY.first->pos));
}
std::int64_t get_RSMT_length(netlist const & circuit, placement_t const & pl, index_t net_ind){
if(circuit.get_net(net_ind).pin_cnt <= 1) return 0;
auto pins = get_pins_2D(circuit, pl, net_ind);
std::vector<point<int_t> > points;
for(pin_2D const p : pins){
points.push_back(p.pos);
}
return RSMT_length(points, 8);
}
namespace gp{
void add_force(pin_1D const p1, pin_1D const p2, linear_system & L, float_t force){
if(p1.movable && p2.movable){
L.add_force(
force,
p1.cell_ind, p2.cell_ind,
p1.offs, p2.offs
);
}
else if(p1.movable){
L.add_fixed_force(
force,
p1.cell_ind,
p2.pos,
p1.offs
);
}
else if(p2.movable){
L.add_fixed_force(
force,
p2.cell_ind,
p1.pos,
p2.offs
);
}
}
void add_force(pin_1D const p1, pin_1D const p2, linear_system & L, float_t tol, float_t scale){
add_force(p1, p2, L, scale/std::max(tol, static_cast<float_t>(std::abs((float)(p2.pos-p1.pos)))));
}
point<linear_system> empty_linear_systems(netlist const & circuit, placement_t const & pl){
point<linear_system> ret = point<linear_system>(linear_system(circuit.cell_cnt()), linear_system(circuit.cell_cnt()));
for(index_t i=0; i<circuit.cell_cnt(); ++i){
bool found_true_net=false;
for(auto p : circuit.get_cell(i)){
if(circuit.get_net(p.net_ind).pin_cnt > 1){
found_true_net = true;
break;
}
}
if( (XMovable & circuit.get_cell(i).attributes) == 0 or not found_true_net){
ret.x.add_triplet(i, i, 1.0f);
ret.x.add_doublet(i, pl.positions_[i].x);
}
if( (YMovable & circuit.get_cell(i).attributes) == 0 or not found_true_net){
ret.y.add_triplet(i, i, 1.0f);
ret.y.add_doublet(i, pl.positions_[i].y);
}
}
return ret;
}
namespace{ // Anonymous namespace for helper functions
void get_HPWLF(std::vector<pin_1D> const & pins, linear_system & L, float_t tol){
if(pins.size() >= 2){
auto min_elt = std::min_element(pins.begin(), pins.end()), max_elt = std::max_element(pins.begin(), pins.end());
for(auto it = pins.begin(); it != pins.end(); ++it){
// Just comparing the iterator is poorer due to redundancies in the benchmarks!
if(it != min_elt){
add_force(*it, *min_elt, L, tol, 1.0f/(pins.size()-1));
if(it != max_elt){ // Hopefully only one connexion between the min and max pins
add_force(*it, *max_elt, L, tol, 1.0f/(pins.size()-1));
}
}
}
}
}
void get_HPWLR(std::vector<pin_1D> const & pins, linear_system & L, float_t tol){
std::vector<pin_1D> sorted_pins = pins;
std::sort(sorted_pins.begin(), sorted_pins.end());
// Pins are connected to the pin two places away
for(index_t i=0; i+2<sorted_pins.size(); ++i){
add_force(sorted_pins[i], sorted_pins[i+2], L, tol, 0.5f);
}
// The extreme pins are connected with their direct neighbour too
if(sorted_pins.size() > 1){
add_force(sorted_pins[0], sorted_pins[1], L, tol, 0.5f);
add_force(sorted_pins[sorted_pins.size()-1], sorted_pins[sorted_pins.size()-2], L, tol, 0.5f);
}
}
void get_star(std::vector<pin_1D> const & pins, linear_system & L, float_t tol, index_t star_index){
// The net is empty, but we still populate the diagonal to avoid divide by zeros
if(pins.size() < 2){
L.add_triplet(star_index, star_index, 1.0f);
return;
}
for(pin_1D p : pins){
pin_1D star_pin = pin_1D(star_index, 0, 0, true);
add_force(p, star_pin, L, 1.0/pins.size());
}
}
void get_clique(std::vector<pin_1D> const & pins, linear_system & L, float_t tol){
// Pins are connected to the pin two places away
for(index_t i=0; i+1<pins.size(); ++i){
for(index_t j=i+1; j<pins.size(); ++j){
add_force(pins[i], pins[j], L, tol, 1.0f/(pins.size()-1));
}
}
}
} // End anonymous namespace
point<linear_system> get_HPWLF_linear_system (netlist const & circuit, placement_t const & pl, float_t tol, index_t min_s, index_t max_s){
point<linear_system> L = empty_linear_systems(circuit, pl);
for(index_t i=0; i<circuit.net_cnt(); ++i){
// Has the net the right pin count?
index_t pin_cnt = circuit.get_net(i).pin_cnt;
if(pin_cnt < min_s or pin_cnt >= max_s) continue;
auto pins = get_pins_1D(circuit, pl, i);
get_HPWLF(pins.x, L.x, tol);
get_HPWLF(pins.y, L.y, tol);
}
return L;
}
point<linear_system> get_HPWLR_linear_system (netlist const & circuit, placement_t const & pl, float_t tol, index_t min_s, index_t max_s){
point<linear_system> L = empty_linear_systems(circuit, pl);
for(index_t i=0; i<circuit.net_cnt(); ++i){
// Has the net the right pin count?
index_t pin_cnt = circuit.get_net(i).pin_cnt;
if(pin_cnt < min_s or pin_cnt >= max_s) continue;
auto pins = get_pins_1D(circuit, pl, i);
get_HPWLR(pins.x, L.x, tol);
get_HPWLR(pins.y, L.y, tol);
}
return L;
}
point<linear_system> get_star_linear_system (netlist const & circuit, placement_t const & pl, float_t tol, index_t min_s, index_t max_s){
point<linear_system> L = empty_linear_systems(circuit, pl);
L.x.add_variables(circuit.net_cnt());
L.y.add_variables(circuit.net_cnt());
for(index_t i=0; i<circuit.net_cnt(); ++i){
// Has the net the right pin count?
index_t pin_cnt = circuit.get_net(i).pin_cnt;
if(pin_cnt < min_s or pin_cnt >= max_s){
// Put a one in the intermediate variable in order to avoid non-invertible matrices
L.x.add_triplet(i+circuit.cell_cnt(), i+circuit.cell_cnt(), 1.0f);
L.y.add_triplet(i+circuit.cell_cnt(), i+circuit.cell_cnt(), 1.0f);
continue;
}
auto pins = get_pins_1D(circuit, pl, i);
// Provide the index of the star's central pin in the linear system
get_star(pins.x, L.x, tol, i+circuit.cell_cnt());
get_star(pins.y, L.y, tol, i+circuit.cell_cnt());
}
return L;
}
point<linear_system> get_clique_linear_system (netlist const & circuit, placement_t const & pl, float_t tol, index_t min_s, index_t max_s){
point<linear_system> L = empty_linear_systems(circuit, pl);
for(index_t i=0; i<circuit.net_cnt(); ++i){
// Has the net the right pin count?
index_t pin_cnt = circuit.get_net(i).pin_cnt;
if(pin_cnt < min_s or pin_cnt >= max_s) continue;
auto pins = get_pins_1D(circuit, pl, i);
get_clique(pins.x, L.x, tol);
get_clique(pins.y, L.y, tol);
}
return L;
}
point<linear_system> get_MST_linear_system(netlist const & circuit, placement_t const & pl, float_t tol, index_t min_s, index_t max_s){
point<linear_system> L = empty_linear_systems(circuit, pl);
for(index_t i=0; i<circuit.net_cnt(); ++i){
// Has the net the right pin count?
index_t pin_cnt = circuit.get_net(i).pin_cnt;
if(pin_cnt < min_s or pin_cnt >= max_s or pin_cnt <= 1) continue;
auto pins = get_pins_2D(circuit, pl, i);
std::vector<point<int_t> > points;
for(pin_2D const p : pins){
points.push_back(p.pos);
}
auto const edges = get_MST_topology(points);
for(auto E : edges){
add_force(pins[E.first].x(), pins[E.second].x(), L.x, tol, 1.0f);
add_force(pins[E.first].y(), pins[E.second].y(), L.y, tol, 1.0f);
}
}
return L;
}
point<linear_system> get_RSMT_linear_system(netlist const & circuit, placement_t const & pl, float_t tol, index_t min_s, index_t max_s){
point<linear_system> L = empty_linear_systems(circuit, pl);
for(index_t i=0; i<circuit.net_cnt(); ++i){
// Has the net the right pin count?
index_t pin_cnt = circuit.get_net(i).pin_cnt;
if(pin_cnt < min_s or pin_cnt >= max_s or pin_cnt <= 1) continue;
auto pins = get_pins_2D(circuit, pl, i);
std::vector<point<int_t> > points;
for(pin_2D const p : pins){
points.push_back(p.pos);
}
auto const edges = get_RSMT_topology(points, 8);
for(auto E : edges.x){
add_force(pins[E.first].x(), pins[E.second].x(), L.x, tol, 1.0f);
}
for(auto E : edges.y){
add_force(pins[E.first].y(), pins[E.second].y(), L.y, tol, 1.0f);
}
}
return L;
}
std::int64_t get_HPWL_wirelength(netlist const & circuit, placement_t const & pl){
std::int64_t sum = 0;
for(index_t i=0; i<circuit.net_cnt(); ++i){
sum += get_HPWL_length(circuit, pl, i);
}
return sum;
}
// The true wirelength with minimum spanning trees, except for very small nets (<= 3) where we have HPWL == true WL
std::int64_t get_MST_wirelength(netlist const & circuit, placement_t const & pl){
std::int64_t sum = 0;
for(index_t i=0; i<circuit.net_cnt(); ++i){
auto pins = get_pins_2D(circuit, pl, i);
std::vector<point<int_t> > points;
for(pin_2D const p : pins){
points.push_back(p.pos);
}
sum += MST_length(points);
}
return sum;
}
std::int64_t get_RSMT_wirelength(netlist const & circuit, placement_t const & pl){
std::int64_t sum = 0;
for(index_t i=0; i<circuit.net_cnt(); ++i){
sum += get_RSMT_length(circuit, pl, i);
}
return sum;
}
void solve_linear_system(netlist const & circuit, placement_t & pl, point<linear_system> & L, index_t nbr_iter){
std::vector<float_t> x_sol, y_sol;
std::vector<float_t> x_guess(pl.cell_cnt()), y_guess(pl.cell_cnt());
assert(L.x.internal_size() == x_guess.size());
assert(L.y.internal_size() == y_guess.size());
for(index_t i=0; i<pl.cell_cnt(); ++i){
x_guess[i] = static_cast<float_t>(pl.positions_[i].x);
y_guess[i] = static_cast<float_t>(pl.positions_[i].y);
}
#pragma omp parallel sections num_threads(2)
{
#pragma omp section
x_sol = L.x.solve_CG(x_guess, nbr_iter);
#pragma omp section
y_sol = L.y.solve_CG(y_guess, nbr_iter);
}
for(index_t i=0; i<pl.cell_cnt(); ++i){
if( (circuit.get_cell(i).attributes & XMovable) != 0){
assert(std::isfinite(x_sol[i]));
pl.positions_[i].x = static_cast<int_t>(x_sol[i]);
}
if( (circuit.get_cell(i).attributes & YMovable) != 0){
assert(std::isfinite(y_sol[i]));
pl.positions_[i].y = static_cast<int_t>(y_sol[i]);
}
}
}
// Intended to be used by pulling forces to adapt the forces to the cell's areas
std::vector<float_t> get_area_scales(netlist const & circuit){
std::vector<float_t> ret(circuit.cell_cnt());
capacity_t int_tot_area = 0;
for(index_t i=0; i<circuit.cell_cnt(); ++i){
capacity_t A = circuit.get_cell(i).area;
ret[i] = static_cast<float_t>(A);
int_tot_area += A;
}
float_t inv_average_area = circuit.cell_cnt() / static_cast<float_t>(int_tot_area);
for(index_t i=0; i<circuit.cell_cnt(); ++i){
ret[i] *= inv_average_area;
}
return ret;
}
point<linear_system> get_pulling_forces (netlist const & circuit, placement_t const & pl, float_t typical_distance){
point<linear_system> L = empty_linear_systems(circuit, pl);
float_t typical_force = 1.0f / typical_distance;
std::vector<float_t> scaling = get_area_scales(circuit);
for(index_t i=0; i<pl.cell_cnt(); ++i){
L.x.add_anchor(
typical_force * scaling[i],
i, pl.positions_[i].x
);
L.y.add_anchor(
typical_force * scaling[i],
i, pl.positions_[i].y
);
}
return L;
}
point<linear_system> get_linear_pulling_forces (netlist const & circuit, placement_t const & UB_pl, placement_t const & LB_pl, float_t force, float_t min_distance){
point<linear_system> L = empty_linear_systems(circuit, UB_pl);
assert(LB_pl.cell_cnt() == UB_pl.cell_cnt());
std::vector<float_t> scaling = get_area_scales(circuit);
for(index_t i=0; i<LB_pl.cell_cnt(); ++i){
L.x.add_anchor(
force * scaling[i] / (std::max(static_cast<float_t>(std::abs((float)(UB_pl.positions_[i].x - LB_pl.positions_[i].x))), min_distance)),
i, UB_pl.positions_[i].x
);
L.y.add_anchor(
force * scaling[i] / (std::max(static_cast<float_t>(std::abs((float)(UB_pl.positions_[i].y - LB_pl.positions_[i].y))), min_distance)),
i, UB_pl.positions_[i].y
);
}
return L;
}
region_distribution get_rough_legalizer(netlist const & circuit, placement_t const & pl, box<int_t> surface){
return region_distribution::uniform_density_distribution(surface, circuit, pl);
}
void get_rough_legalization(netlist const & circuit, placement_t & pl, region_distribution const & legalizer){
auto exportation = legalizer.export_spread_positions_linear();
for(auto const C : exportation){
pl.positions_[C.index_in_placement_] = static_cast<point<int_t> >(C.pos_ - 0.5f * static_cast<point<float_t> >(circuit.get_cell(C.index_in_placement_).size));
}
}
float_t get_mean_linear_disruption(netlist const & circuit, placement_t const & LB_pl, placement_t const & UB_pl){
float_t tot_cost = 0.0;
float_t tot_area = 0.0;
for(index_t i=0; i<circuit.cell_cnt(); ++i){
float_t area = static_cast<float_t>(circuit.get_cell(i).area);
point<int_t> diff = LB_pl.positions_[i] - UB_pl.positions_[i];
if( (circuit.get_cell(i).attributes & XMovable) == 0) assert(diff.x == 0);
if( (circuit.get_cell(i).attributes & YMovable) == 0) assert(diff.y == 0);
tot_cost += area * (std::abs((float)diff.x) + std::abs((float)diff.y));
tot_area += area;
}
return tot_cost / tot_area;
}
float_t get_mean_quadratic_disruption(netlist const & circuit, placement_t const & LB_pl, placement_t const & UB_pl){
float_t tot_cost = 0.0;
float_t tot_area = 0.0;
for(index_t i=0; i<circuit.cell_cnt(); ++i){
float_t area = static_cast<float_t>(circuit.get_cell(i).area);
point<int_t> diff = LB_pl.positions_[i] - UB_pl.positions_[i];
if( (circuit.get_cell(i).attributes & XMovable) == 0) assert(diff.x == 0);
if( (circuit.get_cell(i).attributes & YMovable) == 0) assert(diff.y == 0);
float_t manhattan = (std::abs((float)diff.x) + std::abs((float)diff.y));
tot_cost += area * manhattan * manhattan;
tot_area += area;
}
return std::sqrt(tot_cost / tot_area);
}
} // namespace gp
} // namespace coloquinte

View File

@ -0,0 +1,59 @@
#ifndef COLOQUINTE_GP_CIRCUIT
#define COLOQUINTE_GP_CIRCUIT
#include "common.hxx"
#include "solvers.hxx"
#include "netlist.hxx"
#include "rough_legalizers.hxx"
#include <vector>
#include <cassert>
namespace coloquinte{
void verify_placement_legality(netlist const & circuit, placement_t const & pl, box<int_t> surface);
namespace gp{
point<linear_system> empty_linear_systems(netlist const & circuit, placement_t const & pl);
// Net models stuff
point<linear_system> get_HPWLF_linear_system (netlist const & circuit, placement_t const & pl, float_t tol, index_t min_s, index_t max_s);
point<linear_system> get_HPWLR_linear_system (netlist const & circuit, placement_t const & pl, float_t tol, index_t min_s, index_t max_s);
point<linear_system> get_star_linear_system (netlist const & circuit, placement_t const & pl, float_t tol, index_t min_s, index_t max_s);
point<linear_system> get_clique_linear_system (netlist const & circuit, placement_t const & pl, float_t tol, index_t min_s, index_t max_s);
point<linear_system> get_MST_linear_system (netlist const & circuit, placement_t const & pl, float_t tol, index_t min_s, index_t max_s);
point<linear_system> get_RSMT_linear_system (netlist const & circuit, placement_t const & pl, float_t tol, index_t min_s, index_t max_s);
// Additional forces
point<linear_system> get_pulling_forces (netlist const & circuit, placement_t const & pl, float_t typical_distance);
point<linear_system> get_linear_pulling_forces (netlist const & circuit, placement_t const & UB_pl, placement_t const & LB_pl, float_t force, float_t min_distance);
// Solve the final linear system
void solve_linear_system(netlist const & circuit, placement_t & pl, point<linear_system> & L, index_t nbr_iter);
// Cost-related stuff, whether wirelength or disruption
std::int64_t get_HPWL_wirelength (netlist const & circuit, placement_t const & pl);
std::int64_t get_MST_wirelength (netlist const & circuit, placement_t const & pl);
std::int64_t get_RSMT_wirelength (netlist const & circuit, placement_t const & pl);
float_t get_mean_linear_disruption(netlist const & circuit, placement_t const & LB_pl, placement_t const & UB_pl);
float_t get_mean_quadratic_disruption(netlist const & circuit, placement_t const & LB_pl, placement_t const & UB_pl);
// Legalizer-related stuff
region_distribution get_rough_legalizer(netlist const & circuit, placement_t const & pl, box<int_t> surface);
void get_rough_legalization(netlist const & circuit, placement_t & pl, region_distribution const & legalizer);
// Cell orientation optimization
void optimize_x_orientations(netlist const & circuit, placement_t & pl);
void optimize_y_orientations(netlist const & circuit, placement_t & pl);
void optimize_exact_orientations(netlist const & circuit, placement_t & pl);
//void spread_orientations(netlist const & circuit, placement_t & pl);
} // namespace gp
} // namespace coloquinte
#endif

View File

@ -0,0 +1,92 @@
#ifndef COLOQUINTE_GP_HELPERCIRCUIT
#define COLOQUINTE_GP_HELPERCIRCUIT
#include "common.hxx"
#include "netlist.hxx"
#include <cmath>
namespace coloquinte{
struct pin_1D{
index_t cell_ind;
int_t pos;
int_t offs;
bool movable;
bool operator<(pin_1D const o) const { return pos < o.pos; }
pin_1D(index_t c, int_t p, int_t o, bool m) : cell_ind(c), pos(p), offs(o), movable(m){}
};
struct pin_2D{
index_t cell_ind;
point<int_t> pos;
point<int_t> offs;
bool movable;
pin_2D(index_t c, point<int_t> p, point<int_t> o, bool m) : cell_ind(c), pos(p), offs(o), movable(m){}
pin_1D x() const{ return pin_1D(cell_ind, pos.x, offs.x, movable); }
pin_1D y() const{ return pin_1D(cell_ind, pos.y, offs.y, movable); }
};
inline int_t dist(pin_2D const a, pin_2D const b){
point<int_t> diff = a.pos - b.pos;
return std::abs((float)diff.x) + std::abs((float)diff.y);
}
inline std::vector<pin_2D> get_pins_2D(netlist const & circuit, placement_t const & pl, index_t net_ind){
std::vector<pin_2D> ret;
for(auto p : circuit.get_net(net_ind)){
assert(std::isfinite(pl.positions_[p.cell_ind].x) and std::isfinite(pl.positions_[p.cell_ind].y));
assert(std::isfinite(pl.orientations_[p.cell_ind].x) and std::isfinite(pl.orientations_[p.cell_ind].y));
point<int_t> offs;
offs.x = pl.orientations_[p.cell_ind].x ? p.offset.x : circuit.get_cell(p.cell_ind).size.x - p.offset.x;
offs.y = pl.orientations_[p.cell_ind].y ? p.offset.y : circuit.get_cell(p.cell_ind).size.y - p.offset.y;
point<int_t> pos = offs + pl.positions_[p.cell_ind];
assert(std::isfinite(offs.x) and std::isfinite(offs.y));
assert(std::isfinite(pos.x) and std::isfinite(pos.y));
bool movable = (circuit.get_cell(p.cell_ind).attributes & XMovable) != 0 and (circuit.get_cell(p.cell_ind).attributes & YMovable) != 0;
ret.push_back(pin_2D(p.cell_ind, pos, offs, movable));
}
return ret;
}
inline point<std::vector<pin_1D> > get_pins_1D(netlist const & circuit, placement_t const & pl, index_t net_ind){
point<std::vector<pin_1D> > ret;
for(auto p : circuit.get_net(net_ind)){
assert(std::isfinite(pl.positions_[p.cell_ind].x) and std::isfinite(pl.positions_[p.cell_ind].y));
assert(std::isfinite(pl.orientations_[p.cell_ind].x) and std::isfinite(pl.orientations_[p.cell_ind].y));
point<int_t> offs;
offs.x = pl.orientations_[p.cell_ind].x ? p.offset.x : circuit.get_cell(p.cell_ind).size.x - p.offset.x;
offs.y = pl.orientations_[p.cell_ind].y ? p.offset.y : circuit.get_cell(p.cell_ind).size.y - p.offset.y;
point<int_t> pos = offs + pl.positions_[p.cell_ind];
assert(std::isfinite(offs.x) and std::isfinite(offs.y));
assert(std::isfinite(pos.x) and std::isfinite(pos.y));
bool x_movable = (circuit.get_cell(p.cell_ind).attributes & XMovable) != 0;
bool y_movable = (circuit.get_cell(p.cell_ind).attributes & YMovable) != 0;
ret.x.push_back(pin_1D(p.cell_ind, pos.x, offs.x, x_movable));
ret.y.push_back(pin_1D(p.cell_ind, pos.y, offs.y, y_movable));
}
return ret;
}
std::int64_t MST_length(std::vector<point<int_t> > const & pins);
std::int64_t RSMT_length(std::vector<point<int_t> > const & pins, index_t exactitude_limit);
std::int64_t get_HPWL_length(netlist const & circuit, placement_t const & pl, index_t net_ind);
std::int64_t get_RSMT_length(netlist const & circuit, placement_t const & pl, index_t net_ind);
std::vector<std::pair<index_t, index_t> > get_MST_topology(std::vector<point<int_t> > const & pins);
std::vector<std::pair<index_t, index_t> > get_RSMT_horizontal_topology(std::vector<point<int_t> > const & pins, index_t exactitude_limits);
point<std::vector<std::pair<index_t, index_t> > > get_RSMT_topology(std::vector<point<int_t> > const & pins, index_t exactitude_limit);
} // namespace coloquinte
#endif

View File

@ -0,0 +1,118 @@
#ifndef COLOQUINTE_GP_COMMON
#define COLOQUINTE_GP_COMMON
#include <cstdint>
#include <algorithm>
namespace coloquinte{
using float_t = float;
using int_t = std::int32_t;
using index_t = std::uint32_t;
using capacity_t = std::int64_t;
using mask_t = std::uint32_t;
using ext_object = std::uint64_t;
enum PlacementType{
Optimist = 0,
Pessimist = 1
};
enum Movability{
XMovable = 1 ,
YMovable = 1 << 1,
XFlippable = 1 << 2,
YFlippable = 1 << 3,
SoftMacro = 1 << 4
};
template<typename T>
struct point{
T x, y;
point(){}
point(T x, T y): x(x), y(y){}
template<typename S>
operator point<S>() const{
return point<S>(static_cast<S>(x), static_cast<S>(y));
}
void operator+=(point<T> const o){
x += o.x;
y += o.y;
}
};
template<typename T>
point<T> operator+(point<T> const a, point<T> const b){
return point<T>(a.x+b.x, a.y+b.y);
}
template<typename T>
point<T> operator-(point<T> const a, point<T> const b){
return point<T>(a.x-b.x, a.y-b.y);
}
template<typename T>
point<T> operator*(T lambda, point<T> const p){
return point<T>(lambda * p.x, lambda * p.y);
}
template<typename T>
point<T> operator*(point<T> const a, point<T> const b){
return point<T>(a.x*b.x, a.y*b.y);
}
template<typename T>
struct box{
T x_min, x_max, y_min, y_max;
box(){}
box(T x_mn, T x_mx, T y_mn, T y_mx) : x_min(x_mn), x_max(x_mx), y_min(y_mn), y_max(y_mx){}
box(point<T> mn, point<T> mx) : x_min(mn.x), x_max(mx.x), y_min(mn.y), y_max(mx.y){}
bool in(box<T> const o) const{
return x_max <= o.x_max
&& y_max <= o.y_max
&& x_min >= o.x_min
&& y_min >= o.y_min;
}
bool intersects(box<T> const o) const{
return x_min < o.x_max
&& y_min < o.y_max
&& o.x_min < x_max
&& o.y_min < y_max;
}
box<T> intersection(box<T> const o) const{
return box<T>(
std::max(x_min, o.x_min),
std::min(x_max, o.x_max),
std::max(y_min, o.y_min),
std::min(y_max, o.y_max)
);
}
box<T> bounding_box(box<T> const o) const{
return box<T>(
std::min(x_min, o.x_min),
std::max(x_max, o.x_max),
std::min(y_min, o.y_min),
std::max(y_max, o.y_max)
);
}
point<T> dimensions() const{
return point<T>(x_max-x_min, y_max-y_min);
}
bool empty() const{
return dimensions().x <= 0 or dimensions().y <= 0;
}
template<typename S>
operator box<S>() const{
return box<S>(static_cast<S>(x_min), static_cast<S>(x_max), static_cast<S>(y_min), static_cast<S>(y_max));
}
};
using orientation_t = point<bool>;
} // Namespace coloquinte
#endif

View File

@ -0,0 +1,89 @@
#ifndef COLOQUINTE_DETAILED
#define COLOQUINTE_DETAILED
#include "common.hxx"
#include "netlist.hxx"
#include <vector>
#include <limits>
namespace coloquinte{
namespace dp{
const index_t null_ind = std::numeric_limits<index_t>::max();
struct detailed_placement{
// All position and orientation stuff
placement_t plt_;
std::vector<index_t> cell_rows_;
// The placement region
int_t min_x_, max_x_;
int_t y_origin_;
int_t row_height_;
// Encode the topological state of the circuit: which cells are near each other
// Makes extracting part of the circuit or optimizing positions at fixed topology easy
std::vector<std::pair<index_t, index_t> > neighbours_; // The cells before and after on each row; cells spanning multiple columns use several positions
// In order to get the neighbours in the detailed placement
std::vector<index_t> neighbours_limits_;
std::vector<index_t> row_first_cells_, row_last_cells_; // For each row, which cells are the on the boundaries
// Tests the coherency between positions, widths and topological representation
void selfcheck() const;
detailed_placement(
placement_t pl,
std::vector<index_t> placement_rows,
std::vector<index_t> cell_heights,
std::vector<std::vector<index_t> > rows,
int_t min_x, int_t max_x,
int_t y_origin,
index_t nbr_rows, int_t row_height
);
index_t cell_height(index_t c) const{ return neighbours_limits_[c+1] - neighbours_limits_[c]; }
index_t cell_cnt() const{ return cell_rows_.size(); }
index_t row_cnt() const{ return row_first_cells_.size(); }
index_t neighbour_index(index_t c, index_t r) const{
assert(r - cell_rows_[c] < cell_height(c));
return neighbours_limits_[c] + r - cell_rows_[c];
}
void swap_standard_cell_topologies(index_t c1, index_t c2);
std::pair<int_t, int_t> get_limit_positions(netlist const & circuit, index_t c) const;
index_t get_first_cell_on_row(index_t r);
index_t get_next_cell_on_row(index_t c, index_t r);
index_t get_prev_cell_on_row(index_t c, index_t r);
index_t get_first_standard_cell_on_row(index_t r);
index_t get_next_standard_cell_on_row(index_t c, index_t r);
void reorder_standard_cells(std::vector<index_t> const old_order, std::vector<index_t> const new_order);
void reorder_cells(std::vector<index_t> const old_order, std::vector<index_t> const new_order, index_t row);
};
void swaps_global_HPWL(netlist const & circuit, detailed_placement & pl, index_t row_extent, index_t cell_extent, bool try_flip = false);
void swaps_global_RSMT(netlist const & circuit, detailed_placement & pl, index_t row_extent, index_t cell_extent, bool try_flip = false);
void swaps_row_convex_HPWL(netlist const & circuit, detailed_placement & pl, index_t range);
void swaps_row_convex_RSMT(netlist const & circuit, detailed_placement & pl, index_t range);
void swaps_row_noncvx_HPWL(netlist const & circuit, detailed_placement & pl, index_t range);
void swaps_row_noncvx_RSMT(netlist const & circuit, detailed_placement & pl, index_t range);
void OSRP_convex_HPWL(netlist const & circuit, detailed_placement & pl);
void OSRP_convex_RSMT(netlist const & circuit, detailed_placement & pl);
void OSRP_noncvx_HPWL(netlist const & circuit, detailed_placement & pl);
void OSRP_noncvx_RSMT(netlist const & circuit, detailed_placement & pl);
void row_compatible_orientation(netlist const & circuit, detailed_placement & pl, bool first_row_orient);
} // namespace dp
} // namespace coloquinte
#endif

View File

@ -0,0 +1,12 @@
#include "circuit.hxx"
#include "detailed.hxx"
namespace coloquinte{
namespace dp{
detailed_placement legalize(netlist const & circuit, placement_t const & pl, box<int_t> surface, int_t row_height);
void get_result(netlist const & circuit, detailed_placement const & dpl, placement_t & pl);
} // namespace dp
} // namespace coloquinte

View File

@ -0,0 +1,251 @@
#ifndef COLOQUINTE_NETLIST
#define COLOQUINTE_NETLIST
#include "common.hxx"
#include <vector>
#include <cassert>
namespace coloquinte{
// Structures for construction and circuit_loader
struct temporary_pin{
point<int_t> offset;
index_t cell_ind, net_ind;
temporary_pin(){}
temporary_pin(point<int_t> offs, index_t c, index_t n) : offset(offs), cell_ind(c), net_ind(n){}
};
struct temporary_cell{
point<int_t> size;
capacity_t area;
mask_t attributes;
index_t list_index;
temporary_cell(){}
temporary_cell(point<int_t> s, mask_t attr, index_t ind) : size(s), attributes(attr), list_index(ind){ area = static_cast<capacity_t>(s.x) * static_cast<capacity_t>(s.y);}
};
struct temporary_net{
int_t weight;
index_t list_index;
temporary_net(){}
temporary_net(index_t ind, int_t wght) : weight(wght), list_index(ind){}
};
// Main class
class netlist{
std::vector<int_t> net_weights_;
std::vector<capacity_t> cell_areas_;
std::vector<point<int_t> > cell_sizes_;
std::vector<mask_t> cell_attributes_;
// Mapping of the order given at construction time to the internal representation
std::vector<index_t> cell_internal_mapping_;
std::vector<index_t> net_internal_mapping_;
// Optimized sparse storage for nets
std::vector<index_t> net_limits_;
std::vector<index_t> cell_indexes_;
std::vector<point<int_t> > pin_offsets_;
// Sparse storage from cell to net appartenance
std::vector<index_t> cell_limits_;
std::vector<index_t> net_indexes_;
std::vector<index_t> pin_indexes_;
public:
netlist(std::vector<temporary_cell> cells, std::vector<temporary_net> nets, std::vector<temporary_pin> all_pins);
netlist(){}
void selfcheck() const;
struct pin_t{
point<int_t> offset;
index_t cell_ind, net_ind;
pin_t(point<int_t> offs, index_t c, index_t n) : offset(offs), cell_ind(c), net_ind(n){}
};
class net_pin_iterator{
index_t pin_ind, net_ind;
netlist const & N;
public:
pin_t operator*() const{
return pin_t(N.pin_offsets_[pin_ind], N.cell_indexes_[pin_ind], net_ind);
}
net_pin_iterator & operator++(){
pin_ind++;
return *this;
}
bool operator!=(net_pin_iterator const o) const{
return pin_ind != o.pin_ind;
}
net_pin_iterator(index_t net_index, index_t pin_index, netlist const & orig) : pin_ind(pin_index), net_ind(net_index), N(orig){}
};
class cell_pin_iterator{
index_t pin_ind, cell_ind;
netlist const & N;
public:
pin_t operator*() const{
return pin_t(N.pin_offsets_[N.pin_indexes_[pin_ind]], cell_ind, N.net_indexes_[pin_ind]);
}
cell_pin_iterator & operator++(){
pin_ind++;
return *this;
}
bool operator!=(cell_pin_iterator const o) const{
return pin_ind != o.pin_ind;
}
cell_pin_iterator(index_t cell_index, index_t pin_index, netlist const & orig) : pin_ind(pin_index), cell_ind(cell_index), N(orig){}
};
struct internal_cell{
point<int_t> size;
capacity_t area;
mask_t attributes;
netlist const & N;
index_t index;
index_t pin_cnt;
internal_cell(index_t ind, netlist const & orig) :
size(orig.cell_sizes_[ind]),
area(orig.cell_areas_[ind]),
attributes(orig.cell_attributes_[ind]),
N(orig),
index(ind),
pin_cnt(N.cell_limits_[ind+1] - N.cell_limits_[ind])
{}
cell_pin_iterator begin(){ return cell_pin_iterator(index, N.cell_limits_[index], N); }
cell_pin_iterator end(){ return cell_pin_iterator(index, N.cell_limits_[index+1], N); }
};
struct internal_net{
int_t weight;
netlist const & N;
index_t index;
index_t pin_cnt;
internal_net(index_t ind, netlist const & orig) :
weight(orig.net_weights_[ind]),
N(orig),
index(ind),
pin_cnt(N.net_limits_[ind+1] - N.net_limits_[ind])
{}
net_pin_iterator begin(){ return net_pin_iterator(index, N.net_limits_[index], N); }
net_pin_iterator end(){ return net_pin_iterator(index, N.net_limits_[index+1], N); }
};
internal_cell get_cell(index_t ind) const{
return internal_cell(ind, *this);
}
internal_net get_net(index_t ind) const{
return internal_net(ind, *this);
}
index_t cell_cnt() const{ return cell_internal_mapping_.size(); }
index_t net_cnt() const{ return net_internal_mapping_.size(); }
index_t pin_cnt() const{ return pin_offsets_.size(); }
index_t get_cell_ind(index_t external_ind) const{ return cell_internal_mapping_[external_ind]; }
index_t get_net_ind(index_t external_ind) const{ return net_internal_mapping_[external_ind]; }
point<int_t> get_cell_size(index_t external_ind){
return cell_sizes_[ cell_internal_mapping_[external_ind] ];
}
void set_cell_size(index_t external_ind,point<int_t> cell_size){
cell_sizes_[cell_internal_mapping_[external_ind]] = cell_size;
}
};
inline netlist::netlist(std::vector<temporary_cell> cells, std::vector<temporary_net> nets, std::vector<temporary_pin> all_pins){
struct extended_pin : public temporary_pin{
index_t pin_index;
extended_pin(temporary_pin const p) : temporary_pin(p){}
};
std::vector<extended_pin> pins;
for(temporary_pin const p : all_pins){
pins.push_back(extended_pin(p));
}
cell_limits_.resize(cells.size()+1);
net_limits_.resize(nets.size()+1);
net_weights_.resize(nets.size());
cell_areas_.resize(cells.size());
cell_sizes_.resize(cells.size());
cell_attributes_.resize(cells.size());
cell_internal_mapping_.resize(cells.size());
net_internal_mapping_.resize(nets.size());
cell_indexes_.resize(pins.size());
pin_offsets_.resize(pins.size());
net_indexes_.resize(pins.size());
pin_indexes_.resize(pins.size());
for(index_t i=0; i<nets.size(); ++i){
net_internal_mapping_[i] = i;
}
for(index_t i=0; i<cells.size(); ++i){
cell_internal_mapping_[i] = i;
}
std::sort(pins.begin(), pins.end(), [](extended_pin const a, extended_pin const b){ return a.net_ind < b.net_ind; });
for(index_t n=0, p=0; n<nets.size(); ++n){
net_weights_[n] = nets[n].weight;
net_limits_[n] = p;
while(p<pins.size() && pins[p].net_ind == n){
cell_indexes_[p] = pins[p].cell_ind;
pin_offsets_[p] = pins[p].offset;
pins[p].pin_index = p;
++p;
}
}
net_limits_.back() = pins.size();
std::sort(pins.begin(), pins.end(), [](extended_pin const a, extended_pin const b){ return a.cell_ind < b.cell_ind; });
for(index_t c=0, p=0; c<cells.size(); ++c){
cell_areas_[c] = cells[c].area;
cell_attributes_[c] = cells[c].attributes;
cell_sizes_[c] = cells[c].size;
cell_limits_[c] = p;
while(p<pins.size() && pins[p].cell_ind == c){
net_indexes_[p] = pins[p].net_ind;
pin_indexes_[p] = pins[p].pin_index;
++p;
}
}
cell_limits_.back() = pins.size();
}
struct placement_t{
std::vector<point<int_t> > positions_;
std::vector<point<bool> > orientations_;
index_t cell_cnt() const{
assert(positions_.size() == orientations_.size());
return positions_.size();
}
void selfcheck() const;
};
} // namespace coloquinte
#endif

View File

@ -0,0 +1,161 @@
#ifndef COLOQUINTE_GP_OPTSUBPROBLEMS
#define COLOQUINTE_GP_OPTSUBPROBLEMS
#include "common.hxx"
#include <queue>
#include <vector>
#include <cassert>
#include <numeric>
#include <cmath>
#include <limits>
namespace coloquinte{
typedef std::pair<int_t, capacity_t> t1D_elt;
std::vector<capacity_t> transport_1D(std::vector<t1D_elt> sources, std::vector<t1D_elt> sinks);
std::vector<std::vector<capacity_t> > transport_convex(std::vector<capacity_t> const & capacities, std::vector<capacity_t> const & demands, std::vector<std::vector<float_t> > const & costs);
std::vector<std::vector<capacity_t> > transport_generic(std::vector<capacity_t> const & capacities, std::vector<capacity_t> const & demands, std::vector<std::vector<float_t> > const & costs);
template<typename T>
struct legalizable_task{
T width;
T target_pos;
index_t ind;
legalizable_task(T w, T p, index_t i) : width(w), target_pos(p), ind(i){}
bool operator<(legalizable_task<T> const o) const{ return target_pos < o.target_pos; }
};
// A class to obtain the optimal positions minimizing total weighted displacement along a row
// It is an ordered single row problem/fixed order single machine scheduling problem, solved by the clumping/specialized cascading descent algorithm
// The cost is linear in the distance to the target position, weighted by the width of the cells
template<typename T>
class OSRP_leg{
struct OSRP_bound{
T absolute_pos; // Will be the target absolute position of the cell
T weight; // Will be the width of the cell
bool operator<(OSRP_bound const o) const{ return absolute_pos < o.absolute_pos; }
OSRP_bound(T w, T abs_pos) : absolute_pos(abs_pos), weight(w) {}
};
T begin, end;
std::vector<index_t> cells; // The indexes in the circuit
std::vector<T> constraining_pos; // Where the cells have been pushed and constrain the positions of preceding cells
std::vector<T> prev_width; // Cumulative width of the cells: calculates the absolute position of new cells
std::priority_queue<OSRP_bound> bounds;
// Get the cost of pushing a cell on the row
T get_displacement(legalizable_task<T> const newly_pushed, bool update);
public:
T current_width() const{ return prev_width.back(); }
T remaining_space() const{ return end - begin - current_width(); }
T last_available_pos() const{ return constraining_pos.back() + current_width(); }
T get_cost(legalizable_task<T> const task){ return get_displacement(task, false); }
void push(legalizable_task<T> const task){ get_displacement(task, true); }
// Initialize
OSRP_leg(T b, T e) : begin(b), end(e), prev_width(1, 0) {}
OSRP_leg(){}
typedef std::pair<index_t, T> result_t;
// Get the resulting placement
std::vector<result_t> get_placement() const;
};
struct cell_bound{
index_t c;
int_t pos;
int_t slope;
bool operator<(cell_bound const o) const{ return c < o.c; }
cell_bound(index_t order, int_t p, int_t s) : c(order), pos(p), slope(s) {}
};
bool place_convex_single_row(std::vector<int_t> const & widths, std::vector<std::pair<int_t, int_t> > const & ranges, std::vector<cell_bound> bounds, std::vector<int_t> const & const_slopes, std::vector<int_t> & positions);
bool place_noncvx_single_row(std::vector<int_t> const & widths, std::vector<std::pair<int_t, int_t> > const & ranges, std::vector<int> const & flippables, std::vector<cell_bound> bounds, std::vector<int_t> const & const_slopes, std::vector<int_t> & positions, std::vector<int> & flippings);
template<typename T>
inline T OSRP_leg<T>::get_displacement(legalizable_task<T> const newly_pushed, bool update){
T target_abs_pos = newly_pushed.target_pos - current_width();
T width = newly_pushed.width;
T slope = - width;
T cur_pos = end;
T cur_cost = 0;
std::vector<OSRP_bound> passed_bounds;
while( not bounds.empty() and
((slope < 0 and bounds.top().absolute_pos > target_abs_pos) // Not reached equilibrium
or bounds.top().absolute_pos > end - current_width() - width) // Still not a legal position
){
T old_pos = cur_pos;
cur_pos = bounds.top().absolute_pos;
cur_cost += (old_pos - cur_pos) * (slope + width); // The additional cost for the other cells encountered
slope += bounds.top().weight;
// Remember which bounds we encountered in order to reset the object to its initial state
if(not update)
passed_bounds.push_back(bounds.top());
bounds.pop();
}
T final_abs_pos = std::min(end - current_width() - width, // Always before the end and after the beginning
std::max(begin, slope >= 0 ? cur_pos : target_abs_pos) // but did we stop before reaching the target position?
);
cur_cost += (cur_pos - final_abs_pos) * (slope + width); // The additional cost for the other cells encountered
if(std::numeric_limits<T>::is_integer){
assert(final_abs_pos >= begin);
assert(final_abs_pos <= end - current_width() - width);
}
if(update){
prev_width.push_back(width + current_width());
cells.push_back(newly_pushed.ind);
constraining_pos.push_back(final_abs_pos);
if(slope > 0){ // Remaining capacity of an encountered bound
bounds.push(OSRP_bound(slope, cur_pos));
}
// The new bound, minus what it absorbs of the remaining slope
if(target_abs_pos > begin){
bounds.push(OSRP_bound(2*width + std::min(slope, static_cast<T>(0) ), target_abs_pos));
}
}
else{
for(OSRP_bound b : passed_bounds){
bounds.push(b);
}
}
return cur_cost + width * std::abs((float)(final_abs_pos - target_abs_pos)); // Add the cost of the new cell
}
template<typename T>
inline std::vector<std::pair<index_t, T> > OSRP_leg<T>::get_placement() const{
auto final_abs_pos = constraining_pos;
std::partial_sum(final_abs_pos.rbegin(), final_abs_pos.rend(), final_abs_pos.rbegin(), [](T a, T b)->T{ return std::min(a,b); });
std::vector<result_t> ret(cells.size());
for(index_t i=0; i<cells.size(); ++i){
ret[i] = result_t(cells[i], final_abs_pos[i] + prev_width[i]);
if(std::numeric_limits<T>::is_integer){
assert(final_abs_pos[i] >= begin);
assert(final_abs_pos[i] + prev_width[i+1] <= end);
}
}
return ret;
}
}
#endif

View File

@ -0,0 +1,29 @@
#include "common.hxx"
#include <vector>
namespace coloquinte{
typedef std::pair<int_t, int_t> p_v;
struct piecewise_linear_function{
std::vector<p_v> point_values;
static piecewise_linear_function minimum(piecewise_linear_function const & a, piecewise_linear_function const & b);
piecewise_linear_function previous_min_of_sum(piecewise_linear_function const & o, int_t added_cell_width) const;
piecewise_linear_function previous_min() const;
int_t value_at(int_t pos) const;
int_t last_before(int_t pos) const;
void add_monotone(int_t slope, int_t offset);
void add_bislope(int_t s_l, int_t s_r, int_t pos);
piecewise_linear_function(){}
piecewise_linear_function(int_t min_def, int_t max_def);
};
} // End namespace coloquinte

View File

@ -0,0 +1,263 @@
#ifndef COLOQUINTE_GP_ROUGH_LEGALIZER
#define COLOQUINTE_GP_ROUGH_LEGALIZER
#include "common.hxx"
#include "netlist.hxx"
#include <vector>
#include <cassert>
#include <cmath>
#include <functional>
/*
* A simple class to perform approximate legalization with extreme efficiency
*
* To be called during global placement or before an exact legalization
*
*/
namespace coloquinte{
struct density_limit{
box<int_t> box_;
float_t density_; // from 0.0 for a macro to 1.0 if it does nothing
};
typedef std::vector<density_limit> density_restrictions;
namespace gp{
class region_distribution{
/*
* Coordinates are mostly float but obstacles and areas are integers for correctness
*/
public:
struct movable_cell{
capacity_t demand_; // == area; No FP!!!
point<float_t> pos_; // Target position, determining the cost to allocate it
// int_t x_size, y_size; // May split cells
index_t index_in_placement_;
movable_cell();
movable_cell(capacity_t demand, point<float_t> p, index_t ind);
};
// Specifies a maximum density of movable cells per usable area
// Representing either a macroblock or a routing congestion
private:
struct region;
struct cell_ref{
capacity_t allocated_capacity_;
point<float_t> pos_;
index_t index_in_list_;
cell_ref(){}
cell_ref(capacity_t demand, point<float_t> p, index_t ind) : allocated_capacity_(demand), pos_(p), index_in_list_(ind){}
friend region;
};
struct region{
public:
// Data members
capacity_t capacity_; // ==area; No floating point!!!
point<float_t> pos_;
std::vector<cell_ref> cell_references_;
// Constructors
region(){} // Necessary if we want to resize vectors
region(capacity_t cap, point<float_t> pos, std::vector<cell_ref> cells);
// Helper functions for bipartitioning
private:
static void distribute_new_cells(region & a, region & b, std::vector<cell_ref> cells); // Called by the other two to do the dirty work
public:
void distribute_cells(region & a, region & b) const; // Distribute the cells from one region to two
static void redistribute_cells(region & a, region & b); // Optimizes the distribution between two regions
// Helper functions for multipartitioning
private:
static void distribute_new_cells(std::vector<std::reference_wrapper<region_distribution::region> > regions, std::vector<cell_ref> cells);
public:
void distribute_cells(std::vector<std::reference_wrapper<region_distribution::region> > regions) const;
static void redistribute_cells(std::vector<std::reference_wrapper<region_distribution::region> > regions);
// Helper functions for 1D transportation
public:
static void distribute_new_cells(std::vector<std::reference_wrapper<region_distribution::region> > regions, std::vector<cell_ref> cells, std::function<float_t (point<float_t>)> coord);
static void redistribute_cells(std::vector<std::reference_wrapper<region_distribution::region> > & regions, std::function<float_t (point<float_t>)> coord);
public:
void uniquify_references();
void selfcheck() const;
// Accessors
capacity_t capacity() const;
capacity_t allocated_capacity() const;
capacity_t unused_capacity() const;
index_t cell_cnt() const;
float_t distance(cell_ref const & C) const;
float_t cost() const;
};
private:
// Members
index_t x_regions_cnt_, y_regions_cnt_;
std::vector<movable_cell> cell_list_;
std::vector<region> placement_regions_;
box<int_t> placement_area_;
std::vector<density_limit> density_map_;
const capacity_t full_density_mul; // Multiplicator giving the grain for fractional areas for the surface
capacity_t cell_density_mul; // ANd for the cells
float_t density_scaling_factor_;
private:
// Helper functions
region & get_region(index_t x_coord, index_t y_coord);
region const & get_region(index_t x_coord, index_t y_coord) const;
box<int_t> get_box(index_t x, index_t y, index_t x_cnt, index_t y_cnt) const;
static void sort_uniquify(std::vector<cell_ref> & cell_references);
static void just_uniquify(std::vector<cell_ref> & cell_references);
// Prepare regions with the right positions and capacities; different levels of nesting are compatible
std::vector<region> prepare_regions(index_t x_cnt, index_t y_cnt) const;
public:
inline box<int_t> placement_area() const;
inline point<float_t> region_dimensions() const;
inline index_t x_regions_cnt() const;
inline index_t y_regions_cnt() const;
inline index_t regions_cnt() const;
inline index_t cell_cnt() const;
inline index_t fractional_cell_cnt() const;
/*
* Two types of export
* Region center : upper bound of legalization cost
* 1D quadratic optimization : lower bound of legalization cost
*/
std::vector<movable_cell> export_positions() const;
std::vector<movable_cell> export_spread_positions_quadratic() const;
std::vector<movable_cell> export_spread_positions_linear() const;
// The cost as seen by the partitioning algorithms (but not the export)
float_t cost() const;
/*
* Further partitions
*/
void x_bipartition();
void y_bipartition();
void x_resize(index_t sz);
void y_resize(index_t sz);
void multipartition(index_t x_width, index_t y_width);
void multipartition(index_t width){ multipartition(width, width); }
/*
* Optimization functions
*/
// Bipartitioning: only two regions are considered at a time
void redo_adjacent_bipartitions();
void redo_diagonal_bipartitions();
void redo_bipartitions();
// Line partitioning: optimal on coordinate axis with Manhattan distance (Euclidean distance could use it in any direction)
void redo_line_partitions();
// Multipartitioning: several regions considered, slow runtimes
void redo_diag_partitions(index_t len);
void redo_multipartitions(index_t x_width, index_t y_width);
void redo_multipartitions(index_t width){ redo_multipartitions(width, width); }
// Try to remove duplicate fractional cells
void fractions_minimization();
// Verify
void selfcheck() const;
private:
region_distribution(box<int_t> placement_area, netlist const & circuit, placement_t const & pl, std::vector<density_limit> const & density_map, bool full_density);
public:
/*
* Obtain a region_distribution from a placement
*
* Full density: the object tries to pack the cells as much as possible while still respecting the density limits
* Uniform density: not only are the density limits respected, the allocated capacities are proportional to the allowed densities
*
*/
static region_distribution full_density_distribution(box<int_t> placement_area, netlist const & circuit, placement_t const & pl, std::vector<density_limit> const & density_map = std::vector<density_limit>());
static region_distribution uniform_density_distribution(box<int_t> placement_area, netlist const & circuit, placement_t const & pl, std::vector<density_limit> const & density_map = std::vector<density_limit>());
void update(netlist const & circuit, placement_t const & pl);
};
inline region_distribution::movable_cell::movable_cell(){}
inline region_distribution::movable_cell::movable_cell(capacity_t demand, point<float_t> p, index_t ind) : demand_(demand), pos_(p), index_in_placement_(ind){}
inline box<int_t> region_distribution::placement_area() const { return placement_area_; }
inline point<float_t> region_distribution::region_dimensions() const {
point<int_t> s = static_cast<point<float_t> >(placement_area().dimensions());
return point<float_t>(s.x/x_regions_cnt(), s.y/y_regions_cnt());
}
inline index_t region_distribution::x_regions_cnt() const { return x_regions_cnt_; }
inline index_t region_distribution::y_regions_cnt() const { return y_regions_cnt_; }
inline index_t region_distribution::regions_cnt() const { index_t ret = x_regions_cnt() * y_regions_cnt(); assert(placement_regions_.size() == ret); return ret; }
inline region_distribution::region & region_distribution::get_region(index_t x_coord, index_t y_coord){
return placement_regions_[y_coord * x_regions_cnt() + x_coord];
}
inline region_distribution::region const & region_distribution::get_region(index_t x_coord, index_t y_coord) const{
return placement_regions_[y_coord * x_regions_cnt() + x_coord];
}
inline index_t region_distribution::cell_cnt() const{ return cell_list_.size(); }
inline index_t region_distribution::fractional_cell_cnt() const{
index_t tot_cnt = 0;
for(auto const & R : placement_regions_){
tot_cnt += R.cell_cnt();
}
return tot_cnt;
}
inline capacity_t region_distribution::region::capacity() const{ return capacity_; }
inline capacity_t region_distribution::region::unused_capacity() const{ return capacity() - allocated_capacity(); }
inline capacity_t region_distribution::region::allocated_capacity() const{
capacity_t ret = 0;
for(cell_ref const C : cell_references_){
ret += C.allocated_capacity_;
}
return ret;
}
inline index_t region_distribution::region::cell_cnt() const{ return cell_references_.size(); }
inline float_t region_distribution::region::distance(region_distribution::cell_ref const & C) const{
return std::abs(pos_.x - C.pos_.x) + std::abs(pos_.y - C.pos_.y);
/*
float_t manhattan = std::max(static_cast<float_t>(0.0), std::max(C.pos_.x - surface_.x_max, surface_.x_min - C.pos_.x))
+ std::max(static_cast<float_t>(0.0), std::max(C.pos_.y - surface_.y_max, surface_.y_min - C.pos_.y));
return manhattan * (1.0 + manhattan * 0.0001);
*/
}
} // Namespace gp
} // Namespace coloquinte
#endif

View File

@ -0,0 +1,88 @@
#ifndef COLOQUINE_GP_SOLVERS
#define COLOQUINE_GP_SOLVERS
#include "common.hxx"
#include <vector>
namespace coloquinte{
namespace gp{
struct matrix_doublet{
index_t c_;
float val_;
bool operator<(matrix_doublet const o) const{ return c_ < o.c_; }
matrix_doublet(){}
matrix_doublet(index_t c, float v) : c_(c), val_(v){}
};
struct matrix_triplet{
index_t r_, c_;
float_t val_;
matrix_triplet(index_t ri, index_t ci, float_t v) : r_(ri), c_(ci), val_(v){}
bool operator<(matrix_triplet const o){ return r_ < o.r_ || (r_ == o.r_ && c_ < o.c_); }
};
class linear_system{
std::vector<matrix_triplet> matrix_;
std::vector<float_t> target_;
index_t internal_size_;
public:
void add_triplet(index_t row, index_t col, float_t val){ matrix_.push_back(matrix_triplet(row, col, val)); }
linear_system operator+(linear_system const & o) const;
void add_doublet(index_t row, float_t val){
target_[row] += val;
}
void add_force(
float_t force,
index_t c1, index_t c2,
float_t offs1, float_t offs2
){
add_triplet(c1, c1, force);
add_triplet(c2, c2, force);
add_triplet(c1, c2, -force);
add_triplet(c2, c1, -force);
add_doublet(c1, force * (offs2-offs1));
add_doublet(c2, force * (offs1-offs2));
}
void add_fixed_force(
float_t force,
index_t c,
float_t fixed_pos,
float_t offs
){
add_triplet(c, c, force);
add_doublet(c, force * (fixed_pos-offs));
}
void add_anchor(
float_t scale,
index_t c,
float_t pos
){
add_triplet(c, c, scale);
add_doublet(c, scale*pos);
}
linear_system(index_t s) : target_(s, 0.0), internal_size_(s){}
linear_system(index_t s, index_t i) : target_(s, 0.0), internal_size_(i){}
index_t size() const{ return target_.size(); }
index_t internal_size() const{ return internal_size_; }
void add_variables(index_t cnt){ target_.resize(target_.size() + cnt, 0.0); }
std::vector<float_t> solve_CG(std::vector<float_t> guess, index_t nbr_iter);
};
} // namespace gp
} // namespace coloquinte
#endif

View File

@ -0,0 +1,35 @@
#include "common.hxx"
#include <array>
#ifndef COLOQUINTE_TOPOLOGIES
#define COLOQUINTE_TOPOLOGIES
namespace coloquinte{
namespace steiner_lookup{
template<int pin_cnt>
struct Hconnectivity{
// The edges and the couple of pins connected to the extreme ones are represented by one char each
// The first 4 bits represent the first pin minus one, the next 4 bits the second pin minus one
std::uint8_t connexions[pin_cnt-3];
std::uint8_t extremes;
int_t get_wirelength(std::array<point<int_t>, pin_cnt> const sorted_points) const;
std::array<std::pair<index_t, index_t>, pin_cnt-1> get_x_topology(std::array<point<int_t>, pin_cnt> const sorted_points) const;
};
extern std::array<Hconnectivity<4>, 2> const topologies_4;
extern std::array<Hconnectivity<5>, 6> const topologies_5;
extern std::array<Hconnectivity<6>, 23> const topologies_6;
extern std::array<Hconnectivity<7>, 111> const topologies_7;
extern std::array<Hconnectivity<8>, 642> const topologies_8;
extern std::array<Hconnectivity<9>, 4334> const topologies_9;
extern std::array<Hconnectivity<10>, 33510> const topologies_10;
}
}
#endif

View File

@ -0,0 +1,47 @@
#ifndef COLOQUINTE_UNION_FIND
#define COLOQUINTE_UNION_FIND
#include "common.hxx"
#include <vector>
namespace coloquinte{
class union_find{
std::vector<index_t> connex_representants;
public:
index_t size() const { return connex_representants.size(); }
void merge(index_t a, index_t b){
connex_representants[find(a)] = b;
}
index_t find(index_t ind){
if(connex_representants[ind] != ind){
connex_representants[ind] = find(connex_representants[ind]);
}
return connex_representants[ind];
}
union_find(index_t s) : connex_representants(s){
for(index_t i=0; i<size(); ++i){
connex_representants[i] = i;
}
}
bool is_connex(){
bool connex = true;
for(index_t i=0; i+1<size(); ++i){
connex = connex && (find(i) == find(i+1));
}
return connex;
}
};
} // End namespace coloquinte
#endif

261
coloquinte/src/detailed.cxx Normal file
View File

@ -0,0 +1,261 @@
#include "coloquinte/detailed.hxx"
#include "coloquinte/circuit_helper.hxx"
#include <cassert>
namespace coloquinte{
namespace dp{
detailed_placement::detailed_placement(
placement_t pl,
std::vector<index_t> placement_rows,
std::vector<index_t> cell_heights,
std::vector<std::vector<index_t> > rows,
int_t min_x, int_t max_x,
int_t y_origin,
index_t nbr_rows, int_t row_height
)
:
plt_(pl),
cell_rows_(placement_rows),
min_x_(min_x), max_x_(max_x),
y_origin_(y_origin),
row_height_(row_height)
{
assert(row_height > 0);
assert(min_x < max_x);
assert(rows.size() == nbr_rows);
neighbours_limits_.push_back(0);
for(index_t h : cell_heights){
neighbours_limits_.push_back(neighbours_limits_.back() + h);
}
neighbours_ .resize(neighbours_limits_.back(), std::pair<index_t, index_t>(null_ind, null_ind) );
row_first_cells_ .resize(nbr_rows, null_ind);
row_last_cells_ .resize(nbr_rows, null_ind);
std::vector<bool> explored(neighbours_limits_.back(), false);
// Now we extract the dependencies
for(index_t r=0; r<rows.size(); ++r){
if(not rows[r].empty()){
row_first_cells_[r] = rows[r].front();
row_last_cells_[r] = rows[r].back();
}
for(index_t c : rows[r]){
// Has this row of the cell already been visited?
assert(not explored[neighbour_index(c, r)]);
explored[neighbour_index(c, r)] = true;
}
for(index_t i=0; i+1<rows[r].size(); ++i){
index_t c1 = rows[r][i], c2 = rows[r][i+1];
// Save in the internal format
neighbours_[neighbour_index(c1, r)].second = c2;
neighbours_[neighbour_index(c2, r)].first = c1;
// The positions are correct
}
}
// Every level of every cell must have been visited
for(bool o : explored)
assert(o);
// Verify that we haven't made any obvious mistake
selfcheck();
}
void detailed_placement::selfcheck() const{
assert(row_first_cells_.size() == row_last_cells_.size());
for(index_t i=0; i<cell_cnt(); ++i){
for(index_t l=0; l<cell_height(i); ++l){
// not verified now since we don't modify the position for the obstacles
// : assert(c.position.x >= min_x_ and c.position.x + c.width <= max_x_);
index_t n_ind = l + neighbours_limits_[i];
assert(cell_rows_[i] + cell_height(i) <= row_cnt());
if(neighbours_[n_ind].first != null_ind){
index_t oi = neighbours_[n_ind].first;
// Correct neighbour position
assert(neighbours_[neighbour_index(oi, cell_rows_[i]+l)].second == i);
}
else{
// Beginning of a row
assert(row_first_cells_[cell_rows_[i] + l] == i);
}
if(neighbours_[n_ind].second != null_ind){
index_t oi = neighbours_[n_ind].second;
// Correct neighbour position
assert(neighbours_[neighbour_index(oi, cell_rows_[i]+l)].first == i);
}
else{
// End of a row
assert(row_last_cells_[cell_rows_[i] + l] == i);
}
}
}
}
void detailed_placement::swap_standard_cell_topologies(index_t c1, index_t c2){
assert(cell_height(c1) == cell_height(c2));
assert(cell_height(c1) == 1 and cell_height(c2) == 1);
index_t row_c1 = cell_rows_[c1],
row_c2 = cell_rows_[c2];
index_t b_c1 = neighbours_[neighbours_limits_[c1]].first;
index_t b_c2 = neighbours_[neighbours_limits_[c2]].first;
index_t a_c1 = neighbours_[neighbours_limits_[c1]].second;
index_t a_c2 = neighbours_[neighbours_limits_[c2]].second;
// Two cases: they were adjacent or they were not
// Luckily updating in the neighbours first then swapping the recorded neighbours works in both cases for standard cells
// Update the pointers in the cells' neighbours
if(b_c1 != null_ind) neighbours_[neighbour_index(b_c1, row_c1)].second = c2;
else row_first_cells_[row_c1] = c2;
if(b_c2 != null_ind) neighbours_[neighbour_index(b_c2, row_c2)].second = c1;
else row_first_cells_[row_c2] = c1;
if(a_c1 != null_ind) neighbours_[neighbour_index(a_c1, row_c1)].first = c2;
else row_last_cells_[row_c1] = c2;
if(a_c2 != null_ind) neighbours_[neighbour_index(a_c2, row_c2)].first = c1;
else row_last_cells_[row_c2] = c1;
// Swap the properties in both cells
std::swap(neighbours_[neighbours_limits_[c1]], neighbours_[neighbours_limits_[c2]]);
std::swap(cell_rows_[c1], cell_rows_[c2]);
}
std::pair<int_t, int_t> detailed_placement::get_limit_positions(netlist const & circuit, index_t c) const{
auto ret = std::pair<int_t, int_t>(min_x_, max_x_);
for(index_t l=neighbours_limits_[c]; l<neighbours_limits_[c+1]; ++l){
index_t b_i = neighbours_[l].first,
a_i = neighbours_[l].second;
if(b_i != null_ind){
ret.first = std::max(ret.first, plt_.positions_[b_i].x + circuit.get_cell(b_i).size.x);
}
if(a_i != null_ind){
ret.second = std::min(ret.second, plt_.positions_[a_i].x);
}
}
return ret;
}
index_t detailed_placement::get_first_cell_on_row(index_t r){
return row_first_cells_[r];
}
index_t detailed_placement::get_first_standard_cell_on_row(index_t r){
index_t c = get_first_cell_on_row(r);
while(c != null_ind and cell_height(c) != 1){
index_t next_c = get_next_cell_on_row(c, r);
assert(c != next_c);
c = next_c;
}
assert(c == null_ind or cell_rows_[c] == r);
return c;
}
index_t detailed_placement::get_next_cell_on_row(index_t c, index_t r){
return neighbours_[neighbour_index(c, r)].second;
}
index_t detailed_placement::get_prev_cell_on_row(index_t c, index_t r){
return neighbours_[neighbour_index(c, r)].first;
}
index_t detailed_placement::get_next_standard_cell_on_row(index_t c, index_t r){
do{
index_t next_c = get_next_cell_on_row(c, r);
assert(c != next_c);
c = next_c;
}while(c != null_ind and cell_height(c) != 1);
assert(c == null_ind or cell_rows_[c] == r);
return c;
}
void detailed_placement::reorder_cells(std::vector<index_t> const old_order, std::vector<index_t> const new_order, index_t r){
assert(old_order.size() == new_order.size());
assert(not old_order.empty());
index_t before_row = get_prev_cell_on_row(old_order.front(), r);
index_t after_row = get_next_cell_on_row(old_order.back(), r);
for(index_t i=0; i<new_order.size(); ++i){
auto & nghs = neighbours_[neighbour_index(new_order[i], r)];
if(i > 0){
nghs.first = new_order[i-1];
}
else{
nghs.first = before_row;
}
if(i+1 < new_order.size()){
nghs.second = new_order[i+1];
}
else{
nghs.second = after_row;
}
}
if(before_row != null_ind) neighbours_[neighbour_index(before_row, r)].second = new_order.front();
else row_first_cells_[r] = new_order.front();
if(after_row != null_ind) neighbours_[neighbour_index(after_row, r)].first = new_order.back();
else row_last_cells_[r] = new_order.back();
}
void detailed_placement::reorder_standard_cells(std::vector<index_t> const old_order, std::vector<index_t> const new_order){
assert(old_order.size() == new_order.size());
assert(not old_order.empty());
index_t before_row = neighbours_[neighbours_limits_[old_order.front()]].first;
index_t after_row = neighbours_[neighbours_limits_[old_order.back() ]].second;
index_t r = cell_rows_[new_order.front()];
for(index_t i=0; i<new_order.size(); ++i){
assert(cell_height(new_order[i]) == 1);
assert(cell_rows_[new_order[i]] == r);
auto & nghs = neighbours_[neighbours_limits_[new_order[i]]];
if(i > 0){
nghs.first = new_order[i-1];
}
else{
nghs.first = before_row;
}
if(i+1 < new_order.size()){
nghs.second = new_order[i+1];
}
else{
nghs.second = after_row;
}
}
if(before_row != null_ind) neighbours_[neighbour_index(before_row, r)].second = new_order.front();
else row_first_cells_[r] = new_order.front();
if(after_row != null_ind) neighbours_[neighbour_index(after_row, r)].first = new_order.back();
else row_last_cells_[r] = new_order.back();
}
void row_compatible_orientation(netlist const & circuit, detailed_placement & pl, bool first_row_orient){
for(index_t c=0; c<circuit.cell_cnt(); ++c){
if( (circuit.get_cell(c).attributes & YFlippable) != 0 and pl.cell_height(c) == 1){
pl.plt_.orientations_[c].y = (pl.cell_rows_[c] % 2 != 0) ^ first_row_orient;
}
}
}
} // namespace dp
} // namespace coloquinte

View File

@ -0,0 +1,452 @@
#include "coloquinte/legalizer.hxx"
#include "coloquinte/optimization_subproblems.hxx"
#include <iostream>
#include <sstream>
#include <algorithm>
#include <cmath>
#include <queue>
namespace coloquinte{
namespace dp{
void get_result(netlist const & circuit, detailed_placement const & dpl, placement_t & gpl){
for(index_t c=0; c<circuit.cell_cnt(); ++c){
if( (circuit.get_cell(c).attributes & XMovable) != 0)
gpl.positions_[c].x = dpl.plt_.positions_[c].x;
if( (circuit.get_cell(c).attributes & YMovable) != 0)
gpl.positions_[c].y = dpl.plt_.positions_[c].y;
if( (circuit.get_cell(c).attributes & XFlippable) != 0)
gpl.orientations_[c].x = dpl.plt_.orientations_[c].x;
if( (circuit.get_cell(c).attributes & YFlippable) != 0)
gpl.orientations_[c].y = dpl.plt_.orientations_[c].y;
}
}
struct cell_to_leg{
int_t x_pos, y_pos;
index_t original_cell;
int_t width;
index_t nbr_rows;
bool operator<(cell_to_leg const o) const{ return x_pos < o.x_pos; }
cell_to_leg(int_t x, int_t y, index_t ind, int_t w, index_t rows)
: x_pos(x), y_pos(y),
original_cell(ind),
width(w),
nbr_rows(rows)
{}
legalizable_task<int_t> task() const{ return legalizable_task<int_t>(width, x_pos, original_cell); }
};
struct fixed_cell_interval{
int_t min_x, max_x;
index_t cell_ind;
bool operator<(fixed_cell_interval const o) const{ return min_x > o.min_x; }
fixed_cell_interval(int_t mn, int_t mx, index_t ind) : min_x(mn), max_x(mx), cell_ind(ind){}
};
struct cell_leg_properties{
int_t x_pos;
index_t row_pos;
index_t ind;
cell_leg_properties(){}
cell_leg_properties(int_t x, int_t r, index_t i) : x_pos(x), row_pos(r), ind(i){}
};
std::vector<cell_leg_properties> simple_legalize(
std::vector<std::vector<fixed_cell_interval> > obstacles, std::vector<cell_to_leg> cells,
std::vector<std::vector<index_t> > & rows,
int_t x_min, int_t x_max, int_t y_orig,
int_t row_height, index_t nbr_rows
){
std::vector<int_t> first_available_position(nbr_rows, x_min);
rows.resize(nbr_rows);
// Sort the cells by x position
std::sort(cells.begin(), cells.end());
std::vector<cell_leg_properties> ret;
for(cell_to_leg C : cells){
// Dumb, quick and dirty best-fit legalization
bool found_location = false;
// Properties of the current best solution
int_t best_x=0;
int_t best_cost=0;
index_t best_row=0;
// Helper function
auto check_row_cost = [&](index_t r, cell_to_leg const cell, int_t additional_cost){
// Find where to put the cell in these rows
// Simple method: get a range where we can put the cell
assert(r + cell.nbr_rows <= nbr_rows);
assert(additional_cost >= 0);
// First position where we can put it
int_t cur_pos = *std::max_element(first_available_position.begin() + r, first_available_position.begin() + r + cell.nbr_rows);
int_t max_lim = x_max - cell.width;
int_t interval_lim;
do{
interval_lim = max_lim;
// For each row, test if obstacles prevent us from putting a cell here
// Until we find a correct position or are beyond the maximum position
for(index_t i = 0; i<cell.nbr_rows; ++i){
// Find the first obstacle which is after this position
// TODO: use lower/upper bound
auto it=obstacles[r+i].rbegin();
for(; it != obstacles[r+i].rend() && it->max_x <= cur_pos; ++it){
}
if(it != obstacles[r+i].rend()){ // There is an obstacle on the right
assert(it->min_x < it->max_x);
int_t cur_lim = it->min_x - cell.width; // Where the obstacles contrains us
interval_lim = std::min(cur_lim, interval_lim); // Constraint
if(cur_lim < cur_pos){ // If this particular obstacle constrained us so that it is not possible to make it here, we increment the position
cur_pos = std::max(it->max_x, cur_pos);
}
}
}
// Do it again until we find a solution
// TODO: continue until we can't find a better solution (currently sticks before the first obstacle if there is enough whitespace)
}while(interval_lim < cur_pos and interval_lim < max_lim and cur_pos < max_lim); // Not admissible and we encountered an obstacle and there is still hope
if(interval_lim >= cur_pos){ // An admissible solution is found (and if cell.x_pos is between cur_pos and interval_lim it is optimal)
int_t row_best_x = std::min(interval_lim, std::max(cur_pos, cell.x_pos));
int_t row_cost_x = std::abs((float)(row_best_x - cell.x_pos));
if(not found_location or row_cost_x + additional_cost < best_cost){
found_location = true;
best_cost = row_cost_x + additional_cost;
best_x = row_best_x;
best_row = r;
}
}
};
// The row where we would prefer the cell to go
if(C.nbr_rows > nbr_rows) throw std::runtime_error("Impossible to legalize a cell spanning more rows than are available\n");
index_t central_row = std::min( (index_t) std::max( (C.y_pos - y_orig) / row_height, 0), nbr_rows-C.nbr_rows);
// Try every possible row from the best one, until we can't improve the cost
for(index_t row_dist = 0;
(central_row + row_dist < nbr_rows or central_row >= row_dist)
and (not found_location or (int_t) row_dist * row_height * C.width < (int_t) row_height + best_cost);
++row_dist
){
if(central_row + row_dist < nbr_rows - C.nbr_rows){
int_t add_cost = C.width * std::abs((float)static_cast<int_t>(central_row + row_dist) * static_cast<int_t>(row_height) + y_orig - C.y_pos);
check_row_cost(central_row + row_dist, C, add_cost);
}
if(central_row >= row_dist){
int_t add_cost = C.width * std::abs((float)static_cast<int_t>(central_row - row_dist) * static_cast<int_t>(row_height) + y_orig - C.y_pos);
check_row_cost(central_row - row_dist, C, add_cost);
}
}
if(not found_location){ // We didn't find any whitespace to put the cell in
throw std::runtime_error("Didn't manage to pack a cell due to dumb algorithm\n");
}
else{
assert(best_x + C.width <= x_max and best_x >= x_min);
// Update the occupied rows
for(index_t r = best_row; r < best_row + C.nbr_rows; ++r){
// Include the obstacles
while(not obstacles[r].empty()
and obstacles[r].back().max_x <= best_x){
rows[r].push_back(obstacles[r].back().cell_ind);
obstacles[r].pop_back();
}
assert(obstacles[r].empty() or obstacles[r].back().min_x >= best_x + C.width);
rows[r].push_back(C.original_cell);
first_available_position[r] = best_x + C.width;
}
ret.push_back(cell_leg_properties(best_x, best_row, C.original_cell));
}
}
// Finally, push the remaining fixed cells
for(index_t r=0; r<nbr_rows; ++r){
while(not obstacles[r].empty()){
rows[r].push_back(obstacles[r].back().cell_ind);
obstacles[r].pop_back();
}
}
return ret;
}
// A better legalization function which is able to push already legalized cells
std::vector<cell_leg_properties> good_legalize(
std::vector<std::vector<fixed_cell_interval> > obstacles, std::vector<cell_to_leg> cells,
std::vector<std::vector<index_t> > & rows,
int_t x_min, int_t x_max, int_t y_orig,
int_t row_height, index_t nbr_rows
){
// Two possibilities:
// * Single OSRP (group of movable cells) at the current end of the row of standard cells
// * Multiple OSRPs, between each pair of obstacles
// -> allows pushing cells past obstacles
// -> tricky with multiple standard cell heights
// Therefore I chose single OSRP, which gets cleared and pushed to the final state whenever
// * we encounter a multiple-rows cell
// * a new standard cell gets past an obstacle
// The current group of standard cells on the right of the row
std::vector<OSRP_leg<int_t> > single_row_problems(nbr_rows);
for(index_t r=0; r<nbr_rows; ++r){
single_row_problems[r] = OSRP_leg<int_t>(x_min, obstacles[r].empty() ? x_max : obstacles[r].back().min_x);
}
rows.resize(nbr_rows);
// Sort the cells by x position
std::sort(cells.begin(), cells.end());
std::vector<cell_leg_properties> ret;
for(cell_to_leg C : cells){
// Dumb, quick and dirty best-fit legalization
bool found_location = false;
// Properties of the current best solution
int_t best_cost=0;
index_t best_row=0;
index_t obstacles_passed = 0;
// Helper function
auto check_row_cost = [&](index_t r, cell_to_leg const cell, int_t additional_cost){
// Find where to put the cell in these rows
// Check if we can put it in the current ranges and at what cost; if not or if the optimal position is beyond an obstacle, try after this obstacle too
assert(cell.nbr_rows > 0);
assert(r + cell.nbr_rows <= nbr_rows);
assert(additional_cost >= 0);
// Where can we put a standard cell if we allow to move the cells?
if(cell.nbr_rows == 1){
int_t cur_cost = 0;
// Can we simply add it to the single row problem?
bool found_here = single_row_problems[r].remaining_space() >= cell.width;
int_t loc_obstacles_passed = 0;
if(found_here){
// Check the cost of pushing it here with possible displacement
cur_cost = single_row_problems[r].get_cost(cell.task()); // Don't update the row
}
// Other positions where we can put it, without moving other cells this time
if(not found_here or cur_cost > 0){
index_t obstacles_to_throw = 0;
auto it = obstacles[r].rbegin();
while(it != obstacles[r].rend()){
++ obstacles_to_throw;
auto prev_it = it++;
int_t region_end = it != obstacles[r].rend() ? it->min_x : x_max;
if(region_end >= prev_it->max_x + cell.width){
int_t loc_x = std::min(region_end - cell.width, std::max(prev_it->max_x, cell.x_pos));
int_t loc_cost = cell.width * std::abs((float)(cell.x_pos - loc_x));
if(not found_here or cur_cost > loc_cost){
found_here = true;
cur_cost = loc_cost;
loc_obstacles_passed = obstacles_to_throw;
}
}
}
}
if(found_here and (not found_location or cur_cost + additional_cost < best_cost)){
found_location = true;
//std::cout << "Found with displacement cost " << cur_cost << " and total cost " << cur_cost + additional_cost << std::endl;
best_cost = cur_cost + additional_cost;
best_row = r;
obstacles_passed = loc_obstacles_passed;
if(loc_obstacles_passed > 0) assert(not obstacles[r].empty());
}
}
else{
// If it is a fixed cell, we use fixed locations
std::cerr << "cell.nbr_rows:" << cell.nbr_rows << std::endl;
throw std::runtime_error("I don't handle fucking macros (good_legalize)\n");
}
};
// The row where we would prefer the cell to go
if(C.nbr_rows > nbr_rows) throw std::runtime_error("Impossible to legalize a cell spanning more rows than are available\n");
index_t central_row = std::min( (index_t) std::max( (C.y_pos - y_orig) / row_height, 0), nbr_rows-C.nbr_rows);
// Try every possible row from the best one, until we can't improve the cost
for(index_t row_dist = 0;
(central_row + row_dist < nbr_rows or central_row >= row_dist)
and (not found_location or (int_t) row_dist * row_height * C.width < (int_t) row_height + best_cost);
++row_dist
){
if(central_row + row_dist < nbr_rows - C.nbr_rows){
int_t add_cost = C.width * std::abs((float)static_cast<int_t>(central_row + row_dist) * static_cast<int_t>(row_height) + y_orig - C.y_pos);
check_row_cost(central_row + row_dist, C, add_cost);
}
if(central_row >= row_dist){
int_t add_cost = C.width * std::abs((float)static_cast<int_t>(central_row - row_dist) * static_cast<int_t>(row_height) + y_orig - C.y_pos);
check_row_cost(central_row - row_dist, C, add_cost);
}
}
if(not found_location){ // We didn't find any whitespace to put the cell in
throw std::runtime_error("Didn't manage to pack a cell: leave more whitespace and avoid macros near the right side\n");
}
else{
//std::cout << "Cell " << C.original_cell << " of width " << C.width << " targetting row " << central_row << " and position " << C.x_pos << " put at row " << best_row << " with displacement " << best_cost / C.width << " with " << obstacles_passed << " obstacles passed" << std::endl;
// If the cell spans multiple rows, it becomes fixed
// In this case or if the cell goes after an obstacle, push everything before the cell to the fixed state
if(C.nbr_rows == 1){
if(obstacles_passed == 0){ // Ok; just update the old single row problem
single_row_problems[best_row].push(C.task()); // Push it to the row
}
else{
assert(obstacles_passed > 0);
// Empty the single row problem
for(auto p : single_row_problems[best_row].get_placement()){
rows[best_row].push_back(p.first);
ret.push_back(cell_leg_properties(p.second, best_row, p.first));
}
// Find where to put it
int_t region_begin = x_min;
for(index_t i=0; i<obstacles_passed; ++i){
assert(not obstacles[best_row].empty());
region_begin = obstacles[best_row].back().max_x;
rows[best_row].push_back(obstacles[best_row].back().cell_ind);
obstacles[best_row].pop_back();
}
int_t region_end = obstacles[best_row].empty() ? x_max : obstacles[best_row].back().min_x;
single_row_problems[best_row] = OSRP_leg<int_t>(region_begin, region_end);
assert(region_end - region_begin >= C.width);
single_row_problems[best_row].push(C.task()); // Push this only cell to the single row problem
}
}
else{
throw std::runtime_error("I don't handle fucking macros (here)\n");
}
}
}
for(index_t r=0; r<nbr_rows; ++r){
// Finally, push the remaining standard cells in the row
for(auto p : single_row_problems[r].get_placement()){
rows[r].push_back(p.first);
ret.push_back(cell_leg_properties(p.second, r, p.first));
}
// And the fixed cells
while(not obstacles[r].empty()){
rows[r].push_back(obstacles[r].back().cell_ind);
obstacles[r].pop_back();
}
}
rows.resize(nbr_rows);
return ret;
}
detailed_placement legalize(netlist const & circuit, placement_t const & pl, box<int_t> surface, int_t row_height){
if(row_height <= 0) throw std::runtime_error("The rows' height should be positive\n");
index_t nbr_rows = (surface.y_max - surface.y_min) / row_height;
// The position of the ith row is surface.y_min + i * row_height
std::vector<std::vector<fixed_cell_interval> > row_occupation(nbr_rows);
std::vector<cell_to_leg> cells;
placement_t new_placement = pl;
std::vector<index_t> placement_rows(circuit.cell_cnt());
std::vector<index_t> cell_heights(circuit.cell_cnt());
for(index_t i=0; i<circuit.cell_cnt(); ++i){
auto cur = circuit.get_cell(i);
// Assumes fixed if not both XMovable and YMovable
if( (cur.attributes & XMovable) != 0 && (cur.attributes & YMovable) != 0){
// Just truncate the position we target
point<int_t> target_pos = pl.positions_[i];
index_t cur_cell_rows = (cur.size.y + row_height -1) / row_height;
cells.push_back(cell_to_leg(target_pos.x, target_pos.y, i, cur.size.x, cur_cell_rows));
cell_heights[i] = cur_cell_rows;
}
else{
// In each row, we put the index of the fixed cell and the range that is already occupied
int_t low_x_pos = pl.positions_[i].x,
hgh_x_pos = pl.positions_[i].x + cur.size.x,
low_y_pos = pl.positions_[i].y,
hgh_y_pos = pl.positions_[i].y + cur.size.y;
new_placement.positions_[i] = point<int_t>(low_x_pos, low_y_pos);
if(hgh_y_pos <= surface.y_min or low_y_pos >= surface.y_max or hgh_x_pos <= surface.x_min or low_x_pos >= surface.x_max){
placement_rows[i] = null_ind;
cell_heights[i] = 0;
}
else{
assert(low_x_pos < hgh_x_pos and low_y_pos < hgh_y_pos);
int_t rnd_hgh_x_pos = std::min(surface.x_max, hgh_x_pos);
int_t rnd_hgh_y_pos = std::min(surface.y_max, hgh_y_pos);
int_t rnd_low_x_pos = std::max(surface.x_min, low_x_pos);
int_t rnd_low_y_pos = std::max(surface.y_min, low_y_pos);
index_t first_row = (rnd_low_y_pos - surface.y_min) / row_height;
index_t last_row = (index_t) (rnd_hgh_y_pos - surface.y_min + row_height - 1) / row_height; // Exclusive: if the cell spans the next row, i.e. pos % row_height >= 0, include it too
assert(last_row <= nbr_rows);
placement_rows[i] = first_row;
cell_heights[i] = last_row - first_row;
for(index_t r=first_row; r<last_row; ++r){
row_occupation[r].push_back(fixed_cell_interval(rnd_low_x_pos, rnd_hgh_x_pos, i));
}
}
}
}
for(std::vector<fixed_cell_interval> & L : row_occupation){
std::sort(L.begin(), L.end()); // Sorts from last to first, so that we may use pop_back()
// Doesn't collapse them yet, which may make for bigger complexities
for(index_t i=0; i+1<L.size(); ++i){
if(L[i].min_x < L[i+1].max_x) {
std::ostringstream message;
message << "Coloquinte::dp::legalize(): Sorry, I don't handle overlapping fixed cells yet ";
message << " i:" << i << " max_x: " << L[i].max_x << " > min_x:" << L[i+1].min_x << "\n";
throw std::runtime_error(message.str());
}
}
}
std::vector<std::vector<index_t> > cells_by_rows;
auto final_cells = good_legalize(row_occupation, cells, cells_by_rows,
surface.x_min, surface.x_max, surface.y_min,
row_height, nbr_rows
);
for(cell_leg_properties C : final_cells){
new_placement.positions_[C.ind] = point<int_t>(C.x_pos, static_cast<int_t>(C.row_pos) * row_height + surface.y_min);
placement_rows[C.ind] = C.row_pos;
}
return detailed_placement(
new_placement,
placement_rows,
cell_heights,
cells_by_rows,
surface.x_min, surface.x_max,
surface.y_min,
nbr_rows, row_height
);
}
} // namespace dp
} // namespace coloquinte

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,515 @@
#include "coloquinte/optimization_subproblems.hxx"
#include <stdexcept>
namespace coloquinte{
std::vector<capacity_t> transport_1D(std::vector<t1D_elt> sources, std::vector<t1D_elt> sinks){
/* Description of the algorithm:
*
* For each cell, put it in its optimal region or the last region where a cell is if there is no space in it
* Push all changes in the derivative of the cost function to a priority queue; those changes occur
* when evicting the preceding cell from a region (most such changes are 0 and not considered, hence the complexity)
* when moving to a non-full region
* While the new cell overlaps with a new region, get the new slope (derivative) at this point
* and push all preceding cell until this region is freed or the slope becomes 0 (in which case the new region is now occupied)
*/
struct bound{
capacity_t pos;
int_t slope_diff;
bool operator<(bound const o) const{ return pos < o.pos; }
};
std::priority_queue<bound> bounds;
std::vector<capacity_t> constraining_pos;
std::vector<capacity_t> prev_cap(1, 0), prev_dem(1, 0);
for(auto const s : sinks){
prev_cap.push_back(s.second + prev_cap.back());
}
for(auto const s : sources){
prev_dem.push_back(s.second + prev_dem.back());
}
// The sinks have enough capacity to hold the whole demand
assert(prev_cap.back() >= prev_dem.back());
const capacity_t min_abs_pos = 0, max_abs_pos = prev_cap.back() - prev_dem.back();
assert(min_abs_pos <= max_abs_pos);
auto push_bound = [&](capacity_t p, int_t s){
assert(s >= 0);
if(p > min_abs_pos){
bound B;
B.pos = p;
B.slope_diff = s;
bounds.push(B);
}
};
// Distance to the right - distance to the left
auto get_slope = [&](index_t src, index_t boundary){
assert(boundary+1 < sinks.size());
assert(src < sources.size());
return std::abs((float)(sources[src].first - sinks[boundary+1].first)) - std::abs((float)(sources[src].first - sinks[boundary].first));
};
capacity_t cur_abs_pos = min_abs_pos;
index_t opt_r=0, next_r=0, first_free_r=0;
for(index_t i=0; i<sources.size(); ++i){
// Update the optimal region
while(opt_r+1 < sinks.size() and (sinks[opt_r].first + sinks[opt_r+1].first)/2 < sources[i].first){
++opt_r;
}
// Update the next region
index_t prev_next_r = next_r;
while(next_r < sinks.size() and sinks[next_r].first <= sources[i].first){
++next_r;
}
index_t dest_reg = std::max(first_free_r, opt_r);
assert(dest_reg < sinks.size());
if(i>0){
// Push bounds due to changing the source crossing the boundary j/j+1
// Linear amortized complexity accross all sources (next_r grows)
// get_slope(i-1, j) - get_slope(i, j) == 0 if j >= next_r
// get_slope(i-1, j) - get_slope(i, j) == 0 if j < prev_next_r-1
for(index_t j=std::max(prev_next_r,1u)-1; j<std::min(first_free_r, next_r+1); ++j){
assert(get_slope(i,j) <= get_slope(i-1,j));
push_bound(prev_cap[j+1] - prev_dem[i], get_slope(i-1, j) - get_slope(i,j));
}
}
// Add the bounds due to crossing the boundaries alone
for(index_t j=first_free_r; j<opt_r; ++j){
assert(get_slope(i,j) <= 0);
push_bound(prev_cap[j+1] - prev_dem[i], -get_slope(i, j));
}
first_free_r = std::max(first_free_r, opt_r);
capacity_t this_abs_pos = std::max(cur_abs_pos, prev_cap[first_free_r] - prev_dem[i]); // Just after the previous cell or at the beginning of the destination region
while(first_free_r+1 < sinks.size() and this_abs_pos > std::max(prev_cap[first_free_r+1] - prev_dem[i+1], min_abs_pos)){ // Absolute position that wouldn't make the cell fit in the region, and we are not in the last region yet
capacity_t end_pos = std::max(prev_cap[first_free_r+1] - prev_dem[i+1], min_abs_pos);
int_t add_slope = get_slope(i, first_free_r);
int_t slope = add_slope;
while(not bounds.empty() and slope >= 0 and bounds.top().pos > end_pos){
this_abs_pos = bounds.top().pos;
slope -= bounds.top().slope_diff;
bounds.pop();
}
if(slope >= 0){ // We still push: the cell completely escapes the region
this_abs_pos = end_pos;
push_bound(end_pos, add_slope-slope);
}
else{ // Ok, absorbed the whole slope: push what remains and we still occupy the next region
push_bound(this_abs_pos, -slope);
++first_free_r;
}
}
cur_abs_pos = this_abs_pos;
constraining_pos.push_back(this_abs_pos);
}
assert(constraining_pos.size() == sources.size());
if(not constraining_pos.empty()){
// Calculate the final constraining_pos
constraining_pos.back() = std::min(max_abs_pos, constraining_pos.back());
}
std::partial_sum(constraining_pos.rbegin(), constraining_pos.rend(), constraining_pos.rbegin(), [](capacity_t a, capacity_t b)->capacity_t{ return std::min(a, b); });
for(index_t i=0; i<constraining_pos.size(); ++i){
constraining_pos[i] += prev_dem[i];
}
return constraining_pos;
}
namespace{ // Anonymous namespace to hide the transportation structures
class current_allocation{
static const index_t null_ind;
// Internal data structures
// Priority queue element to determine the source to be used between regions
struct movable_source{
index_t source;
float_t cost;
bool operator<(movable_source const o) const{
return cost > o.cost // Sorted by cost
|| (cost == o.cost && source < o.source); // And by index to limit the number of fractional elements between two regions
}
movable_source(index_t s, float_t c) : source(s), cost(c) {}
};
// Member data
// The current state
std::vector<std::vector<capacity_t> > sr_allocations; // For each region, for each source, the capacity allocated by the region
std::vector<std::vector<float_t> > sr_costs; // The costs from a region to a source
std::vector<capacity_t> s_demands; // The demands of the sources
std::vector<capacity_t> r_capacities; // The remaining capacities of the regions
// Shortest path data
std::vector<float_t> r_costs; // The costs of allocating to a region
std::vector<index_t> r_parents; // The parents of the regions i.e. the regions where we push sources first (or null_ind)
std::vector<index_t> r_sources; // The source involved in these edges
std::vector<capacity_t> arc_capacities; // The capacities of the edges to the parents, or of the region if no parent
// Best edges data
std::vector<std::vector<std::priority_queue<movable_source> > > best_interregions_costs; // What is the best source to move to go from region k1 to region k2?
index_t dijkstra_cnt;
// Helper functions
// Number of regions
index_t region_cnt() const{
assert(sr_costs.size() == sr_allocations.size());
return sr_costs.size();
}
// Update the edge between two regions
void update_edge(index_t r1, index_t r2);
// Add a source to all heaps of a region; returns if we need to update a path
bool add_source_to_heaps(index_t r, index_t source);
// Initialize the heaps of a region
void create_heaps(index_t reg);
// Run the shortest path algorithm to update the cost of each region
void dijkstra_update();
// Update the edge and returns if we need to rerun Dijkstra
bool push_edge(index_t reg, capacity_t flow);
// Updates a full path when pushing an element; returns if we need to rerun Dijkstra
bool push_path(index_t pushed_reg, capacity_t demanded, capacity_t & flow);
public:
// Add a new source to the transportation problem; should be done in decreasing order of demand to keep low complexity
void add_source(index_t elt_ind);
current_allocation(std::vector<capacity_t> caps, std::vector<capacity_t> demands, std::vector<std::vector<float_t> > costs)
:
sr_allocations(caps.size()),
sr_costs(costs),
s_demands(demands),
r_capacities(caps),
r_costs(caps.size(), 0.0),
r_parents(caps.size(), null_ind),
r_sources(caps.size(), null_ind),
arc_capacities(caps),
best_interregions_costs(caps.size(), std::vector<std::priority_queue<movable_source> >(caps.size())),
dijkstra_cnt(0)
{
assert(caps.size() > 0);
assert(costs.size() == caps.size());
dijkstra_update();
}
std::vector<std::vector<capacity_t> > get_allocations() const{ return sr_allocations; }
index_t get_iterations_cnt() const { return dijkstra_cnt; }
};
const index_t current_allocation::null_ind = std::numeric_limits<index_t>::max();
void current_allocation::update_edge(index_t r1, index_t r2){
while(not best_interregions_costs[r1][r2].empty() and sr_allocations[r1][best_interregions_costs[r1][r2].top().source] == 0){
best_interregions_costs[r1][r2].pop();
}
if(not best_interregions_costs[r1][r2].empty()){
// There is an edge
movable_source cur = best_interregions_costs[r1][r2].top();
float_t new_cost = r_costs[r2] + cur.cost;
if(new_cost < r_costs[r1]){
r_costs[r1] = cur.cost;
r_sources[r1] = cur.source;
r_parents[r1] = r2;
arc_capacities[r1] = sr_allocations[r1][cur.source];
}
}
}
bool current_allocation::add_source_to_heaps(index_t r, index_t source){
bool need_rerun = false;
for(index_t i=0; i<region_cnt(); ++i){
if(i == r) continue;
best_interregions_costs[r][i].push(
movable_source(source,
sr_costs[i][source] - sr_costs[r][source]
)
);
while(sr_allocations[r][best_interregions_costs[r][i].top().source] == 0){
best_interregions_costs[r][i].pop();
}
need_rerun = (best_interregions_costs[r][i].top().source == source) or need_rerun;
}
return need_rerun;
}
void current_allocation::create_heaps(index_t reg){
// Get all relevant elements
std::vector<std::vector<movable_source> > interregion_costs(region_cnt());
for(index_t i=0; i<sr_allocations[reg].size(); ++i){
if(sr_allocations[reg][i] > 0){
for(index_t oreg=0; oreg<region_cnt(); ++oreg){
if(oreg == reg) continue;
interregion_costs[oreg].push_back(
movable_source(
i,
sr_costs[oreg][i] - sr_costs[reg][i]
)
);
}
}
}
// Create the heaps
for(index_t oreg=0; oreg<region_cnt(); ++oreg){
best_interregions_costs[reg][oreg] = std::priority_queue<movable_source>(interregion_costs[oreg].begin(), interregion_costs[oreg].end());
}
}
// Returns if the path has been modified so that we would need to rerun Dijkstra
bool current_allocation::push_edge(index_t reg, capacity_t flow){
index_t cur_source = r_sources[reg];
// Does this edge allocates a new source in the destination region? If yes, update the corresponding heaps
bool already_present = sr_allocations[r_parents[reg]][cur_source] > 0;
// Deallocating from the first region is handled by the get_edge function: just substract the flow
sr_allocations[ reg ][cur_source] -= flow;
sr_allocations[r_parents[reg]][cur_source] += flow;
assert(sr_allocations[reg][cur_source] >= 0); // The source to be pushed was indeed present in the region
assert(r_capacities[reg] == 0); // The region is full, which explains why we need to push
assert(flow <= arc_capacities[reg]); // The flow is not bigger than what can be sent
arc_capacities[reg] = sr_allocations[reg][cur_source]; // Just update the capacity if it turns out that we don't need to run Dijkstra
if(arc_capacities[reg] == 0){
// The source may have been deleted from a region: rerun Dijkstra at the end
return true;
}
else if(not already_present and r_capacities[r_parents[reg]] == 0){
// A new source is allocated to a full region: rerun Dijkstra at the end if it changed the heap's top
return add_source_to_heaps(r_parents[reg], cur_source);
}
else{
// The edge is still present with the same cost and non-zero updated capacity
// The path still exists: no need to rerun Dijkstra yet
return false;
}
}
void current_allocation::dijkstra_update(){
// Simple case of the regions with remaining capacity
std::vector<int> visited(region_cnt(), 0);
index_t visited_cnt = 0;
for(index_t i=0; i<region_cnt(); ++i){
r_sources[i] = null_ind;
r_parents[i] = null_ind;
if(r_capacities[i] > 0){
r_costs[i] = 0.0;
arc_capacities[i] = r_capacities[i];
visited[i] = 1;
++visited_cnt;
}
else{
r_costs[i] = std::numeric_limits<float_t>::infinity();
arc_capacities[i] = 0;
}
}
// if(visited_cnt <= 0) throw std::runtime_error("Capacity problem: no region has been marked as reachable\n");
if(visited_cnt == region_cnt()){ return; }
// Get the costs for every non-visited region
for(index_t i=0; i<region_cnt(); ++i) if(visited[i] == 0){ // For every region that is not visited yet
for(index_t j=0; j<region_cnt(); ++j) if(visited[j] == 1){ // For every already visited region
// Get the best interregion cost
update_edge(i,j);
}
}
while(visited_cnt < region_cnt()){
// Find the region with the lowest cost to visit; mark it visited
index_t best_reg = null_ind;
float_t best_cost = std::numeric_limits<float_t>::infinity();
for(index_t i=0; i<region_cnt(); ++i) if(visited[i] == 0){ // For every region that is not visited yet
if(r_costs[i] < best_cost){
best_cost = r_costs[i];
best_reg = i;
}
}
if(best_reg == null_ind) break; // Some regions are unreachable, typically because they have zero capacity at the beginning
visited[best_reg] = 1;
++visited_cnt;
// Update the cost for every unvisited region
for(index_t i=0; i<region_cnt(); ++i) if(visited[i] == 0){ // For every region that is not visited yet
update_edge(i, best_reg);
}
}
}
bool current_allocation::push_path(index_t pushed_reg, capacity_t demanded, capacity_t & flow){
// Get the final flow sent, which is smaller than the capacities on the path
flow = demanded;
for(index_t reg = pushed_reg; reg != null_ind; reg = r_parents[reg]){
flow = std::min(flow, arc_capacities[reg]);
}
bool rerun_dijkstra = false;
// Update the path between the regions
index_t reg = pushed_reg;
for(; r_parents[reg] != null_ind; reg = r_parents[reg]){
assert(r_capacities[reg] == 0);
rerun_dijkstra = push_edge(reg, flow) or rerun_dijkstra;
}
assert(r_capacities[reg] > 0);
assert(arc_capacities[reg] == r_capacities[reg]);
assert(r_capacities[reg] >= flow);
// Update the capacities at the end
r_capacities[reg] -= flow;
arc_capacities[reg] -= flow;
// The last region on the path is the one that satisfies the demand
if(r_capacities[reg] == 0){ // If we just consumed the available capacity, it becomes useful to move sources off this region: build the heap
create_heaps(reg);
rerun_dijkstra = true;
}
assert(flow > 0);
// If an edge changes cost or a region is full,
// we need to update the costs, parents, sources and arc_capacities using a Dijkstra
// but later
return rerun_dijkstra;
}
void current_allocation::add_source(index_t elt_ind){ //capacity_t demand, std::vector<float_t> const & costs){
for(index_t i=0; i<region_cnt(); ++i){
sr_allocations[i].push_back(0);
}
bool need_rerun = false;
capacity_t demand = s_demands[elt_ind];
while(demand > 0){
// In case we modified the structures earlier
if(need_rerun){
dijkstra_update();
need_rerun = false;
}
++ dijkstra_cnt;
index_t best_reg = null_ind;
float_t best_cost = std::numeric_limits<float_t>::infinity();
for(index_t reg=0; reg<region_cnt(); ++reg){
// Find the region which gets the source
if(r_costs[reg] + sr_costs[reg][elt_ind] < best_cost){
best_reg = reg;
best_cost = r_costs[reg] + sr_costs[reg][elt_ind];
}
}
if(best_reg == null_ind){ throw std::runtime_error("No reachable region found\n"); }
capacity_t flow = 0;
// Tells us whether we need to update the data structures
need_rerun = push_path(best_reg, demand, flow);
demand -= flow;
// Lazily store the change
sr_allocations[best_reg][elt_ind] += flow;
}
// Set the source's demand
for(index_t i=0; i<region_cnt(); ++i){
if(r_capacities[i] == 0 and sr_allocations[i][elt_ind] > 0){
need_rerun = add_source_to_heaps(i, elt_ind) or need_rerun;
}
}
// We leave a clean set with correct paths for the next iteration
if(need_rerun)
dijkstra_update();
}
} // End anonymous namespace
std::vector<std::vector<capacity_t> > transport_generic(std::vector<capacity_t> const & capacities, std::vector<capacity_t> const & demands, std::vector<std::vector<float_t> > const & costs){
current_allocation transporter(capacities, demands, costs);
for(index_t i=0; i<demands.size(); ++i){
transporter.add_source(i);
}
return transporter.get_allocations();
}
bool place_convex_single_row(std::vector<int_t> const & widths, std::vector<std::pair<int_t, int_t> > const & ranges, std::vector<cell_bound> bounds, std::vector<int_t> const & const_slopes, std::vector<int_t> & positions){
std::sort(bounds.begin(), bounds.end());
struct bound{
int_t abs_pos;
int_t slope_diff;
bool operator<(bound const o) const{ return abs_pos < o.abs_pos; }
bound(int_t p, int_t s) : abs_pos(p), slope_diff(s) {}
};
std::priority_queue<bound> prio_queue;
std::vector<int_t> prev_widths(widths.size()+1, 0);
std::partial_sum(widths.begin(), widths.end(), std::next(prev_widths.begin()));
std::vector<int_t> constraining_pos(widths.size());
int_t lower_lim = std::numeric_limits<int_t>::min();
for(index_t i=0, j=0; i<widths.size(); ++i){
int_t old_width = prev_widths[i];
int_t new_width = prev_widths[i+1];
lower_lim = std::max(ranges[i].first - old_width, lower_lim);
int_t upper_lim = ranges[i].second - new_width;
for(; j<bounds.size() and bounds[j].c == i; ++j){
prio_queue.push(bound(bounds[j].pos - old_width, bounds[j].slope));
}
if(upper_lim < lower_lim){ // Infeasible
return false;
}
int_t cur_slope = const_slopes[i];
int_t cur_pos = upper_lim;
while(not prio_queue.empty() and (cur_slope > 0 or prio_queue.top().abs_pos > upper_lim)){
cur_slope -= prio_queue.top().slope_diff;
cur_pos = prio_queue.top().abs_pos;
prio_queue.pop();
}
int_t final_abs_pos = std::max(std::min(cur_pos, upper_lim), lower_lim);
constraining_pos[i] = final_abs_pos;
if(cur_slope < 0){
prio_queue.push(bound(final_abs_pos, -cur_slope));
}
}
positions.resize(constraining_pos.size());
std::partial_sum(constraining_pos.rbegin(), constraining_pos.rend(), positions.rbegin(), [](int_t a, int_t b)->int_t{ return std::min(a,b); });
for(index_t i=0; i<positions.size(); ++i){
positions[i] += prev_widths[i];
}
return true;
}
bool place_noncvx_single_row(std::vector<int_t> const & widths, std::vector<std::pair<int_t, int_t> > const & ranges, std::vector<int> const & flippables, std::vector<cell_bound> bounds, std::vector<int_t> const & const_slopes, std::vector<int_t> & positions, std::vector<int> & flippings){
flippings = std::vector<int>(positions.size(), 0);
return place_convex_single_row(widths, ranges, bounds, const_slopes, positions);
}
} // Namespace coloquinte

View File

@ -0,0 +1,166 @@
#include "coloquinte/circuit_helper.hxx"
#include <stack>
#include <functional>
#include <algorithm>
namespace coloquinte{
namespace gp{
namespace{
//index_t const null_ind = std::numeric_limits<index_t>::max();
inline void opt_orient(netlist const & circuit, placement_t & pl, std::function<int_t (point<int_t>)> i_coor, std::function<bool & (point<bool> &)> b_coor,mask_t FLIPPABLE){
std::stack<index_t> opt_cells;
for(index_t cell_ind = 0; cell_ind < circuit.cell_cnt(); ++cell_ind){
if( (circuit.get_cell(cell_ind).attributes & FLIPPABLE) != 0)
opt_cells.push(cell_ind);
}
while(not opt_cells.empty()){
index_t cell_ind = opt_cells.top(); opt_cells.pop();
assert((circuit.get_cell(cell_ind).attributes & FLIPPABLE) != 0);
// What is the current orientation?
bool old_orientation = b_coor(pl.orientations_[cell_ind]);
int_t pos = i_coor(pl.positions_[cell_ind]);
int_t size = i_coor(circuit.get_cell(cell_ind).size);
// Check both orientations of the cell
std::vector<index_t> involved_nets;
for(netlist::pin_t p : circuit.get_cell(cell_ind)){
involved_nets.push_back(p.net_ind);
}
// Deal with cells with multiple pins in one net (uniquify)
std::sort(involved_nets.begin(), involved_nets.end());
involved_nets.resize(std::distance(involved_nets.begin(), std::unique(involved_nets.begin(), involved_nets.end())));
std::int64_t p_cost = 0, n_cost = 0;
std::vector<index_t> extreme_elements;
for(index_t n : involved_nets){
std::vector<pin_1D> other_pins;
std::vector<int_t> offsets;
for(auto p : circuit.get_net(n)){
if(p.cell_ind != cell_ind){
other_pins.push_back(pin_1D(
p.cell_ind,
i_coor(pl.positions_[p.cell_ind])
+ (b_coor(pl.orientations_[p.cell_ind]) ? i_coor(p.offset) : i_coor(circuit.get_cell(p.cell_ind).size) - i_coor(p.offset)),
0, // Don't care about the offset
(circuit.get_cell(p.cell_ind).attributes & FLIPPABLE) != 0)
);
}
else{
offsets.push_back(i_coor(p.offset));
}
}
assert(offsets.size() > 0);
if(other_pins.size() > 0){ // Else the orientation of the cell doesn't change anything
auto minmaxC = std::minmax_element(other_pins.begin(), other_pins.end());
auto minmaxO = std::minmax_element(offsets.begin(), offsets.end());
p_cost += std::max(pos + *minmaxO.second, minmaxC.second->pos) - std::min(pos + *minmaxO.first, minmaxC.first->pos);
n_cost += std::max(pos + size - *minmaxO.first, minmaxC.second->pos) - std::min(pos + size - *minmaxO.second, minmaxC.first->pos);
int_t min_pin_pos = std::min(pos + *minmaxO.second, pos + size - *minmaxO.first),
max_pin_pos = std::max(pos + *minmaxO.second, pos + size - *minmaxO.first);
// Do the extreme elements change between the two positions?
if(minmaxC.second->movable
and (minmaxC.second->pos < max_pin_pos)
and (minmaxC.second->pos > min_pin_pos) ){
extreme_elements.push_back(minmaxC.second->cell_ind);
}
if(minmaxC.first->movable
and (minmaxC.first->pos < max_pin_pos)
and (minmaxC.first->pos > min_pin_pos) ){
extreme_elements.push_back(minmaxC.first->cell_ind);
}
}
}
if(p_cost < n_cost)
b_coor(pl.orientations_[cell_ind]) = true;
if(p_cost > n_cost)
b_coor(pl.orientations_[cell_ind]) = false;
// If we changed the orientation, check the extreme pins which changed and try their cells again
if(b_coor(pl.orientations_[cell_ind]) != old_orientation){
std::sort(extreme_elements.begin(), extreme_elements.end());
extreme_elements.resize(std::distance(extreme_elements.begin(), std::unique(extreme_elements.begin(), extreme_elements.end())));
for(index_t extreme_cell : extreme_elements){
if( (circuit.get_cell(extreme_cell).attributes & FLIPPABLE) != 0)
opt_cells.push(extreme_cell);
}
}
}
}
/*
inline void spread_orient(netlist const & circuit, placement_t & pl, std::function<float_t & (point<float_t> &)> coor, mask_t FLIPPABLE){
std::vector<float_t> weights(circuit.cell_cnt(), 0.0);
for(index_t n=0; n<circuit.net_cnt(); ++n){
float_t min_pos=INF, max_pos=-INF;
float_t min_offs=INF, max_offs=-INF;
index_t min_ind=null_ind, max_ind=null_ind;
for(netlist::pin_t p : circuit.get_net(n)){
if( (circuit.get_cell(p.cell_ind).attributes & FLIPPABLE) != 0){
float_t pos = coor(pl.positions_[p.cell_ind]);
if(pos < min_pos){
min_pos = pos;
min_ind = p.cell_ind;
min_offs = coor(p.offset);
}
if(pos > max_pos){
max_pos = pos;
max_ind = p.cell_ind;
max_offs = coor(p.offset);
}
}
else{
float_t pos = coor(pl.positions_[p.cell_ind]) + coor(pl.orientations_[p.cell_ind]) * coor(p.offset);
if(pos < min_pos){
min_pos = pos;
min_ind = null_ind;
}
if(pos > max_pos){
max_pos = pos;
max_ind = null_ind;
}
}
}
float_t net_weight = circuit.get_net(n).weight;
if(min_ind != null_ind) weights[min_ind] += net_weight * min_offs;
if(max_ind != null_ind) weights[max_ind] -= net_weight * max_offs;
}
for(index_t c=0; c<circuit.cell_cnt(); ++c){
coor(pl.orientations_[c]) = (weights[c] >= 0.0) ? 1.0 : -1.0;
}
}
*/
} // End anonymous namespace
void optimize_x_orientations(netlist const & circuit, placement_t & pl){
opt_orient(circuit, pl, [](point<int_t> p) -> int_t { return p.x; }, [](point<bool> & p) -> bool & { return p.x; }, XFlippable);
}
void optimize_y_orientations(netlist const & circuit, placement_t & pl){
opt_orient(circuit, pl, [](point<int_t> p) -> int_t { return p.y; }, [](point<bool> & p) -> bool & { return p.y; }, YFlippable);
}
// Iteratively optimize feasible orientations; performs only one pass
void optimize_exact_orientations(netlist const & circuit, placement_t & pl){
optimize_x_orientations(circuit, pl);
optimize_y_orientations(circuit, pl);
}
/*
void spread_orientations(netlist const & circuit, placement_t & pl){
spread_orient(circuit, pl, [](point<float_t> & p) -> float_t & { return p.x; }, XFlippable);
spread_orient(circuit, pl, [](point<float_t> & p) -> float_t & { return p.y; }, YFlippable);
}
*/
} // namespace gp
} // namespace coloquinte

View File

@ -0,0 +1,260 @@
#include "coloquinte/piecewise_linear.hxx"
#include <cassert>
#include <cmath>
namespace coloquinte{
namespace{
struct pl_edge{
p_v f, s;
static void push_intersections(pl_edge a, pl_edge b, piecewise_linear_function & lf){
// Strict, because it makes everything easier
//assert(a.f.first < b.s.first and a.s.first > b.f.first);
//assert(a.f.first < a.s.first and b.f.first < b.s.first);
assert(a.f.first <= b.s.first and a.s.first >= b.f.first);
assert(a.f.first <= a.s.first and b.f.first <= b.s.first);
// ra = (a.s.second - a.f.second) / (a.s.first - a.f.first)
// xintersect = (yb - ya - xb * rb + xa * ra) / (ra - rb)
double ra = static_cast<double>(a.s.second - a.f.second) / (a.s.first - a.f.first);
double rb = static_cast<double>(b.s.second - b.f.second) / (b.s.first - b.f.first);
double xintersect = (b.f.second - a.f.second - rb * b.f.first + ra * a.f.first) / (ra - rb);
if( not xintersect ) return;
int_t pos = xintersect;
if( std::ceil(xintersect) == std::floor(xintersect) ){ // Exact integer intersection
if(pos > std::max(a.f.first, b.f.first) and pos < std::min(a.s.first, b.s.first) ){ // Necessarily smaller than s.first due to the previous condition
lf.point_values.push_back(p_v(pos, a.value_at(pos)));
}
}
else{ // Non exact intersection: create two integers since I don't want to mess with floating point
int_t pos1 = pos;
int_t pos2 = pos + 1;
// Value_at is only an approximation, but it shouldn't be too bad
if(pos1 > std::max(a.f.first, b.f.first) and pos1 < std::min(a.s.first, b.s.first))
lf.point_values.push_back(p_v(pos1, std::min(a.value_at(pos1), b.value_at(pos1))));
if(pos2 > std::max(a.f.first, b.f.first) and pos2 < std::min(a.s.first, b.s.first))
lf.point_values.push_back(p_v(pos2, std::min(a.value_at(pos2), b.value_at(pos2))));
}
}
// Lower-rounded value
int_t value_at(int_t pos) const{
assert(pos >= f.first and pos <= s.first and s.first > f.first);
return (static_cast<std::int64_t>(f.second) * (s.first - pos) + static_cast<std::int64_t>(s.second) * (pos - f.first)) / (s.first - f.first);
}
// Lower-rounded value
int_t pos_at(int_t val) const{
assert(val <= std::max(f.second, s.second) and val >= std::min(f.second, s.second));
assert(f.second != s.second);
return (static_cast<std::int64_t>(f.first) * (s.second - val) + static_cast<std::int64_t>(s.first) * (val - f.second)) / (s.second - f.second);
}
bool above(p_v const o) const{
int_t pos = o.first;
assert(pos > f.first and pos < s.first);
return (static_cast<std::int64_t>(f.second) * (s.first - pos) + static_cast<std::int64_t>(s.second) * (pos - f.first)) > o.second * (s.first - f.first);
}
pl_edge(p_v a, p_v b) : f(a), s(b) {}
};
} // End anonymous namespace
void piecewise_linear_function::add_monotone(int_t slope, int_t offset){
for(auto & V : point_values){
// Offset taken into account here, multiplied with the slope
V.second += slope * (V.first - point_values.front().first - offset);
}
}
void piecewise_linear_function::add_bislope(int_t s_l, int_t s_r, int_t pos){
//assert(pos <= point_values.back().first);
//assert(pos >= point_values.front().first);
/*
if(pos >= point_values.back().first){
add_monotone(s_l, pos - point_values.front().first);
}
else if(pos <= point_values.front().first){
add_monotone(s_r, pos - point_values.front().first);
}
else{
auto it = point_values.begin();
while(it->first < pos){
it->second += s_l * (it->first - pos);
++it;
assert(it != point_values.end());
}
if(it->first != pos){
point_values.insert(it, p_v(pos, pl_edge(*std::prev(it), *it).value_at(pos)));
}
for(auto & V : point_values){
if(V.first > pos)
V.second += s_r * (V.first - pos);
}
}
*/
auto it = std::lower_bound(point_values.begin(), point_values.end(), pos, [](p_v o, int_t v){ return o.first < v; });
if(it != point_values.end() and it->first != pos and it != point_values.begin()){
assert(it->first > pos);
point_values.insert(it, p_v(pos, pl_edge(*std::prev(it), *it).value_at(pos)));
}
for(auto & V : point_values){
if(V.first > pos)
V.second += s_r * (V.first - pos);
if(V.first < pos)
V.second += s_l * (V.first - pos);
}
}
piecewise_linear_function::piecewise_linear_function(int_t min_def, int_t max_def){
point_values.push_back(p_v(min_def, 0));
point_values.push_back(p_v(max_def, 0));
}
piecewise_linear_function piecewise_linear_function::previous_min() const{
piecewise_linear_function ret;
assert(not point_values.empty());
auto it = point_values.begin();
ret.point_values.push_back(*it);
++it;
// Use the previous minimum to detect when we find something smaller
for(; it != point_values.end(); ++it){
int_t cur_min = ret.point_values.back().second;
assert(it->first >= ret.point_values.back().first);
if(it->second < cur_min){
if(std::prev(it)->first != ret.point_values.back().first){ // May be equal, in which case we don't need to push anything new
int_t pos = pl_edge(*std::prev(it), *it).pos_at(cur_min);
if(pos != ret.point_values.back().first and pos != it->first){
ret.point_values.push_back(p_v(pos, cur_min));
}
}
ret.point_values.push_back(*it);
}
}
return ret;
}
piecewise_linear_function piecewise_linear_function::previous_min_of_sum(piecewise_linear_function const & a, int_t shift) const{
piecewise_linear_function ret;
// Go to the correct definition
auto b_begin = point_values.begin(), a_begin = a.point_values.begin();
auto b_it = b_begin, a_it = a_begin;
auto b_end = point_values.end(), a_end = a.point_values.end();
while(a_it != a_end){
if(b_it == b_end or a_it->first < b_it->first+shift){ // Ok, create an edge and calculate the value
if(b_it != b_begin){
int_t value;
if(b_it != b_end){
pl_edge b_edge(*std::prev(b_it), *b_it);
value = b_edge.value_at(a_it->first-shift);
}
else{
value = point_values.back().second;
}
ret.point_values.push_back(p_v(a_it->first, a_it->second + value));
}
++a_it;
}
else if(a_it->first > b_it->first+shift){
if(a_it != a_begin){
pl_edge a_edge(*std::prev(a_it), *a_it);
int_t value = a_edge.value_at(b_it->first+shift);
ret.point_values.push_back(p_v(b_it->first+shift, b_it->second + value));
}
++b_it;
}
else{ // if(a_it->first == b_it->first+shift){
ret.point_values.push_back(p_v(a_it->first, a_it->second + b_it->second));
++a_it;
++b_it;
}
}
return ret.previous_min();
}
int_t piecewise_linear_function::last_before(int_t pos) const{
auto it = point_values.rbegin();
while(it != point_values.rend()){
if(it->first <= pos){
if(it != point_values.rbegin() and std::prev(it)->first > pos){ // On a negative slope
return pos;
}
else{
return it->first; // First point or not mapped to a negative slope in the original function
}
}
++it;
}
assert(false); // We should have found it if the bound was correct
return -1;
}
int_t piecewise_linear_function::value_at(int_t pos) const{
// First position bigger or equal than pos
auto it = std::lower_bound(point_values.begin(), point_values.end(), pos, [](p_v o, int_t v){ return o.first < v; });
if(pos != it->first){
assert(it != point_values.begin());
return pl_edge(*std::prev(it), *it).value_at(pos);
}
else{
return it->second;
}
}
piecewise_linear_function piecewise_linear_function::piecewise_linear_function::minimum(piecewise_linear_function const & a, piecewise_linear_function const & b){
assert(a.point_values.front().first == b.point_values.front().first);
assert(a.point_values.back().first == b.point_values.back().first);
piecewise_linear_function ret;
auto a_it = a.point_values.begin(), b_it = b.point_values.begin();
auto a_end = a.point_values.end(), b_end = b.point_values.end();
ret.point_values.push_back(p_v(a_it->first, std::min(a_it->second, b_it->second)));
assert(std::next(a_it) != a_end and std::next(b_it) != b_end);
while(std::next(a_it) != a_end and std::next(b_it) != b_end){
pl_edge a_edge(*a_it, *std::next(a_it)), b_edge(*b_it, *std::next(b_it));
// Three cases: one of them always below, or both intersect
// Both intersect: we push the values when intersecting
pl_edge::push_intersections(a_edge, b_edge, ret);
// In any case, we push the value of the one below if it finishes, and increment the iterator
if(a_edge.s.first < b_edge.s.first){
++a_it;
if(b_edge.above(a_edge.s)){ // We push a_edge.s
ret.point_values.push_back(a_edge.s);
}
}
else if(a_edge.s.first > b_edge.s.first){
++b_it;
if(a_edge.above(b_edge.s)){ // We push a_edge.s
ret.point_values.push_back(b_edge.s);
}
}
else{
ret.point_values.push_back(p_v(a_edge.s.first, std::min(a_edge.s.second, b_edge.s.second)));
++a_it;
++b_it;
}
}
return ret;
}
} // End namespace coloquinte

File diff suppressed because it is too large Load Diff

599
coloquinte/src/row_opt.cxx Normal file
View File

@ -0,0 +1,599 @@
#include "coloquinte/detailed.hxx"
#include "coloquinte/circuit_helper.hxx"
#include "coloquinte/optimization_subproblems.hxx"
#include "coloquinte/union_find.hxx"
#include "coloquinte/piecewise_linear.hxx"
#include <cassert>
#include <iostream>
namespace coloquinte{
namespace dp{
namespace{
struct minmax{
int_t min, max;
minmax(){}
minmax(int_t f, int_t s) : min(f), max(s){}
void merge(minmax const o){
min = std::min(min, o.min);
max = std::max(max, o.max);
}
void merge(int_t const o){
merge(minmax(o, o));
}
};
struct order_gettr{
index_t cell_ind, seq_order;
bool operator<(order_gettr const o) const{ return cell_ind < o.cell_ind; }
bool operator<(index_t const o) const{ return cell_ind < o; }
order_gettr(index_t c, index_t i) : cell_ind(c), seq_order(i) {}
};
std::vector<order_gettr> get_sorted_ordered_cells(std::vector<index_t> const & cells){
std::vector<order_gettr> ret;
for(index_t i=0; i<cells.size(); ++i){
ret.push_back(order_gettr(cells[i],i));
}
std::sort(ret.begin(), ret.end());
return ret;
}
std::vector<index_t> get_unique_nets(netlist const & circuit, std::vector<index_t> const & cells){
std::vector<index_t> involved_nets;
for(index_t c : cells){
for(netlist::pin_t p : circuit.get_cell(c)){
involved_nets.push_back(p.net_ind);
}
}
// Uniquify the nets
std::sort(involved_nets.begin(), involved_nets.end());
involved_nets.resize(std::distance(involved_nets.begin(), std::unique(involved_nets.begin(), involved_nets.end())));
return involved_nets;
}
struct Hnet_group{
struct Hpin{
index_t cell_index; // Not indexes in the circuit!!! Rather in the internal algorithm
minmax offset;
bool operator<(Hpin const o) const{ return cell_index < o.cell_index; }
};
struct Hnet{
bool has_ext_pins;
minmax ext_pins;
int_t weight;
Hnet(){
has_ext_pins = false;
ext_pins = minmax(std::numeric_limits<int_t>::max(), 0);
weight = 1;
}
};
std::vector<index_t> net_limits;
std::vector<Hnet> nets;
std::vector<Hpin> pins;
std::vector<int_t> cell_widths;
Hnet_group(){
net_limits.push_back(0);
}
void add_net(std::vector<pin_1D> const added_pins, int_t weight){
Hnet cur_net;
cur_net.weight = weight;
std::vector<Hpin> new_pins;
for(auto const p : added_pins){
if(p.movable){
Hpin new_pin;
new_pin.cell_index = p.cell_ind;
new_pin.offset = minmax(p.offs, p.offs);
new_pins.push_back(new_pin);
}
else{
cur_net.has_ext_pins = true;
cur_net.ext_pins.merge(p.pos);
}
}
std::sort(new_pins.begin(), new_pins.end());
if(not new_pins.empty()){ // Possible when generating from a Steiner topology
// Uniquify just in case there are several pins on the net on a single cell
index_t j=0;
auto prev_pin = new_pins[0];
for(auto it = new_pins.begin()+1; it != new_pins.end(); ++it){
if(it->cell_index == prev_pin.cell_index){
prev_pin.offset.merge(it->offset);
}
else{
new_pins[j] = prev_pin;
++j;
prev_pin = *it;
}
}
new_pins[j]=prev_pin;
new_pins.resize(j+1);
nets.push_back(cur_net);
net_limits.push_back(net_limits.back() + new_pins.size());
pins.insert(pins.end(), new_pins.begin(), new_pins.end());
}
}
std::int64_t get_cost(std::vector<int_t> const & pos) const{
std::int64_t cost=0;
for(index_t n=0; n<nets.size(); ++n){
auto cur_net = nets[n];
minmax mm(std::numeric_limits<int_t>::max(), std::numeric_limits<int_t>::min());
if(cur_net.has_ext_pins){
mm = cur_net.ext_pins;
}
assert(net_limits[n+1] > net_limits[n]);
for(index_t p=net_limits[n]; p<net_limits[n+1]; ++p){
int_t cur_pos = pos[pins[p].cell_index];
mm.merge( minmax(cur_pos + pins[p].offset.min, cur_pos + pins[p].offset.max) );
}
cost += static_cast<std::int64_t>(cur_net.weight) * (mm.max - mm.min);
}
return cost;
}
std::int64_t get_cost(std::vector<int_t> const & pos, std::vector<int> const & flip) const{
std::int64_t cost=0;
for(index_t n=0; n<nets.size(); ++n){
auto cur_net = nets[n];
minmax mm(std::numeric_limits<int_t>::max(), std::numeric_limits<int_t>::min());
if(cur_net.has_ext_pins){
mm = cur_net.ext_pins;
}
assert(net_limits[n+1] > net_limits[n]);
for(index_t p=net_limits[n]; p<net_limits[n+1]; ++p){
int_t cur_pos = pos[pins[p].cell_index];
bool flipped = flip[pins[p].cell_index];
int_t wdth = cell_widths[pins[p].cell_index];
mm.merge( flipped ?
minmax(cur_pos + wdth - pins[p].offset.max, cur_pos + wdth - pins[p].offset.min)
: minmax(cur_pos + pins[p].offset.min, cur_pos + pins[p].offset.max)
);
}
cost += static_cast<std::int64_t>(cur_net.weight) * (mm.max - mm.min);
}
return cost;
}
};
Hnet_group get_B2B_netgroup(netlist const & circuit, detailed_placement const & pl, std::vector<index_t> const & cells){
std::vector<order_gettr> cells_in_row = get_sorted_ordered_cells(cells);
std::vector<index_t> involved_nets = get_unique_nets(circuit, cells);
Hnet_group ret;
for(index_t c : cells)
ret.cell_widths.push_back(circuit.get_cell(c).size.x);
for(index_t n : involved_nets){
std::vector<pin_1D> cur_pins = get_pins_1D(circuit, pl.plt_, n).x;
for(pin_1D & p : cur_pins){
auto it = std::lower_bound(cells_in_row.begin(), cells_in_row.end(), p.cell_ind);
if(it != cells_in_row.end() and it->cell_ind == p.cell_ind){
p.cell_ind = it->seq_order;
}
else{ // Found a pin which remains fixed for this round
p.movable = false;
}
}
ret.add_net(cur_pins, circuit.get_net(n).weight);
}
return ret;
}
Hnet_group get_RSMT_netgroup(netlist const & circuit, detailed_placement const & pl, std::vector<index_t> const & cells){
std::vector<order_gettr> cells_in_row = get_sorted_ordered_cells(cells);
std::vector<index_t> involved_nets = get_unique_nets(circuit, cells);
Hnet_group ret;
for(index_t c : cells)
ret.cell_widths.push_back(circuit.get_cell(c).size.x);
for(index_t n : involved_nets){
auto vpins = get_pins_2D(circuit, pl.plt_, n);
for(auto & p : vpins){
auto it = std::lower_bound(cells_in_row.begin(), cells_in_row.end(), p.cell_ind);
if(it != cells_in_row.end() and it->cell_ind == p.cell_ind){
p.cell_ind = it->seq_order;
}
else{
p.movable = false;
}
}
std::vector<point<int_t> > pin_locations;
for(auto p : vpins)
pin_locations.push_back(p.pos);
auto const Htopo = get_RSMT_topology(pin_locations, 8).x;
// In the horizontal topology, we transform the parts of the tree that are on the row into HPWL subnets
// Two pins sharing an edge are in the same subnet if one of them is on the row: use union-find
union_find UF(vpins.size());
for(auto E : Htopo){
if( vpins[E.first].movable or vpins[E.second].movable){
UF.merge(E.first, E.second);
}
}
std::vector<std::vector<pin_1D> > connex_comps(vpins.size());
for(index_t i=0; i<vpins.size(); ++i){
connex_comps[UF.find(i)].push_back(vpins[i].x());;
}
int_t weight = circuit.get_net(n).weight;
for(index_t i=0; i<vpins.size(); ++i){
if(not connex_comps[i].empty()){
ret.add_net(connex_comps[i], weight);
}
}
}
return ret;
}
// Optimizes an ordered sequence of standard cells on the same row, returns the cost and the corresponding positions
inline std::int64_t optimize_convex_sequence(Hnet_group const & nets, std::vector<index_t> const & permutation, std::vector<int_t> & positions, std::vector<std::pair<int_t, int_t> > const & cell_ranges){
// Get the widths of the cells in row order
std::vector<int_t> loc_widths(permutation.size());
std::vector<std::pair<int_t, int_t> > loc_ranges(permutation.size());
for(index_t i=0; i<permutation.size(); ++i){
loc_widths[permutation[i]] = nets.cell_widths[i];
loc_ranges[permutation[i]] = cell_ranges[i];
}
std::vector<cell_bound> bounds;
std::vector<int_t> right_slopes(permutation.size(), 0);
for(index_t n=0; n<nets.nets.size(); ++n){
index_t fst_c=std::numeric_limits<index_t>::max(), lst_c=0;
int_t fst_pin_offs=0, lst_pin_offs=0;
assert(nets.net_limits[n+1] > nets.net_limits[n]);
auto cur_net = nets.nets[n];
for(index_t p=nets.net_limits[n]; p<nets.net_limits[n+1]; ++p){
// Permutation: index in the Hnet_group to index in the row
index_t cur_cell = permutation[nets.pins[p].cell_index];
if(cur_cell < fst_c){
fst_c = cur_cell;
fst_pin_offs = nets.pins[p].offset.min;
}
if(cur_cell >= lst_c){
lst_c = cur_cell;
lst_pin_offs = nets.pins[p].offset.max;
}
}
if(cur_net.has_ext_pins){
bounds.push_back(cell_bound(fst_c, cur_net.ext_pins.min - fst_pin_offs, cur_net.weight));
bounds.push_back(cell_bound(lst_c, cur_net.ext_pins.max - lst_pin_offs, cur_net.weight));
right_slopes[lst_c] += cur_net.weight;
}
else{
right_slopes[lst_c] += cur_net.weight;
right_slopes[fst_c] -= cur_net.weight;
}
}
bool feasible = place_convex_single_row(loc_widths, loc_ranges, bounds, right_slopes, positions);
auto permuted_positions = positions;
for(index_t i=0; i<permutation.size(); ++i){
permuted_positions[i] = positions[permutation[i]];
}
if(feasible)
return nets.get_cost(permuted_positions);
else
return std::numeric_limits<std::int64_t>::max(); // Infeasible: return a very big cost
}
// TODO: take modified order relative to the obstacles into account
inline std::int64_t optimize_noncvx_sequence(Hnet_group const & nets, std::vector<index_t> const & permutation, std::vector<int_t> & positions, std::vector<int> & flippings, std::vector<int> const & flippability, std::vector<std::pair<int_t, int_t> > const & cell_ranges){
// Get the widths of the cells in row order
std::vector<int_t> loc_widths(permutation.size());
std::vector<int> loc_flipps(permutation.size());
std::vector<std::pair<int_t, int_t> > loc_ranges(permutation.size());
for(index_t i=0; i<permutation.size(); ++i){
loc_widths[permutation[i]] = nets.cell_widths[i];
loc_ranges[permutation[i]] = cell_ranges[i];
loc_flipps[permutation[i]] = flippability[i];
}
int_t min_limit = std::numeric_limits<int_t>::min();
for(index_t i=0; i<loc_ranges.size(); ++i){
min_limit = std::max(loc_ranges[i].first, min_limit);
loc_ranges[i].first = min_limit;
min_limit += loc_widths[i];
}
int_t max_limit = std::numeric_limits<int_t>::max();
for(index_t i=loc_ranges.size(); i>0; --i){
max_limit = std::min(loc_ranges[i-1].second, max_limit);
max_limit -= loc_widths[i-1];
loc_ranges[i-1].second = max_limit;
}
for(index_t i=0; i<loc_ranges.size(); ++i){
if(loc_ranges[i].first > loc_ranges[i].second){
return std::numeric_limits<std::int64_t>::max(); // Infeasible: return a very big cost
}
}
std::vector<piecewise_linear_function> unflipped_cost_functions, flipped_cost_functions;
for(index_t i=0; i<loc_ranges.size(); ++i){
auto cur = piecewise_linear_function(loc_ranges[i].first, loc_ranges[i].second);
unflipped_cost_functions.push_back(cur);
flipped_cost_functions.push_back(cur);
}
for(index_t n=0; n<nets.nets.size(); ++n){
index_t fst_c=std::numeric_limits<index_t>::max(), lst_c=0;
int_t fst_pin_offs_mn=0, lst_pin_offs_mn=0,
fst_pin_offs_mx=0, lst_pin_offs_mx=0;
assert(nets.net_limits[n+1] > nets.net_limits[n]);
auto cur_net = nets.nets[n];
for(index_t p=nets.net_limits[n]; p<nets.net_limits[n+1]; ++p){
// Permutation: index in the Hnet_group to index in the row
index_t cur_cell = permutation[nets.pins[p].cell_index];
if(cur_cell < fst_c){
fst_c = cur_cell;
fst_pin_offs_mn = nets.pins[p].offset.min;
fst_pin_offs_mx = nets.pins[p].offset.max;
}
if(cur_cell >= lst_c){
lst_c = cur_cell;
lst_pin_offs_mn = nets.pins[p].offset.min;
lst_pin_offs_mx = nets.pins[p].offset.max;
}
}
if(cur_net.has_ext_pins){
unflipped_cost_functions[fst_c].add_bislope(-cur_net.weight, 0, cur_net.ext_pins.min - fst_pin_offs_mn);
unflipped_cost_functions[lst_c].add_bislope(0, cur_net.weight, cur_net.ext_pins.max - lst_pin_offs_mx);
flipped_cost_functions[fst_c].add_bislope(-cur_net.weight, 0, cur_net.ext_pins.min - loc_widths[fst_c] + fst_pin_offs_mx);
flipped_cost_functions[lst_c].add_bislope(0, cur_net.weight, cur_net.ext_pins.max - loc_widths[lst_c] + lst_pin_offs_mn);
}
else{
unflipped_cost_functions[fst_c].add_monotone(-cur_net.weight, -fst_pin_offs_mn);
unflipped_cost_functions[lst_c].add_monotone( cur_net.weight, -lst_pin_offs_mx);
flipped_cost_functions[fst_c].add_monotone(-cur_net.weight, fst_pin_offs_mx - loc_widths[fst_c] );
flipped_cost_functions[lst_c].add_monotone( cur_net.weight, lst_pin_offs_mn - loc_widths[lst_c] );
}
}
std::vector<piecewise_linear_function> prev_mins, merged_costs;
for(index_t i=0; i<loc_ranges.size(); ++i){
merged_costs.push_back(loc_flipps[i] ?
piecewise_linear_function::minimum(unflipped_cost_functions[i], flipped_cost_functions[i])
: unflipped_cost_functions[i]
);
if(i>0){
prev_mins.push_back(prev_mins.back().previous_min_of_sum(merged_costs.back(), loc_widths[i-1]));
}
else{
prev_mins.push_back(merged_costs.back().previous_min());
}
}
for(auto const M : prev_mins){
for(index_t i=0; i+1<M.point_values.size(); ++i){
assert(M.point_values[i].second >= M.point_values[i+1].second);
}
}
flippings.resize(cell_ranges.size(), 0); positions.resize(cell_ranges.size(), 0);
int_t pos = std::numeric_limits<int_t>::max();
for(index_t i=loc_ranges.size(); i>0; --i){
// Find the best position and flipping for each cell
pos = prev_mins[i-1].last_before(std::min(pos - loc_widths[i-1], loc_ranges[i-1].second) );
positions[i-1] = pos;
if(loc_flipps[i-1] and flipped_cost_functions[i-1].value_at(pos) < unflipped_cost_functions[i-1].value_at(pos)){
flippings[i-1] = 1;
}
}
for(index_t i=0; i<loc_ranges.size(); ++i){
assert(positions[i] >= loc_ranges[i].first);
assert(positions[i] <= loc_ranges[i].second);
}
for(index_t i=0; i+1<loc_ranges.size(); ++i){
assert(positions[i] + loc_widths[i] <= positions[i+1]);
}
auto permuted_positions = positions;
auto permuted_flippings = flippings;
for(index_t i=0; i<permutation.size(); ++i){
permuted_positions[i] = positions[permutation[i]];
permuted_flippings[i] = flippings[permutation[i]];
}
return nets.get_cost(permuted_positions, permuted_flippings);
}
std::vector<std::pair<int_t, int_t> > get_cell_ranges(netlist const & circuit, detailed_placement const & pl, std::vector<index_t> const & cells){
std::vector<std::pair<int_t, int_t> > lims;
for(index_t i=0; i+1<cells.size(); ++i){
assert(pl.plt_.positions_[cells[i]].x + circuit.get_cell(cells[i]).size.x <= pl.plt_.positions_[cells[i+1]].x);
}
// Extreme limits, except macros are allowed to be beyond the limit of the placement area
int_t lower_lim = pl.get_limit_positions(circuit, cells.front()).first;
int_t upper_lim = pl.get_limit_positions(circuit, cells.back()).second;
for(index_t OSRP_cell : cells){
auto attr = circuit.get_cell(OSRP_cell).attributes;
auto cur_lim = std::pair<int_t, int_t>(lower_lim, upper_lim);
int_t pos = pl.plt_.positions_[OSRP_cell].x;
if( (attr & XMovable) == 0 or pl.cell_height(OSRP_cell) != 1){
cur_lim = std::pair<int_t, int_t>(pos, pos + circuit.get_cell(OSRP_cell).size.x);
}
else{
assert(pos >= lower_lim);
assert(pos + circuit.get_cell(OSRP_cell).size.x <= upper_lim);
}
lims.push_back(cur_lim);
}
return lims;
}
template<bool NON_CONVEX, bool RSMT>
void OSRP_generic(netlist const & circuit, detailed_placement & pl){
for(index_t r=0; r<pl.row_cnt(); ++r){
// Complete optimization on a row, comprising possible obstacles
std::vector<index_t> cells;
std::vector<int> flippability;
// Get the movable cells, if we can flip them, and the obstacles on the row
for(index_t OSRP_cell = pl.get_first_cell_on_row(r); OSRP_cell != null_ind; OSRP_cell = pl.get_next_cell_on_row(OSRP_cell, r)){
auto attr = circuit.get_cell(OSRP_cell).attributes;
cells.push_back(OSRP_cell);
flippability.push_back( (attr & XFlippable) != 0 ? 1 : 0);
}
if(not cells.empty()){
std::vector<std::pair<int_t, int_t> > lims = get_cell_ranges(circuit, pl, cells); // Limit positions for each cell
Hnet_group nets = RSMT ?
get_RSMT_netgroup(circuit, pl, cells)
: get_B2B_netgroup(circuit, pl, cells);
std::vector<index_t> no_permutation(cells.size());
for(index_t i=0; i<cells.size(); ++i) no_permutation[i] = i;
std::vector<int_t> final_positions;
if(NON_CONVEX){
std::vector<int> flipped;
optimize_noncvx_sequence(nets, no_permutation, final_positions, flipped, flippability, lims);
for(index_t i=0; i<cells.size(); ++i){
bool old_orient = pl.plt_.orientations_[cells[i]].x;
pl.plt_.orientations_[cells[i]].x = flipped[i] ? not old_orient : old_orient;
}
}
else{
optimize_convex_sequence(nets, no_permutation, final_positions, lims);
}
// Update the positions and orientations
for(index_t i=0; i<cells.size(); ++i){
pl.plt_.positions_[cells[i]].x = final_positions[i];
}
}
} // Iteration on the rows
pl.selfcheck();
}
template<bool NON_CONVEX, bool RSMT>
void swaps_row_generic(netlist const & circuit, detailed_placement & pl, index_t range){
assert(range >= 2);
for(index_t r=0; r<pl.row_cnt(); ++r){
index_t OSRP_cell = pl.get_first_cell_on_row(r);
while(OSRP_cell != null_ind){
std::vector<index_t> cells;
std::vector<std::pair<int_t, int_t> > lims;
std::vector<int> flippables;
for(index_t nbr_cells=0;
OSRP_cell != null_ind
and nbr_cells < range;
OSRP_cell = pl.get_next_cell_on_row(OSRP_cell, r), ++nbr_cells
){
cells.push_back(OSRP_cell);
flippables.push_back( (circuit.get_cell(OSRP_cell).attributes & XFlippable) != 0);
}
if(not cells.empty()){
std::vector<std::pair<int_t, int_t> > lims = get_cell_ranges(circuit, pl, cells); // Limit positions for each cell
Hnet_group nets = RSMT ?
get_RSMT_netgroup(circuit, pl, cells)
: get_B2B_netgroup(circuit, pl, cells);
std::int64_t best_cost = std::numeric_limits<std::int64_t>::max();
std::vector<int_t> positions(cells.size());
std::vector<int> flippings(cells.size());
std::vector<int_t> best_positions(cells.size());
std::vector<int> best_flippings(cells.size());
std::vector<index_t> permutation(cells.size());
for(index_t i=0; i<cells.size(); ++i) permutation[i] = i;
std::vector<index_t> best_permutation;
// Check every possible permutation of the cells
do{
std::int64_t cur_cost = NON_CONVEX ?
optimize_noncvx_sequence(nets, permutation, positions, flippings, flippables, lims) :
optimize_convex_sequence(nets, permutation, positions, lims);
if(cur_cost <= best_cost){
best_cost = cur_cost;
best_permutation = permutation;
best_flippings = flippings;
best_positions = positions;
}
}while(std::next_permutation(permutation.begin(), permutation.end()));
std::vector<index_t> new_cell_order(cells.size());
// Update the positions and the topology
for(index_t i=0; i<cells.size(); ++i){
index_t r_ind = best_permutation[i]; // In the row from in the Hnet_group
new_cell_order[r_ind] = cells[i];
pl.plt_.positions_[cells[i]].x = best_positions[r_ind];
if(NON_CONVEX){
bool old_orient = pl.plt_.orientations_[cells[i]].x;
pl.plt_.orientations_[cells[i]].x = best_flippings[r_ind] ? not old_orient : old_orient;
}
}
pl.reorder_cells(cells, new_cell_order, r);
cells = new_cell_order;
assert(best_cost < std::numeric_limits<std::int64_t>::max());
}
if(OSRP_cell != null_ind){
assert(cells.size() == range);
OSRP_cell = cells[range/2];
}
} // Iteration on the entire row
} // Iteration on the rows
pl.selfcheck();
}
} // End anonymous namespace
void OSRP_convex_HPWL(netlist const & circuit, detailed_placement & pl){ OSRP_generic< false, false>(circuit, pl); }
void OSRP_convex_RSMT(netlist const & circuit, detailed_placement & pl){ OSRP_generic< false, true >(circuit, pl); }
void OSRP_noncvx_HPWL(netlist const & circuit, detailed_placement & pl){ OSRP_generic< true , false>(circuit, pl); }
void OSRP_noncvx_RSMT(netlist const & circuit, detailed_placement & pl){ OSRP_generic< true , true >(circuit, pl); }
void swaps_row_convex_HPWL(netlist const & circuit, detailed_placement & pl, index_t range){ swaps_row_generic< false, false>(circuit, pl, range); }
void swaps_row_convex_RSMT(netlist const & circuit, detailed_placement & pl, index_t range){ swaps_row_generic< false, true >(circuit, pl, range); }
void swaps_row_noncvx_HPWL(netlist const & circuit, detailed_placement & pl, index_t range){ swaps_row_generic< true , false>(circuit, pl, range); }
void swaps_row_noncvx_RSMT(netlist const & circuit, detailed_placement & pl, index_t range){ swaps_row_generic< true , true >(circuit, pl, range); }
} // namespace dp
} // namespace coloquinte

384
coloquinte/src/solvers.cxx Normal file
View File

@ -0,0 +1,384 @@
#include "coloquinte/solvers.hxx"
#include <cassert>
#include <stdexcept>
#include <cmath>
#include <limits>
namespace coloquinte{
namespace gp{
linear_system linear_system::operator+(linear_system const & o) const{
if(o.internal_size() != internal_size()){ throw std::runtime_error("Mismatched system sizes"); }
linear_system ret(target_.size() + o.target_.size() - internal_size(), internal_size());
ret.matrix_ = matrix_;
std::vector<matrix_triplet> omatrix = o.matrix_;
for(matrix_triplet & t : omatrix){
if(t.c_ >= internal_size()){
t.c_ += (target_.size() - internal_size());
}
if(t.r_ >= internal_size()){
t.r_ += (target_.size() - internal_size());
}
}
ret.matrix_.insert(ret.matrix_.end(), omatrix.begin(), omatrix.end());
// ret.target_.resize(target_.size() + o.target_.size() - internal_size);
for(index_t i=0; i<internal_size(); ++i){
ret.target_[i] = target_[i] + o.target_[i];
}
for(index_t i=internal_size(); i<target_.size(); ++i){
ret.target_[i] = target_[i];
}
for(index_t i=internal_size(); i<o.target_.size(); ++i){
ret.target_[i + target_.size() - internal_size()] = o.target_[i];
}
return ret;
}
// The classical compressed sparse row storage
struct csr_matrix{
std::vector<std::uint32_t> row_limits, col_indexes;
std::vector<float> values, diag;
std::vector<float> mul(std::vector<float> const & x) const;
std::vector<float> solve_CG(std::vector<float> const & goal, std::vector<float> guess, std::uint32_t min_iter, std::uint32_t max_iter, float tol) const;
csr_matrix(std::vector<std::uint32_t> const & row_l, std::vector<std::uint32_t> const & col_i, std::vector<float> const & vals, std::vector<float> const D) : row_limits(row_l), col_indexes(col_i), values(vals), diag(D){
assert(values.size() == col_indexes.size());
assert(diag.size()+1 == row_limits.size());
}
};
// A matrix with successive rows padded to the same length and accessed column-major; hopefully a little better
template<std::uint32_t unroll_len>
struct ellpack_matrix{
std::vector<std::uint32_t> row_limits, col_indexes;
std::vector<float> values, diag;
std::vector<float> mul(std::vector<float> const & x) const;
std::vector<float> solve_CG(std::vector<float> goal, std::vector<float> guess, std::uint32_t min_iter, std::uint32_t max_iter, float tol) const;
ellpack_matrix(std::vector<std::uint32_t> const & row_l, std::vector<std::uint32_t> const & col_i, std::vector<float> const & vals, std::vector<float> const D) : row_limits(row_l), col_indexes(col_i), values(vals), diag(D){
assert(values.size() == col_indexes.size());
assert(diag.size() % unroll_len == 0);
assert((row_limits.size()-1) * unroll_len == diag.size() );
assert(row_limits.back() * unroll_len == values.size());
assert(values.size() % unroll_len == 0);
assert(col_indexes.size() % unroll_len == 0);
}
};
// The proxy matrix for compressed sparse storage
class doublet_matrix{
std::vector<std::uint32_t> row_limits;
std::vector<matrix_doublet> doublets;
std::uint32_t size;
void get_compressed(std::vector<std::uint32_t> & limits, std::vector<matrix_doublet> & elements, std::vector<float> & diag) const;
public:
doublet_matrix(std::vector<matrix_triplet> const & triplets, std::uint32_t size);
csr_matrix get_compressed_matrix() const;
template<std::uint32_t unroll_len>
ellpack_matrix<unroll_len> get_ellpack_matrix() const;
};
doublet_matrix::doublet_matrix(std::vector<matrix_triplet> const & triplets, std::uint32_t n) : size(n){
row_limits.resize(size+1, 0);
// First store the row sizes in the array
for(uint32_t i=0; i<triplets.size(); ++i){
++row_limits[triplets[i].r_+1];
}
// The total size of the uncompressed matrix
uint32_t tot_triplets=0;
// Get the beginning position of each row in the csr matrix
for(uint32_t i=1; i<n+1; ++i){
uint32_t new_tot_triplets = tot_triplets + row_limits[i];
row_limits[i] = tot_triplets; // Stores the beginning of the row
tot_triplets = new_tot_triplets;
}
assert(tot_triplets == triplets.size());
// Now we know the size and can allocate storage for the indices and values
doublets.resize(tot_triplets);
// We store the triplets in the new storage and tranform beginning positions into end positions
for(uint32_t i=0; i<triplets.size(); ++i){
doublets[row_limits[triplets[i].r_+1]] = matrix_doublet(triplets[i].c_, triplets[i].val_);
++row_limits[triplets[i].r_+1]; // row_limits will hold the end position of the row
}
}
void doublet_matrix::get_compressed(std::vector<std::uint32_t> & sizes, std::vector<matrix_doublet> & elements, std::vector<float> & diag) const{
assert(size+1 == row_limits.size());
sizes.resize(size);
diag.resize(size, 0.0);
std::vector<matrix_doublet> tmp_doublets = doublets;
for(uint32_t i=0; i<size; ++i){
// Sort the elements in the row
std::sort(tmp_doublets.begin() + row_limits[i], tmp_doublets.begin() + row_limits[i+1]);
// Compress them and extract the diagonal
std::uint32_t l=0;
matrix_doublet cur(tmp_doublets[row_limits[i]]);
for(uint32_t j=row_limits[i]+1; j<row_limits[i+1]; ++j){
if(tmp_doublets[j].c_ == cur.c_){
cur.val_ += tmp_doublets[j].val_;
}
else{
if(i != cur.c_){
elements.push_back(cur);
++l;
}
else{
diag[i] = cur.val_;
}
cur = tmp_doublets[j];
}
}
if(i != cur.c_){
elements.push_back(cur);
++l;
}
else{
diag[i] = cur.val_;
}
sizes[i] = l;
}
}
csr_matrix doublet_matrix::get_compressed_matrix() const{
std::vector<matrix_doublet> tmp_doublets;
std::vector<std::uint32_t> sizes;
std::vector<float> diag;
get_compressed(sizes, tmp_doublets, diag);
// Get the limits of each row
std::vector<std::uint32_t> new_row_limits(row_limits.size());
new_row_limits[0] = 0;
for(std::uint32_t i=0; i<size; ++i){
new_row_limits[i+1] = new_row_limits[i] + sizes[i];
}
// Store the doublets to the sparse storage
std::vector<std::uint32_t> col_indices(tmp_doublets.size());
std::vector<float> values(tmp_doublets.size());
for(std::uint32_t i=0; i<tmp_doublets.size(); ++i){
col_indices[i] = tmp_doublets[i].c_;
values[i] = tmp_doublets[i].val_;
}
return csr_matrix(new_row_limits, col_indices, values, diag);
}
template<std::uint32_t unroll_len>
ellpack_matrix<unroll_len> doublet_matrix::get_ellpack_matrix() const{
std::vector<matrix_doublet> tmp_doublets;
std::vector<std::uint32_t> sizes;
std::vector<float> diag;
get_compressed(sizes, tmp_doublets, diag);
std::uint32_t unrolled_size = (diag.size() % unroll_len == 0)? diag.size()/unroll_len : diag.size() / unroll_len + 1;
sizes.resize(unroll_len * unrolled_size, 0);
diag.resize(unroll_len * unrolled_size, 1.0);
// Store the maximum size of a group of rows
std::vector<std::uint32_t> new_row_limits(unrolled_size+1);
new_row_limits[0] = 0;
for(std::uint32_t i=0; i<unrolled_size; ++i){
std::uint32_t max_sz = sizes[unroll_len*i];
for(int j=1; j<unroll_len; ++j){
max_sz = std::max(max_sz, sizes[unroll_len*i + j]);
}
new_row_limits[i+1] = new_row_limits[i] + max_sz;
}
std::vector<std::uint32_t> col_indices(unroll_len * new_row_limits.back());
std::vector<float> values(unroll_len * new_row_limits.back());
std::uint32_t d = 0;
for(std::uint32_t i=0; i<sizes.size(); ++i){ // For every line
std::uint32_t ui = i/unroll_len;
std::uint32_t k = i%unroll_len;
std::uint32_t max_sz = new_row_limits[ui+1] - new_row_limits[ui];
std::uint32_t row_begin = new_row_limits[ui];
for(std::uint32_t j=0; j<sizes[i]; ++j, ++d){ // For the non-zero values
col_indices[unroll_len * (row_begin+j) + k] = tmp_doublets[d].c_;
values[unroll_len * (row_begin+j) + k] = tmp_doublets[d].val_;
}
for(std::uint32_t j=sizes[i]; j<max_sz; ++j){ // For the padding zeroes
col_indices[unroll_len * (row_begin+j) + k] = 0;
values[unroll_len * (row_begin+j) + k] = 0;
}
}
return ellpack_matrix<unroll_len>(new_row_limits, col_indices, values, diag);
}
std::vector<float> csr_matrix::mul(std::vector<float> const & x) const{
std::vector<float> res(x.size());
assert(x.size() == diag.size());
for(std::uint32_t i=0; i<diag.size(); ++i){
res[i] = diag[i] * x[i];
for(std::uint32_t j=row_limits[i]; j<row_limits[i+1]; ++j){
res[i] += values[j] * x[col_indexes[j]];
}
}
return res;
}
template<std::uint32_t unroll_len>
std::vector<float> ellpack_matrix<unroll_len>::mul(std::vector<float> const & x) const{
std::vector<float> res(x.size());
assert(x.size() % unroll_len == 0);
assert(x.size() == diag.size());
for(std::uint32_t i=0; i+1<row_limits.size(); ++i){
float cur[unroll_len];
for(int k=0; k<unroll_len; ++k){
cur[k] = diag[unroll_len*i+k] * x[unroll_len*i+k];
}
for(std::uint32_t j=row_limits[i]; j<row_limits[i+1]; ++j){
for(int k=0; k<unroll_len; ++k){
cur[k] += values[unroll_len*j+k] * x[col_indexes[unroll_len*j+k]];
}
}
for(int k=0; k<unroll_len; ++k){
res[unroll_len*i+k] = cur[k];
}
}
return res;
}
template<std::uint32_t unroll_len>
float dot_prod(std::vector<float> const & a, std::vector<float> const & b){
assert(a.size() == b.size());
float vals[unroll_len];
for(int j=0; j<unroll_len; ++j) vals[j] = 0.0;
for(std::uint32_t i=0; i<a.size() / unroll_len; ++i){
for(int j=0; j<unroll_len; ++j){
vals[j] += a[unroll_len*i + j] * b[unroll_len*i + j];
}
}
float res = 0.0;
for(int j=0; j<unroll_len; ++j) res += vals[j];
for(int i = unroll_len*(a.size() / unroll_len); i< a.size(); ++i){
res += a[i] * b[i];
}
return res;
}
std::vector<float> csr_matrix::solve_CG(std::vector<float> const & goal, std::vector<float> x, std::uint32_t min_iter, std::uint32_t max_iter, float tol_ratio) const{
std::uint32_t n = diag.size();
assert(goal.size() == n);
assert(x.size() == n);
std::vector<float> r, p(n), z(n), mul_res, preconditioner(n);
r = mul(x);
for(uint32_t i=0; i<n; ++i){
r[i] = goal[i] - r[i];
preconditioner[i] = 1.0/diag[i];
assert(std::isfinite(preconditioner[i]));
z[i] = preconditioner[i] * r[i];
p[i] = z[i];
}
float cross_norm = dot_prod<16>(r, z);
assert(std::isfinite(cross_norm));
float_t const epsilon = std::numeric_limits<float_t>::min();
float start_norm = cross_norm;
for(uint32_t k=0; k < max_iter; ++k){
mul_res = mul(p);
float_t pr_prod = dot_prod<16>(p, mul_res);
float_t alpha = cross_norm / pr_prod;
if(
not std::isfinite(cross_norm) or not std::isfinite(alpha) or not std::isfinite(pr_prod)
or cross_norm <= epsilon or alpha <= epsilon or pr_prod <= epsilon
){
break;
}
// Update the result
for(uint32_t i=0; i<n; ++i){
x[i] = x[i] + alpha * p[i];
r[i] = r[i] - alpha * mul_res[i];
z[i] = preconditioner[i] * r[i];
}
float new_cross_norm = dot_prod<16>(r, z);
// Update the scaled residual and the search direction
if(k >= min_iter && new_cross_norm <= tol_ratio * start_norm){
break;
}
float beta = new_cross_norm / cross_norm;
cross_norm = new_cross_norm;
for(uint32_t i=0; i<n; ++i)
p[i] = z[i] + beta * p[i];
}
return x;
}
template<std::uint32_t unroll_len>
std::vector<float> ellpack_matrix<unroll_len>::solve_CG(std::vector<float> goal, std::vector<float> x, std::uint32_t min_iter, std::uint32_t max_iter, float tol_ratio) const{
std::uint32_t n = diag.size();
std::uint32_t old_n = x.size();
assert(goal.size() == x.size());
x.resize(diag.size(), 0.0);
goal.resize(diag.size(), 0.0);
std::vector<float> r, p(n), z(n), mul_res, preconditioner(n);
r = mul(x);
for(uint32_t i=0; i<n; ++i){
r[i] = goal[i] - r[i];
preconditioner[i] = 1.0/diag[i];
z[i] = preconditioner[i] * r[i];
p[i] = z[i];
}
float cross_norm = dot_prod<unroll_len>(r, z);
float start_norm = cross_norm;
for(uint32_t k=0; k < max_iter; ++k){
mul_res = mul(p);
float alpha = cross_norm / dot_prod<unroll_len>(p, mul_res);
// Update the result
for(uint32_t i=0; i<n; ++i){
x[i] = x[i] + alpha * p[i];
r[i] = r[i] - alpha * mul_res[i];
z[i] = preconditioner[i] * r[i];
}
float new_cross_norm = dot_prod<unroll_len>(r, z);
// Update the scaled residual and the search direction
if(k >= min_iter && new_cross_norm <= tol_ratio * start_norm){
break;
}
float beta = new_cross_norm / cross_norm;
cross_norm = new_cross_norm;
for(uint32_t i=0; i<n; ++i)
p[i] = z[i] + beta * p[i];
}
x.resize(old_n);
return x;
}
std::vector<float_t> linear_system::solve_CG(std::vector<float_t> guess, index_t nbr_iter){
doublet_matrix tmp(matrix_, size());
csr_matrix mat = tmp.get_compressed_matrix();
//ellpack_matrix<16> mat = tmp.get_ellpack_matrix<16>();
guess.resize(target_.size(), 0.0);
auto ret = mat.solve_CG(target_, guess, nbr_iter, nbr_iter, 0.0);
ret.resize(internal_size());
return ret;
}
}
}

View File

@ -0,0 +1,536 @@
#include "coloquinte/topologies.hxx"
#include "coloquinte/circuit_helper.hxx"
#include "coloquinte/union_find.hxx"
#include <algorithm>
#include <cassert>
#include <set>
#include <functional>
#include <cmath>
#include <array>
#include <limits>
namespace coloquinte{
using edge_t = std::pair<index_t, index_t>;
namespace{
struct minmax_t{
int_t min, max;
minmax_t(int_t mn, int_t mx) : min(mn), max(mx) {}
minmax_t() {}
void merge(minmax_t const o){
min = std::min(o.max, min);
max = std::max(o.min, max);
}
void merge(int_t const p){
min = std::min(p, min);
max = std::max(p, max);
}
};
}
namespace steiner_lookup{
template<int pin_cnt>
int_t Hconnectivity<pin_cnt>::get_wirelength(std::array<point<int_t>, pin_cnt> const sorted_points) const{
std::array<minmax_t, pin_cnt-2> minmaxs;
for(index_t i=0; i<pin_cnt-2; ++i){
minmaxs[i] = minmax_t(sorted_points[i+1].y, sorted_points[i+1].y);
}
std::uint8_t b_con = extremes & 15u, e_con = extremes >> 4;
minmaxs[b_con].merge(sorted_points.front() .y);
minmaxs[e_con].merge(sorted_points.back() .y);
for(std::uint8_t const E : connexions){
minmaxs[(E >> 4)].merge(minmaxs[(E & 15u)]);
}
int_t cost = sorted_points.back().x - sorted_points.front().x + sorted_points[b_con+1].x - sorted_points[e_con+1].x;
for(std::uint8_t const E : connexions){
cost += std::abs((float)(sorted_points[(E >> 4) +1].x - sorted_points[(E & 15u) +1].x));
}
for(index_t i=0; i<pin_cnt-2; ++i){
cost += (minmaxs[i].max - minmaxs[i].min);
}
return cost;
}
template<int pin_cnt>
std::array<edge_t, pin_cnt-1> Hconnectivity<pin_cnt>::get_x_topology(std::array<point<int_t>, pin_cnt> const sorted_points) const{
std::array<edge_t, pin_cnt-1> ret;
std::uint8_t b_con = extremes & 15u, e_con = extremes >> 4;
ret[0] = edge_t(0, b_con+1);
ret[1] = edge_t(pin_cnt-1, e_con+1);
for(index_t i=0; i<pin_cnt-3; ++i){
std::uint8_t E = connexions[i];
ret[i+2] = edge_t((E & 15u) +1, (E >> 4) +1);
}
return ret;
}
} // End namespace steiner_lookup
namespace {
template<int n, int array_size>
int_t get_wirelength_from_sorted(std::vector<point<int_t> > const & pins, std::array<steiner_lookup::Hconnectivity<n>, array_size> const & lookups){
std::array<point<int_t>, n> points;
std::copy_n(pins.begin(), n, points.begin());
int_t cost = std::numeric_limits<int_t>::max();
for(auto const L : lookups){
cost = std::min(cost, L.get_wirelength(points));
}
return cost;
}
std::int64_t get_wirelength_from_topo(std::vector<point<int_t> > const & points, std::vector<std::pair<index_t, index_t> > Htopo){
std::vector<minmax_t> minmaxs(points.size());
for(index_t i=0; i<points.size(); ++i){
minmaxs[i] = minmax_t(points[i].y, points[i].y);
}
for(auto const E : Htopo){
minmaxs[E.second].merge(minmaxs[E.first]);
}
std::int64_t cost = 0;
for(edge_t const E : Htopo){
cost += std::abs((float)(points[E.first].x - points[E.second].x));
}
for(index_t i=0; i<points.size(); ++i){
cost += (minmaxs[i].max - minmaxs[i].min);
}
return cost;
}
struct indexed_pt : point<int_t>{
index_t index;
indexed_pt(point<int_t> pt, index_t pos) : point<int_t>(pt), index(pos) {}
indexed_pt(){}
};
template<int n, int array_size>
std::vector<std::pair<index_t, index_t> > get_topology_from_sorted(std::vector<point<int_t> > const & pins, std::array<steiner_lookup::Hconnectivity<n>, array_size> const & lookups){
std::array<point<int_t>, n> points;
std::copy_n(pins.begin(), n, points.begin());
// Find the horizontal topology with the smallest cost
int_t cost = std::numeric_limits<int_t>::max();
index_t ind = std::numeric_limits<index_t>::max();
for(index_t i=0; i<array_size; ++i){
int_t this_cost = lookups[i].get_wirelength(points);
if(this_cost < cost){
cost = this_cost;
ind = i;
}
}
assert(ind != std::numeric_limits<index_t>::max());
auto ret = lookups[ind].get_x_topology(points);
return std::vector<std::pair<index_t, index_t> >(ret.begin(), ret.end());
}
std::vector<edge_t> get_vertical_topology(std::vector<point<int_t> > pins, std::vector<edge_t> const & Htopo){
index_t const null_ind = std::numeric_limits<index_t>::max();
std::vector<indexed_pt> ipoints(pins.size());
for(index_t i=0; i<pins.size(); ++i){
ipoints[i] = indexed_pt(pins[i], i);
}
std::sort(ipoints.begin(), ipoints.end(), [](indexed_pt a , indexed_pt b){return a.y < b.y; });
// First pin with y ordering
std::vector<index_t> min_y_pin(pins.size());
for(index_t i=0; i<ipoints.size(); ++i){
min_y_pin[ipoints[i].index] = i;
}
std::vector<index_t> max_y_pin = min_y_pin;
std::vector<index_t> nxt_y_pin(pins.size(), null_ind);
std::vector<edge_t> ret;
for(auto const E : Htopo){
// Assuming a correctly ordered horizontal topology where the first node of the edge is never visited again
index_t f=E.first, s=E.second;
index_t first_yf=min_y_pin[f], first_ys=min_y_pin[s];
// Push the edges from the first and insert one of its elements in the second's linked structure
if(max_y_pin[f] < min_y_pin[s] or max_y_pin[s] < min_y_pin[f]){
for(index_t yf=first_yf; nxt_y_pin[yf] != null_ind; yf = nxt_y_pin[yf]){
ret.push_back(edge_t(yf, nxt_y_pin[yf]));
}
if(max_y_pin[f] < min_y_pin[s]){
nxt_y_pin[max_y_pin[f]] = min_y_pin[s];
min_y_pin[s] = max_y_pin[f];
}
else if(max_y_pin[s] < min_y_pin[f]){
nxt_y_pin[max_y_pin[s]] = min_y_pin[f];
max_y_pin[s] = min_y_pin[f];
nxt_y_pin[min_y_pin[f]] = null_ind;
}
else{
abort();
}
}
else{ // Need to chose a pin with two connexions because there will be no L route
// One pin from the second is in the middle of the first
if(max_y_pin[f] > max_y_pin[s]){
index_t middle_pin = max_y_pin[s];
index_t yf=first_yf;
// Make the first connexions
for(; nxt_y_pin[yf] < middle_pin; yf = nxt_y_pin[yf]){
ret.push_back(edge_t(yf, nxt_y_pin[yf]));
}
// Make the two connexions with the new pin
ret.push_back(edge_t(yf, middle_pin));
yf = nxt_y_pin[yf];
ret.push_back(edge_t(yf, middle_pin));
// Finish the connexions
for(; nxt_y_pin[yf] != null_ind; yf = nxt_y_pin[yf]){
ret.push_back(edge_t(yf, nxt_y_pin[yf]));
}
}
// One pin from the first is in the middle of the second
else{
for(index_t yf=first_yf; nxt_y_pin[yf] != null_ind; yf = nxt_y_pin[yf]){
ret.push_back(edge_t(yf, nxt_y_pin[yf]));
}
index_t middle_pin = max_y_pin[f];
// Find the place where we can insert this pin
index_t ys=first_ys;
for(; nxt_y_pin[ys] < middle_pin; ys = nxt_y_pin[ys]);
nxt_y_pin[middle_pin] = nxt_y_pin[ys];
nxt_y_pin[ys] = middle_pin;
}
}
}
// The last visited gives the remaining connexions to push
for(index_t yf=min_y_pin[Htopo.back().second]; nxt_y_pin[yf] != null_ind; yf = nxt_y_pin[yf]){
ret.push_back(edge_t(yf, nxt_y_pin[yf]));
}
// Back to the original ordering
for(auto & E : ret){
E.first = ipoints[E.first].index;
E.second = ipoints[E.second].index;
}
return ret;
}
inline void northeast_octant_neighbours(std::vector<point<int_t> > pins, std::vector<std::pair<index_t, index_t> > & edges){
std::vector<indexed_pt> point_list;
for(index_t i=0; i<pins.size(); ++i){
point_list.push_back(indexed_pt(pins[i], i));
}
std::sort(point_list.begin(), point_list.end(),
[](indexed_pt const a, indexed_pt const b){ return a.x + a.y < b.x + b.y; }
);
// Decreasing order of x and y; multiset not necessary because no two elements have same coordinate
std::set<indexed_pt, std::function<bool (indexed_pt const, indexed_pt const)> >
active_upper_octant([](indexed_pt const a, indexed_pt const b)->bool{return a.x > b.x;}),
active_lower_octant([](indexed_pt const a, indexed_pt const b)->bool{return a.y > b.y;});
for(indexed_pt const current : point_list){
{ // North to north-east region
auto first_it = active_upper_octant.lower_bound(current); // Largest x with x <= current.x
auto it = first_it;
for(; it != active_upper_octant.end() && it->x - it->y >= current.x - current.y; ++it){
edges.push_back(std::pair<index_t, index_t>(current.index, it->index));
}
if(first_it != active_upper_octant.end()){ active_upper_octant.erase(first_it, it); }
active_upper_octant.insert(it, current); // Hint to insert the element since it is the correct position
} // End region
{ // North-east to east region
auto first_it = active_lower_octant.lower_bound(current); // Largest y with y <= current.y
auto it = first_it;
for(; it != active_lower_octant.end() && it->y - it->x >= current.y - current.x; ++it){
edges.push_back(std::pair<index_t, index_t>(current.index, it->index));
}
if(first_it != active_lower_octant.end()){ active_lower_octant.erase(first_it, it); }
active_lower_octant.insert(it, current); // Hint to insert the element since it is the correct position
} // End region
}
}
// Gets the nearest octant neighbour for each point in the south-east quadrant
inline void southeast_octant_neighbours(std::vector<point<int_t> > pins, std::vector<std::pair<index_t, index_t> > & edges){
for(auto & pin : pins){
pin.y = - pin.y;
}
northeast_octant_neighbours(pins, edges);
}
std::vector<std::pair<index_t, index_t> > get_small_horizontal_topology_from_sorted(std::vector<point<int_t> > const & pins){
assert(pins.size() <= 10);
switch(pins.size()){
case 2:
return std::vector<edge_t>(1, edge_t(0, 1));
case 3:
return std::vector<edge_t>{{0, 1}, {1, 2}};
case 4:
return get_topology_from_sorted<4, 2>(pins, steiner_lookup::topologies_4);
case 5:
return get_topology_from_sorted<5, 6>(pins, steiner_lookup::topologies_5);
case 6:
return get_topology_from_sorted<6, 23>(pins, steiner_lookup::topologies_6);
case 7:
return get_topology_from_sorted<7, 111>(pins, steiner_lookup::topologies_7);
case 8:
return get_topology_from_sorted<8, 642>(pins, steiner_lookup::topologies_8);
case 9:
return get_topology_from_sorted<9, 4334>(pins, steiner_lookup::topologies_9);
case 10:
return get_topology_from_sorted<10, 33510>(pins, steiner_lookup::topologies_10);
default: // Only 1 and 0 left (11 and more are protected by an assertion)
return std::vector<edge_t>();
}
}
// Get an ordering of the edges that is compatible with the processing functions
std::vector<edge_t> get_tree_topo_sort(std::vector<edge_t> const & topo){
std::vector<edge_t> sorted_topo;
std::vector<std::vector<index_t> > neighbours(topo.size()+1);
for(edge_t const E : topo){
neighbours[E.first].push_back(E.second);
neighbours[E.second].push_back(E.first);
}
std::vector<index_t> to_visit;
std::vector<int_t> nbr_unvisited(topo.size()+1);
for(index_t i=0; i<=topo.size(); ++i){
nbr_unvisited[i] = neighbours[i].size();
assert(topo.size() == 0 or nbr_unvisited[i] >= 1);
if(nbr_unvisited[i] == 1)
to_visit.push_back(i);
}
std::vector<int> visited(topo.size()+1, 0);
while(not to_visit.empty()){
index_t f = to_visit.back();
assert(visited[f] == 0);
visited[f] = 1;
to_visit.pop_back();
for(index_t s : neighbours[f]){
--nbr_unvisited[s];
if(visited[s] == 0){ // It is not a node we already visited
sorted_topo.push_back(edge_t(f, s));
}
if(nbr_unvisited[s] == 1){
to_visit.push_back(s);
}
}
}
assert(sorted_topo.size() == topo.size());
return sorted_topo;
}
std::vector<edge_t> get_big_horizontal_topology_from_sorted(std::vector<point<int_t> > const & pins, index_t exactitude_limit){
auto spanning = get_MST_topology(pins);
// TODO: perform local optimizations on the topology using exact Steiner tree algorithms
// Remove horizontal suboptimalities i.e. when the connexions to the left and right are unbalanced
// Reuse existing code by translation to vertical topology
auto first_Htopo = get_tree_topo_sort(spanning);
auto Vtopo = get_vertical_topology(pins, first_Htopo);
Vtopo = get_tree_topo_sort(Vtopo);
std::vector<point<int_t> > inverted_coords = pins;
for(point<int_t> & pt : inverted_coords){
std::swap(pt.x, pt.y);
}
auto Htopo = get_vertical_topology(inverted_coords, Vtopo);
// Sort the tree so that it is usable when building an RSMT
return get_tree_topo_sort(Htopo);
}
} // End anonymous namespace
std::vector<edge_t> get_RSMT_horizontal_topology(std::vector<point<int_t> > const & pins, index_t exactitude_limit){
if(pins.size() <= 1)
return std::vector<edge_t>();
else if(pins.size() == 2)
return std::vector<edge_t>(1, edge_t(0, 1));
else if(pins.size() == 3){
std::vector<indexed_pt> ipoints(pins.size());
for(index_t i=0; i<pins.size(); ++i){
ipoints[i] = indexed_pt(pins[i], i);
}
auto xpoints=ipoints;
std::sort(xpoints.begin(), xpoints.end(), [](indexed_pt a , indexed_pt b){return a.x < b.x; });
return std::vector<edge_t>{{xpoints[0].index, xpoints[1].index}, {xpoints[1].index, xpoints[2].index}};
}
else{
std::vector<edge_t> horizontal_topology;
// Sort the pins by x coordinate
std::vector<indexed_pt> ipoints(pins.size());
for(index_t i=0; i<pins.size(); ++i){
ipoints[i] = indexed_pt(pins[i], i);
}
std::sort(ipoints.begin(), ipoints.end(), [](indexed_pt a , indexed_pt b){return a.x < b.x; });
std::vector<point<int_t> > sorted_pins(pins.size());
for(index_t i=0; i<pins.size(); ++i){
sorted_pins[i] = ipoints[i];
}
// Get the topology for this ordering
if(pins.size() <= exactitude_limit){
horizontal_topology = get_small_horizontal_topology_from_sorted(sorted_pins);
}
else{
horizontal_topology = get_big_horizontal_topology_from_sorted(sorted_pins, exactitude_limit);
}
// Back to the original ordering
for(auto & E : horizontal_topology){
E.first = ipoints[E.first].index;
E.second = ipoints[E.second].index;
}
return horizontal_topology;
}
}
std::vector<std::pair<index_t, index_t> > get_MST_topology(std::vector<point<int_t> > const & pins){
std::vector<edge_t> edges;
if(pins.size() <= 2){
if(pins.size() == 2){
edges.push_back(edge_t(0, 1));
}
if(pins.size() == 3){
auto D = [](point<int_t> a, point<int_t> b){ return (int_t)(std::abs((float)(a.x - b.x)) + std::abs((float)(a.y - b.y))); };
auto dists = std::array<int_t, 3>({{D(pins[1], pins[2]), D(pins[1], pins[2]), D(pins[0], pins[1])}});
index_t mx = std::max_element(dists.begin(), dists.end()) - dists.begin();
for(index_t i=0; i<3; ++i){
if(i != mx)
edges.push_back(edge_t((i+1) % 3, (i+2) % 3));
}
}
return edges;
}
northeast_octant_neighbours(pins, edges);
southeast_octant_neighbours(pins, edges);
std::vector<edge_t> returned_edges;
auto edge_length = [&](edge_t E){
point<int_t> p1 = pins[E.first],
p2 = pins[E.second];
return std::abs((float)(p1.x - p2.x)) + std::abs((float)(p1.y - p2.y));
};
// Perform Kruskal to get the tree
std::sort(edges.begin(), edges.end(), [&](edge_t a, edge_t b){ return edge_length(a) < edge_length(b); });
union_find merger(pins.size());
for(index_t i=0; i<edges.size() && returned_edges.size()+1 < pins.size(); ++i){
edge_t E = edges[i];
if(merger.find(E.first) != merger.find(E.second)){
merger.merge(E.first, E.second);
assert(merger.find(E.first) == merger.find(E.second));
returned_edges.push_back(E);
}
}
assert(returned_edges.size() + 1 == pins.size());
assert(merger.is_connex());
return returned_edges;
}
std::int64_t MST_length(std::vector<point<int_t> > const & pins){
auto edges = get_MST_topology(pins);
std::int64_t sum = 0;
for(auto E : edges){
sum += std::abs((float)(pins[E.first].x - pins[E.second].x));
sum += std::abs((float)(pins[E.first].y - pins[E.second].y));
}
return sum;
}
std::int64_t RSMT_length(std::vector<point<int_t> > const & pins, index_t exactitude_limit){
assert(exactitude_limit <= 10 and exactitude_limit >= 3);
if(pins.size() <= 3){
if(pins.size() == 2){
return std::abs((float)(pins[0].x - pins[1].x)) + std::abs((float)(pins[0].y - pins[1].y));
}
else if(pins.size() == 3){
auto minmaxX = std::minmax_element(pins.begin(), pins.end(), [](point<int_t> a, point<int_t> b){ return a.x < b.x; }),
minmaxY = std::minmax_element(pins.begin(), pins.end(), [](point<int_t> a, point<int_t> b){ return a.y < b.y; });
return (minmaxX.second->x - minmaxX.first->x) + (minmaxY.second->y - minmaxY.first->y);
}
else{
return 0;
}
}
else{
std::vector<point<int_t> > points = pins;
std::sort(points.begin(), points.end(), [](point<int_t> a , point<int_t> b){return a.x < b.x; });
if(points.size() <= exactitude_limit){
switch(points.size()){
case 4:
return get_wirelength_from_sorted<4, 2>(points, steiner_lookup::topologies_4);
case 5:
return get_wirelength_from_sorted<5, 6>(points, steiner_lookup::topologies_5);
case 6:
return get_wirelength_from_sorted<6, 23>(points, steiner_lookup::topologies_6);
case 7:
return get_wirelength_from_sorted<7, 111>(points, steiner_lookup::topologies_7);
case 8:
return get_wirelength_from_sorted<8, 642>(points, steiner_lookup::topologies_8);
case 9:
return get_wirelength_from_sorted<9, 4334>(points, steiner_lookup::topologies_9);
case 10:
return get_wirelength_from_sorted<10, 33510>(points, steiner_lookup::topologies_10);
default:
abort();
}
}
else{ // Need to create the full topology, then calculate the length back
//return MST_length(points);
auto horizontal_topology = get_big_horizontal_topology_from_sorted(points, exactitude_limit);
return get_wirelength_from_topo(points, horizontal_topology);
}
}
}
point<std::vector<std::pair<index_t, index_t> > > get_RSMT_topology(std::vector<point<int_t> > const & pins, index_t exactitude_limit){
assert(exactitude_limit <= 10 and exactitude_limit >= 3);
// For 3 pin and fewer, the topology is very simple
if(pins.size() <= 2){
if(pins.size() == 2){
auto ret = std::vector<edge_t>(1, edge_t(0, 1));
return point<std::vector<edge_t> >(ret, ret);
}
else{
return point<std::vector<edge_t> >();
}
}
else if(pins.size() == 3){
std::vector<indexed_pt> ipoints(pins.size());
for(index_t i=0; i<pins.size(); ++i){
ipoints[i] = indexed_pt(pins[i], i);
}
auto xpoints=ipoints;
std::sort(xpoints.begin(), xpoints.end(), [](indexed_pt a , indexed_pt b){return a.x < b.x; });
auto ypoints=ipoints;
std::sort(ypoints.begin(), ypoints.end(), [](indexed_pt a , indexed_pt b){return a.y < b.y; });
return point<std::vector<edge_t> >{{{xpoints[0].index, xpoints[1].index}, {xpoints[1].index, xpoints[2].index}}, {{ypoints[0].index, ypoints[1].index}, {ypoints[1].index, ypoints[2].index}}};
}
else{
std::vector<edge_t> horizontal_topology = get_RSMT_horizontal_topology(pins, exactitude_limit);
return point<std::vector<edge_t> >(horizontal_topology, get_vertical_topology(pins, horizontal_topology));
}
}
} // Namespace coloquinte

View File

@ -5,7 +5,7 @@
set(ignoreVariables "${CMAKE_INSTALL_DIR}") set(ignoreVariables "${CMAKE_INSTALL_DIR}")
cmake_minimum_required(VERSION 3.16) cmake_minimum_required(VERSION 3.18)
OPTION(BUILD_DOC "Build the documentation (latex+doxygen)" OFF) OPTION(BUILD_DOC "Build the documentation (latex+doxygen)" OFF)
option(USE_LIBBFD "Link with BFD libraries to print stack traces" OFF) option(USE_LIBBFD "Link with BFD libraries to print stack traces" OFF)
@ -21,7 +21,6 @@
setup_sysconfdir("${CMAKE_INSTALL_PREFIX}") setup_sysconfdir("${CMAKE_INSTALL_PREFIX}")
setup_boost(program_options) setup_boost(program_options)
setup_qt() setup_qt()
setup_python()
cmake_policy(SET CMP0054 NEW) cmake_policy(SET CMP0054 NEW)
@ -29,6 +28,7 @@
find_package(Libbfd) find_package(Libbfd)
endif() endif()
find_package(BZip2 REQUIRED) find_package(BZip2 REQUIRED)
find_package(Python 3 REQUIRED COMPONENTS Interpreter Development.Module)
find_package(PythonSitePackages REQUIRED) find_package(PythonSitePackages REQUIRED)
find_package(BISON REQUIRED) find_package(BISON REQUIRED)
find_package(FLEX REQUIRED) find_package(FLEX REQUIRED)
@ -41,5 +41,6 @@
add_subdirectory(src) add_subdirectory(src)
add_subdirectory(python) add_subdirectory(python)
add_subdirectory(etc)
add_subdirectory(cmake_modules) add_subdirectory(cmake_modules)
add_subdirectory(doc) add_subdirectory(doc)

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -24,7 +24,7 @@
--> -->
<br> <br>
<body onload="javascript:toggleLevel(1)"> <body onload="javascript:toggleLevel(1)">
<!-- Generated by Doxygen 1.9.1 --> <!-- Generated by Doxygen 1.8.14 -->
<script type="text/javascript" src="menudata.js"></script> <script type="text/javascript" src="menudata.js"></script>
<script type="text/javascript" src="menu.js"></script> <script type="text/javascript" src="menu.js"></script>
<script type="text/javascript"> <script type="text/javascript">
@ -43,20 +43,20 @@ $(function() {
<div class="textblock">Here are the classes, structs, unions and interfaces with brief descriptions:</div><div class="directory"> <div class="textblock">Here are the classes, structs, unions and interfaces with brief descriptions:</div><div class="directory">
<div class="levels">[detail level <span onclick="javascript:toggleLevel(1);">1</span><span onclick="javascript:toggleLevel(2);">2</span><span onclick="javascript:toggleLevel(3);">3</span>]</div><table class="directory"> <div class="levels">[detail level <span onclick="javascript:toggleLevel(1);">1</span><span onclick="javascript:toggleLevel(2);">2</span><span onclick="javascript:toggleLevel(3);">3</span>]</div><table class="directory">
<tr id="row_0_" class="even"><td class="entry"><span style="width:0px;display:inline-block;">&#160;</span><span id="arr_0_" class="arrow" onclick="toggleFolder('0_')">&#9660;</span><span class="icona"><span class="icon">N</span></span><a class="el" href="namespaceCRL.html" target="_self">CRL</a></td><td class="desc">The namespace of Coriolis Core </td></tr> <tr id="row_0_" class="even"><td class="entry"><span style="width:0px;display:inline-block;">&#160;</span><span id="arr_0_" class="arrow" onclick="toggleFolder('0_')">&#9660;</span><span class="icona"><span class="icon">N</span></span><a class="el" href="namespaceCRL.html" target="_self">CRL</a></td><td class="desc">The namespace of Coriolis Core </td></tr>
<tr id="row_0_0_"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="classCRL_1_1Environment.html" target="_self">Environment</a></td><td class="desc">Holds all the Alliance environment variables </td></tr> <tr id="row_0_0_"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="classCRL_1_1AcmSigda.html" target="_self">AcmSigda</a></td><td class="desc">A Parser of ACM/Sigda 89' benchmarks </td></tr>
<tr id="row_0_1_" class="even"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="classCRL_1_1Banner.html" target="_self">Banner</a></td><td class="desc">Print Formatted Banners (on ttys) </td></tr> <tr id="row_0_1_" class="even"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="classCRL_1_1AllianceFramework.html" target="_self">AllianceFramework</a></td><td class="desc">A Framework to work with Alliance formats </td></tr>
<tr id="row_0_2_"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span id="arr_0_2_" class="arrow" onclick="toggleFolder('0_2_')">&#9660;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="classCRL_1_1Catalog.html" target="_self">Catalog</a></td><td class="desc">A Registry to store Alliance Cell metadatas </td></tr> <tr id="row_0_2_"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="classCRL_1_1AllianceLibrary.html" target="_self">AllianceLibrary</a></td><td class="desc">A small wrapper around <a class="elRef" doxygen="/dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/html/hurricane.tag:../hurricane/" href="../hurricane/classHurricane_1_1Library.html">Hurricane::Library</a> </td></tr>
<tr id="row_0_2_0_" class="even"><td class="entry"><span style="width:48px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="classCRL_1_1Catalog_1_1State.html" target="_self">State</a></td><td class="desc">An entry to store the Cell <a class="el" href="classCRL_1_1Catalog_1_1State.html" title="An entry to store the Cell State in the Catalog.">State</a> in the <a class="el" href="classCRL_1_1Catalog.html" title="A Registry to store Alliance Cell metadatas.">Catalog</a> </td></tr> <tr id="row_0_3_" class="even"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="classCRL_1_1Banner.html" target="_self">Banner</a></td><td class="desc">Print Formatted Banners (on ttys) </td></tr>
<tr id="row_0_3_"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="classCRL_1_1CatalogExtension.html" target="_self">CatalogExtension</a></td><td class="desc">Wrapper to access a <a class="elRef" href="../hurricane/classHurricane_1_1Cell.html">Hurricane::Cell</a> <a class="el" href="classCRL_1_1Catalog_1_1State.html" title="An entry to store the Cell State in the Catalog.">Catalog::State</a> </td></tr> <tr id="row_0_4_"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span id="arr_0_4_" class="arrow" onclick="toggleFolder('0_4_')">&#9660;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="classCRL_1_1Catalog.html" target="_self">Catalog</a></td><td class="desc">A Registry to store Alliance Cell metadatas </td></tr>
<tr id="row_0_4_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span id="arr_0_4_" class="arrow" onclick="toggleFolder('0_4_')">&#9660;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="classCRL_1_1SearchPath.html" target="_self">SearchPath</a></td><td class="desc">An ordered list of search pathes </td></tr> <tr id="row_0_4_0_" class="even"><td class="entry"><span style="width:48px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="classCRL_1_1Catalog_1_1State.html" target="_self">State</a></td><td class="desc">An entry to store the Cell <a class="el" href="classCRL_1_1Catalog_1_1State.html" title="An entry to store the Cell State in the Catalog. ">State</a> in the <a class="el" href="classCRL_1_1Catalog.html" title="A Registry to store Alliance Cell metadatas. ">Catalog</a> </td></tr>
<tr id="row_0_4_0_"><td class="entry"><span style="width:48px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="classCRL_1_1SearchPath_1_1Element.html" target="_self">Element</a></td><td class="desc">An element of the search path (mapping a directory) </td></tr> <tr id="row_0_5_"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="classCRL_1_1CatalogExtension.html" target="_self">CatalogExtension</a></td><td class="desc">Wrapper to access a <a class="elRef" doxygen="/dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/html/hurricane.tag:../hurricane/" href="../hurricane/classHurricane_1_1Cell.html">Hurricane::Cell</a> <a class="el" href="classCRL_1_1Catalog_1_1State.html" title="An entry to store the Cell State in the Catalog. ">Catalog::State</a> </td></tr>
<tr id="row_0_5_" class="even"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="classCRL_1_1AllianceLibrary.html" target="_self">AllianceLibrary</a></td><td class="desc">A small wrapper around <a class="elRef" href="../hurricane/classHurricane_1_1Library.html">Hurricane::Library</a> </td></tr> <tr id="row_0_6_" class="even"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="classCRL_1_1Environment.html" target="_self">Environment</a></td><td class="desc">Holds all the Alliance environment variables </td></tr>
<tr id="row_0_6_"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="classCRL_1_1RoutingLayerGauge.html" target="_self">RoutingLayerGauge</a></td><td class="desc">Gauge of a Layer for the detailed routing </td></tr> <tr id="row_0_7_"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="classCRL_1_1GraphicTool.html" target="_self">GraphicTool</a></td><td class="desc">Base Class to Hook ToolEngines into the CellViewer </td></tr>
<tr id="row_0_7_" class="even"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="classCRL_1_1RoutingGauge.html" target="_self">RoutingGauge</a></td><td class="desc">Gauge for the detailed routing </td></tr> <tr id="row_0_8_" class="even"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="classCRL_1_1RoutingGauge.html" target="_self">RoutingGauge</a></td><td class="desc">Gauge for the detailed routing </td></tr>
<tr id="row_0_8_"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="classCRL_1_1AllianceFramework.html" target="_self">AllianceFramework</a></td><td class="desc">A Framework to work with Alliance formats </td></tr> <tr id="row_0_9_"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="classCRL_1_1RoutingLayerGauge.html" target="_self">RoutingLayerGauge</a></td><td class="desc">Gauge of a Layer for the detailed routing </td></tr>
<tr id="row_0_9_" class="even"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="classCRL_1_1AcmSigda.html" target="_self">AcmSigda</a></td><td class="desc">A Parser of ACM/Sigda 89' benchmarks </td></tr> <tr id="row_0_10_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span id="arr_0_10_" class="arrow" onclick="toggleFolder('0_10_')">&#9660;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="classCRL_1_1SearchPath.html" target="_self">SearchPath</a></td><td class="desc">An ordered list of search pathes </td></tr>
<tr id="row_0_10_"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="classCRL_1_1ToolEngine.html" target="_self">ToolEngine</a></td><td class="desc">Base Class of all Coriolis Tools </td></tr> <tr id="row_0_10_0_"><td class="entry"><span style="width:48px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="classCRL_1_1SearchPath_1_1Element.html" target="_self">Element</a></td><td class="desc">An element of the search path (mapping a directory) </td></tr>
<tr id="row_0_11_" class="even"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="classCRL_1_1GraphicTool.html" target="_self">GraphicTool</a></td><td class="desc">Base Class to Hook ToolEngines into the CellViewer </td></tr> <tr id="row_0_11_" class="even"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="classCRL_1_1ToolEngine.html" target="_self">ToolEngine</a></td><td class="desc">Base Class of all Coriolis Tools </td></tr>
</table> </table>
</div><!-- directory --> </div><!-- directory -->
</div><!-- contents --> </div><!-- contents -->
@ -64,7 +64,7 @@ $(function() {
<hr> <hr>
<table class="footer1"> <table class="footer1">
<tr> <tr>
<td class="LFooter"><small>Generated by doxygen 1.9.1 on Tue Feb 21 2023</small></td> <td class="LFooter"><small>Generated by doxygen 1.8.14 on Sun Nov 21 2021</small></td>
<td class="RFooter"><a href='#pagetop'><small>Return to top of page</small></a></td> <td class="RFooter"><a href='#pagetop'><small>Return to top of page</small></a></td>
</tr> </tr>
</table> </table>

View File

@ -24,7 +24,7 @@
--> -->
<br> <br>
<body onload="javascript:toggleLevel(1)"> <body onload="javascript:toggleLevel(1)">
<!-- Generated by Doxygen 1.9.1 --> <!-- Generated by Doxygen 1.8.14 -->
<script type="text/javascript" src="menudata.js"></script> <script type="text/javascript" src="menudata.js"></script>
<script type="text/javascript" src="menu.js"></script> <script type="text/javascript" src="menu.js"></script>
<script type="text/javascript"> <script type="text/javascript">
@ -53,7 +53,7 @@ $(function() {
<hr> <hr>
<table class="footer1"> <table class="footer1">
<tr> <tr>
<td class="LFooter"><small>Generated by doxygen 1.9.1 on Tue Feb 21 2023</small></td> <td class="LFooter"><small>Generated by doxygen 1.8.14 on Sun Nov 21 2021</small></td>
<td class="RFooter"><a href='#pagetop'><small>Return to top of page</small></a></td> <td class="RFooter"><a href='#pagetop'><small>Return to top of page</small></a></td>
</tr> </tr>
</table> </table>

View File

@ -24,7 +24,7 @@
--> -->
<br> <br>
<body onload="javascript:toggleLevel(1)"> <body onload="javascript:toggleLevel(1)">
<!-- Generated by Doxygen 1.9.1 --> <!-- Generated by Doxygen 1.8.14 -->
<script type="text/javascript" src="menudata.js"></script> <script type="text/javascript" src="menudata.js"></script>
<script type="text/javascript" src="menu.js"></script> <script type="text/javascript" src="menu.js"></script>
<script type="text/javascript"> <script type="text/javascript">
@ -53,7 +53,7 @@ $(function() {
<table class="memberdecls"> <table class="memberdecls">
<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-static-methods"></a> <tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-static-methods"></a>
Static Public Member Functions</h2></td></tr> Static Public Member Functions</h2></td></tr>
<tr class="memitem:a5e61fb60049f5a2dca1f2ca05fd5857a"><td class="memItemLeft" align="right" valign="top">static <a class="elRef" href="../hurricane/classHurricane_1_1Cell.html">Cell</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classCRL_1_1AcmSigda.html#a5e61fb60049f5a2dca1f2ca05fd5857a">load</a> (std::string benchmark)</td></tr> <tr class="memitem:a5e61fb60049f5a2dca1f2ca05fd5857a"><td class="memItemLeft" align="right" valign="top">static <a class="elRef" doxygen="/dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/html/hurricane.tag:../hurricane/" href="../hurricane/classHurricane_1_1Cell.html">Cell</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classCRL_1_1AcmSigda.html#a5e61fb60049f5a2dca1f2ca05fd5857a">load</a> (std::string benchmark)</td></tr>
<tr class="separator:a5e61fb60049f5a2dca1f2ca05fd5857a"><td class="memSeparator" colspan="2">&#160;</td></tr> <tr class="separator:a5e61fb60049f5a2dca1f2ca05fd5857a"><td class="memSeparator" colspan="2">&#160;</td></tr>
</table> </table>
<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2> <a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
@ -92,7 +92,7 @@ Static Public Member Functions</h2></td></tr>
<td class="mlabels-left"> <td class="mlabels-left">
<table class="memname"> <table class="memname">
<tr> <tr>
<td class="memname"><a class="elRef" href="../hurricane/classHurricane_1_1Cell.html">Cell</a> * CRL::AcmSigda::load </td> <td class="memname"><a class="elRef" doxygen="/dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/html/hurricane.tag:../hurricane/" href="../hurricane/classHurricane_1_1Cell.html">Cell</a> * CRL::AcmSigda::load </td>
<td>(</td> <td>(</td>
<td class="paramtype">std::string&#160;</td> <td class="paramtype">std::string&#160;</td>
<td class="paramname"><em>benchname</em></td><td>)</td> <td class="paramname"><em>benchname</em></td><td>)</td>
@ -118,7 +118,7 @@ Static Public Member Functions</h2></td></tr>
<hr> <hr>
<table class="footer1"> <table class="footer1">
<tr> <tr>
<td class="LFooter"><small>Generated by doxygen 1.9.1 on Tue Feb 21 2023</small></td> <td class="LFooter"><small>Generated by doxygen 1.8.14 on Sun Nov 21 2021</small></td>
<td class="RFooter"><a href='#pagetop'><small>Return to top of page</small></a></td> <td class="RFooter"><a href='#pagetop'><small>Return to top of page</small></a></td>
</tr> </tr>
</table> </table>

View File

@ -24,7 +24,7 @@
--> -->
<br> <br>
<body onload="javascript:toggleLevel(1)"> <body onload="javascript:toggleLevel(1)">
<!-- Generated by Doxygen 1.9.1 --> <!-- Generated by Doxygen 1.8.14 -->
<script type="text/javascript" src="menudata.js"></script> <script type="text/javascript" src="menudata.js"></script>
<script type="text/javascript" src="menu.js"></script> <script type="text/javascript" src="menu.js"></script>
<script type="text/javascript"> <script type="text/javascript">
@ -49,12 +49,12 @@ $(function() {
<table class="directory"> <table class="directory">
<tr class="even"><td class="entry"><a class="el" href="classCRL_1_1AllianceFramework.html#aab16db33a0ce2e3bce5739f7cadb3d5a">addCellGauge</a>(CellGauge *)</td><td class="entry"><a class="el" href="classCRL_1_1AllianceFramework.html">CRL::AllianceFramework</a></td><td class="entry"></td></tr> <tr class="even"><td class="entry"><a class="el" href="classCRL_1_1AllianceFramework.html#aab16db33a0ce2e3bce5739f7cadb3d5a">addCellGauge</a>(CellGauge *)</td><td class="entry"><a class="el" href="classCRL_1_1AllianceFramework.html">CRL::AllianceFramework</a></td><td class="entry"></td></tr>
<tr><td class="entry"><a class="el" href="classCRL_1_1AllianceFramework.html#ae182fd150c695fd24c1b10ddbc377b32">addRoutingGauge</a>(RoutingGauge *)</td><td class="entry"><a class="el" href="classCRL_1_1AllianceFramework.html">CRL::AllianceFramework</a></td><td class="entry"></td></tr> <tr><td class="entry"><a class="el" href="classCRL_1_1AllianceFramework.html#ae182fd150c695fd24c1b10ddbc377b32">addRoutingGauge</a>(RoutingGauge *)</td><td class="entry"><a class="el" href="classCRL_1_1AllianceFramework.html">CRL::AllianceFramework</a></td><td class="entry"></td></tr>
<tr class="even"><td class="entry"><a class="elRef" href="../hurricane/classHurricane_1_1DBo.html#a3e02f3d665cb0b2120df2fdfe9c3df4f">clearProperties</a>()</td><td class="entry"><a class="elRef" href="../hurricane/classHurricane_1_1DBo.html">Hurricane::DBo</a></td><td class="entry"></td></tr> <tr class="even"><td class="entry"><a class="elRef" doxygen="/dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/html/hurricane.tag:../hurricane/" href="../hurricane/classHurricane_1_1DBo.html#a3e02f3d665cb0b2120df2fdfe9c3df4f">clearProperties</a>()</td><td class="entry"><a class="elRef" doxygen="/dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/html/hurricane.tag:../hurricane/" href="../hurricane/classHurricane_1_1DBo.html">Hurricane::DBo</a></td><td class="entry"></td></tr>
<tr><td class="entry"><a class="el" href="classCRL_1_1AllianceFramework.html#a8cff32ced8cc163cadca885d8ed8a5fc">create</a>(unsigned long flags=NoFlags)</td><td class="entry"><a class="el" href="classCRL_1_1AllianceFramework.html">CRL::AllianceFramework</a></td><td class="entry"><span class="mlabel">static</span></td></tr> <tr><td class="entry"><a class="el" href="classCRL_1_1AllianceFramework.html#a8cff32ced8cc163cadca885d8ed8a5fc">create</a>(unsigned long flags=NoFlags)</td><td class="entry"><a class="el" href="classCRL_1_1AllianceFramework.html">CRL::AllianceFramework</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
<tr class="even"><td class="entry"><a class="el" href="classCRL_1_1AllianceFramework.html#ac4381ad0c3799d584ef3ea160846e2bb">createCell</a>(const string &amp;name, AllianceLibrary *library=NULL)</td><td class="entry"><a class="el" href="classCRL_1_1AllianceFramework.html">CRL::AllianceFramework</a></td><td class="entry"></td></tr> <tr class="even"><td class="entry"><a class="el" href="classCRL_1_1AllianceFramework.html#ac4381ad0c3799d584ef3ea160846e2bb">createCell</a>(const string &amp;name, AllianceLibrary *library=NULL)</td><td class="entry"><a class="el" href="classCRL_1_1AllianceFramework.html">CRL::AllianceFramework</a></td><td class="entry"></td></tr>
<tr><td class="entry"><a class="el" href="classCRL_1_1AllianceFramework.html#a0ec1cd09dec34dfecfec22927b92cc25ade58398b3ec849dc3aedb6a0812fbc7a">CreateLibrary</a> enum value</td><td class="entry"><a class="el" href="classCRL_1_1AllianceFramework.html">CRL::AllianceFramework</a></td><td class="entry"></td></tr> <tr><td class="entry"><a class="el" href="classCRL_1_1AllianceFramework.html#a0ec1cd09dec34dfecfec22927b92cc25ade58398b3ec849dc3aedb6a0812fbc7a">CreateLibrary</a> enum value</td><td class="entry"><a class="el" href="classCRL_1_1AllianceFramework.html">CRL::AllianceFramework</a></td><td class="entry"></td></tr>
<tr class="even"><td class="entry"><a class="el" href="classCRL_1_1AllianceFramework.html#a4efc06e6a6d5413398946453c3fd6649">createLibrary</a>(const string &amp;path, unsigned int flags, string libName=&quot;&quot;)</td><td class="entry"><a class="el" href="classCRL_1_1AllianceFramework.html">CRL::AllianceFramework</a></td><td class="entry"></td></tr> <tr class="even"><td class="entry"><a class="el" href="classCRL_1_1AllianceFramework.html#a4efc06e6a6d5413398946453c3fd6649">createLibrary</a>(const string &amp;path, unsigned int flags, string libName=&quot;&quot;)</td><td class="entry"><a class="el" href="classCRL_1_1AllianceFramework.html">CRL::AllianceFramework</a></td><td class="entry"></td></tr>
<tr><td class="entry"><a class="elRef" href="../hurricane/classHurricane_1_1DBo.html#a67febf5bf9c8b322674648688639728b">destroy</a>()</td><td class="entry"><a class="elRef" href="../hurricane/classHurricane_1_1DBo.html">Hurricane::DBo</a></td><td class="entry"><span class="mlabel">virtual</span></td></tr> <tr><td class="entry"><a class="elRef" doxygen="/dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/html/hurricane.tag:../hurricane/" href="../hurricane/classHurricane_1_1DBo.html#a67febf5bf9c8b322674648688639728b">destroy</a>()</td><td class="entry"><a class="elRef" doxygen="/dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/html/hurricane.tag:../hurricane/" href="../hurricane/classHurricane_1_1DBo.html">Hurricane::DBo</a></td><td class="entry"><span class="mlabel">virtual</span></td></tr>
<tr class="even"><td class="entry"><a class="el" href="classCRL_1_1AllianceFramework.html#a976479af696a86c998c10d9d2604839d">get</a>()</td><td class="entry"><a class="el" href="classCRL_1_1AllianceFramework.html">CRL::AllianceFramework</a></td><td class="entry"><span class="mlabel">static</span></td></tr> <tr class="even"><td class="entry"><a class="el" href="classCRL_1_1AllianceFramework.html#a976479af696a86c998c10d9d2604839d">get</a>()</td><td class="entry"><a class="el" href="classCRL_1_1AllianceFramework.html">CRL::AllianceFramework</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
<tr><td class="entry"><a class="el" href="classCRL_1_1AllianceFramework.html#a4085f3bc96ca5e4bf2d41a4ada9658f2">getAllianceLibrary</a>(unsigned int index)</td><td class="entry"><a class="el" href="classCRL_1_1AllianceFramework.html">CRL::AllianceFramework</a></td><td class="entry"></td></tr> <tr><td class="entry"><a class="el" href="classCRL_1_1AllianceFramework.html#a4085f3bc96ca5e4bf2d41a4ada9658f2">getAllianceLibrary</a>(unsigned int index)</td><td class="entry"><a class="el" href="classCRL_1_1AllianceFramework.html">CRL::AllianceFramework</a></td><td class="entry"></td></tr>
<tr class="even"><td class="entry"><a class="el" href="classCRL_1_1AllianceFramework.html#a8e007b3f2ac45feec2907f77530a718c">getAllianceLibrary</a>(Library *)</td><td class="entry"><a class="el" href="classCRL_1_1AllianceFramework.html">CRL::AllianceFramework</a></td><td class="entry"></td></tr> <tr class="even"><td class="entry"><a class="el" href="classCRL_1_1AllianceFramework.html#a8e007b3f2ac45feec2907f77530a718c">getAllianceLibrary</a>(Library *)</td><td class="entry"><a class="el" href="classCRL_1_1AllianceFramework.html">CRL::AllianceFramework</a></td><td class="entry"></td></tr>
@ -67,11 +67,11 @@ $(function() {
<tr><td class="entry"><a class="el" href="classCRL_1_1AllianceFramework.html#afe822e9e04b613862aec5066743e1ffd">getParentLibrary</a>()</td><td class="entry"><a class="el" href="classCRL_1_1AllianceFramework.html">CRL::AllianceFramework</a></td><td class="entry"><span class="mlabel">inline</span></td></tr> <tr><td class="entry"><a class="el" href="classCRL_1_1AllianceFramework.html#afe822e9e04b613862aec5066743e1ffd">getParentLibrary</a>()</td><td class="entry"><a class="el" href="classCRL_1_1AllianceFramework.html">CRL::AllianceFramework</a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
<tr class="even"><td class="entry"><a class="el" href="classCRL_1_1AllianceFramework.html#a4f1d2d34c254ac596e8c4a408ef6ba43">getParentLibraryName</a>() const</td><td class="entry"><a class="el" href="classCRL_1_1AllianceFramework.html">CRL::AllianceFramework</a></td><td class="entry"><span class="mlabel">inline</span></td></tr> <tr class="even"><td class="entry"><a class="el" href="classCRL_1_1AllianceFramework.html#a4f1d2d34c254ac596e8c4a408ef6ba43">getParentLibraryName</a>() const</td><td class="entry"><a class="el" href="classCRL_1_1AllianceFramework.html">CRL::AllianceFramework</a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
<tr><td class="entry"><a class="el" href="classCRL_1_1AllianceFramework.html#ab142ba712b0e6388e45bb8d2fa05d93e">getPrint</a>() const</td><td class="entry"><a class="el" href="classCRL_1_1AllianceFramework.html">CRL::AllianceFramework</a></td><td class="entry"></td></tr> <tr><td class="entry"><a class="el" href="classCRL_1_1AllianceFramework.html#ab142ba712b0e6388e45bb8d2fa05d93e">getPrint</a>() const</td><td class="entry"><a class="el" href="classCRL_1_1AllianceFramework.html">CRL::AllianceFramework</a></td><td class="entry"></td></tr>
<tr class="even"><td class="entry"><a class="elRef" href="../hurricane/classHurricane_1_1DBo.html#aec46894a10e83abb54c495dc4d90f2d3">getProperties</a>() const</td><td class="entry"><a class="elRef" href="../hurricane/classHurricane_1_1DBo.html">Hurricane::DBo</a></td><td class="entry"></td></tr> <tr class="even"><td class="entry"><a class="elRef" doxygen="/dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/html/hurricane.tag:../hurricane/" href="../hurricane/classHurricane_1_1DBo.html#aec46894a10e83abb54c495dc4d90f2d3">getProperties</a>() const</td><td class="entry"><a class="elRef" doxygen="/dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/html/hurricane.tag:../hurricane/" href="../hurricane/classHurricane_1_1DBo.html">Hurricane::DBo</a></td><td class="entry"></td></tr>
<tr><td class="entry"><a class="elRef" href="../hurricane/classHurricane_1_1DBo.html#a599f61978df51d1d4c351f6cbd02488d">getProperty</a>(const Name &amp;) const</td><td class="entry"><a class="elRef" href="../hurricane/classHurricane_1_1DBo.html">Hurricane::DBo</a></td><td class="entry"></td></tr> <tr><td class="entry"><a class="elRef" doxygen="/dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/html/hurricane.tag:../hurricane/" href="../hurricane/classHurricane_1_1DBo.html#a599f61978df51d1d4c351f6cbd02488d">getProperty</a>(const Name &amp;) const</td><td class="entry"><a class="elRef" doxygen="/dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/html/hurricane.tag:../hurricane/" href="../hurricane/classHurricane_1_1DBo.html">Hurricane::DBo</a></td><td class="entry"></td></tr>
<tr class="even"><td class="entry"><a class="el" href="classCRL_1_1AllianceFramework.html#ae102d655820c5d0a29a0200c5e83d42c">getRoutingGauge</a>(const Name &amp;name=&quot;&quot;)</td><td class="entry"><a class="el" href="classCRL_1_1AllianceFramework.html">CRL::AllianceFramework</a></td><td class="entry"></td></tr> <tr class="even"><td class="entry"><a class="el" href="classCRL_1_1AllianceFramework.html#ae102d655820c5d0a29a0200c5e83d42c">getRoutingGauge</a>(const Name &amp;name=&quot;&quot;)</td><td class="entry"><a class="el" href="classCRL_1_1AllianceFramework.html">CRL::AllianceFramework</a></td><td class="entry"></td></tr>
<tr><td class="entry"><a class="el" href="classCRL_1_1AllianceFramework.html#a0ec1cd09dec34dfecfec22927b92cc25a8d9678631764327cbfe81f8184fa9e05">HasCatalog</a> enum value</td><td class="entry"><a class="el" href="classCRL_1_1AllianceFramework.html">CRL::AllianceFramework</a></td><td class="entry"></td></tr> <tr><td class="entry"><a class="el" href="classCRL_1_1AllianceFramework.html#a0ec1cd09dec34dfecfec22927b92cc25a8d9678631764327cbfe81f8184fa9e05">HasCatalog</a> enum value</td><td class="entry"><a class="el" href="classCRL_1_1AllianceFramework.html">CRL::AllianceFramework</a></td><td class="entry"></td></tr>
<tr class="even"><td class="entry"><a class="elRef" href="../hurricane/classHurricane_1_1DBo.html#a1563f094565030c77592ed82f9a9989b">hasProperty</a>() const</td><td class="entry"><a class="elRef" href="../hurricane/classHurricane_1_1DBo.html">Hurricane::DBo</a></td><td class="entry"></td></tr> <tr class="even"><td class="entry"><a class="elRef" doxygen="/dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/html/hurricane.tag:../hurricane/" href="../hurricane/classHurricane_1_1DBo.html#a1563f094565030c77592ed82f9a9989b">hasProperty</a>() const</td><td class="entry"><a class="elRef" doxygen="/dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/html/hurricane.tag:../hurricane/" href="../hurricane/classHurricane_1_1DBo.html">Hurricane::DBo</a></td><td class="entry"></td></tr>
<tr><td class="entry"><a class="el" href="classCRL_1_1AllianceFramework.html#a03ef94e043d2d25eb7a6a5f1ae176432a4a10630340ffb5b0aa9983f8b7f4cbe0">IgnoreFeeds</a> enum value</td><td class="entry"><a class="el" href="classCRL_1_1AllianceFramework.html">CRL::AllianceFramework</a></td><td class="entry"></td></tr> <tr><td class="entry"><a class="el" href="classCRL_1_1AllianceFramework.html#a03ef94e043d2d25eb7a6a5f1ae176432a4a10630340ffb5b0aa9983f8b7f4cbe0">IgnoreFeeds</a> enum value</td><td class="entry"><a class="el" href="classCRL_1_1AllianceFramework.html">CRL::AllianceFramework</a></td><td class="entry"></td></tr>
<tr class="even"><td class="entry"><a class="el" href="classCRL_1_1AllianceFramework.html#a03ef94e043d2d25eb7a6a5f1ae176432">InstancesCountFlags</a> enum name</td><td class="entry"><a class="el" href="classCRL_1_1AllianceFramework.html">CRL::AllianceFramework</a></td><td class="entry"></td></tr> <tr class="even"><td class="entry"><a class="el" href="classCRL_1_1AllianceFramework.html#a03ef94e043d2d25eb7a6a5f1ae176432">InstancesCountFlags</a> enum name</td><td class="entry"><a class="el" href="classCRL_1_1AllianceFramework.html">CRL::AllianceFramework</a></td><td class="entry"></td></tr>
<tr><td class="entry"><a class="el" href="classCRL_1_1AllianceFramework.html#aa41d24d292c19624236fff250a28b102">isBLOCKAGE</a>(const string &amp;name)</td><td class="entry"><a class="el" href="classCRL_1_1AllianceFramework.html">CRL::AllianceFramework</a></td><td class="entry"><span class="mlabel">inline</span></td></tr> <tr><td class="entry"><a class="el" href="classCRL_1_1AllianceFramework.html#aa41d24d292c19624236fff250a28b102">isBLOCKAGE</a>(const string &amp;name)</td><td class="entry"><a class="el" href="classCRL_1_1AllianceFramework.html">CRL::AllianceFramework</a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
@ -82,10 +82,10 @@ $(function() {
<tr class="even"><td class="entry"><a class="el" href="classCRL_1_1AllianceFramework.html#a0ec1cd09dec34dfecfec22927b92cc25">LibraryFlags</a> enum name</td><td class="entry"><a class="el" href="classCRL_1_1AllianceFramework.html">CRL::AllianceFramework</a></td><td class="entry"></td></tr> <tr class="even"><td class="entry"><a class="el" href="classCRL_1_1AllianceFramework.html#a0ec1cd09dec34dfecfec22927b92cc25">LibraryFlags</a> enum name</td><td class="entry"><a class="el" href="classCRL_1_1AllianceFramework.html">CRL::AllianceFramework</a></td><td class="entry"></td></tr>
<tr><td class="entry"><a class="el" href="classCRL_1_1AllianceFramework.html#a2e43b1928a05eea4b2dc1fe0757e4865">loadLibraryCells</a>(Library *)</td><td class="entry"><a class="el" href="classCRL_1_1AllianceFramework.html">CRL::AllianceFramework</a></td><td class="entry"></td></tr> <tr><td class="entry"><a class="el" href="classCRL_1_1AllianceFramework.html#a2e43b1928a05eea4b2dc1fe0757e4865">loadLibraryCells</a>(Library *)</td><td class="entry"><a class="el" href="classCRL_1_1AllianceFramework.html">CRL::AllianceFramework</a></td><td class="entry"></td></tr>
<tr class="even"><td class="entry"><a class="el" href="classCRL_1_1AllianceFramework.html#adc8acedeb9daa37b4ab2dee0717835fa">loadLibraryCells</a>(const Name &amp;)</td><td class="entry"><a class="el" href="classCRL_1_1AllianceFramework.html">CRL::AllianceFramework</a></td><td class="entry"></td></tr> <tr class="even"><td class="entry"><a class="el" href="classCRL_1_1AllianceFramework.html#adc8acedeb9daa37b4ab2dee0717835fa">loadLibraryCells</a>(const Name &amp;)</td><td class="entry"><a class="el" href="classCRL_1_1AllianceFramework.html">CRL::AllianceFramework</a></td><td class="entry"></td></tr>
<tr><td class="entry"><a class="elRef" href="../hurricane/classHurricane_1_1DBo.html#a8979674f11507cb4c7c5251b41ed72d5">put</a>(Property *)</td><td class="entry"><a class="elRef" href="../hurricane/classHurricane_1_1DBo.html">Hurricane::DBo</a></td><td class="entry"></td></tr> <tr><td class="entry"><a class="elRef" doxygen="/dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/html/hurricane.tag:../hurricane/" href="../hurricane/classHurricane_1_1DBo.html#a8979674f11507cb4c7c5251b41ed72d5">put</a>(Property *)</td><td class="entry"><a class="elRef" doxygen="/dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/html/hurricane.tag:../hurricane/" href="../hurricane/classHurricane_1_1DBo.html">Hurricane::DBo</a></td><td class="entry"></td></tr>
<tr class="even"><td class="entry"><a class="el" href="classCRL_1_1AllianceFramework.html#a03ef94e043d2d25eb7a6a5f1ae176432a3c65ebdaecc4b34b54a01ff3a5c3195a">Recursive</a> enum value</td><td class="entry"><a class="el" href="classCRL_1_1AllianceFramework.html">CRL::AllianceFramework</a></td><td class="entry"></td></tr> <tr class="even"><td class="entry"><a class="el" href="classCRL_1_1AllianceFramework.html#a03ef94e043d2d25eb7a6a5f1ae176432a3c65ebdaecc4b34b54a01ff3a5c3195a">Recursive</a> enum value</td><td class="entry"><a class="el" href="classCRL_1_1AllianceFramework.html">CRL::AllianceFramework</a></td><td class="entry"></td></tr>
<tr><td class="entry"><a class="elRef" href="../hurricane/classHurricane_1_1DBo.html#a7833a1f0b8c704930bdc00861e63cf5e">remove</a>(Property *)</td><td class="entry"><a class="elRef" href="../hurricane/classHurricane_1_1DBo.html">Hurricane::DBo</a></td><td class="entry"></td></tr> <tr><td class="entry"><a class="elRef" doxygen="/dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/html/hurricane.tag:../hurricane/" href="../hurricane/classHurricane_1_1DBo.html#a7833a1f0b8c704930bdc00861e63cf5e">remove</a>(Property *)</td><td class="entry"><a class="elRef" doxygen="/dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/html/hurricane.tag:../hurricane/" href="../hurricane/classHurricane_1_1DBo.html">Hurricane::DBo</a></td><td class="entry"></td></tr>
<tr class="even"><td class="entry"><a class="elRef" href="../hurricane/classHurricane_1_1DBo.html#ac35fbb8303b1a78db5ca0fc831fb6a0c">removeProperty</a>(const Name &amp;)</td><td class="entry"><a class="elRef" href="../hurricane/classHurricane_1_1DBo.html">Hurricane::DBo</a></td><td class="entry"></td></tr> <tr class="even"><td class="entry"><a class="elRef" doxygen="/dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/html/hurricane.tag:../hurricane/" href="../hurricane/classHurricane_1_1DBo.html#ac35fbb8303b1a78db5ca0fc831fb6a0c">removeProperty</a>(const Name &amp;)</td><td class="entry"><a class="elRef" doxygen="/dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/html/hurricane.tag:../hurricane/" href="../hurricane/classHurricane_1_1DBo.html">Hurricane::DBo</a></td><td class="entry"></td></tr>
<tr><td class="entry"><a class="el" href="classCRL_1_1AllianceFramework.html#abb34a606c7cd21638b4439701a8dcef9">saveCell</a>(Cell *, unsigned int mode)</td><td class="entry"><a class="el" href="classCRL_1_1AllianceFramework.html">CRL::AllianceFramework</a></td><td class="entry"></td></tr> <tr><td class="entry"><a class="el" href="classCRL_1_1AllianceFramework.html#abb34a606c7cd21638b4439701a8dcef9">saveCell</a>(Cell *, unsigned int mode)</td><td class="entry"><a class="el" href="classCRL_1_1AllianceFramework.html">CRL::AllianceFramework</a></td><td class="entry"></td></tr>
<tr class="even"><td class="entry"><a class="el" href="classCRL_1_1AllianceFramework.html#a5e5a3d137a2c141bf8984877b7f7d18a">saveLibrary</a>(Library *)</td><td class="entry"><a class="el" href="classCRL_1_1AllianceFramework.html">CRL::AllianceFramework</a></td><td class="entry"></td></tr> <tr class="even"><td class="entry"><a class="el" href="classCRL_1_1AllianceFramework.html#a5e5a3d137a2c141bf8984877b7f7d18a">saveLibrary</a>(Library *)</td><td class="entry"><a class="el" href="classCRL_1_1AllianceFramework.html">CRL::AllianceFramework</a></td><td class="entry"></td></tr>
<tr><td class="entry"><a class="el" href="classCRL_1_1AllianceFramework.html#afe7a103d54e865511fd55af90eddcf4e">saveLibrary</a>(AllianceLibrary *)</td><td class="entry"><a class="el" href="classCRL_1_1AllianceFramework.html">CRL::AllianceFramework</a></td><td class="entry"></td></tr> <tr><td class="entry"><a class="el" href="classCRL_1_1AllianceFramework.html#afe7a103d54e865511fd55af90eddcf4e">saveLibrary</a>(AllianceLibrary *)</td><td class="entry"><a class="el" href="classCRL_1_1AllianceFramework.html">CRL::AllianceFramework</a></td><td class="entry"></td></tr>
@ -94,7 +94,7 @@ $(function() {
<hr> <hr>
<table class="footer1"> <table class="footer1">
<tr> <tr>
<td class="LFooter"><small>Generated by doxygen 1.9.1 on Tue Feb 21 2023</small></td> <td class="LFooter"><small>Generated by doxygen 1.8.14 on Sun Nov 21 2021</small></td>
<td class="RFooter"><a href='#pagetop'><small>Return to top of page</small></a></td> <td class="RFooter"><a href='#pagetop'><small>Return to top of page</small></a></td>
</tr> </tr>
</table> </table>

View File

@ -24,7 +24,7 @@
--> -->
<br> <br>
<body onload="javascript:toggleLevel(1)"> <body onload="javascript:toggleLevel(1)">
<!-- Generated by Doxygen 1.9.1 --> <!-- Generated by Doxygen 1.8.14 -->
<script type="text/javascript" src="menudata.js"></script> <script type="text/javascript" src="menudata.js"></script>
<script type="text/javascript" src="menu.js"></script> <script type="text/javascript" src="menu.js"></script>
<script type="text/javascript"> <script type="text/javascript">
@ -53,30 +53,20 @@ $(function() {
<p>A Framework to work with Alliance formats. <p>A Framework to work with Alliance formats.
<a href="classCRL_1_1AllianceFramework.html#details">More...</a></p> <a href="classCRL_1_1AllianceFramework.html#details">More...</a></p>
<p>Inherits <a class="elRef" href="../hurricane/classHurricane_1_1DBo.html">Hurricane::DBo</a>.</p> <p>Inherits <a class="elRef" doxygen="/dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/html/hurricane.tag:../hurricane/" href="../hurricane/classHurricane_1_1DBo.html">Hurricane::DBo</a>.</p>
<table class="memberdecls"> <table class="memberdecls">
<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-types"></a> <tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-types"></a>
Public Types</h2></td></tr> Public Types</h2></td></tr>
<tr class="memitem:a03ef94e043d2d25eb7a6a5f1ae176432"><td class="memItemLeft" align="right" valign="top">enum &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classCRL_1_1AllianceFramework.html#a03ef94e043d2d25eb7a6a5f1ae176432">InstancesCountFlags</a> { <br /> <tr class="memitem:a03ef94e043d2d25eb7a6a5f1ae176432"><td class="memItemLeft" align="right" valign="top">enum &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classCRL_1_1AllianceFramework.html#a03ef94e043d2d25eb7a6a5f1ae176432">InstancesCountFlags</a> { <br />
&#160;&#160;<a class="el" href="classCRL_1_1AllianceFramework.html#a03ef94e043d2d25eb7a6a5f1ae176432a3c65ebdaecc4b34b54a01ff3a5c3195a">Recursive</a> = (1&lt;&lt;0) &#160;&#160;<a class="el" href="classCRL_1_1AllianceFramework.html#a03ef94e043d2d25eb7a6a5f1ae176432a3c65ebdaecc4b34b54a01ff3a5c3195a">Recursive</a> = (1&lt;&lt;0),
, <br /> <br />
&#160;&#160;<a class="el" href="classCRL_1_1AllianceFramework.html#a03ef94e043d2d25eb7a6a5f1ae176432a4a10630340ffb5b0aa9983f8b7f4cbe0">IgnoreFeeds</a> = (1&lt;&lt;1) &#160;&#160;<a class="el" href="classCRL_1_1AllianceFramework.html#a03ef94e043d2d25eb7a6a5f1ae176432a4a10630340ffb5b0aa9983f8b7f4cbe0">IgnoreFeeds</a> = (1&lt;&lt;1)
, <br />
&#160;&#160;<b>IgnoreDiodes</b> = (1&lt;&lt;2)
, <br />
&#160;&#160;<b>IgnorePowerFeeds</b> = (1&lt;&lt;3)
, <br />
&#160;&#160;<b>IgnoreNonLogic</b> = IgnoreFeeds|IgnoreDiodes|IgnorePowerFeeds
, <br />
&#160;&#160;<b>TerminalNetlist</b> = (1&lt;&lt;4)
<br /> <br />
}</td></tr> }</td></tr>
<tr class="separator:a03ef94e043d2d25eb7a6a5f1ae176432"><td class="memSeparator" colspan="2">&#160;</td></tr> <tr class="separator:a03ef94e043d2d25eb7a6a5f1ae176432"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a0ec1cd09dec34dfecfec22927b92cc25"><td class="memItemLeft" align="right" valign="top">enum &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classCRL_1_1AllianceFramework.html#a0ec1cd09dec34dfecfec22927b92cc25">LibraryFlags</a> { <br /> <tr class="memitem:a0ec1cd09dec34dfecfec22927b92cc25"><td class="memItemLeft" align="right" valign="top">enum &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classCRL_1_1AllianceFramework.html#a0ec1cd09dec34dfecfec22927b92cc25">LibraryFlags</a> { <br />
&#160;&#160;<a class="el" href="classCRL_1_1AllianceFramework.html#a0ec1cd09dec34dfecfec22927b92cc25ade58398b3ec849dc3aedb6a0812fbc7a">CreateLibrary</a> = (1&lt;&lt;0) &#160;&#160;<a class="el" href="classCRL_1_1AllianceFramework.html#a0ec1cd09dec34dfecfec22927b92cc25ade58398b3ec849dc3aedb6a0812fbc7a">CreateLibrary</a> = (1&lt;&lt;0)
, <br /> , <br />
&#160;&#160;<b>AppendLibrary</b> = (1&lt;&lt;1)
, <br />
&#160;&#160;<a class="el" href="classCRL_1_1AllianceFramework.html#a0ec1cd09dec34dfecfec22927b92cc25a8d9678631764327cbfe81f8184fa9e05">HasCatalog</a> = (1&lt;&lt;2) &#160;&#160;<a class="el" href="classCRL_1_1AllianceFramework.html#a0ec1cd09dec34dfecfec22927b92cc25a8d9678631764327cbfe81f8184fa9e05">HasCatalog</a> = (1&lt;&lt;2)
<br /> <br />
}</td></tr> }</td></tr>
@ -100,39 +90,39 @@ Public Member Functions</h2></td></tr>
<tr class="separator:a8e044592d2ceaea0060aec5dc5cc6900"><td class="memSeparator" colspan="2">&#160;</td></tr> <tr class="separator:a8e044592d2ceaea0060aec5dc5cc6900"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a036bd6fa8f837c81f60b9d424f817add"><td class="memItemLeft" align="right" valign="top"><a class="el" href="classCRL_1_1Catalog.html">Catalog</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classCRL_1_1AllianceFramework.html#a036bd6fa8f837c81f60b9d424f817add">getCatalog</a> ()</td></tr> <tr class="memitem:a036bd6fa8f837c81f60b9d424f817add"><td class="memItemLeft" align="right" valign="top"><a class="el" href="classCRL_1_1Catalog.html">Catalog</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classCRL_1_1AllianceFramework.html#a036bd6fa8f837c81f60b9d424f817add">getCatalog</a> ()</td></tr>
<tr class="separator:a036bd6fa8f837c81f60b9d424f817add"><td class="memSeparator" colspan="2">&#160;</td></tr> <tr class="separator:a036bd6fa8f837c81f60b9d424f817add"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a4f1d2d34c254ac596e8c4a408ef6ba43"><td class="memItemLeft" align="right" valign="top">const <a class="elRef" href="../hurricane/classHurricane_1_1Name.html">Name</a> &amp;&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classCRL_1_1AllianceFramework.html#a4f1d2d34c254ac596e8c4a408ef6ba43">getParentLibraryName</a> () const</td></tr> <tr class="memitem:a4f1d2d34c254ac596e8c4a408ef6ba43"><td class="memItemLeft" align="right" valign="top">const <a class="elRef" doxygen="/dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/html/hurricane.tag:../hurricane/" href="../hurricane/classHurricane_1_1Name.html">Name</a> &amp;&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classCRL_1_1AllianceFramework.html#a4f1d2d34c254ac596e8c4a408ef6ba43">getParentLibraryName</a> () const</td></tr>
<tr class="separator:a4f1d2d34c254ac596e8c4a408ef6ba43"><td class="memSeparator" colspan="2">&#160;</td></tr> <tr class="separator:a4f1d2d34c254ac596e8c4a408ef6ba43"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:afe822e9e04b613862aec5066743e1ffd"><td class="memItemLeft" align="right" valign="top"><a class="elRef" href="../hurricane/classHurricane_1_1Library.html">Library</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classCRL_1_1AllianceFramework.html#afe822e9e04b613862aec5066743e1ffd">getParentLibrary</a> ()</td></tr> <tr class="memitem:afe822e9e04b613862aec5066743e1ffd"><td class="memItemLeft" align="right" valign="top"><a class="elRef" doxygen="/dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/html/hurricane.tag:../hurricane/" href="../hurricane/classHurricane_1_1Library.html">Library</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classCRL_1_1AllianceFramework.html#afe822e9e04b613862aec5066743e1ffd">getParentLibrary</a> ()</td></tr>
<tr class="separator:afe822e9e04b613862aec5066743e1ffd"><td class="memSeparator" colspan="2">&#160;</td></tr> <tr class="separator:afe822e9e04b613862aec5066743e1ffd"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:ab6f9ac0f07b20c2444b13ef8bc55c9ea"><td class="memItemLeft" align="right" valign="top"><a class="elRef" href="../hurricane/classHurricane_1_1Library.html">Library</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classCRL_1_1AllianceFramework.html#ab6f9ac0f07b20c2444b13ef8bc55c9ea">getLibrary</a> (unsigned int index)</td></tr> <tr class="memitem:ab6f9ac0f07b20c2444b13ef8bc55c9ea"><td class="memItemLeft" align="right" valign="top"><a class="elRef" doxygen="/dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/html/hurricane.tag:../hurricane/" href="../hurricane/classHurricane_1_1Library.html">Library</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classCRL_1_1AllianceFramework.html#ab6f9ac0f07b20c2444b13ef8bc55c9ea">getLibrary</a> (unsigned int index)</td></tr>
<tr class="separator:ab6f9ac0f07b20c2444b13ef8bc55c9ea"><td class="memSeparator" colspan="2">&#160;</td></tr> <tr class="separator:ab6f9ac0f07b20c2444b13ef8bc55c9ea"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a4085f3bc96ca5e4bf2d41a4ada9658f2"><td class="memItemLeft" align="right" valign="top"><a class="el" href="classCRL_1_1AllianceLibrary.html">AllianceLibrary</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classCRL_1_1AllianceFramework.html#a4085f3bc96ca5e4bf2d41a4ada9658f2">getAllianceLibrary</a> (unsigned int index)</td></tr> <tr class="memitem:a4085f3bc96ca5e4bf2d41a4ada9658f2"><td class="memItemLeft" align="right" valign="top"><a class="el" href="classCRL_1_1AllianceLibrary.html">AllianceLibrary</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classCRL_1_1AllianceFramework.html#a4085f3bc96ca5e4bf2d41a4ada9658f2">getAllianceLibrary</a> (unsigned int index)</td></tr>
<tr class="separator:a4085f3bc96ca5e4bf2d41a4ada9658f2"><td class="memSeparator" colspan="2">&#160;</td></tr> <tr class="separator:a4085f3bc96ca5e4bf2d41a4ada9658f2"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a8e007b3f2ac45feec2907f77530a718c"><td class="memItemLeft" align="right" valign="top"><a class="el" href="classCRL_1_1AllianceLibrary.html">AllianceLibrary</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classCRL_1_1AllianceFramework.html#a8e007b3f2ac45feec2907f77530a718c">getAllianceLibrary</a> (<a class="elRef" href="../hurricane/classHurricane_1_1Library.html">Library</a> *)</td></tr> <tr class="memitem:a8e007b3f2ac45feec2907f77530a718c"><td class="memItemLeft" align="right" valign="top"><a class="el" href="classCRL_1_1AllianceLibrary.html">AllianceLibrary</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classCRL_1_1AllianceFramework.html#a8e007b3f2ac45feec2907f77530a718c">getAllianceLibrary</a> (<a class="elRef" doxygen="/dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/html/hurricane.tag:../hurricane/" href="../hurricane/classHurricane_1_1Library.html">Library</a> *)</td></tr>
<tr class="separator:a8e007b3f2ac45feec2907f77530a718c"><td class="memSeparator" colspan="2">&#160;</td></tr> <tr class="separator:a8e007b3f2ac45feec2907f77530a718c"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a4efc06e6a6d5413398946453c3fd6649"><td class="memItemLeft" align="right" valign="top"><a class="el" href="classCRL_1_1AllianceLibrary.html">AllianceLibrary</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classCRL_1_1AllianceFramework.html#a4efc06e6a6d5413398946453c3fd6649">createLibrary</a> (const string &amp;path, unsigned int flags, string libName=&quot;&quot;)</td></tr> <tr class="memitem:a4efc06e6a6d5413398946453c3fd6649"><td class="memItemLeft" align="right" valign="top"><a class="el" href="classCRL_1_1AllianceLibrary.html">AllianceLibrary</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classCRL_1_1AllianceFramework.html#a4efc06e6a6d5413398946453c3fd6649">createLibrary</a> (const string &amp;path, unsigned int flags, string libName=&quot;&quot;)</td></tr>
<tr class="separator:a4efc06e6a6d5413398946453c3fd6649"><td class="memSeparator" colspan="2">&#160;</td></tr> <tr class="separator:a4efc06e6a6d5413398946453c3fd6649"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a5e5a3d137a2c141bf8984877b7f7d18a"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classCRL_1_1AllianceFramework.html#a5e5a3d137a2c141bf8984877b7f7d18a">saveLibrary</a> (<a class="elRef" href="../hurricane/classHurricane_1_1Library.html">Library</a> *)</td></tr> <tr class="memitem:a5e5a3d137a2c141bf8984877b7f7d18a"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classCRL_1_1AllianceFramework.html#a5e5a3d137a2c141bf8984877b7f7d18a">saveLibrary</a> (<a class="elRef" doxygen="/dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/html/hurricane.tag:../hurricane/" href="../hurricane/classHurricane_1_1Library.html">Library</a> *)</td></tr>
<tr class="separator:a5e5a3d137a2c141bf8984877b7f7d18a"><td class="memSeparator" colspan="2">&#160;</td></tr> <tr class="separator:a5e5a3d137a2c141bf8984877b7f7d18a"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:afe7a103d54e865511fd55af90eddcf4e"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classCRL_1_1AllianceFramework.html#afe7a103d54e865511fd55af90eddcf4e">saveLibrary</a> (<a class="el" href="classCRL_1_1AllianceLibrary.html">AllianceLibrary</a> *)</td></tr> <tr class="memitem:afe7a103d54e865511fd55af90eddcf4e"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classCRL_1_1AllianceFramework.html#afe7a103d54e865511fd55af90eddcf4e">saveLibrary</a> (<a class="el" href="classCRL_1_1AllianceLibrary.html">AllianceLibrary</a> *)</td></tr>
<tr class="separator:afe7a103d54e865511fd55af90eddcf4e"><td class="memSeparator" colspan="2">&#160;</td></tr> <tr class="separator:afe7a103d54e865511fd55af90eddcf4e"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:ae102d655820c5d0a29a0200c5e83d42c"><td class="memItemLeft" align="right" valign="top"><a class="el" href="classCRL_1_1RoutingGauge.html">RoutingGauge</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classCRL_1_1AllianceFramework.html#ae102d655820c5d0a29a0200c5e83d42c">getRoutingGauge</a> (const <a class="elRef" href="../hurricane/classHurricane_1_1Name.html">Name</a> &amp;name=&quot;&quot;)</td></tr> <tr class="memitem:ae102d655820c5d0a29a0200c5e83d42c"><td class="memItemLeft" align="right" valign="top"><a class="el" href="classCRL_1_1RoutingGauge.html">RoutingGauge</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classCRL_1_1AllianceFramework.html#ae102d655820c5d0a29a0200c5e83d42c">getRoutingGauge</a> (const <a class="elRef" doxygen="/dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/html/hurricane.tag:../hurricane/" href="../hurricane/classHurricane_1_1Name.html">Name</a> &amp;name=&quot;&quot;)</td></tr>
<tr class="separator:ae102d655820c5d0a29a0200c5e83d42c"><td class="memSeparator" colspan="2">&#160;</td></tr> <tr class="separator:ae102d655820c5d0a29a0200c5e83d42c"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:ae2bf20fc92a4684bebdab666c68c8aab"><td class="memItemLeft" align="right" valign="top">const <a class="elRef" href="../hurricane/classHurricane_1_1Name.html">Name</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classCRL_1_1AllianceFramework.html#ae2bf20fc92a4684bebdab666c68c8aab">getDefaultCGPinLayerName</a> () const</td></tr> <tr class="memitem:ae2bf20fc92a4684bebdab666c68c8aab"><td class="memItemLeft" align="right" valign="top">const <a class="elRef" doxygen="/dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/html/hurricane.tag:../hurricane/" href="../hurricane/classHurricane_1_1Name.html">Name</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classCRL_1_1AllianceFramework.html#ae2bf20fc92a4684bebdab666c68c8aab">getDefaultCGPinLayerName</a> () const</td></tr>
<tr class="separator:ae2bf20fc92a4684bebdab666c68c8aab"><td class="memSeparator" colspan="2">&#160;</td></tr> <tr class="separator:ae2bf20fc92a4684bebdab666c68c8aab"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:ae182fd150c695fd24c1b10ddbc377b32"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classCRL_1_1AllianceFramework.html#ae182fd150c695fd24c1b10ddbc377b32">addRoutingGauge</a> (<a class="el" href="classCRL_1_1RoutingGauge.html">RoutingGauge</a> *)</td></tr> <tr class="memitem:ae182fd150c695fd24c1b10ddbc377b32"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classCRL_1_1AllianceFramework.html#ae182fd150c695fd24c1b10ddbc377b32">addRoutingGauge</a> (<a class="el" href="classCRL_1_1RoutingGauge.html">RoutingGauge</a> *)</td></tr>
<tr class="separator:ae182fd150c695fd24c1b10ddbc377b32"><td class="memSeparator" colspan="2">&#160;</td></tr> <tr class="separator:ae182fd150c695fd24c1b10ddbc377b32"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:aab16db33a0ce2e3bce5739f7cadb3d5a"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classCRL_1_1AllianceFramework.html#aab16db33a0ce2e3bce5739f7cadb3d5a">addCellGauge</a> (CellGauge *)</td></tr> <tr class="memitem:aab16db33a0ce2e3bce5739f7cadb3d5a"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classCRL_1_1AllianceFramework.html#aab16db33a0ce2e3bce5739f7cadb3d5a">addCellGauge</a> (CellGauge *)</td></tr>
<tr class="separator:aab16db33a0ce2e3bce5739f7cadb3d5a"><td class="memSeparator" colspan="2">&#160;</td></tr> <tr class="separator:aab16db33a0ce2e3bce5739f7cadb3d5a"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a329d04c188668968308108523d16e2be"><td class="memItemLeft" align="right" valign="top"><a class="elRef" href="../hurricane/classHurricane_1_1Cell.html">Cell</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classCRL_1_1AllianceFramework.html#a329d04c188668968308108523d16e2be">getCell</a> (const string &amp;name, unsigned int mode, unsigned int depth=(unsigned int) -1)</td></tr> <tr class="memitem:a329d04c188668968308108523d16e2be"><td class="memItemLeft" align="right" valign="top"><a class="elRef" doxygen="/dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/html/hurricane.tag:../hurricane/" href="../hurricane/classHurricane_1_1Cell.html">Cell</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classCRL_1_1AllianceFramework.html#a329d04c188668968308108523d16e2be">getCell</a> (const string &amp;name, unsigned int mode, unsigned int depth=(unsigned int) -1)</td></tr>
<tr class="separator:a329d04c188668968308108523d16e2be"><td class="memSeparator" colspan="2">&#160;</td></tr> <tr class="separator:a329d04c188668968308108523d16e2be"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:ac4381ad0c3799d584ef3ea160846e2bb"><td class="memItemLeft" align="right" valign="top"><a class="elRef" href="../hurricane/classHurricane_1_1Cell.html">Cell</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classCRL_1_1AllianceFramework.html#ac4381ad0c3799d584ef3ea160846e2bb">createCell</a> (const string &amp;name, <a class="el" href="classCRL_1_1AllianceLibrary.html">AllianceLibrary</a> *library=NULL)</td></tr> <tr class="memitem:ac4381ad0c3799d584ef3ea160846e2bb"><td class="memItemLeft" align="right" valign="top"><a class="elRef" doxygen="/dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/html/hurricane.tag:../hurricane/" href="../hurricane/classHurricane_1_1Cell.html">Cell</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classCRL_1_1AllianceFramework.html#ac4381ad0c3799d584ef3ea160846e2bb">createCell</a> (const string &amp;name, <a class="el" href="classCRL_1_1AllianceLibrary.html">AllianceLibrary</a> *library=NULL)</td></tr>
<tr class="separator:ac4381ad0c3799d584ef3ea160846e2bb"><td class="memSeparator" colspan="2">&#160;</td></tr> <tr class="separator:ac4381ad0c3799d584ef3ea160846e2bb"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:abb34a606c7cd21638b4439701a8dcef9"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classCRL_1_1AllianceFramework.html#abb34a606c7cd21638b4439701a8dcef9">saveCell</a> (<a class="elRef" href="../hurricane/classHurricane_1_1Cell.html">Cell</a> *, unsigned int mode)</td></tr> <tr class="memitem:abb34a606c7cd21638b4439701a8dcef9"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classCRL_1_1AllianceFramework.html#abb34a606c7cd21638b4439701a8dcef9">saveCell</a> (<a class="elRef" doxygen="/dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/html/hurricane.tag:../hurricane/" href="../hurricane/classHurricane_1_1Cell.html">Cell</a> *, unsigned int mode)</td></tr>
<tr class="separator:abb34a606c7cd21638b4439701a8dcef9"><td class="memSeparator" colspan="2">&#160;</td></tr> <tr class="separator:abb34a606c7cd21638b4439701a8dcef9"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a2e43b1928a05eea4b2dc1fe0757e4865"><td class="memItemLeft" align="right" valign="top">unsigned int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classCRL_1_1AllianceFramework.html#a2e43b1928a05eea4b2dc1fe0757e4865">loadLibraryCells</a> (<a class="elRef" href="../hurricane/classHurricane_1_1Library.html">Library</a> *)</td></tr> <tr class="memitem:a2e43b1928a05eea4b2dc1fe0757e4865"><td class="memItemLeft" align="right" valign="top">unsigned int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classCRL_1_1AllianceFramework.html#a2e43b1928a05eea4b2dc1fe0757e4865">loadLibraryCells</a> (<a class="elRef" doxygen="/dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/html/hurricane.tag:../hurricane/" href="../hurricane/classHurricane_1_1Library.html">Library</a> *)</td></tr>
<tr class="separator:a2e43b1928a05eea4b2dc1fe0757e4865"><td class="memSeparator" colspan="2">&#160;</td></tr> <tr class="separator:a2e43b1928a05eea4b2dc1fe0757e4865"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:adc8acedeb9daa37b4ab2dee0717835fa"><td class="memItemLeft" align="right" valign="top">unsigned int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classCRL_1_1AllianceFramework.html#adc8acedeb9daa37b4ab2dee0717835fa">loadLibraryCells</a> (const <a class="elRef" href="../hurricane/classHurricane_1_1Name.html">Name</a> &amp;)</td></tr> <tr class="memitem:adc8acedeb9daa37b4ab2dee0717835fa"><td class="memItemLeft" align="right" valign="top">unsigned int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classCRL_1_1AllianceFramework.html#adc8acedeb9daa37b4ab2dee0717835fa">loadLibraryCells</a> (const <a class="elRef" doxygen="/dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/html/hurricane.tag:../hurricane/" href="../hurricane/classHurricane_1_1Name.html">Name</a> &amp;)</td></tr>
<tr class="separator:adc8acedeb9daa37b4ab2dee0717835fa"><td class="memSeparator" colspan="2">&#160;</td></tr> <tr class="separator:adc8acedeb9daa37b4ab2dee0717835fa"><td class="memSeparator" colspan="2">&#160;</td></tr>
</table><table class="memberdecls"> </table><table class="memberdecls">
<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-static-methods"></a> <tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-static-methods"></a>
@ -141,12 +131,12 @@ Static Public Member Functions</h2></td></tr>
<tr class="separator:a8cff32ced8cc163cadca885d8ed8a5fc"><td class="memSeparator" colspan="2">&#160;</td></tr> <tr class="separator:a8cff32ced8cc163cadca885d8ed8a5fc"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a976479af696a86c998c10d9d2604839d"><td class="memItemLeft" align="right" valign="top">static <a class="el" href="classCRL_1_1AllianceFramework.html">AllianceFramework</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classCRL_1_1AllianceFramework.html#a976479af696a86c998c10d9d2604839d">get</a> ()</td></tr> <tr class="memitem:a976479af696a86c998c10d9d2604839d"><td class="memItemLeft" align="right" valign="top">static <a class="el" href="classCRL_1_1AllianceFramework.html">AllianceFramework</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classCRL_1_1AllianceFramework.html#a976479af696a86c998c10d9d2604839d">get</a> ()</td></tr>
<tr class="separator:a976479af696a86c998c10d9d2604839d"><td class="memSeparator" colspan="2">&#160;</td></tr> <tr class="separator:a976479af696a86c998c10d9d2604839d"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a95aa8c6b8ab3f995daf22a0317324933"><td class="memItemLeft" align="right" valign="top">static size_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classCRL_1_1AllianceFramework.html#a95aa8c6b8ab3f995daf22a0317324933">getInstancesCount</a> (<a class="elRef" href="../hurricane/classHurricane_1_1Cell.html">Cell</a> *, unsigned int flags)</td></tr> <tr class="memitem:a95aa8c6b8ab3f995daf22a0317324933"><td class="memItemLeft" align="right" valign="top">static size_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classCRL_1_1AllianceFramework.html#a95aa8c6b8ab3f995daf22a0317324933">getInstancesCount</a> (<a class="elRef" doxygen="/dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/html/hurricane.tag:../hurricane/" href="../hurricane/classHurricane_1_1Cell.html">Cell</a> *, unsigned int flags)</td></tr>
<tr class="separator:a95aa8c6b8ab3f995daf22a0317324933"><td class="memSeparator" colspan="2">&#160;</td></tr> <tr class="separator:a95aa8c6b8ab3f995daf22a0317324933"><td class="memSeparator" colspan="2">&#160;</td></tr>
</table> </table>
<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2> <a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
<div class="textblock"><p>A Framework to work with Alliance formats. </p> <div class="textblock"><p>A Framework to work with Alliance formats. </p>
<p>The <a class="el" href="classCRL_1_1AllianceFramework.html" title="A Framework to work with Alliance formats.">AllianceFramework</a> is also registered as <a class="elRef" href="../hurricane/classHurricane_1_1Property.html">Hurricane::Property</a> on the <a class="elRef" href="../hurricane/classHurricane_1_1DataBase.html">Hurricane::DataBase</a>. </p> <p>The <a class="el" href="classCRL_1_1AllianceFramework.html" title="A Framework to work with Alliance formats. ">AllianceFramework</a> is also registered as <a class="elRef" doxygen="/dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/html/hurricane.tag:../hurricane/" href="../hurricane/classHurricane_1_1Property.html">Hurricane::Property</a> on the <a class="elRef" doxygen="/dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/html/hurricane.tag:../hurricane/" href="../hurricane/classHurricane_1_1DataBase.html">Hurricane::DataBase</a>. </p>
</div><h2 class="groupheader">Member Enumeration Documentation</h2> </div><h2 class="groupheader">Member Enumeration Documentation</h2>
<a id="a03ef94e043d2d25eb7a6a5f1ae176432"></a> <a id="a03ef94e043d2d25eb7a6a5f1ae176432"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a03ef94e043d2d25eb7a6a5f1ae176432">&#9670;&nbsp;</a></span>InstancesCountFlags</h2> <h2 class="memtitle"><span class="permalink"><a href="#a03ef94e043d2d25eb7a6a5f1ae176432">&#9670;&nbsp;</a></span>InstancesCountFlags</h2>
@ -214,7 +204,7 @@ Static Public Member Functions</h2></td></tr>
</tr> </tr>
</table> </table>
</div><div class="memdoc"> </div><div class="memdoc">
<p><b>Returns:</b> The <a class="el" href="classCRL_1_1AllianceFramework.html" title="A Framework to work with Alliance formats.">AllianceFramework</a> singleton. This function has no effect if the singleton has already been created. It is indeed an alias over <a class="el" href="classCRL_1_1AllianceFramework.html#a976479af696a86c998c10d9d2604839d">AllianceFramework::get()</a>. </p> <p><b>Returns:</b> The <a class="el" href="classCRL_1_1AllianceFramework.html" title="A Framework to work with Alliance formats. ">AllianceFramework</a> singleton. This function has no effect if the singleton has already been created. It is indeed an alias over <a class="el" href="classCRL_1_1AllianceFramework.html#a976479af696a86c998c10d9d2604839d">AllianceFramework::get()</a>. </p>
</div> </div>
</div> </div>
@ -258,7 +248,7 @@ Static Public Member Functions</h2></td></tr>
</tr> </tr>
</table> </table>
</div><div class="memdoc"> </div><div class="memdoc">
<p><b>Returns:</b> A nicely formatted string displaying the configuration of the <a class="el" href="classCRL_1_1AllianceFramework.html" title="A Framework to work with Alliance formats.">AllianceFramework</a>, for ttys. </p> <p><b>Returns:</b> A nicely formatted string displaying the configuration of the <a class="el" href="classCRL_1_1AllianceFramework.html" title="A Framework to work with Alliance formats. ">AllianceFramework</a>, for ttys. </p>
</div> </div>
</div> </div>
@ -459,7 +449,7 @@ Static Public Member Functions</h2></td></tr>
<td class="mlabels-left"> <td class="mlabels-left">
<table class="memname"> <table class="memname">
<tr> <tr>
<td class="memname">const <a class="elRef" href="../hurricane/classHurricane_1_1Name.html">Name</a> &amp; CRL::AllianceFramework::getParentLibraryName </td> <td class="memname">const <a class="elRef" doxygen="/dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/html/hurricane.tag:../hurricane/" href="../hurricane/classHurricane_1_1Name.html">Name</a> &amp; CRL::AllianceFramework::getParentLibraryName </td>
<td>(</td> <td>(</td>
<td class="paramname"></td><td>)</td> <td class="paramname"></td><td>)</td>
<td> const</td> <td> const</td>
@ -485,7 +475,7 @@ Static Public Member Functions</h2></td></tr>
<td class="mlabels-left"> <td class="mlabels-left">
<table class="memname"> <table class="memname">
<tr> <tr>
<td class="memname"><a class="elRef" href="../hurricane/classHurricane_1_1Library.html">Library</a> * CRL::AllianceFramework::getParentLibrary </td> <td class="memname"><a class="elRef" doxygen="/dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/html/hurricane.tag:../hurricane/" href="../hurricane/classHurricane_1_1Library.html">Library</a> * CRL::AllianceFramework::getParentLibrary </td>
<td>(</td> <td>(</td>
<td class="paramname"></td><td>)</td> <td class="paramname"></td><td>)</td>
<td></td> <td></td>
@ -508,7 +498,7 @@ Static Public Member Functions</h2></td></tr>
<div class="memproto"> <div class="memproto">
<table class="memname"> <table class="memname">
<tr> <tr>
<td class="memname"><a class="elRef" href="../hurricane/classHurricane_1_1Library.html">Library</a> * CRL::AllianceFramework::getLibrary </td> <td class="memname"><a class="elRef" doxygen="/dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/html/hurricane.tag:../hurricane/" href="../hurricane/classHurricane_1_1Library.html">Library</a> * CRL::AllianceFramework::getLibrary </td>
<td>(</td> <td>(</td>
<td class="paramtype">unsigned int&#160;</td> <td class="paramtype">unsigned int&#160;</td>
<td class="paramname"><em>index</em></td><td>)</td> <td class="paramname"><em>index</em></td><td>)</td>
@ -516,7 +506,7 @@ Static Public Member Functions</h2></td></tr>
</tr> </tr>
</table> </table>
</div><div class="memdoc"> </div><div class="memdoc">
<p><b>Returns:</b> the <a class="elRef" href="../hurricane/classHurricane_1_1Library.html">Hurricane::Library</a> at <code>index</code> in the search path. </p> <p><b>Returns:</b> the <a class="elRef" doxygen="/dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/html/hurricane.tag:../hurricane/" href="../hurricane/classHurricane_1_1Library.html">Hurricane::Library</a> at <code>index</code> in the search path. </p>
</div> </div>
</div> </div>
@ -535,7 +525,7 @@ Static Public Member Functions</h2></td></tr>
</tr> </tr>
</table> </table>
</div><div class="memdoc"> </div><div class="memdoc">
<p><b>Returns:</b> the <a class="el" href="classCRL_1_1AllianceLibrary.html" title="A small wrapper around Hurricane::Library.">AllianceLibrary</a> at <code>index</code> in the search path. </p> <p><b>Returns:</b> the <a class="el" href="classCRL_1_1AllianceLibrary.html" title="A small wrapper around Hurricane::Library. ">AllianceLibrary</a> at <code>index</code> in the search path. </p>
</div> </div>
</div> </div>
@ -548,13 +538,13 @@ Static Public Member Functions</h2></td></tr>
<tr> <tr>
<td class="memname"><a class="el" href="classCRL_1_1AllianceLibrary.html">AllianceLibrary</a> * CRL::AllianceFramework::getAllianceLibrary </td> <td class="memname"><a class="el" href="classCRL_1_1AllianceLibrary.html">AllianceLibrary</a> * CRL::AllianceFramework::getAllianceLibrary </td>
<td>(</td> <td>(</td>
<td class="paramtype"><a class="elRef" href="../hurricane/classHurricane_1_1Library.html">Library</a> *&#160;</td> <td class="paramtype"><a class="elRef" doxygen="/dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/html/hurricane.tag:../hurricane/" href="../hurricane/classHurricane_1_1Library.html">Library</a> *&#160;</td>
<td class="paramname"><em>library</em></td><td>)</td> <td class="paramname"><em>library</em></td><td>)</td>
<td></td> <td></td>
</tr> </tr>
</table> </table>
</div><div class="memdoc"> </div><div class="memdoc">
<p><b>Returns:</b> the <a class="el" href="classCRL_1_1AllianceLibrary.html" title="A small wrapper around Hurricane::Library.">AllianceLibrary</a> which is associated to the <a class="elRef" href="../hurricane/classHurricane_1_1Library.html">Hurricane::Library</a> <code>library</code>. </p> <p><b>Returns:</b> the <a class="el" href="classCRL_1_1AllianceLibrary.html" title="A small wrapper around Hurricane::Library. ">AllianceLibrary</a> which is associated to the <a class="elRef" doxygen="/dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/html/hurricane.tag:../hurricane/" href="../hurricane/classHurricane_1_1Library.html">Hurricane::Library</a> <code>library</code>. </p>
</div> </div>
</div> </div>
@ -597,7 +587,7 @@ Static Public Member Functions</h2></td></tr>
</table> </table>
</dd> </dd>
</dl> </dl>
<p>Create a new <a class="el" href="classCRL_1_1AllianceLibrary.html" title="A small wrapper around Hurricane::Library.">AllianceLibrary</a>. If the library is not already in the search it's prepended, otherwise the one already in place is used. If the library is in <em>load by lib</em> mode, the library parser is called and all the Cells are loaded. </p> <p>Create a new <a class="el" href="classCRL_1_1AllianceLibrary.html" title="A small wrapper around Hurricane::Library. ">AllianceLibrary</a>. If the library is not already in the search it's prepended, otherwise the one already in place is used. If the library is in <em>load by lib</em> mode, the library parser is called and all the Cells are loaded. </p>
</div> </div>
</div> </div>
@ -610,7 +600,7 @@ Static Public Member Functions</h2></td></tr>
<tr> <tr>
<td class="memname">void CRL::AllianceFramework::saveLibrary </td> <td class="memname">void CRL::AllianceFramework::saveLibrary </td>
<td>(</td> <td>(</td>
<td class="paramtype"><a class="elRef" href="../hurricane/classHurricane_1_1Library.html">Library</a> *&#160;</td> <td class="paramtype"><a class="elRef" doxygen="/dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/html/hurricane.tag:../hurricane/" href="../hurricane/classHurricane_1_1Library.html">Library</a> *&#160;</td>
<td class="paramname"><em>library</em></td><td>)</td> <td class="paramname"><em>library</em></td><td>)</td>
<td></td> <td></td>
</tr> </tr>
@ -648,13 +638,13 @@ Static Public Member Functions</h2></td></tr>
<tr> <tr>
<td class="memname">CellGauge * CRL::AllianceFramework::getRoutingGauge </td> <td class="memname">CellGauge * CRL::AllianceFramework::getRoutingGauge </td>
<td>(</td> <td>(</td>
<td class="paramtype">const <a class="elRef" href="../hurricane/classHurricane_1_1Name.html">Name</a> &amp;&#160;</td> <td class="paramtype">const <a class="elRef" doxygen="/dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/html/hurricane.tag:../hurricane/" href="../hurricane/classHurricane_1_1Name.html">Name</a> &amp;&#160;</td>
<td class="paramname"><em>name</em> = <code>&quot;&quot;</code></td><td>)</td> <td class="paramname"><em>name</em> = <code>&quot;&quot;</code></td><td>)</td>
<td></td> <td></td>
</tr> </tr>
</table> </table>
</div><div class="memdoc"> </div><div class="memdoc">
<p><b>Returns:</b> get the <a class="el" href="classCRL_1_1RoutingGauge.html" title="Gauge for the detailed routing.">RoutingGauge</a> <code>name</code>. If <code>name</code> is empty, the default one.</p> <p><b>Returns:</b> get the <a class="el" href="classCRL_1_1RoutingGauge.html" title="Gauge for the detailed routing. ">RoutingGauge</a> <code>name</code>. If <code>name</code> is empty, the default one.</p>
<p><b>Returns:</b> get the CellGauge <code>name</code>. If <code>name</code> is empty, the default one. </p> <p><b>Returns:</b> get the CellGauge <code>name</code>. If <code>name</code> is empty, the default one. </p>
</div> </div>
@ -669,7 +659,7 @@ Static Public Member Functions</h2></td></tr>
<td class="mlabels-left"> <td class="mlabels-left">
<table class="memname"> <table class="memname">
<tr> <tr>
<td class="memname">const <a class="elRef" href="../hurricane/classHurricane_1_1Name.html">Name</a> CRL::AllianceFramework::getDefaultCGPinLayerName </td> <td class="memname">const <a class="elRef" doxygen="/dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/html/hurricane.tag:../hurricane/" href="../hurricane/classHurricane_1_1Name.html">Name</a> CRL::AllianceFramework::getDefaultCGPinLayerName </td>
<td>(</td> <td>(</td>
<td class="paramname"></td><td>)</td> <td class="paramname"></td><td>)</td>
<td> const</td> <td> const</td>
@ -700,7 +690,7 @@ Static Public Member Functions</h2></td></tr>
</tr> </tr>
</table> </table>
</div><div class="memdoc"> </div><div class="memdoc">
<p><b>Returns:</b> Add a new <a class="el" href="classCRL_1_1RoutingGauge.html" title="Gauge for the detailed routing.">RoutingGauge</a>. The last added becomes the default one. </p> <p><b>Returns:</b> Add a new <a class="el" href="classCRL_1_1RoutingGauge.html" title="Gauge for the detailed routing. ">RoutingGauge</a>. The last added becomes the default one. </p>
</div> </div>
</div> </div>
@ -730,7 +720,7 @@ Static Public Member Functions</h2></td></tr>
<div class="memproto"> <div class="memproto">
<table class="memname"> <table class="memname">
<tr> <tr>
<td class="memname"><a class="elRef" href="../hurricane/classHurricane_1_1Cell.html">Cell</a> * CRL::AllianceFramework::getCell </td> <td class="memname"><a class="elRef" doxygen="/dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/html/hurricane.tag:../hurricane/" href="../hurricane/classHurricane_1_1Cell.html">Cell</a> * CRL::AllianceFramework::getCell </td>
<td>(</td> <td>(</td>
<td class="paramtype">const string &amp;&#160;</td> <td class="paramtype">const string &amp;&#160;</td>
<td class="paramname"><em>name</em>, </td> <td class="paramname"><em>name</em>, </td>
@ -773,7 +763,7 @@ Static Public Member Functions</h2></td></tr>
<div class="memproto"> <div class="memproto">
<table class="memname"> <table class="memname">
<tr> <tr>
<td class="memname"><a class="elRef" href="../hurricane/classHurricane_1_1Cell.html">Cell</a> * CRL::AllianceFramework::createCell </td> <td class="memname"><a class="elRef" doxygen="/dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/html/hurricane.tag:../hurricane/" href="../hurricane/classHurricane_1_1Cell.html">Cell</a> * CRL::AllianceFramework::createCell </td>
<td>(</td> <td>(</td>
<td class="paramtype">const string &amp;&#160;</td> <td class="paramtype">const string &amp;&#160;</td>
<td class="paramname"><em>name</em>, </td> <td class="paramname"><em>name</em>, </td>
@ -798,7 +788,7 @@ Static Public Member Functions</h2></td></tr>
</table> </table>
</dd> </dd>
</dl> </dl>
<p>Create a new Cell named <code>name</code> in the <a class="el" href="classCRL_1_1AllianceLibrary.html" title="A small wrapper around Hurricane::Library.">AllianceLibrary</a> <code>library</code>. If <code>library</code> is <code>NULL</code>, uses the working library. Checks are performed to ensure that in a given library no two cells have the same name. </p> <p>Create a new Cell named <code>name</code> in the <a class="el" href="classCRL_1_1AllianceLibrary.html" title="A small wrapper around Hurricane::Library. ">AllianceLibrary</a> <code>library</code>. If <code>library</code> is <code>NULL</code>, uses the working library. Checks are performed to ensure that in a given library no two cells have the same name. </p>
</div> </div>
</div> </div>
@ -811,7 +801,7 @@ Static Public Member Functions</h2></td></tr>
<tr> <tr>
<td class="memname">void CRL::AllianceFramework::saveCell </td> <td class="memname">void CRL::AllianceFramework::saveCell </td>
<td>(</td> <td>(</td>
<td class="paramtype"><a class="elRef" href="../hurricane/classHurricane_1_1Cell.html">Cell</a> *&#160;</td> <td class="paramtype"><a class="elRef" doxygen="/dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/html/hurricane.tag:../hurricane/" href="../hurricane/classHurricane_1_1Cell.html">Cell</a> *&#160;</td>
<td class="paramname"><em>cell</em>, </td> <td class="paramname"><em>cell</em>, </td>
</tr> </tr>
<tr> <tr>
@ -840,7 +830,7 @@ Static Public Member Functions</h2></td></tr>
<tr> <tr>
<td class="memname">unsigned int CRL::AllianceFramework::loadLibraryCells </td> <td class="memname">unsigned int CRL::AllianceFramework::loadLibraryCells </td>
<td>(</td> <td>(</td>
<td class="paramtype"><a class="elRef" href="../hurricane/classHurricane_1_1Library.html">Library</a> *&#160;</td> <td class="paramtype"><a class="elRef" doxygen="/dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/html/hurricane.tag:../hurricane/" href="../hurricane/classHurricane_1_1Library.html">Library</a> *&#160;</td>
<td class="paramname"><em>library</em></td><td>)</td> <td class="paramname"><em>library</em></td><td>)</td>
<td></td> <td></td>
</tr> </tr>
@ -859,7 +849,7 @@ Static Public Member Functions</h2></td></tr>
<tr> <tr>
<td class="memname">unsigned int CRL::AllianceFramework::loadLibraryCells </td> <td class="memname">unsigned int CRL::AllianceFramework::loadLibraryCells </td>
<td>(</td> <td>(</td>
<td class="paramtype">const <a class="elRef" href="../hurricane/classHurricane_1_1Name.html">Name</a> &amp;&#160;</td> <td class="paramtype">const <a class="elRef" doxygen="/dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/html/hurricane.tag:../hurricane/" href="../hurricane/classHurricane_1_1Name.html">Name</a> &amp;&#160;</td>
<td class="paramname"></td><td>)</td> <td class="paramname"></td><td>)</td>
<td></td> <td></td>
</tr> </tr>
@ -881,7 +871,7 @@ Static Public Member Functions</h2></td></tr>
<tr> <tr>
<td class="memname">size_t CRL::AllianceFramework::getInstancesCount </td> <td class="memname">size_t CRL::AllianceFramework::getInstancesCount </td>
<td>(</td> <td>(</td>
<td class="paramtype"><a class="elRef" href="../hurricane/classHurricane_1_1Cell.html">Cell</a> *&#160;</td> <td class="paramtype"><a class="elRef" doxygen="/dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/html/hurricane.tag:../hurricane/" href="../hurricane/classHurricane_1_1Cell.html">Cell</a> *&#160;</td>
<td class="paramname"><em>cell</em>, </td> <td class="paramname"><em>cell</em>, </td>
</tr> </tr>
<tr> <tr>
@ -915,7 +905,7 @@ Static Public Member Functions</h2></td></tr>
<hr> <hr>
<table class="footer1"> <table class="footer1">
<tr> <tr>
<td class="LFooter"><small>Generated by doxygen 1.9.1 on Tue Feb 21 2023</small></td> <td class="LFooter"><small>Generated by doxygen 1.8.14 on Sun Nov 21 2021</small></td>
<td class="RFooter"><a href='#pagetop'><small>Return to top of page</small></a></td> <td class="RFooter"><a href='#pagetop'><small>Return to top of page</small></a></td>
</tr> </tr>
</table> </table>

View File

@ -24,7 +24,7 @@
--> -->
<br> <br>
<body onload="javascript:toggleLevel(1)"> <body onload="javascript:toggleLevel(1)">
<!-- Generated by Doxygen 1.9.1 --> <!-- Generated by Doxygen 1.8.14 -->
<script type="text/javascript" src="menudata.js"></script> <script type="text/javascript" src="menudata.js"></script>
<script type="text/javascript" src="menu.js"></script> <script type="text/javascript" src="menu.js"></script>
<script type="text/javascript"> <script type="text/javascript">
@ -56,7 +56,7 @@ $(function() {
<hr> <hr>
<table class="footer1"> <table class="footer1">
<tr> <tr>
<td class="LFooter"><small>Generated by doxygen 1.9.1 on Tue Feb 21 2023</small></td> <td class="LFooter"><small>Generated by doxygen 1.8.14 on Sun Nov 21 2021</small></td>
<td class="RFooter"><a href='#pagetop'><small>Return to top of page</small></a></td> <td class="RFooter"><a href='#pagetop'><small>Return to top of page</small></a></td>
</tr> </tr>
</table> </table>

View File

@ -24,7 +24,7 @@
--> -->
<br> <br>
<body onload="javascript:toggleLevel(1)"> <body onload="javascript:toggleLevel(1)">
<!-- Generated by Doxygen 1.9.1 --> <!-- Generated by Doxygen 1.8.14 -->
<script type="text/javascript" src="menudata.js"></script> <script type="text/javascript" src="menudata.js"></script>
<script type="text/javascript" src="menu.js"></script> <script type="text/javascript" src="menu.js"></script>
<script type="text/javascript"> <script type="text/javascript">
@ -48,23 +48,23 @@ $(function() {
</div><!--header--> </div><!--header-->
<div class="contents"> <div class="contents">
<p>A small wrapper around <a class="elRef" href="../hurricane/classHurricane_1_1Library.html">Hurricane::Library</a>. <p>A small wrapper around <a class="elRef" doxygen="/dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/html/hurricane.tag:../hurricane/" href="../hurricane/classHurricane_1_1Library.html">Hurricane::Library</a>.
<a href="classCRL_1_1AllianceLibrary.html#details">More...</a></p> <a href="classCRL_1_1AllianceLibrary.html#details">More...</a></p>
<table class="memberdecls"> <table class="memberdecls">
<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-methods"></a> <tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-methods"></a>
Public Member Functions</h2></td></tr> Public Member Functions</h2></td></tr>
<tr class="memitem:ad7394ba603e21e655d4518795650f042"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classCRL_1_1AllianceLibrary.html#ad7394ba603e21e655d4518795650f042">AllianceLibrary</a> ()</td></tr> <tr class="memitem:ad7394ba603e21e655d4518795650f042"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classCRL_1_1AllianceLibrary.html#ad7394ba603e21e655d4518795650f042">AllianceLibrary</a> ()</td></tr>
<tr class="separator:ad7394ba603e21e655d4518795650f042"><td class="memSeparator" colspan="2">&#160;</td></tr> <tr class="separator:ad7394ba603e21e655d4518795650f042"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a1a0c9a0f2b74eaae859206e5338107a0"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classCRL_1_1AllianceLibrary.html#a1a0c9a0f2b74eaae859206e5338107a0">AllianceLibrary</a> (const <a class="elRef" href="../hurricane/classHurricane_1_1Name.html">Name</a> &amp;path, <a class="elRef" href="../hurricane/classHurricane_1_1Library.html">Library</a> *library=NULL)</td></tr> <tr class="memitem:a1a0c9a0f2b74eaae859206e5338107a0"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classCRL_1_1AllianceLibrary.html#a1a0c9a0f2b74eaae859206e5338107a0">AllianceLibrary</a> (const <a class="elRef" doxygen="/dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/html/hurricane.tag:../hurricane/" href="../hurricane/classHurricane_1_1Name.html">Name</a> &amp;path, <a class="elRef" doxygen="/dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/html/hurricane.tag:../hurricane/" href="../hurricane/classHurricane_1_1Library.html">Library</a> *library=NULL)</td></tr>
<tr class="separator:a1a0c9a0f2b74eaae859206e5338107a0"><td class="memSeparator" colspan="2">&#160;</td></tr> <tr class="separator:a1a0c9a0f2b74eaae859206e5338107a0"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a3be21e668a6a01085df037989eacf6f8"><td class="memItemLeft" align="right" valign="top">const <a class="elRef" href="../hurricane/classHurricane_1_1Name.html">Name</a> &amp;&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classCRL_1_1AllianceLibrary.html#a3be21e668a6a01085df037989eacf6f8">getPath</a> () const</td></tr> <tr class="memitem:a3be21e668a6a01085df037989eacf6f8"><td class="memItemLeft" align="right" valign="top">const <a class="elRef" doxygen="/dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/html/hurricane.tag:../hurricane/" href="../hurricane/classHurricane_1_1Name.html">Name</a> &amp;&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classCRL_1_1AllianceLibrary.html#a3be21e668a6a01085df037989eacf6f8">getPath</a> () const</td></tr>
<tr class="separator:a3be21e668a6a01085df037989eacf6f8"><td class="memSeparator" colspan="2">&#160;</td></tr> <tr class="separator:a3be21e668a6a01085df037989eacf6f8"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:abd54e8a070660030c6d2af8a239359b5"><td class="memItemLeft" align="right" valign="top"><a class="elRef" href="../hurricane/classHurricane_1_1Library.html">Library</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classCRL_1_1AllianceLibrary.html#abd54e8a070660030c6d2af8a239359b5">getLibrary</a> () const</td></tr> <tr class="memitem:abd54e8a070660030c6d2af8a239359b5"><td class="memItemLeft" align="right" valign="top"><a class="elRef" doxygen="/dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/html/hurricane.tag:../hurricane/" href="../hurricane/classHurricane_1_1Library.html">Library</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classCRL_1_1AllianceLibrary.html#abd54e8a070660030c6d2af8a239359b5">getLibrary</a> () const</td></tr>
<tr class="separator:abd54e8a070660030c6d2af8a239359b5"><td class="memSeparator" colspan="2">&#160;</td></tr> <tr class="separator:abd54e8a070660030c6d2af8a239359b5"><td class="memSeparator" colspan="2">&#160;</td></tr>
</table> </table>
<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2> <a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
<div class="textblock"><p>A small wrapper around <a class="elRef" href="../hurricane/classHurricane_1_1Library.html">Hurricane::Library</a>. </p> <div class="textblock"><p>A small wrapper around <a class="elRef" doxygen="/dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/html/hurricane.tag:../hurricane/" href="../hurricane/classHurricane_1_1Library.html">Hurricane::Library</a>. </p>
<p>The <a class="el" href="classCRL_1_1AllianceLibrary.html" title="A small wrapper around Hurricane::Library.">AllianceLibrary</a> simply adds the path from which the <a class="elRef" href="../hurricane/classHurricane_1_1Library.html">Hurricane::Library</a> has been loaded. </p> <p>The <a class="el" href="classCRL_1_1AllianceLibrary.html" title="A small wrapper around Hurricane::Library. ">AllianceLibrary</a> simply adds the path from which the <a class="elRef" doxygen="/dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/html/hurricane.tag:../hurricane/" href="../hurricane/classHurricane_1_1Library.html">Hurricane::Library</a> has been loaded. </p>
</div><h2 class="groupheader">Constructor &amp; Destructor Documentation</h2> </div><h2 class="groupheader">Constructor &amp; Destructor Documentation</h2>
<a id="ad7394ba603e21e655d4518795650f042"></a> <a id="ad7394ba603e21e655d4518795650f042"></a>
<h2 class="memtitle"><span class="permalink"><a href="#ad7394ba603e21e655d4518795650f042">&#9670;&nbsp;</a></span>AllianceLibrary() <span class="overload">[1/2]</span></h2> <h2 class="memtitle"><span class="permalink"><a href="#ad7394ba603e21e655d4518795650f042">&#9670;&nbsp;</a></span>AllianceLibrary() <span class="overload">[1/2]</span></h2>
@ -80,7 +80,7 @@ Public Member Functions</h2></td></tr>
</tr> </tr>
</table> </table>
</div><div class="memdoc"> </div><div class="memdoc">
<p>A new, empty, <a class="el" href="classCRL_1_1AllianceLibrary.html" title="A small wrapper around Hurricane::Library.">AllianceLibrary</a>. </p> <p>A new, empty, <a class="el" href="classCRL_1_1AllianceLibrary.html" title="A small wrapper around Hurricane::Library. ">AllianceLibrary</a>. </p>
</div> </div>
</div> </div>
@ -93,13 +93,13 @@ Public Member Functions</h2></td></tr>
<tr> <tr>
<td class="memname">CRL::AllianceLibrary::AllianceLibrary </td> <td class="memname">CRL::AllianceLibrary::AllianceLibrary </td>
<td>(</td> <td>(</td>
<td class="paramtype">const <a class="elRef" href="../hurricane/classHurricane_1_1Name.html">Name</a> &amp;&#160;</td> <td class="paramtype">const <a class="elRef" doxygen="/dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/html/hurricane.tag:../hurricane/" href="../hurricane/classHurricane_1_1Name.html">Name</a> &amp;&#160;</td>
<td class="paramname"><em>path</em>, </td> <td class="paramname"><em>path</em>, </td>
</tr> </tr>
<tr> <tr>
<td class="paramkey"></td> <td class="paramkey"></td>
<td></td> <td></td>
<td class="paramtype"><a class="elRef" href="../hurricane/classHurricane_1_1Library.html">Library</a> *&#160;</td> <td class="paramtype"><a class="elRef" doxygen="/dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/html/hurricane.tag:../hurricane/" href="../hurricane/classHurricane_1_1Library.html">Library</a> *&#160;</td>
<td class="paramname"><em>library</em> = <code>NULL</code>&#160;</td> <td class="paramname"><em>library</em> = <code>NULL</code>&#160;</td>
</tr> </tr>
<tr> <tr>
@ -109,7 +109,7 @@ Public Member Functions</h2></td></tr>
</tr> </tr>
</table> </table>
</div><div class="memdoc"> </div><div class="memdoc">
<p>A new <a class="el" href="classCRL_1_1AllianceLibrary.html" title="A small wrapper around Hurricane::Library.">AllianceLibrary</a>, with <code>path</code> positionned and possibly <code>library</code>. </p> <p>A new <a class="el" href="classCRL_1_1AllianceLibrary.html" title="A small wrapper around Hurricane::Library. ">AllianceLibrary</a>, with <code>path</code> positionned and possibly <code>library</code>. </p>
</div> </div>
</div> </div>
@ -124,7 +124,7 @@ Public Member Functions</h2></td></tr>
<td class="mlabels-left"> <td class="mlabels-left">
<table class="memname"> <table class="memname">
<tr> <tr>
<td class="memname">const <a class="elRef" href="../hurricane/classHurricane_1_1Name.html">Name</a> &amp; CRL::AllianceLibrary::getPath </td> <td class="memname">const <a class="elRef" doxygen="/dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/html/hurricane.tag:../hurricane/" href="../hurricane/classHurricane_1_1Name.html">Name</a> &amp; CRL::AllianceLibrary::getPath </td>
<td>(</td> <td>(</td>
<td class="paramname"></td><td>)</td> <td class="paramname"></td><td>)</td>
<td> const</td> <td> const</td>
@ -150,7 +150,7 @@ Public Member Functions</h2></td></tr>
<td class="mlabels-left"> <td class="mlabels-left">
<table class="memname"> <table class="memname">
<tr> <tr>
<td class="memname"><a class="elRef" href="../hurricane/classHurricane_1_1Library.html">Hurricane::Library</a> * CRL::AllianceLibrary::getLibrary </td> <td class="memname"><a class="elRef" doxygen="/dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/html/hurricane.tag:../hurricane/" href="../hurricane/classHurricane_1_1Library.html">Hurricane::Library</a> * CRL::AllianceLibrary::getLibrary </td>
<td>(</td> <td>(</td>
<td class="paramname"></td><td>)</td> <td class="paramname"></td><td>)</td>
<td> const</td> <td> const</td>
@ -175,7 +175,7 @@ Public Member Functions</h2></td></tr>
<hr> <hr>
<table class="footer1"> <table class="footer1">
<tr> <tr>
<td class="LFooter"><small>Generated by doxygen 1.9.1 on Tue Feb 21 2023</small></td> <td class="LFooter"><small>Generated by doxygen 1.8.14 on Sun Nov 21 2021</small></td>
<td class="RFooter"><a href='#pagetop'><small>Return to top of page</small></a></td> <td class="RFooter"><a href='#pagetop'><small>Return to top of page</small></a></td>
</tr> </tr>
</table> </table>

View File

@ -24,7 +24,7 @@
--> -->
<br> <br>
<body onload="javascript:toggleLevel(1)"> <body onload="javascript:toggleLevel(1)">
<!-- Generated by Doxygen 1.9.1 --> <!-- Generated by Doxygen 1.8.14 -->
<script type="text/javascript" src="menudata.js"></script> <script type="text/javascript" src="menudata.js"></script>
<script type="text/javascript" src="menu.js"></script> <script type="text/javascript" src="menu.js"></script>
<script type="text/javascript"> <script type="text/javascript">
@ -67,7 +67,7 @@ $(function() {
<hr> <hr>
<table class="footer1"> <table class="footer1">
<tr> <tr>
<td class="LFooter"><small>Generated by doxygen 1.9.1 on Tue Feb 21 2023</small></td> <td class="LFooter"><small>Generated by doxygen 1.8.14 on Sun Nov 21 2021</small></td>
<td class="RFooter"><a href='#pagetop'><small>Return to top of page</small></a></td> <td class="RFooter"><a href='#pagetop'><small>Return to top of page</small></a></td>
</tr> </tr>
</table> </table>

View File

@ -24,7 +24,7 @@
--> -->
<br> <br>
<body onload="javascript:toggleLevel(1)"> <body onload="javascript:toggleLevel(1)">
<!-- Generated by Doxygen 1.9.1 --> <!-- Generated by Doxygen 1.8.14 -->
<script type="text/javascript" src="menudata.js"></script> <script type="text/javascript" src="menudata.js"></script>
<script type="text/javascript" src="menu.js"></script> <script type="text/javascript" src="menu.js"></script>
<script type="text/javascript"> <script type="text/javascript">
@ -495,7 +495,7 @@ Public Member Functions</h2></td></tr>
<hr> <hr>
<table class="footer1"> <table class="footer1">
<tr> <tr>
<td class="LFooter"><small>Generated by doxygen 1.9.1 on Tue Feb 21 2023</small></td> <td class="LFooter"><small>Generated by doxygen 1.8.14 on Sun Nov 21 2021</small></td>
<td class="RFooter"><a href='#pagetop'><small>Return to top of page</small></a></td> <td class="RFooter"><a href='#pagetop'><small>Return to top of page</small></a></td>
</tr> </tr>
</table> </table>

View File

@ -24,7 +24,7 @@
--> -->
<br> <br>
<body onload="javascript:toggleLevel(1)"> <body onload="javascript:toggleLevel(1)">
<!-- Generated by Doxygen 1.9.1 --> <!-- Generated by Doxygen 1.8.14 -->
<script type="text/javascript" src="menudata.js"></script> <script type="text/javascript" src="menudata.js"></script>
<script type="text/javascript" src="menu.js"></script> <script type="text/javascript" src="menu.js"></script>
<script type="text/javascript"> <script type="text/javascript">
@ -60,7 +60,7 @@ $(function() {
<hr> <hr>
<table class="footer1"> <table class="footer1">
<tr> <tr>
<td class="LFooter"><small>Generated by doxygen 1.9.1 on Tue Feb 21 2023</small></td> <td class="LFooter"><small>Generated by doxygen 1.8.14 on Sun Nov 21 2021</small></td>
<td class="RFooter"><a href='#pagetop'><small>Return to top of page</small></a></td> <td class="RFooter"><a href='#pagetop'><small>Return to top of page</small></a></td>
</tr> </tr>
</table> </table>

View File

@ -24,7 +24,7 @@
--> -->
<br> <br>
<body onload="javascript:toggleLevel(1)"> <body onload="javascript:toggleLevel(1)">
<!-- Generated by Doxygen 1.9.1 --> <!-- Generated by Doxygen 1.8.14 -->
<script type="text/javascript" src="menudata.js"></script> <script type="text/javascript" src="menudata.js"></script>
<script type="text/javascript" src="menu.js"></script> <script type="text/javascript" src="menu.js"></script>
<script type="text/javascript"> <script type="text/javascript">
@ -55,7 +55,7 @@ $(function() {
<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="nested-classes"></a> <tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="nested-classes"></a>
Classes</h2></td></tr> Classes</h2></td></tr>
<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">class &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classCRL_1_1Catalog_1_1State.html">State</a></td></tr> <tr class="memitem:"><td class="memItemLeft" align="right" valign="top">class &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classCRL_1_1Catalog_1_1State.html">State</a></td></tr>
<tr class="memdesc:"><td class="mdescLeft">&#160;</td><td class="mdescRight">An entry to store the Cell <a class="el" href="classCRL_1_1Catalog_1_1State.html" title="An entry to store the Cell State in the Catalog.">State</a> in the <a class="el" href="classCRL_1_1Catalog.html" title="A Registry to store Alliance Cell metadatas.">Catalog</a>. <a href="classCRL_1_1Catalog_1_1State.html#details">More...</a><br /></td></tr> <tr class="memdesc:"><td class="mdescLeft">&#160;</td><td class="mdescRight">An entry to store the Cell <a class="el" href="classCRL_1_1Catalog_1_1State.html" title="An entry to store the Cell State in the Catalog. ">State</a> in the <a class="el" href="classCRL_1_1Catalog.html" title="A Registry to store Alliance Cell metadatas. ">Catalog</a>. <a href="classCRL_1_1Catalog_1_1State.html#details">More...</a><br /></td></tr>
<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr> <tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
</table><table class="memberdecls"> </table><table class="memberdecls">
<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-methods"></a> <tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-methods"></a>
@ -64,22 +64,22 @@ Public Member Functions</h2></td></tr>
<tr class="separator:a6682f773880c7ca16bdca79057a08e6b"><td class="memSeparator" colspan="2">&#160;</td></tr> <tr class="separator:a6682f773880c7ca16bdca79057a08e6b"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a3ad457a2bf6246c3a1d9c3a4730c2696"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classCRL_1_1Catalog.html#a3ad457a2bf6246c3a1d9c3a4730c2696">~Catalog</a> ()</td></tr> <tr class="memitem:a3ad457a2bf6246c3a1d9c3a4730c2696"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classCRL_1_1Catalog.html#a3ad457a2bf6246c3a1d9c3a4730c2696">~Catalog</a> ()</td></tr>
<tr class="separator:a3ad457a2bf6246c3a1d9c3a4730c2696"><td class="memSeparator" colspan="2">&#160;</td></tr> <tr class="separator:a3ad457a2bf6246c3a1d9c3a4730c2696"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a5b04db2b2179d70212dd1b12daa903f9"><td class="memItemLeft" align="right" valign="top"><a class="el" href="classCRL_1_1Catalog_1_1State.html">State</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classCRL_1_1Catalog.html#a5b04db2b2179d70212dd1b12daa903f9">getState</a> (const <a class="elRef" href="../hurricane/classHurricane_1_1Name.html">Name</a> &amp;name, bool add=false)</td></tr> <tr class="memitem:a5b04db2b2179d70212dd1b12daa903f9"><td class="memItemLeft" align="right" valign="top"><a class="el" href="classCRL_1_1Catalog_1_1State.html">State</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classCRL_1_1Catalog.html#a5b04db2b2179d70212dd1b12daa903f9">getState</a> (const <a class="elRef" doxygen="/dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/html/hurricane.tag:../hurricane/" href="../hurricane/classHurricane_1_1Name.html">Name</a> &amp;name, bool add=false)</td></tr>
<tr class="separator:a5b04db2b2179d70212dd1b12daa903f9"><td class="memSeparator" colspan="2">&#160;</td></tr> <tr class="separator:a5b04db2b2179d70212dd1b12daa903f9"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:afe3ea2153684ed8df029ee896cef6608"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classCRL_1_1Catalog.html#afe3ea2153684ed8df029ee896cef6608">mergeState</a> (const <a class="elRef" href="../hurricane/classHurricane_1_1Name.html">Name</a> &amp;name, const <a class="el" href="classCRL_1_1Catalog_1_1State.html">State</a> &amp;other)</td></tr> <tr class="memitem:afe3ea2153684ed8df029ee896cef6608"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classCRL_1_1Catalog.html#afe3ea2153684ed8df029ee896cef6608">mergeState</a> (const <a class="elRef" doxygen="/dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/html/hurricane.tag:../hurricane/" href="../hurricane/classHurricane_1_1Name.html">Name</a> &amp;name, const <a class="el" href="classCRL_1_1Catalog_1_1State.html">State</a> &amp;other)</td></tr>
<tr class="separator:afe3ea2153684ed8df029ee896cef6608"><td class="memSeparator" colspan="2">&#160;</td></tr> <tr class="separator:afe3ea2153684ed8df029ee896cef6608"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:ada5b55e7926764fc9c7f5b7d4e6c2cdc"><td class="memItemLeft" align="right" valign="top">bool&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classCRL_1_1Catalog.html#ada5b55e7926764fc9c7f5b7d4e6c2cdc">deleteState</a> (const <a class="elRef" href="../hurricane/classHurricane_1_1Name.html">Name</a> &amp;name)</td></tr> <tr class="memitem:ada5b55e7926764fc9c7f5b7d4e6c2cdc"><td class="memItemLeft" align="right" valign="top">bool&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classCRL_1_1Catalog.html#ada5b55e7926764fc9c7f5b7d4e6c2cdc">deleteState</a> (const <a class="elRef" doxygen="/dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/html/hurricane.tag:../hurricane/" href="../hurricane/classHurricane_1_1Name.html">Name</a> &amp;name)</td></tr>
<tr class="separator:ada5b55e7926764fc9c7f5b7d4e6c2cdc"><td class="memSeparator" colspan="2">&#160;</td></tr> <tr class="separator:ada5b55e7926764fc9c7f5b7d4e6c2cdc"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:aa40bdbaf5b64f56b085bfce72dc89fe6"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classCRL_1_1Catalog.html#aa40bdbaf5b64f56b085bfce72dc89fe6">clear</a> ()</td></tr> <tr class="memitem:aa40bdbaf5b64f56b085bfce72dc89fe6"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classCRL_1_1Catalog.html#aa40bdbaf5b64f56b085bfce72dc89fe6">clear</a> ()</td></tr>
<tr class="separator:aa40bdbaf5b64f56b085bfce72dc89fe6"><td class="memSeparator" colspan="2">&#160;</td></tr> <tr class="separator:aa40bdbaf5b64f56b085bfce72dc89fe6"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a02ae9d3636235db933a29c08329c5778"><td class="memItemLeft" align="right" valign="top">bool&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classCRL_1_1Catalog.html#a02ae9d3636235db933a29c08329c5778">loadFromFile</a> (const string &amp;path, <a class="elRef" href="../hurricane/classHurricane_1_1Library.html">Library</a> *library)</td></tr> <tr class="memitem:a02ae9d3636235db933a29c08329c5778"><td class="memItemLeft" align="right" valign="top">bool&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classCRL_1_1Catalog.html#a02ae9d3636235db933a29c08329c5778">loadFromFile</a> (const string &amp;path, <a class="elRef" doxygen="/dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/html/hurricane.tag:../hurricane/" href="../hurricane/classHurricane_1_1Library.html">Library</a> *library)</td></tr>
<tr class="separator:a02ae9d3636235db933a29c08329c5778"><td class="memSeparator" colspan="2">&#160;</td></tr> <tr class="separator:a02ae9d3636235db933a29c08329c5778"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a3e326d2515c01af4fc75e421a3b61a81"><td class="memItemLeft" align="right" valign="top">map&lt; <a class="elRef" href="../hurricane/classHurricane_1_1Name.html">Name</a>, <a class="el" href="classCRL_1_1Catalog_1_1State.html">State</a> * &gt; *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classCRL_1_1Catalog.html#a3e326d2515c01af4fc75e421a3b61a81">getStates</a> ()</td></tr> <tr class="memitem:a3e326d2515c01af4fc75e421a3b61a81"><td class="memItemLeft" align="right" valign="top">map&lt; <a class="elRef" doxygen="/dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/html/hurricane.tag:../hurricane/" href="../hurricane/classHurricane_1_1Name.html">Name</a>, <a class="el" href="classCRL_1_1Catalog_1_1State.html">State</a> * &gt; *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classCRL_1_1Catalog.html#a3e326d2515c01af4fc75e421a3b61a81">getStates</a> ()</td></tr>
<tr class="separator:a3e326d2515c01af4fc75e421a3b61a81"><td class="memSeparator" colspan="2">&#160;</td></tr> <tr class="separator:a3e326d2515c01af4fc75e421a3b61a81"><td class="memSeparator" colspan="2">&#160;</td></tr>
</table> </table>
<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2> <a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
<div class="textblock"><p>A Registry to store Alliance Cell metadatas. </p> <div class="textblock"><p>A Registry to store Alliance Cell metadatas. </p>
<p>The <a class="el" href="classCRL_1_1Catalog.html" title="A Registry to store Alliance Cell metadatas.">Catalog</a> is built from the various CATAL files from the library directories and enriched with the current state of Cell in the database. </p> <p>The <a class="el" href="classCRL_1_1Catalog.html" title="A Registry to store Alliance Cell metadatas. ">Catalog</a> is built from the various CATAL files from the library directories and enriched with the current state of Cell in the database. </p>
</div><h2 class="groupheader">Constructor &amp; Destructor Documentation</h2> </div><h2 class="groupheader">Constructor &amp; Destructor Documentation</h2>
<a id="a6682f773880c7ca16bdca79057a08e6b"></a> <a id="a6682f773880c7ca16bdca79057a08e6b"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a6682f773880c7ca16bdca79057a08e6b">&#9670;&nbsp;</a></span>Catalog()</h2> <h2 class="memtitle"><span class="permalink"><a href="#a6682f773880c7ca16bdca79057a08e6b">&#9670;&nbsp;</a></span>Catalog()</h2>
@ -103,7 +103,7 @@ Public Member Functions</h2></td></tr>
</tr> </tr>
</table> </table>
</div><div class="memdoc"> </div><div class="memdoc">
<p>A new, empty, <a class="el" href="classCRL_1_1Catalog.html" title="A Registry to store Alliance Cell metadatas.">Catalog</a>. Normally, there should only be one <a class="el" href="classCRL_1_1Catalog.html" title="A Registry to store Alliance Cell metadatas.">Catalog</a>, attribute of <a class="el" href="classCRL_1_1AllianceFramework.html" title="A Framework to work with Alliance formats.">AllianceFramework</a>. </p> <p>A new, empty, <a class="el" href="classCRL_1_1Catalog.html" title="A Registry to store Alliance Cell metadatas. ">Catalog</a>. Normally, there should only be one <a class="el" href="classCRL_1_1Catalog.html" title="A Registry to store Alliance Cell metadatas. ">Catalog</a>, attribute of <a class="el" href="classCRL_1_1AllianceFramework.html" title="A Framework to work with Alliance formats. ">AllianceFramework</a>. </p>
</div> </div>
</div> </div>
@ -121,7 +121,7 @@ Public Member Functions</h2></td></tr>
</tr> </tr>
</table> </table>
</div><div class="memdoc"> </div><div class="memdoc">
<p>Free a <a class="el" href="classCRL_1_1Catalog.html" title="A Registry to store Alliance Cell metadatas.">Catalog</a> object. </p> <p>Free a <a class="el" href="classCRL_1_1Catalog.html" title="A Registry to store Alliance Cell metadatas. ">Catalog</a> object. </p>
</div> </div>
</div> </div>
@ -135,7 +135,7 @@ Public Member Functions</h2></td></tr>
<tr> <tr>
<td class="memname"><a class="el" href="classCRL_1_1Catalog_1_1State.html">State</a> * CRL::Catalog::getState </td> <td class="memname"><a class="el" href="classCRL_1_1Catalog_1_1State.html">State</a> * CRL::Catalog::getState </td>
<td>(</td> <td>(</td>
<td class="paramtype">const <a class="elRef" href="../hurricane/classHurricane_1_1Name.html">Name</a> &amp;&#160;</td> <td class="paramtype">const <a class="elRef" doxygen="/dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/html/hurricane.tag:../hurricane/" href="../hurricane/classHurricane_1_1Name.html">Name</a> &amp;&#160;</td>
<td class="paramname"><em>name</em>, </td> <td class="paramname"><em>name</em>, </td>
</tr> </tr>
<tr> <tr>
@ -151,7 +151,7 @@ Public Member Functions</h2></td></tr>
</tr> </tr>
</table> </table>
</div><div class="memdoc"> </div><div class="memdoc">
<p><b>Returns:</b> the <a class="el" href="classCRL_1_1Catalog_1_1State.html" title="An entry to store the Cell State in the Catalog.">State</a> of the Cell named <code>name</code>. If <code>add</code> is set to <b>true</b> and the cell doesn't exist, an entry is created for it. Otherwise, NULL is returned. </p> <p><b>Returns:</b> the <a class="el" href="classCRL_1_1Catalog_1_1State.html" title="An entry to store the Cell State in the Catalog. ">State</a> of the Cell named <code>name</code>. If <code>add</code> is set to <b>true</b> and the cell doesn't exist, an entry is created for it. Otherwise, NULL is returned. </p>
</div> </div>
</div> </div>
@ -164,7 +164,7 @@ Public Member Functions</h2></td></tr>
<tr> <tr>
<td class="memname">void CRL::Catalog::mergeState </td> <td class="memname">void CRL::Catalog::mergeState </td>
<td>(</td> <td>(</td>
<td class="paramtype">const <a class="elRef" href="../hurricane/classHurricane_1_1Name.html">Name</a> &amp;&#160;</td> <td class="paramtype">const <a class="elRef" doxygen="/dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/html/hurricane.tag:../hurricane/" href="../hurricane/classHurricane_1_1Name.html">Name</a> &amp;&#160;</td>
<td class="paramname"><em>name</em>, </td> <td class="paramname"><em>name</em>, </td>
</tr> </tr>
<tr> <tr>
@ -180,7 +180,7 @@ Public Member Functions</h2></td></tr>
</tr> </tr>
</table> </table>
</div><div class="memdoc"> </div><div class="memdoc">
<p>Merge the <a class="el" href="classCRL_1_1Catalog_1_1State.html" title="An entry to store the Cell State in the Catalog.">State</a> <code>other</code> with the current one. It only fills the holes. If the <a class="el" href="classCRL_1_1Catalog_1_1State.html" title="An entry to store the Cell State in the Catalog.">State</a>'s Cell or Library is already sets, the ones from <code>other</code> are discarteds. Related to the Alliance search path policy where the first Cell found shadows any other one found later. </p> <p>Merge the <a class="el" href="classCRL_1_1Catalog_1_1State.html" title="An entry to store the Cell State in the Catalog. ">State</a> <code>other</code> with the current one. It only fills the holes. If the <a class="el" href="classCRL_1_1Catalog_1_1State.html" title="An entry to store the Cell State in the Catalog. ">State</a>'s Cell or Library is already sets, the ones from <code>other</code> are discarteds. Related to the Alliance search path policy where the first Cell found shadows any other one found later. </p>
</div> </div>
</div> </div>
@ -193,14 +193,14 @@ Public Member Functions</h2></td></tr>
<tr> <tr>
<td class="memname">bool CRL::Catalog::deleteState </td> <td class="memname">bool CRL::Catalog::deleteState </td>
<td>(</td> <td>(</td>
<td class="paramtype">const <a class="elRef" href="../hurricane/classHurricane_1_1Name.html">Name</a> &amp;&#160;</td> <td class="paramtype">const <a class="elRef" doxygen="/dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/html/hurricane.tag:../hurricane/" href="../hurricane/classHurricane_1_1Name.html">Name</a> &amp;&#160;</td>
<td class="paramname"><em>name</em></td><td>)</td> <td class="paramname"><em>name</em></td><td>)</td>
<td></td> <td></td>
</tr> </tr>
</table> </table>
</div><div class="memdoc"> </div><div class="memdoc">
<p><b>Returns:</b> <b>true</b> if an entry has been indeed deleted.</p> <p><b>Returns:</b> <b>true</b> if an entry has been indeed deleted.</p>
<p>Delete the <a class="el" href="classCRL_1_1Catalog_1_1State.html" title="An entry to store the Cell State in the Catalog.">State</a> associated with Cell <code>name</code>. </p> <p>Delete the <a class="el" href="classCRL_1_1Catalog_1_1State.html" title="An entry to store the Cell State in the Catalog. ">State</a> associated with Cell <code>name</code>. </p>
</div> </div>
</div> </div>
@ -218,7 +218,7 @@ Public Member Functions</h2></td></tr>
</tr> </tr>
</table> </table>
</div><div class="memdoc"> </div><div class="memdoc">
<p>Completly empty the <a class="el" href="classCRL_1_1Catalog.html" title="A Registry to store Alliance Cell metadatas.">Catalog</a>. </p> <p>Completly empty the <a class="el" href="classCRL_1_1Catalog.html" title="A Registry to store Alliance Cell metadatas. ">Catalog</a>. </p>
</div> </div>
</div> </div>
@ -237,7 +237,7 @@ Public Member Functions</h2></td></tr>
<tr> <tr>
<td class="paramkey"></td> <td class="paramkey"></td>
<td></td> <td></td>
<td class="paramtype"><a class="elRef" href="../hurricane/classHurricane_1_1Library.html">Library</a> *&#160;</td> <td class="paramtype"><a class="elRef" doxygen="/dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/html/hurricane.tag:../hurricane/" href="../hurricane/classHurricane_1_1Library.html">Library</a> *&#160;</td>
<td class="paramname"><em>library</em>&#160;</td> <td class="paramname"><em>library</em>&#160;</td>
</tr> </tr>
<tr> <tr>
@ -267,7 +267,7 @@ Public Member Functions</h2></td></tr>
<td class="mlabels-left"> <td class="mlabels-left">
<table class="memname"> <table class="memname">
<tr> <tr>
<td class="memname">std::map&lt; <a class="elRef" href="../hurricane/classHurricane_1_1Name.html">Hurricane::Name</a>, <a class="el" href="classCRL_1_1Catalog_1_1State.html">State</a> * &gt; * CRL::Catalog::getStates </td> <td class="memname">std::map&lt; <a class="elRef" doxygen="/dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/html/hurricane.tag:../hurricane/" href="../hurricane/classHurricane_1_1Name.html">Hurricane::Name</a>, <a class="el" href="classCRL_1_1Catalog_1_1State.html">State</a> * &gt; * CRL::Catalog::getStates </td>
<td>(</td> <td>(</td>
<td class="paramname"></td><td>)</td> <td class="paramname"></td><td>)</td>
<td></td> <td></td>
@ -292,7 +292,7 @@ Public Member Functions</h2></td></tr>
<hr> <hr>
<table class="footer1"> <table class="footer1">
<tr> <tr>
<td class="LFooter"><small>Generated by doxygen 1.9.1 on Tue Feb 21 2023</small></td> <td class="LFooter"><small>Generated by doxygen 1.8.14 on Sun Nov 21 2021</small></td>
<td class="RFooter"><a href='#pagetop'><small>Return to top of page</small></a></td> <td class="RFooter"><a href='#pagetop'><small>Return to top of page</small></a></td>
</tr> </tr>
</table> </table>

View File

@ -24,7 +24,7 @@
--> -->
<br> <br>
<body onload="javascript:toggleLevel(1)"> <body onload="javascript:toggleLevel(1)">
<!-- Generated by Doxygen 1.9.1 --> <!-- Generated by Doxygen 1.8.14 -->
<script type="text/javascript" src="menudata.js"></script> <script type="text/javascript" src="menudata.js"></script>
<script type="text/javascript" src="menu.js"></script> <script type="text/javascript" src="menu.js"></script>
<script type="text/javascript"> <script type="text/javascript">
@ -69,7 +69,7 @@ $(function() {
<hr> <hr>
<table class="footer1"> <table class="footer1">
<tr> <tr>
<td class="LFooter"><small>Generated by doxygen 1.9.1 on Tue Feb 21 2023</small></td> <td class="LFooter"><small>Generated by doxygen 1.8.14 on Sun Nov 21 2021</small></td>
<td class="RFooter"><a href='#pagetop'><small>Return to top of page</small></a></td> <td class="RFooter"><a href='#pagetop'><small>Return to top of page</small></a></td>
</tr> </tr>
</table> </table>

View File

@ -24,7 +24,7 @@
--> -->
<br> <br>
<body onload="javascript:toggleLevel(1)"> <body onload="javascript:toggleLevel(1)">
<!-- Generated by Doxygen 1.9.1 --> <!-- Generated by Doxygen 1.8.14 -->
<script type="text/javascript" src="menudata.js"></script> <script type="text/javascript" src="menudata.js"></script>
<script type="text/javascript" src="menu.js"></script> <script type="text/javascript" src="menu.js"></script>
<script type="text/javascript"> <script type="text/javascript">
@ -48,49 +48,49 @@ $(function() {
</div><!--header--> </div><!--header-->
<div class="contents"> <div class="contents">
<p>Wrapper to access a <a class="elRef" href="../hurricane/classHurricane_1_1Cell.html">Hurricane::Cell</a> <a class="el" href="classCRL_1_1Catalog_1_1State.html" title="An entry to store the Cell State in the Catalog.">Catalog::State</a>. <p>Wrapper to access a <a class="elRef" doxygen="/dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/html/hurricane.tag:../hurricane/" href="../hurricane/classHurricane_1_1Cell.html">Hurricane::Cell</a> <a class="el" href="classCRL_1_1Catalog_1_1State.html" title="An entry to store the Cell State in the Catalog. ">Catalog::State</a>.
<a href="classCRL_1_1CatalogExtension.html#details">More...</a></p> <a href="classCRL_1_1CatalogExtension.html#details">More...</a></p>
<table class="memberdecls"> <table class="memberdecls">
<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-static-methods"></a> <tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-static-methods"></a>
Static Public Member Functions</h2></td></tr> Static Public Member Functions</h2></td></tr>
<tr class="memitem:a5feda5d6fba490a71e3742361ec7b4a1"><td class="memItemLeft" align="right" valign="top">static bool&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classCRL_1_1CatalogExtension.html#a5feda5d6fba490a71e3742361ec7b4a1">isFeed</a> (const <a class="elRef" href="../hurricane/classHurricane_1_1Cell.html">Cell</a> *)</td></tr> <tr class="memitem:a5feda5d6fba490a71e3742361ec7b4a1"><td class="memItemLeft" align="right" valign="top">static bool&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classCRL_1_1CatalogExtension.html#a5feda5d6fba490a71e3742361ec7b4a1">isFeed</a> (const <a class="elRef" doxygen="/dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/html/hurricane.tag:../hurricane/" href="../hurricane/classHurricane_1_1Cell.html">Cell</a> *)</td></tr>
<tr class="separator:a5feda5d6fba490a71e3742361ec7b4a1"><td class="memSeparator" colspan="2">&#160;</td></tr> <tr class="separator:a5feda5d6fba490a71e3742361ec7b4a1"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a2695acabeac2f224fa4ac3a9563aeee9"><td class="memItemLeft" align="right" valign="top">static bool&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classCRL_1_1CatalogExtension.html#a2695acabeac2f224fa4ac3a9563aeee9">isPad</a> (const <a class="elRef" href="../hurricane/classHurricane_1_1Cell.html">Cell</a> *)</td></tr> <tr class="memitem:a2695acabeac2f224fa4ac3a9563aeee9"><td class="memItemLeft" align="right" valign="top">static bool&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classCRL_1_1CatalogExtension.html#a2695acabeac2f224fa4ac3a9563aeee9">isPad</a> (const <a class="elRef" doxygen="/dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/html/hurricane.tag:../hurricane/" href="../hurricane/classHurricane_1_1Cell.html">Cell</a> *)</td></tr>
<tr class="separator:a2695acabeac2f224fa4ac3a9563aeee9"><td class="memSeparator" colspan="2">&#160;</td></tr> <tr class="separator:a2695acabeac2f224fa4ac3a9563aeee9"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a37c8d304e7386ee31b73c826cb929e5f"><td class="memItemLeft" align="right" valign="top">static bool&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classCRL_1_1CatalogExtension.html#a37c8d304e7386ee31b73c826cb929e5f">isGds</a> (const <a class="elRef" href="../hurricane/classHurricane_1_1Cell.html">Cell</a> *)</td></tr> <tr class="memitem:a37c8d304e7386ee31b73c826cb929e5f"><td class="memItemLeft" align="right" valign="top">static bool&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classCRL_1_1CatalogExtension.html#a37c8d304e7386ee31b73c826cb929e5f">isGds</a> (const <a class="elRef" doxygen="/dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/html/hurricane.tag:../hurricane/" href="../hurricane/classHurricane_1_1Cell.html">Cell</a> *)</td></tr>
<tr class="separator:a37c8d304e7386ee31b73c826cb929e5f"><td class="memSeparator" colspan="2">&#160;</td></tr> <tr class="separator:a37c8d304e7386ee31b73c826cb929e5f"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a90e941d2349f5a0f4f7fefb41b434b0a"><td class="memItemLeft" align="right" valign="top">static bool&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classCRL_1_1CatalogExtension.html#a90e941d2349f5a0f4f7fefb41b434b0a">isDelete</a> (const <a class="elRef" href="../hurricane/classHurricane_1_1Cell.html">Cell</a> *)</td></tr> <tr class="memitem:a90e941d2349f5a0f4f7fefb41b434b0a"><td class="memItemLeft" align="right" valign="top">static bool&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classCRL_1_1CatalogExtension.html#a90e941d2349f5a0f4f7fefb41b434b0a">isDelete</a> (const <a class="elRef" doxygen="/dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/html/hurricane.tag:../hurricane/" href="../hurricane/classHurricane_1_1Cell.html">Cell</a> *)</td></tr>
<tr class="separator:a90e941d2349f5a0f4f7fefb41b434b0a"><td class="memSeparator" colspan="2">&#160;</td></tr> <tr class="separator:a90e941d2349f5a0f4f7fefb41b434b0a"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a3af53ef4a7fa512a079adbcb68677e2f"><td class="memItemLeft" align="right" valign="top">static bool&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classCRL_1_1CatalogExtension.html#a3af53ef4a7fa512a079adbcb68677e2f">isPhysical</a> (const <a class="elRef" href="../hurricane/classHurricane_1_1Cell.html">Cell</a> *)</td></tr> <tr class="memitem:a3af53ef4a7fa512a079adbcb68677e2f"><td class="memItemLeft" align="right" valign="top">static bool&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classCRL_1_1CatalogExtension.html#a3af53ef4a7fa512a079adbcb68677e2f">isPhysical</a> (const <a class="elRef" doxygen="/dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/html/hurricane.tag:../hurricane/" href="../hurricane/classHurricane_1_1Cell.html">Cell</a> *)</td></tr>
<tr class="separator:a3af53ef4a7fa512a079adbcb68677e2f"><td class="memSeparator" colspan="2">&#160;</td></tr> <tr class="separator:a3af53ef4a7fa512a079adbcb68677e2f"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a558c506a28d2230e592080dccbcca380"><td class="memItemLeft" align="right" valign="top">static bool&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classCRL_1_1CatalogExtension.html#a558c506a28d2230e592080dccbcca380">isLogical</a> (const <a class="elRef" href="../hurricane/classHurricane_1_1Cell.html">Cell</a> *)</td></tr> <tr class="memitem:a558c506a28d2230e592080dccbcca380"><td class="memItemLeft" align="right" valign="top">static bool&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classCRL_1_1CatalogExtension.html#a558c506a28d2230e592080dccbcca380">isLogical</a> (const <a class="elRef" doxygen="/dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/html/hurricane.tag:../hurricane/" href="../hurricane/classHurricane_1_1Cell.html">Cell</a> *)</td></tr>
<tr class="separator:a558c506a28d2230e592080dccbcca380"><td class="memSeparator" colspan="2">&#160;</td></tr> <tr class="separator:a558c506a28d2230e592080dccbcca380"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a9525c2253aa310a63de32caaeb694e66"><td class="memItemLeft" align="right" valign="top">static unsigned int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classCRL_1_1CatalogExtension.html#a9525c2253aa310a63de32caaeb694e66">getFlags</a> (const <a class="elRef" href="../hurricane/classHurricane_1_1Cell.html">Cell</a> *, unsigned int mask=(unsigned int) -1)</td></tr> <tr class="memitem:a9525c2253aa310a63de32caaeb694e66"><td class="memItemLeft" align="right" valign="top">static unsigned int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classCRL_1_1CatalogExtension.html#a9525c2253aa310a63de32caaeb694e66">getFlags</a> (const <a class="elRef" doxygen="/dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/html/hurricane.tag:../hurricane/" href="../hurricane/classHurricane_1_1Cell.html">Cell</a> *, unsigned int mask=(unsigned int) -1)</td></tr>
<tr class="separator:a9525c2253aa310a63de32caaeb694e66"><td class="memSeparator" colspan="2">&#160;</td></tr> <tr class="separator:a9525c2253aa310a63de32caaeb694e66"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:ab9475735032d500f4d4a8cf980864b3e"><td class="memItemLeft" align="right" valign="top">static bool&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classCRL_1_1CatalogExtension.html#ab9475735032d500f4d4a8cf980864b3e">setFlags</a> (const <a class="elRef" href="../hurricane/classHurricane_1_1Cell.html">Cell</a> *, unsigned int mask, bool value)</td></tr> <tr class="memitem:ab9475735032d500f4d4a8cf980864b3e"><td class="memItemLeft" align="right" valign="top">static bool&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classCRL_1_1CatalogExtension.html#ab9475735032d500f4d4a8cf980864b3e">setFlags</a> (const <a class="elRef" doxygen="/dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/html/hurricane.tag:../hurricane/" href="../hurricane/classHurricane_1_1Cell.html">Cell</a> *, unsigned int mask, bool value)</td></tr>
<tr class="separator:ab9475735032d500f4d4a8cf980864b3e"><td class="memSeparator" colspan="2">&#160;</td></tr> <tr class="separator:ab9475735032d500f4d4a8cf980864b3e"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:ab82e4b139ca636feaca5d97836891b68"><td class="memItemLeft" align="right" valign="top">static bool&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classCRL_1_1CatalogExtension.html#ab82e4b139ca636feaca5d97836891b68">setFeed</a> (const <a class="elRef" href="../hurricane/classHurricane_1_1Cell.html">Cell</a> *, bool value)</td></tr> <tr class="memitem:ab82e4b139ca636feaca5d97836891b68"><td class="memItemLeft" align="right" valign="top">static bool&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classCRL_1_1CatalogExtension.html#ab82e4b139ca636feaca5d97836891b68">setFeed</a> (const <a class="elRef" doxygen="/dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/html/hurricane.tag:../hurricane/" href="../hurricane/classHurricane_1_1Cell.html">Cell</a> *, bool value)</td></tr>
<tr class="separator:ab82e4b139ca636feaca5d97836891b68"><td class="memSeparator" colspan="2">&#160;</td></tr> <tr class="separator:ab82e4b139ca636feaca5d97836891b68"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:afceda0d184ed2964e160b563a216bc35"><td class="memItemLeft" align="right" valign="top">static bool&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classCRL_1_1CatalogExtension.html#afceda0d184ed2964e160b563a216bc35">setPad</a> (const <a class="elRef" href="../hurricane/classHurricane_1_1Cell.html">Cell</a> *, bool value)</td></tr> <tr class="memitem:afceda0d184ed2964e160b563a216bc35"><td class="memItemLeft" align="right" valign="top">static bool&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classCRL_1_1CatalogExtension.html#afceda0d184ed2964e160b563a216bc35">setPad</a> (const <a class="elRef" doxygen="/dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/html/hurricane.tag:../hurricane/" href="../hurricane/classHurricane_1_1Cell.html">Cell</a> *, bool value)</td></tr>
<tr class="separator:afceda0d184ed2964e160b563a216bc35"><td class="memSeparator" colspan="2">&#160;</td></tr> <tr class="separator:afceda0d184ed2964e160b563a216bc35"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a6c440bfd5ac56c9e07213c1347f0610a"><td class="memItemLeft" align="right" valign="top">static bool&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classCRL_1_1CatalogExtension.html#a6c440bfd5ac56c9e07213c1347f0610a">setGds</a> (const <a class="elRef" href="../hurricane/classHurricane_1_1Cell.html">Cell</a> *, bool value)</td></tr> <tr class="memitem:a6c440bfd5ac56c9e07213c1347f0610a"><td class="memItemLeft" align="right" valign="top">static bool&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classCRL_1_1CatalogExtension.html#a6c440bfd5ac56c9e07213c1347f0610a">setGds</a> (const <a class="elRef" doxygen="/dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/html/hurricane.tag:../hurricane/" href="../hurricane/classHurricane_1_1Cell.html">Cell</a> *, bool value)</td></tr>
<tr class="separator:a6c440bfd5ac56c9e07213c1347f0610a"><td class="memSeparator" colspan="2">&#160;</td></tr> <tr class="separator:a6c440bfd5ac56c9e07213c1347f0610a"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a8a5bdbfb8c898f8ea00c8718c6714983"><td class="memItemLeft" align="right" valign="top">static bool&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classCRL_1_1CatalogExtension.html#a8a5bdbfb8c898f8ea00c8718c6714983">setDelete</a> (const <a class="elRef" href="../hurricane/classHurricane_1_1Cell.html">Cell</a> *, bool value)</td></tr> <tr class="memitem:a8a5bdbfb8c898f8ea00c8718c6714983"><td class="memItemLeft" align="right" valign="top">static bool&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classCRL_1_1CatalogExtension.html#a8a5bdbfb8c898f8ea00c8718c6714983">setDelete</a> (const <a class="elRef" doxygen="/dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/html/hurricane.tag:../hurricane/" href="../hurricane/classHurricane_1_1Cell.html">Cell</a> *, bool value)</td></tr>
<tr class="separator:a8a5bdbfb8c898f8ea00c8718c6714983"><td class="memSeparator" colspan="2">&#160;</td></tr> <tr class="separator:a8a5bdbfb8c898f8ea00c8718c6714983"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:ae3de9795e0ddce5a767cf53d79fec077"><td class="memItemLeft" align="right" valign="top">static bool&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classCRL_1_1CatalogExtension.html#ae3de9795e0ddce5a767cf53d79fec077">setPhysical</a> (const <a class="elRef" href="../hurricane/classHurricane_1_1Cell.html">Cell</a> *, bool value)</td></tr> <tr class="memitem:ae3de9795e0ddce5a767cf53d79fec077"><td class="memItemLeft" align="right" valign="top">static bool&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classCRL_1_1CatalogExtension.html#ae3de9795e0ddce5a767cf53d79fec077">setPhysical</a> (const <a class="elRef" doxygen="/dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/html/hurricane.tag:../hurricane/" href="../hurricane/classHurricane_1_1Cell.html">Cell</a> *, bool value)</td></tr>
<tr class="separator:ae3de9795e0ddce5a767cf53d79fec077"><td class="memSeparator" colspan="2">&#160;</td></tr> <tr class="separator:ae3de9795e0ddce5a767cf53d79fec077"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a9609c756887f433fe9b250e32ff1ae0a"><td class="memItemLeft" align="right" valign="top">static bool&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classCRL_1_1CatalogExtension.html#a9609c756887f433fe9b250e32ff1ae0a">setLogical</a> (const <a class="elRef" href="../hurricane/classHurricane_1_1Cell.html">Cell</a> *, bool value)</td></tr> <tr class="memitem:a9609c756887f433fe9b250e32ff1ae0a"><td class="memItemLeft" align="right" valign="top">static bool&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classCRL_1_1CatalogExtension.html#a9609c756887f433fe9b250e32ff1ae0a">setLogical</a> (const <a class="elRef" doxygen="/dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/html/hurricane.tag:../hurricane/" href="../hurricane/classHurricane_1_1Cell.html">Cell</a> *, bool value)</td></tr>
<tr class="separator:a9609c756887f433fe9b250e32ff1ae0a"><td class="memSeparator" colspan="2">&#160;</td></tr> <tr class="separator:a9609c756887f433fe9b250e32ff1ae0a"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a6681f9fbe64998a27fe532fd3591afc7"><td class="memItemLeft" align="right" valign="top">static <a class="elRef" href="../hurricane/classHurricane_1_1Library.html">Library</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classCRL_1_1CatalogExtension.html#a6681f9fbe64998a27fe532fd3591afc7">getLibrary</a> (const <a class="elRef" href="../hurricane/classHurricane_1_1Cell.html">Cell</a> *)</td></tr> <tr class="memitem:a6681f9fbe64998a27fe532fd3591afc7"><td class="memItemLeft" align="right" valign="top">static <a class="elRef" doxygen="/dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/html/hurricane.tag:../hurricane/" href="../hurricane/classHurricane_1_1Library.html">Library</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classCRL_1_1CatalogExtension.html#a6681f9fbe64998a27fe532fd3591afc7">getLibrary</a> (const <a class="elRef" doxygen="/dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/html/hurricane.tag:../hurricane/" href="../hurricane/classHurricane_1_1Cell.html">Cell</a> *)</td></tr>
<tr class="separator:a6681f9fbe64998a27fe532fd3591afc7"><td class="memSeparator" colspan="2">&#160;</td></tr> <tr class="separator:a6681f9fbe64998a27fe532fd3591afc7"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:ae4f8d30cf08796b62422546c05526d86"><td class="memItemLeft" align="right" valign="top">static unsigned int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classCRL_1_1CatalogExtension.html#ae4f8d30cf08796b62422546c05526d86">getDepth</a> (const <a class="elRef" href="../hurricane/classHurricane_1_1Cell.html">Cell</a> *)</td></tr> <tr class="memitem:ae4f8d30cf08796b62422546c05526d86"><td class="memItemLeft" align="right" valign="top">static unsigned int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classCRL_1_1CatalogExtension.html#ae4f8d30cf08796b62422546c05526d86">getDepth</a> (const <a class="elRef" doxygen="/dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/html/hurricane.tag:../hurricane/" href="../hurricane/classHurricane_1_1Cell.html">Cell</a> *)</td></tr>
<tr class="separator:ae4f8d30cf08796b62422546c05526d86"><td class="memSeparator" colspan="2">&#160;</td></tr> <tr class="separator:ae4f8d30cf08796b62422546c05526d86"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a6ef1b96f9bbbe39e13a5aba073f2394c"><td class="memItemLeft" align="right" valign="top">static <a class="elRef" href="../hurricane/classHurricane_1_1Library.html">Library</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classCRL_1_1CatalogExtension.html#a6ef1b96f9bbbe39e13a5aba073f2394c">setLibrary</a> (const <a class="elRef" href="../hurricane/classHurricane_1_1Cell.html">Cell</a> *, <a class="elRef" href="../hurricane/classHurricane_1_1Library.html">Library</a> *library)</td></tr> <tr class="memitem:a6ef1b96f9bbbe39e13a5aba073f2394c"><td class="memItemLeft" align="right" valign="top">static <a class="elRef" doxygen="/dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/html/hurricane.tag:../hurricane/" href="../hurricane/classHurricane_1_1Library.html">Library</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classCRL_1_1CatalogExtension.html#a6ef1b96f9bbbe39e13a5aba073f2394c">setLibrary</a> (const <a class="elRef" doxygen="/dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/html/hurricane.tag:../hurricane/" href="../hurricane/classHurricane_1_1Cell.html">Cell</a> *, <a class="elRef" doxygen="/dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/html/hurricane.tag:../hurricane/" href="../hurricane/classHurricane_1_1Library.html">Library</a> *library)</td></tr>
<tr class="separator:a6ef1b96f9bbbe39e13a5aba073f2394c"><td class="memSeparator" colspan="2">&#160;</td></tr> <tr class="separator:a6ef1b96f9bbbe39e13a5aba073f2394c"><td class="memSeparator" colspan="2">&#160;</td></tr>
</table> </table>
<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2> <a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
<div class="textblock"><p>Wrapper to access a <a class="elRef" href="../hurricane/classHurricane_1_1Cell.html">Hurricane::Cell</a> <a class="el" href="classCRL_1_1Catalog_1_1State.html" title="An entry to store the Cell State in the Catalog.">Catalog::State</a>. </p> <div class="textblock"><p>Wrapper to access a <a class="elRef" doxygen="/dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/html/hurricane.tag:../hurricane/" href="../hurricane/classHurricane_1_1Cell.html">Hurricane::Cell</a> <a class="el" href="classCRL_1_1Catalog_1_1State.html" title="An entry to store the Cell State in the Catalog. ">Catalog::State</a>. </p>
<p><a class="el" href="classCRL_1_1Catalog_1_1State.html" title="An entry to store the Cell State in the Catalog.">Catalog::State</a> are stored inside the <a class="el" href="classCRL_1_1AllianceFramework.html" title="A Framework to work with Alliance formats.">AllianceFramework</a> <a class="el" href="classCRL_1_1Catalog.html" title="A Registry to store Alliance Cell metadatas.">Catalog</a> but also linked in a Property on the <a class="elRef" href="../hurricane/classHurricane_1_1Cell.html">Hurricane::Cell</a> for easier access. The <a class="el" href="classCRL_1_1CatalogExtension.html" title="Wrapper to access a Hurricane::Cell Catalog::State.">CatalogExtension</a> is a small wrapper around the Property mechanism to allow a simpler access. </p> <p><a class="el" href="classCRL_1_1Catalog_1_1State.html" title="An entry to store the Cell State in the Catalog. ">Catalog::State</a> are stored inside the <a class="el" href="classCRL_1_1AllianceFramework.html" title="A Framework to work with Alliance formats. ">AllianceFramework</a> <a class="el" href="classCRL_1_1Catalog.html" title="A Registry to store Alliance Cell metadatas. ">Catalog</a> but also linked in a Property on the <a class="elRef" doxygen="/dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/html/hurricane.tag:../hurricane/" href="../hurricane/classHurricane_1_1Cell.html">Hurricane::Cell</a> for easier access. The <a class="el" href="classCRL_1_1CatalogExtension.html" title="Wrapper to access a Hurricane::Cell Catalog::State. ">CatalogExtension</a> is a small wrapper around the Property mechanism to allow a simpler access. </p>
</div><h2 class="groupheader">Member Function Documentation</h2> </div><h2 class="groupheader">Member Function Documentation</h2>
<a id="a5feda5d6fba490a71e3742361ec7b4a1"></a> <a id="a5feda5d6fba490a71e3742361ec7b4a1"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a5feda5d6fba490a71e3742361ec7b4a1">&#9670;&nbsp;</a></span>isFeed()</h2> <h2 class="memtitle"><span class="permalink"><a href="#a5feda5d6fba490a71e3742361ec7b4a1">&#9670;&nbsp;</a></span>isFeed()</h2>
@ -104,7 +104,7 @@ Static Public Member Functions</h2></td></tr>
<tr> <tr>
<td class="memname">bool CRL::CatalogExtension::isFeed </td> <td class="memname">bool CRL::CatalogExtension::isFeed </td>
<td>(</td> <td>(</td>
<td class="paramtype">const <a class="elRef" href="../hurricane/classHurricane_1_1Cell.html">Cell</a> *&#160;</td> <td class="paramtype">const <a class="elRef" doxygen="/dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/html/hurricane.tag:../hurricane/" href="../hurricane/classHurricane_1_1Cell.html">Cell</a> *&#160;</td>
<td class="paramname"><em>cell</em></td><td>)</td> <td class="paramname"><em>cell</em></td><td>)</td>
<td></td> <td></td>
</tr> </tr>
@ -133,7 +133,7 @@ Static Public Member Functions</h2></td></tr>
<tr> <tr>
<td class="memname">bool CRL::CatalogExtension::isPad </td> <td class="memname">bool CRL::CatalogExtension::isPad </td>
<td>(</td> <td>(</td>
<td class="paramtype">const <a class="elRef" href="../hurricane/classHurricane_1_1Cell.html">Cell</a> *&#160;</td> <td class="paramtype">const <a class="elRef" doxygen="/dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/html/hurricane.tag:../hurricane/" href="../hurricane/classHurricane_1_1Cell.html">Cell</a> *&#160;</td>
<td class="paramname"><em>cell</em></td><td>)</td> <td class="paramname"><em>cell</em></td><td>)</td>
<td></td> <td></td>
</tr> </tr>
@ -162,7 +162,7 @@ Static Public Member Functions</h2></td></tr>
<tr> <tr>
<td class="memname">bool CRL::CatalogExtension::isGds </td> <td class="memname">bool CRL::CatalogExtension::isGds </td>
<td>(</td> <td>(</td>
<td class="paramtype">const <a class="elRef" href="../hurricane/classHurricane_1_1Cell.html">Cell</a> *&#160;</td> <td class="paramtype">const <a class="elRef" doxygen="/dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/html/hurricane.tag:../hurricane/" href="../hurricane/classHurricane_1_1Cell.html">Cell</a> *&#160;</td>
<td class="paramname"><em>cell</em></td><td>)</td> <td class="paramname"><em>cell</em></td><td>)</td>
<td></td> <td></td>
</tr> </tr>
@ -191,7 +191,7 @@ Static Public Member Functions</h2></td></tr>
<tr> <tr>
<td class="memname">bool CRL::CatalogExtension::isDelete </td> <td class="memname">bool CRL::CatalogExtension::isDelete </td>
<td>(</td> <td>(</td>
<td class="paramtype">const <a class="elRef" href="../hurricane/classHurricane_1_1Cell.html">Cell</a> *&#160;</td> <td class="paramtype">const <a class="elRef" doxygen="/dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/html/hurricane.tag:../hurricane/" href="../hurricane/classHurricane_1_1Cell.html">Cell</a> *&#160;</td>
<td class="paramname"><em>cell</em></td><td>)</td> <td class="paramname"><em>cell</em></td><td>)</td>
<td></td> <td></td>
</tr> </tr>
@ -220,7 +220,7 @@ Static Public Member Functions</h2></td></tr>
<tr> <tr>
<td class="memname">bool CRL::CatalogExtension::isPhysical </td> <td class="memname">bool CRL::CatalogExtension::isPhysical </td>
<td>(</td> <td>(</td>
<td class="paramtype">const <a class="elRef" href="../hurricane/classHurricane_1_1Cell.html">Cell</a> *&#160;</td> <td class="paramtype">const <a class="elRef" doxygen="/dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/html/hurricane.tag:../hurricane/" href="../hurricane/classHurricane_1_1Cell.html">Cell</a> *&#160;</td>
<td class="paramname"><em>cell</em></td><td>)</td> <td class="paramname"><em>cell</em></td><td>)</td>
<td></td> <td></td>
</tr> </tr>
@ -249,7 +249,7 @@ Static Public Member Functions</h2></td></tr>
<tr> <tr>
<td class="memname">bool CRL::CatalogExtension::isLogical </td> <td class="memname">bool CRL::CatalogExtension::isLogical </td>
<td>(</td> <td>(</td>
<td class="paramtype">const <a class="elRef" href="../hurricane/classHurricane_1_1Cell.html">Cell</a> *&#160;</td> <td class="paramtype">const <a class="elRef" doxygen="/dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/html/hurricane.tag:../hurricane/" href="../hurricane/classHurricane_1_1Cell.html">Cell</a> *&#160;</td>
<td class="paramname"><em>cell</em></td><td>)</td> <td class="paramname"><em>cell</em></td><td>)</td>
<td></td> <td></td>
</tr> </tr>
@ -278,7 +278,7 @@ Static Public Member Functions</h2></td></tr>
<tr> <tr>
<td class="memname">unsigned int CRL::CatalogExtension::getFlags </td> <td class="memname">unsigned int CRL::CatalogExtension::getFlags </td>
<td>(</td> <td>(</td>
<td class="paramtype">const <a class="elRef" href="../hurricane/classHurricane_1_1Cell.html">Cell</a> *&#160;</td> <td class="paramtype">const <a class="elRef" doxygen="/dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/html/hurricane.tag:../hurricane/" href="../hurricane/classHurricane_1_1Cell.html">Cell</a> *&#160;</td>
<td class="paramname"><em>cell</em>, </td> <td class="paramname"><em>cell</em>, </td>
</tr> </tr>
<tr> <tr>
@ -317,7 +317,7 @@ Static Public Member Functions</h2></td></tr>
<tr> <tr>
<td class="memname">bool CRL::CatalogExtension::setFlags </td> <td class="memname">bool CRL::CatalogExtension::setFlags </td>
<td>(</td> <td>(</td>
<td class="paramtype">const <a class="elRef" href="../hurricane/classHurricane_1_1Cell.html">Cell</a> *&#160;</td> <td class="paramtype">const <a class="elRef" doxygen="/dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/html/hurricane.tag:../hurricane/" href="../hurricane/classHurricane_1_1Cell.html">Cell</a> *&#160;</td>
<td class="paramname"><em>cell</em>, </td> <td class="paramname"><em>cell</em>, </td>
</tr> </tr>
<tr> <tr>
@ -363,7 +363,7 @@ Static Public Member Functions</h2></td></tr>
<tr> <tr>
<td class="memname">bool CRL::CatalogExtension::setFeed </td> <td class="memname">bool CRL::CatalogExtension::setFeed </td>
<td>(</td> <td>(</td>
<td class="paramtype">const <a class="elRef" href="../hurricane/classHurricane_1_1Cell.html">Cell</a> *&#160;</td> <td class="paramtype">const <a class="elRef" doxygen="/dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/html/hurricane.tag:../hurricane/" href="../hurricane/classHurricane_1_1Cell.html">Cell</a> *&#160;</td>
<td class="paramname"><em>cell</em>, </td> <td class="paramname"><em>cell</em>, </td>
</tr> </tr>
<tr> <tr>
@ -402,7 +402,7 @@ Static Public Member Functions</h2></td></tr>
<tr> <tr>
<td class="memname">bool CRL::CatalogExtension::setPad </td> <td class="memname">bool CRL::CatalogExtension::setPad </td>
<td>(</td> <td>(</td>
<td class="paramtype">const <a class="elRef" href="../hurricane/classHurricane_1_1Cell.html">Cell</a> *&#160;</td> <td class="paramtype">const <a class="elRef" doxygen="/dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/html/hurricane.tag:../hurricane/" href="../hurricane/classHurricane_1_1Cell.html">Cell</a> *&#160;</td>
<td class="paramname"><em>cell</em>, </td> <td class="paramname"><em>cell</em>, </td>
</tr> </tr>
<tr> <tr>
@ -441,7 +441,7 @@ Static Public Member Functions</h2></td></tr>
<tr> <tr>
<td class="memname">bool CRL::CatalogExtension::setGds </td> <td class="memname">bool CRL::CatalogExtension::setGds </td>
<td>(</td> <td>(</td>
<td class="paramtype">const <a class="elRef" href="../hurricane/classHurricane_1_1Cell.html">Cell</a> *&#160;</td> <td class="paramtype">const <a class="elRef" doxygen="/dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/html/hurricane.tag:../hurricane/" href="../hurricane/classHurricane_1_1Cell.html">Cell</a> *&#160;</td>
<td class="paramname"><em>cell</em>, </td> <td class="paramname"><em>cell</em>, </td>
</tr> </tr>
<tr> <tr>
@ -480,7 +480,7 @@ Static Public Member Functions</h2></td></tr>
<tr> <tr>
<td class="memname">bool CRL::CatalogExtension::setDelete </td> <td class="memname">bool CRL::CatalogExtension::setDelete </td>
<td>(</td> <td>(</td>
<td class="paramtype">const <a class="elRef" href="../hurricane/classHurricane_1_1Cell.html">Cell</a> *&#160;</td> <td class="paramtype">const <a class="elRef" doxygen="/dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/html/hurricane.tag:../hurricane/" href="../hurricane/classHurricane_1_1Cell.html">Cell</a> *&#160;</td>
<td class="paramname"><em>cell</em>, </td> <td class="paramname"><em>cell</em>, </td>
</tr> </tr>
<tr> <tr>
@ -519,7 +519,7 @@ Static Public Member Functions</h2></td></tr>
<tr> <tr>
<td class="memname">bool CRL::CatalogExtension::setPhysical </td> <td class="memname">bool CRL::CatalogExtension::setPhysical </td>
<td>(</td> <td>(</td>
<td class="paramtype">const <a class="elRef" href="../hurricane/classHurricane_1_1Cell.html">Cell</a> *&#160;</td> <td class="paramtype">const <a class="elRef" doxygen="/dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/html/hurricane.tag:../hurricane/" href="../hurricane/classHurricane_1_1Cell.html">Cell</a> *&#160;</td>
<td class="paramname"><em>cell</em>, </td> <td class="paramname"><em>cell</em>, </td>
</tr> </tr>
<tr> <tr>
@ -558,7 +558,7 @@ Static Public Member Functions</h2></td></tr>
<tr> <tr>
<td class="memname">bool CRL::CatalogExtension::setLogical </td> <td class="memname">bool CRL::CatalogExtension::setLogical </td>
<td>(</td> <td>(</td>
<td class="paramtype">const <a class="elRef" href="../hurricane/classHurricane_1_1Cell.html">Cell</a> *&#160;</td> <td class="paramtype">const <a class="elRef" doxygen="/dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/html/hurricane.tag:../hurricane/" href="../hurricane/classHurricane_1_1Cell.html">Cell</a> *&#160;</td>
<td class="paramname"><em>cell</em>, </td> <td class="paramname"><em>cell</em>, </td>
</tr> </tr>
<tr> <tr>
@ -595,9 +595,9 @@ Static Public Member Functions</h2></td></tr>
<td class="mlabels-left"> <td class="mlabels-left">
<table class="memname"> <table class="memname">
<tr> <tr>
<td class="memname"><a class="elRef" href="../hurricane/classHurricane_1_1Library.html">Hurricane::Library</a> * CRL::CatalogExtension::getLibrary </td> <td class="memname"><a class="elRef" doxygen="/dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/html/hurricane.tag:../hurricane/" href="../hurricane/classHurricane_1_1Library.html">Hurricane::Library</a> * CRL::CatalogExtension::getLibrary </td>
<td>(</td> <td>(</td>
<td class="paramtype">const <a class="elRef" href="../hurricane/classHurricane_1_1Cell.html">Cell</a> *&#160;</td> <td class="paramtype">const <a class="elRef" doxygen="/dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/html/hurricane.tag:../hurricane/" href="../hurricane/classHurricane_1_1Cell.html">Cell</a> *&#160;</td>
<td class="paramname"><em>cell</em></td><td>)</td> <td class="paramname"><em>cell</em></td><td>)</td>
<td></td> <td></td>
</tr> </tr>
@ -608,7 +608,7 @@ Static Public Member Functions</h2></td></tr>
</tr> </tr>
</table> </table>
</div><div class="memdoc"> </div><div class="memdoc">
<p><b>Returns:</b> the associated <a class="elRef" href="../hurricane/classHurricane_1_1Library.html">Hurricane::Library</a>. </p> <p><b>Returns:</b> the associated <a class="elRef" doxygen="/dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/html/hurricane.tag:../hurricane/" href="../hurricane/classHurricane_1_1Library.html">Hurricane::Library</a>. </p>
<p class="reference">References <a class="el" href="classCRL_1_1Catalog_1_1State.html#a89dad78f1829b1ee3177f61e2f73d6c6">CRL::Catalog::State::getLibrary()</a>.</p> <p class="reference">References <a class="el" href="classCRL_1_1Catalog_1_1State.html#a89dad78f1829b1ee3177f61e2f73d6c6">CRL::Catalog::State::getLibrary()</a>.</p>
@ -626,7 +626,7 @@ Static Public Member Functions</h2></td></tr>
<tr> <tr>
<td class="memname">unsigned int CRL::CatalogExtension::getDepth </td> <td class="memname">unsigned int CRL::CatalogExtension::getDepth </td>
<td>(</td> <td>(</td>
<td class="paramtype">const <a class="elRef" href="../hurricane/classHurricane_1_1Cell.html">Cell</a> *&#160;</td> <td class="paramtype">const <a class="elRef" doxygen="/dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/html/hurricane.tag:../hurricane/" href="../hurricane/classHurricane_1_1Cell.html">Cell</a> *&#160;</td>
<td class="paramname"><em>cell</em></td><td>)</td> <td class="paramname"><em>cell</em></td><td>)</td>
<td></td> <td></td>
</tr> </tr>
@ -653,15 +653,15 @@ Static Public Member Functions</h2></td></tr>
<td class="mlabels-left"> <td class="mlabels-left">
<table class="memname"> <table class="memname">
<tr> <tr>
<td class="memname"><a class="elRef" href="../hurricane/classHurricane_1_1Library.html">Hurricane::Library</a> * CRL::CatalogExtension::setLibrary </td> <td class="memname"><a class="elRef" doxygen="/dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/html/hurricane.tag:../hurricane/" href="../hurricane/classHurricane_1_1Library.html">Hurricane::Library</a> * CRL::CatalogExtension::setLibrary </td>
<td>(</td> <td>(</td>
<td class="paramtype">const <a class="elRef" href="../hurricane/classHurricane_1_1Cell.html">Cell</a> *&#160;</td> <td class="paramtype">const <a class="elRef" doxygen="/dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/html/hurricane.tag:../hurricane/" href="../hurricane/classHurricane_1_1Cell.html">Cell</a> *&#160;</td>
<td class="paramname"><em>cell</em>, </td> <td class="paramname"><em>cell</em>, </td>
</tr> </tr>
<tr> <tr>
<td class="paramkey"></td> <td class="paramkey"></td>
<td></td> <td></td>
<td class="paramtype"><a class="elRef" href="../hurricane/classHurricane_1_1Library.html">Hurricane::Library</a> *&#160;</td> <td class="paramtype"><a class="elRef" doxygen="/dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/html/hurricane.tag:../hurricane/" href="../hurricane/classHurricane_1_1Library.html">Hurricane::Library</a> *&#160;</td>
<td class="paramname"><em>library</em>&#160;</td> <td class="paramname"><em>library</em>&#160;</td>
</tr> </tr>
<tr> <tr>
@ -691,7 +691,7 @@ Static Public Member Functions</h2></td></tr>
<hr> <hr>
<table class="footer1"> <table class="footer1">
<tr> <tr>
<td class="LFooter"><small>Generated by doxygen 1.9.1 on Tue Feb 21 2023</small></td> <td class="LFooter"><small>Generated by doxygen 1.8.14 on Sun Nov 21 2021</small></td>
<td class="RFooter"><a href='#pagetop'><small>Return to top of page</small></a></td> <td class="RFooter"><a href='#pagetop'><small>Return to top of page</small></a></td>
</tr> </tr>
</table> </table>

View File

@ -24,7 +24,7 @@
--> -->
<br> <br>
<body onload="javascript:toggleLevel(1)"> <body onload="javascript:toggleLevel(1)">
<!-- Generated by Doxygen 1.9.1 --> <!-- Generated by Doxygen 1.8.14 -->
<script type="text/javascript" src="menudata.js"></script> <script type="text/javascript" src="menudata.js"></script>
<script type="text/javascript" src="menu.js"></script> <script type="text/javascript" src="menu.js"></script>
<script type="text/javascript"> <script type="text/javascript">
@ -83,7 +83,7 @@ $(function() {
<hr> <hr>
<table class="footer1"> <table class="footer1">
<tr> <tr>
<td class="LFooter"><small>Generated by doxygen 1.9.1 on Tue Feb 21 2023</small></td> <td class="LFooter"><small>Generated by doxygen 1.8.14 on Sun Nov 21 2021</small></td>
<td class="RFooter"><a href='#pagetop'><small>Return to top of page</small></a></td> <td class="RFooter"><a href='#pagetop'><small>Return to top of page</small></a></td>
</tr> </tr>
</table> </table>

View File

@ -24,7 +24,7 @@
--> -->
<br> <br>
<body onload="javascript:toggleLevel(1)"> <body onload="javascript:toggleLevel(1)">
<!-- Generated by Doxygen 1.9.1 --> <!-- Generated by Doxygen 1.8.14 -->
<script type="text/javascript" src="menudata.js"></script> <script type="text/javascript" src="menudata.js"></script>
<script type="text/javascript" src="menu.js"></script> <script type="text/javascript" src="menu.js"></script>
<script type="text/javascript"> <script type="text/javascript">
@ -49,12 +49,28 @@ $(function() {
</div><!--header--> </div><!--header-->
<div class="contents"> <div class="contents">
<p>An entry to store the Cell <a class="el" href="classCRL_1_1Catalog_1_1State.html" title="An entry to store the Cell State in the Catalog.">State</a> in the <a class="el" href="classCRL_1_1Catalog.html" title="A Registry to store Alliance Cell metadatas.">Catalog</a>. <p>An entry to store the Cell <a class="el" href="classCRL_1_1Catalog_1_1State.html" title="An entry to store the Cell State in the Catalog. ">State</a> in the <a class="el" href="classCRL_1_1Catalog.html" title="A Registry to store Alliance Cell metadatas. ">Catalog</a>.
<a href="classCRL_1_1Catalog_1_1State.html#details">More...</a></p> <a href="classCRL_1_1Catalog_1_1State.html#details">More...</a></p>
<table class="memberdecls"> <table class="memberdecls">
<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-types"></a> <tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-types"></a>
Public Types</h2></td></tr> Public Types</h2></td></tr>
<tr class="memitem:a625003526d38ac7500b4ad7de35e2d74"><td class="memItemLeft" align="right" valign="top">enum &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classCRL_1_1Catalog_1_1State.html#a625003526d38ac7500b4ad7de35e2d74">Flags</a> { <br /> <tr class="memitem:a625003526d38ac7500b4ad7de35e2d74"><td class="memItemLeft" align="right" valign="top">enum &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classCRL_1_1Catalog_1_1State.html#a625003526d38ac7500b4ad7de35e2d74">Flags</a> { , <br />
&#160;&#160;<a class="el" href="classCRL_1_1Catalog_1_1State.html#a625003526d38ac7500b4ad7de35e2d74a2b7599c1303429830c8d3e6b673b3cb1">Feed</a> = 1 &lt;&lt; 1,
<br />
&#160;&#160;<a class="el" href="classCRL_1_1Catalog_1_1State.html#a625003526d38ac7500b4ad7de35e2d74a2e2b8b775bb6e8d8d12500426a01e38b">Pad</a> = 1 &lt;&lt; 2,
<br />
&#160;&#160;<a class="el" href="classCRL_1_1Catalog_1_1State.html#a625003526d38ac7500b4ad7de35e2d74a98da2efe9c180f68f009836d1179cc4a">GDS</a> = 1 &lt;&lt; 3,
<br />
&#160;&#160;<a class="el" href="classCRL_1_1Catalog_1_1State.html#a625003526d38ac7500b4ad7de35e2d74ae8f1bee3750e1fa0c1d8097a28ee49da">Delete</a> = 1 &lt;&lt; 4,
<br />
&#160;&#160;<a class="el" href="classCRL_1_1Catalog_1_1State.html#a625003526d38ac7500b4ad7de35e2d74a39170df01b13e1845db6eef82cc41b33">Logical</a> = 1 &lt;&lt; 5,
<br />
&#160;&#160;<a class="el" href="classCRL_1_1Catalog_1_1State.html#a625003526d38ac7500b4ad7de35e2d74ae166fbe3aa47f42ea93b2624b2ffed7d">Physical</a> = 1 &lt;&lt; 6,
<br />
&#160;&#160;<a class="el" href="classCRL_1_1Catalog_1_1State.html#a625003526d38ac7500b4ad7de35e2d74a1f8f15ecd43109bcc463970d8acc03fd">InMemory</a> = 1 &lt;&lt; 7
, <br />
&#160;&#160;<a class="el" href="classCRL_1_1Catalog_1_1State.html#a625003526d38ac7500b4ad7de35e2d74a6b88bbc27f9989a35a1e00772e157b35">Views</a> = Physical|Logical
<br />
}</td></tr> }</td></tr>
<tr class="separator:a625003526d38ac7500b4ad7de35e2d74"><td class="memSeparator" colspan="2">&#160;</td></tr> <tr class="separator:a625003526d38ac7500b4ad7de35e2d74"><td class="memSeparator" colspan="2">&#160;</td></tr>
</table><table class="memberdecls"> </table><table class="memberdecls">
@ -92,22 +108,22 @@ Public Member Functions</h2></td></tr>
<tr class="separator:a85a091727c8e7de2b16d01088324de0d"><td class="memSeparator" colspan="2">&#160;</td></tr> <tr class="separator:a85a091727c8e7de2b16d01088324de0d"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:af41327abeb4e7646ef5cafabe8eeabd0"><td class="memItemLeft" align="right" valign="top">bool&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classCRL_1_1Catalog_1_1State.html#af41327abeb4e7646ef5cafabe8eeabd0">setLogical</a> (bool value)</td></tr> <tr class="memitem:af41327abeb4e7646ef5cafabe8eeabd0"><td class="memItemLeft" align="right" valign="top">bool&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classCRL_1_1Catalog_1_1State.html#af41327abeb4e7646ef5cafabe8eeabd0">setLogical</a> (bool value)</td></tr>
<tr class="separator:af41327abeb4e7646ef5cafabe8eeabd0"><td class="memSeparator" colspan="2">&#160;</td></tr> <tr class="separator:af41327abeb4e7646ef5cafabe8eeabd0"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a0cc5ef54176f8207ef4e723eed62c35e"><td class="memItemLeft" align="right" valign="top"><a class="elRef" href="../hurricane/classHurricane_1_1Cell.html">Cell</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classCRL_1_1Catalog_1_1State.html#a0cc5ef54176f8207ef4e723eed62c35e">getCell</a> () const</td></tr> <tr class="memitem:a0cc5ef54176f8207ef4e723eed62c35e"><td class="memItemLeft" align="right" valign="top"><a class="elRef" doxygen="/dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/html/hurricane.tag:../hurricane/" href="../hurricane/classHurricane_1_1Cell.html">Cell</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classCRL_1_1Catalog_1_1State.html#a0cc5ef54176f8207ef4e723eed62c35e">getCell</a> () const</td></tr>
<tr class="separator:a0cc5ef54176f8207ef4e723eed62c35e"><td class="memSeparator" colspan="2">&#160;</td></tr> <tr class="separator:a0cc5ef54176f8207ef4e723eed62c35e"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a89dad78f1829b1ee3177f61e2f73d6c6"><td class="memItemLeft" align="right" valign="top"><a class="elRef" href="../hurricane/classHurricane_1_1Library.html">Library</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classCRL_1_1Catalog_1_1State.html#a89dad78f1829b1ee3177f61e2f73d6c6">getLibrary</a> () const</td></tr> <tr class="memitem:a89dad78f1829b1ee3177f61e2f73d6c6"><td class="memItemLeft" align="right" valign="top"><a class="elRef" doxygen="/dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/html/hurricane.tag:../hurricane/" href="../hurricane/classHurricane_1_1Library.html">Library</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classCRL_1_1Catalog_1_1State.html#a89dad78f1829b1ee3177f61e2f73d6c6">getLibrary</a> () const</td></tr>
<tr class="separator:a89dad78f1829b1ee3177f61e2f73d6c6"><td class="memSeparator" colspan="2">&#160;</td></tr> <tr class="separator:a89dad78f1829b1ee3177f61e2f73d6c6"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a0232ad6dcfda1e2801f788deaad83e08"><td class="memItemLeft" align="right" valign="top">unsigned int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classCRL_1_1Catalog_1_1State.html#a0232ad6dcfda1e2801f788deaad83e08">getDepth</a> () const</td></tr> <tr class="memitem:a0232ad6dcfda1e2801f788deaad83e08"><td class="memItemLeft" align="right" valign="top">unsigned int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classCRL_1_1Catalog_1_1State.html#a0232ad6dcfda1e2801f788deaad83e08">getDepth</a> () const</td></tr>
<tr class="separator:a0232ad6dcfda1e2801f788deaad83e08"><td class="memSeparator" colspan="2">&#160;</td></tr> <tr class="separator:a0232ad6dcfda1e2801f788deaad83e08"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a41fde67f1b88de06cae113a0d8108f25"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classCRL_1_1Catalog_1_1State.html#a41fde67f1b88de06cae113a0d8108f25">merge</a> (const <a class="el" href="classCRL_1_1Catalog_1_1State.html">State</a> &amp;other)</td></tr> <tr class="memitem:a41fde67f1b88de06cae113a0d8108f25"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classCRL_1_1Catalog_1_1State.html#a41fde67f1b88de06cae113a0d8108f25">merge</a> (const <a class="el" href="classCRL_1_1Catalog_1_1State.html">State</a> &amp;other)</td></tr>
<tr class="separator:a41fde67f1b88de06cae113a0d8108f25"><td class="memSeparator" colspan="2">&#160;</td></tr> <tr class="separator:a41fde67f1b88de06cae113a0d8108f25"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a156714ad3fe2e5bb8ad8549d101526fe"><td class="memItemLeft" align="right" valign="top"><a class="elRef" href="../hurricane/classHurricane_1_1Cell.html">Cell</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classCRL_1_1Catalog_1_1State.html#a156714ad3fe2e5bb8ad8549d101526fe">setCell</a> (<a class="elRef" href="../hurricane/classHurricane_1_1Cell.html">Cell</a> *cell)</td></tr> <tr class="memitem:a156714ad3fe2e5bb8ad8549d101526fe"><td class="memItemLeft" align="right" valign="top"><a class="elRef" doxygen="/dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/html/hurricane.tag:../hurricane/" href="../hurricane/classHurricane_1_1Cell.html">Cell</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classCRL_1_1Catalog_1_1State.html#a156714ad3fe2e5bb8ad8549d101526fe">setCell</a> (<a class="elRef" doxygen="/dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/html/hurricane.tag:../hurricane/" href="../hurricane/classHurricane_1_1Cell.html">Cell</a> *cell)</td></tr>
<tr class="separator:a156714ad3fe2e5bb8ad8549d101526fe"><td class="memSeparator" colspan="2">&#160;</td></tr> <tr class="separator:a156714ad3fe2e5bb8ad8549d101526fe"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a821ac2ae33f0045232cab612ab12f84b"><td class="memItemLeft" align="right" valign="top"><a class="elRef" href="../hurricane/classHurricane_1_1Library.html">Library</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classCRL_1_1Catalog_1_1State.html#a821ac2ae33f0045232cab612ab12f84b">setLibrary</a> (<a class="elRef" href="../hurricane/classHurricane_1_1Library.html">Library</a> *library)</td></tr> <tr class="memitem:a821ac2ae33f0045232cab612ab12f84b"><td class="memItemLeft" align="right" valign="top"><a class="elRef" doxygen="/dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/html/hurricane.tag:../hurricane/" href="../hurricane/classHurricane_1_1Library.html">Library</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classCRL_1_1Catalog_1_1State.html#a821ac2ae33f0045232cab612ab12f84b">setLibrary</a> (<a class="elRef" doxygen="/dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/html/hurricane.tag:../hurricane/" href="../hurricane/classHurricane_1_1Library.html">Library</a> *library)</td></tr>
<tr class="separator:a821ac2ae33f0045232cab612ab12f84b"><td class="memSeparator" colspan="2">&#160;</td></tr> <tr class="separator:a821ac2ae33f0045232cab612ab12f84b"><td class="memSeparator" colspan="2">&#160;</td></tr>
</table> </table>
<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2> <a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
<div class="textblock"><p>An entry to store the Cell <a class="el" href="classCRL_1_1Catalog_1_1State.html" title="An entry to store the Cell State in the Catalog.">State</a> in the <a class="el" href="classCRL_1_1Catalog.html" title="A Registry to store Alliance Cell metadatas.">Catalog</a>. </p> <div class="textblock"><p>An entry to store the Cell <a class="el" href="classCRL_1_1Catalog_1_1State.html" title="An entry to store the Cell State in the Catalog. ">State</a> in the <a class="el" href="classCRL_1_1Catalog.html" title="A Registry to store Alliance Cell metadatas. ">Catalog</a>. </p>
<p><a class="el" href="classCRL_1_1Catalog_1_1State.html" title="An entry to store the Cell State in the Catalog.">Catalog::State</a> can be accessed through the <a class="el" href="classCRL_1_1AllianceFramework.html" title="A Framework to work with Alliance formats.">AllianceFramework</a> global <a class="el" href="classCRL_1_1Catalog.html" title="A Registry to store Alliance Cell metadatas.">Catalog</a>, or on a Cell basis, usign the <a class="el" href="classCRL_1_1CatalogExtension.html" title="Wrapper to access a Hurricane::Cell Catalog::State.">CatalogExtension</a> helper. </p> <p><a class="el" href="classCRL_1_1Catalog_1_1State.html" title="An entry to store the Cell State in the Catalog. ">Catalog::State</a> can be accessed through the <a class="el" href="classCRL_1_1AllianceFramework.html" title="A Framework to work with Alliance formats. ">AllianceFramework</a> global <a class="el" href="classCRL_1_1Catalog.html" title="A Registry to store Alliance Cell metadatas. ">Catalog</a>, or on a Cell basis, usign the <a class="el" href="classCRL_1_1CatalogExtension.html" title="Wrapper to access a Hurricane::Cell Catalog::State. ">CatalogExtension</a> helper. </p>
</div><h2 class="groupheader">Member Enumeration Documentation</h2> </div><h2 class="groupheader">Member Enumeration Documentation</h2>
<a id="a625003526d38ac7500b4ad7de35e2d74"></a> <a id="a625003526d38ac7500b4ad7de35e2d74"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a625003526d38ac7500b4ad7de35e2d74">&#9670;&nbsp;</a></span>Flags</h2> <h2 class="memtitle"><span class="permalink"><a href="#a625003526d38ac7500b4ad7de35e2d74">&#9670;&nbsp;</a></span>Flags</h2>
@ -120,21 +136,21 @@ Public Member Functions</h2></td></tr>
</tr> </tr>
</table> </table>
</div><div class="memdoc"> </div><div class="memdoc">
<p>Flags to indicates Cell <a class="el" href="classCRL_1_1Catalog_1_1State.html" title="An entry to store the Cell State in the Catalog.">State</a> (Alliance metadatas). </p> <p>Flags to indicates Cell <a class="el" href="classCRL_1_1Catalog_1_1State.html" title="An entry to store the Cell State in the Catalog. ">State</a> (Alliance metadatas). </p>
<table class="fieldtable"> <table class="fieldtable">
<tr><th colspan="2">Enumerator</th></tr><tr><td class="fieldname"><a id="a625003526d38ac7500b4ad7de35e2d74a2b7599c1303429830c8d3e6b673b3cb1"></a>Feed&#160;</td><td class="fielddoc"><p>The <a class="elRef" href="../hurricane/classHurricane_1_1Cell.html">Hurricane::Cell</a> is a feed cell. </p> <tr><th colspan="2">Enumerator</th></tr><tr><td class="fieldname"><a id="a625003526d38ac7500b4ad7de35e2d74a2b7599c1303429830c8d3e6b673b3cb1"></a>Feed&#160;</td><td class="fielddoc"><p>The <a class="elRef" doxygen="/dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/html/hurricane.tag:../hurricane/" href="../hurricane/classHurricane_1_1Cell.html">Hurricane::Cell</a> is a feed cell. </p>
</td></tr> </td></tr>
<tr><td class="fieldname"><a id="a625003526d38ac7500b4ad7de35e2d74a2e2b8b775bb6e8d8d12500426a01e38b"></a>Pad&#160;</td><td class="fielddoc"><p>The <a class="elRef" href="../hurricane/classHurricane_1_1Cell.html">Hurricane::Cell</a> is a pad cell. </p> <tr><td class="fieldname"><a id="a625003526d38ac7500b4ad7de35e2d74a2e2b8b775bb6e8d8d12500426a01e38b"></a>Pad&#160;</td><td class="fielddoc"><p>The <a class="elRef" doxygen="/dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/html/hurricane.tag:../hurricane/" href="../hurricane/classHurricane_1_1Cell.html">Hurricane::Cell</a> is a pad cell. </p>
</td></tr> </td></tr>
<tr><td class="fieldname"><a id="a625003526d38ac7500b4ad7de35e2d74a98da2efe9c180f68f009836d1179cc4a"></a>GDS&#160;</td><td class="fielddoc"><p>The <a class="elRef" href="../hurricane/classHurricane_1_1Cell.html">Hurricane::Cell</a> has a real layout (i.e. not symbolic). </p> <tr><td class="fieldname"><a id="a625003526d38ac7500b4ad7de35e2d74a98da2efe9c180f68f009836d1179cc4a"></a>GDS&#160;</td><td class="fielddoc"><p>The <a class="elRef" doxygen="/dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/html/hurricane.tag:../hurricane/" href="../hurricane/classHurricane_1_1Cell.html">Hurricane::Cell</a> has a real layout (i.e. not symbolic). </p>
</td></tr> </td></tr>
<tr><td class="fieldname"><a id="a625003526d38ac7500b4ad7de35e2d74ae8f1bee3750e1fa0c1d8097a28ee49da"></a>Delete&#160;</td><td class="fielddoc"><p>The <a class="elRef" href="../hurricane/classHurricane_1_1Cell.html">Hurricane::Cell</a> has been deleted from memory. </p> <tr><td class="fieldname"><a id="a625003526d38ac7500b4ad7de35e2d74ae8f1bee3750e1fa0c1d8097a28ee49da"></a>Delete&#160;</td><td class="fielddoc"><p>The <a class="elRef" doxygen="/dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/html/hurricane.tag:../hurricane/" href="../hurricane/classHurricane_1_1Cell.html">Hurricane::Cell</a> has been deleted from memory. </p>
</td></tr> </td></tr>
<tr><td class="fieldname"><a id="a625003526d38ac7500b4ad7de35e2d74a39170df01b13e1845db6eef82cc41b33"></a>Logical&#160;</td><td class="fielddoc"><p>The <a class="elRef" href="../hurricane/classHurricane_1_1Cell.html">Hurricane::Cell</a> have a logical (netlist) view. </p> <tr><td class="fieldname"><a id="a625003526d38ac7500b4ad7de35e2d74a39170df01b13e1845db6eef82cc41b33"></a>Logical&#160;</td><td class="fielddoc"><p>The <a class="elRef" doxygen="/dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/html/hurricane.tag:../hurricane/" href="../hurricane/classHurricane_1_1Cell.html">Hurricane::Cell</a> have a logical (netlist) view. </p>
</td></tr> </td></tr>
<tr><td class="fieldname"><a id="a625003526d38ac7500b4ad7de35e2d74ae166fbe3aa47f42ea93b2624b2ffed7d"></a>Physical&#160;</td><td class="fielddoc"><p>The <a class="elRef" href="../hurricane/classHurricane_1_1Cell.html">Hurricane::Cell</a> have a physical (layout) view. </p> <tr><td class="fieldname"><a id="a625003526d38ac7500b4ad7de35e2d74ae166fbe3aa47f42ea93b2624b2ffed7d"></a>Physical&#160;</td><td class="fielddoc"><p>The <a class="elRef" doxygen="/dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/html/hurricane.tag:../hurricane/" href="../hurricane/classHurricane_1_1Cell.html">Hurricane::Cell</a> have a physical (layout) view. </p>
</td></tr> </td></tr>
<tr><td class="fieldname"><a id="a625003526d38ac7500b4ad7de35e2d74a1f8f15ecd43109bcc463970d8acc03fd"></a>InMemory&#160;</td><td class="fielddoc"><p>The <a class="elRef" href="../hurricane/classHurricane_1_1Cell.html">Hurricane::Cell</a> has been loaded, at least partially, in memory. </p> <tr><td class="fieldname"><a id="a625003526d38ac7500b4ad7de35e2d74a1f8f15ecd43109bcc463970d8acc03fd"></a>InMemory&#160;</td><td class="fielddoc"><p>The <a class="elRef" doxygen="/dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/html/hurricane.tag:../hurricane/" href="../hurricane/classHurricane_1_1Cell.html">Hurricane::Cell</a> has been loaded, at least partially, in memory. </p>
</td></tr> </td></tr>
<tr><td class="fieldname"><a id="a625003526d38ac7500b4ad7de35e2d74a6b88bbc27f9989a35a1e00772e157b35"></a>Views&#160;</td><td class="fielddoc"><p>A composite flag to mask all the avalaible kinds of views. Currently, physical &amp; logical. </p> <tr><td class="fieldname"><a id="a625003526d38ac7500b4ad7de35e2d74a6b88bbc27f9989a35a1e00772e157b35"></a>Views&#160;</td><td class="fielddoc"><p>A composite flag to mask all the avalaible kinds of views. Currently, physical &amp; logical. </p>
</td></tr> </td></tr>
@ -165,7 +181,7 @@ Public Member Functions</h2></td></tr>
</tr> </tr>
</table> </table>
</div><div class="memdoc"> </div><div class="memdoc">
<p>A new, empty, <a class="el" href="classCRL_1_1Catalog_1_1State.html" title="An entry to store the Cell State in the Catalog.">State</a> entry. </p> <p>A new, empty, <a class="el" href="classCRL_1_1Catalog_1_1State.html" title="An entry to store the Cell State in the Catalog. ">State</a> entry. </p>
</div> </div>
</div> </div>
@ -183,7 +199,7 @@ Public Member Functions</h2></td></tr>
</tr> </tr>
</table> </table>
</div><div class="memdoc"> </div><div class="memdoc">
<p>Free a <a class="el" href="classCRL_1_1Catalog_1_1State.html" title="An entry to store the Cell State in the Catalog.">Catalog::State</a> object. </p> <p>Free a <a class="el" href="classCRL_1_1Catalog_1_1State.html" title="An entry to store the Cell State in the Catalog. ">Catalog::State</a> object. </p>
</div> </div>
</div> </div>
@ -609,7 +625,7 @@ Public Member Functions</h2></td></tr>
<td class="mlabels-left"> <td class="mlabels-left">
<table class="memname"> <table class="memname">
<tr> <tr>
<td class="memname"><a class="elRef" href="../hurricane/classHurricane_1_1Cell.html">Hurricane::Cell</a> * CRL::Catalog::State::getCell </td> <td class="memname"><a class="elRef" doxygen="/dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/html/hurricane.tag:../hurricane/" href="../hurricane/classHurricane_1_1Cell.html">Hurricane::Cell</a> * CRL::Catalog::State::getCell </td>
<td>(</td> <td>(</td>
<td class="paramname"></td><td>)</td> <td class="paramname"></td><td>)</td>
<td> const</td> <td> const</td>
@ -621,7 +637,7 @@ Public Member Functions</h2></td></tr>
</tr> </tr>
</table> </table>
</div><div class="memdoc"> </div><div class="memdoc">
<p><b>Returns:</b> the associated <a class="elRef" href="../hurricane/classHurricane_1_1Cell.html">Hurricane::Cell</a>. May be NULL if it has not been loaded yet (loading is done on demand at <a class="el" href="classCRL_1_1AllianceFramework.html" title="A Framework to work with Alliance formats.">AllianceFramework</a> level). </p> <p><b>Returns:</b> the associated <a class="elRef" doxygen="/dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/html/hurricane.tag:../hurricane/" href="../hurricane/classHurricane_1_1Cell.html">Hurricane::Cell</a>. May be NULL if it has not been loaded yet (loading is done on demand at <a class="el" href="classCRL_1_1AllianceFramework.html" title="A Framework to work with Alliance formats. ">AllianceFramework</a> level). </p>
</div> </div>
</div> </div>
@ -635,7 +651,7 @@ Public Member Functions</h2></td></tr>
<td class="mlabels-left"> <td class="mlabels-left">
<table class="memname"> <table class="memname">
<tr> <tr>
<td class="memname"><a class="elRef" href="../hurricane/classHurricane_1_1Library.html">Hurricane::Library</a> * CRL::Catalog::State::getLibrary </td> <td class="memname"><a class="elRef" doxygen="/dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/html/hurricane.tag:../hurricane/" href="../hurricane/classHurricane_1_1Library.html">Hurricane::Library</a> * CRL::Catalog::State::getLibrary </td>
<td>(</td> <td>(</td>
<td class="paramname"></td><td>)</td> <td class="paramname"></td><td>)</td>
<td> const</td> <td> const</td>
@ -647,7 +663,7 @@ Public Member Functions</h2></td></tr>
</tr> </tr>
</table> </table>
</div><div class="memdoc"> </div><div class="memdoc">
<p><b>Returns:</b> the associated <a class="elRef" href="../hurricane/classHurricane_1_1Library.html">Hurricane::Library</a>. </p> <p><b>Returns:</b> the associated <a class="elRef" doxygen="/dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/html/hurricane.tag:../hurricane/" href="../hurricane/classHurricane_1_1Library.html">Hurricane::Library</a>. </p>
<p class="reference">Referenced by <a class="el" href="classCRL_1_1CatalogExtension.html#a6681f9fbe64998a27fe532fd3591afc7">CRL::CatalogExtension::getLibrary()</a>.</p> <p class="reference">Referenced by <a class="el" href="classCRL_1_1CatalogExtension.html#a6681f9fbe64998a27fe532fd3591afc7">CRL::CatalogExtension::getLibrary()</a>.</p>
@ -704,7 +720,7 @@ Public Member Functions</h2></td></tr>
</tr> </tr>
</table> </table>
</div><div class="memdoc"> </div><div class="memdoc">
<p>Fill in the void fields of the current <a class="el" href="classCRL_1_1Catalog_1_1State.html" title="An entry to store the Cell State in the Catalog.">State</a> by those from <code>other</code>. The non-void are not overriden. Flags are merged unconditionnaly. </p> <p>Fill in the void fields of the current <a class="el" href="classCRL_1_1Catalog_1_1State.html" title="An entry to store the Cell State in the Catalog. ">State</a> by those from <code>other</code>. The non-void are not overriden. Flags are merged unconditionnaly. </p>
</div> </div>
</div> </div>
@ -715,9 +731,9 @@ Public Member Functions</h2></td></tr>
<div class="memproto"> <div class="memproto">
<table class="memname"> <table class="memname">
<tr> <tr>
<td class="memname"><a class="elRef" href="../hurricane/classHurricane_1_1Cell.html">Hurricane::Cell</a> * CRL::Catalog::State::setCell </td> <td class="memname"><a class="elRef" doxygen="/dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/html/hurricane.tag:../hurricane/" href="../hurricane/classHurricane_1_1Cell.html">Hurricane::Cell</a> * CRL::Catalog::State::setCell </td>
<td>(</td> <td>(</td>
<td class="paramtype"><a class="elRef" href="../hurricane/classHurricane_1_1Cell.html">Hurricane::Cell</a> *&#160;</td> <td class="paramtype"><a class="elRef" doxygen="/dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/html/hurricane.tag:../hurricane/" href="../hurricane/classHurricane_1_1Cell.html">Hurricane::Cell</a> *&#160;</td>
<td class="paramname"><em>cell</em></td><td>)</td> <td class="paramname"><em>cell</em></td><td>)</td>
<td></td> <td></td>
</tr> </tr>
@ -737,9 +753,9 @@ Public Member Functions</h2></td></tr>
<td class="mlabels-left"> <td class="mlabels-left">
<table class="memname"> <table class="memname">
<tr> <tr>
<td class="memname"><a class="elRef" href="../hurricane/classHurricane_1_1Library.html">Hurricane::Library</a> * CRL::Catalog::State::setLibrary </td> <td class="memname"><a class="elRef" doxygen="/dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/html/hurricane.tag:../hurricane/" href="../hurricane/classHurricane_1_1Library.html">Hurricane::Library</a> * CRL::Catalog::State::setLibrary </td>
<td>(</td> <td>(</td>
<td class="paramtype"><a class="elRef" href="../hurricane/classHurricane_1_1Library.html">Hurricane::Library</a> *&#160;</td> <td class="paramtype"><a class="elRef" doxygen="/dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/html/hurricane.tag:../hurricane/" href="../hurricane/classHurricane_1_1Library.html">Hurricane::Library</a> *&#160;</td>
<td class="paramname"><em>library</em></td><td>)</td> <td class="paramname"><em>library</em></td><td>)</td>
<td></td> <td></td>
</tr> </tr>
@ -765,7 +781,7 @@ Public Member Functions</h2></td></tr>
<hr> <hr>
<table class="footer1"> <table class="footer1">
<tr> <tr>
<td class="LFooter"><small>Generated by doxygen 1.9.1 on Tue Feb 21 2023</small></td> <td class="LFooter"><small>Generated by doxygen 1.8.14 on Sun Nov 21 2021</small></td>
<td class="RFooter"><a href='#pagetop'><small>Return to top of page</small></a></td> <td class="RFooter"><a href='#pagetop'><small>Return to top of page</small></a></td>
</tr> </tr>
</table> </table>

View File

@ -24,7 +24,7 @@
--> -->
<br> <br>
<body onload="javascript:toggleLevel(1)"> <body onload="javascript:toggleLevel(1)">
<!-- Generated by Doxygen 1.9.1 --> <!-- Generated by Doxygen 1.8.14 -->
<script type="text/javascript" src="menudata.js"></script> <script type="text/javascript" src="menudata.js"></script>
<script type="text/javascript" src="menu.js"></script> <script type="text/javascript" src="menu.js"></script>
<script type="text/javascript"> <script type="text/javascript">
@ -96,7 +96,7 @@ $(function() {
<hr> <hr>
<table class="footer1"> <table class="footer1">
<tr> <tr>
<td class="LFooter"><small>Generated by doxygen 1.9.1 on Tue Feb 21 2023</small></td> <td class="LFooter"><small>Generated by doxygen 1.8.14 on Sun Nov 21 2021</small></td>
<td class="RFooter"><a href='#pagetop'><small>Return to top of page</small></a></td> <td class="RFooter"><a href='#pagetop'><small>Return to top of page</small></a></td>
</tr> </tr>
</table> </table>

View File

@ -24,7 +24,7 @@
--> -->
<br> <br>
<body onload="javascript:toggleLevel(1)"> <body onload="javascript:toggleLevel(1)">
<!-- Generated by Doxygen 1.9.1 --> <!-- Generated by Doxygen 1.8.14 -->
<script type="text/javascript" src="menudata.js"></script> <script type="text/javascript" src="menudata.js"></script>
<script type="text/javascript" src="menu.js"></script> <script type="text/javascript" src="menu.js"></script>
<script type="text/javascript"> <script type="text/javascript">
@ -55,10 +55,10 @@ $(function() {
<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-types"></a> <tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-types"></a>
Public Types</h2></td></tr> Public Types</h2></td></tr>
<tr class="memitem:ac5692c2f5d20e892573a3d46de222aeb"><td class="memItemLeft" align="right" valign="top">enum &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classCRL_1_1Environment.html#ac5692c2f5d20e892573a3d46de222aeb">AddMode</a> { <br /> <tr class="memitem:ac5692c2f5d20e892573a3d46de222aeb"><td class="memItemLeft" align="right" valign="top">enum &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classCRL_1_1Environment.html#ac5692c2f5d20e892573a3d46de222aeb">AddMode</a> { <br />
&#160;&#160;<a class="el" href="classCRL_1_1Environment.html#ac5692c2f5d20e892573a3d46de222aeba69ce578d2eeb6a8de507920ccf673b8d">Append</a> =1 &#160;&#160;<a class="el" href="classCRL_1_1Environment.html#ac5692c2f5d20e892573a3d46de222aeba69ce578d2eeb6a8de507920ccf673b8d">Append</a> =1,
, <br /> <br />
&#160;&#160;<a class="el" href="classCRL_1_1Environment.html#ac5692c2f5d20e892573a3d46de222aeba9acc311bf991f5e62be5ea9333083fd0">Prepend</a> =2 &#160;&#160;<a class="el" href="classCRL_1_1Environment.html#ac5692c2f5d20e892573a3d46de222aeba9acc311bf991f5e62be5ea9333083fd0">Prepend</a> =2,
, <br /> <br />
&#160;&#160;<a class="el" href="classCRL_1_1Environment.html#ac5692c2f5d20e892573a3d46de222aeba61fc1f828e487ed148c456f3d37be83a">Replace</a> =3 &#160;&#160;<a class="el" href="classCRL_1_1Environment.html#ac5692c2f5d20e892573a3d46de222aeba61fc1f828e487ed148c456f3d37be83a">Replace</a> =3
<br /> <br />
}</td></tr> }</td></tr>
@ -149,7 +149,7 @@ Public Member Functions</h2></td></tr>
</table> </table>
<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2> <a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
<div class="textblock"><p>Holds all the Alliance environment variables. </p> <div class="textblock"><p>Holds all the Alliance environment variables. </p>
<p>This object is not to be used alone, but only as an attribute of <a class="el" href="classCRL_1_1AllianceFramework.html" title="A Framework to work with Alliance formats.">AllianceFramework</a>.</p> <p>This object is not to be used alone, but only as an attribute of <a class="el" href="classCRL_1_1AllianceFramework.html" title="A Framework to work with Alliance formats. ">AllianceFramework</a>.</p>
<p>Although we constantly refer of the contents of this object as <em>environement variables</em>, they may (and should) be initialized through the Coriolis Python environement loader or legacy XML parsers. </p> <p>Although we constantly refer of the contents of this object as <em>environement variables</em>, they may (and should) be initialized through the Coriolis Python environement loader or legacy XML parsers. </p>
</div><h2 class="groupheader">Member Enumeration Documentation</h2> </div><h2 class="groupheader">Member Enumeration Documentation</h2>
<a id="ac5692c2f5d20e892573a3d46de222aeb"></a> <a id="ac5692c2f5d20e892573a3d46de222aeb"></a>
@ -522,7 +522,7 @@ Public Member Functions</h2></td></tr>
</table> </table>
</div><div class="memdoc"> </div><div class="memdoc">
<p><b>Returns:</b> With the Hurricane database you cannot create physical components whithout a net. All segments used for signaling blockage area are grouped inside a unique net, which name is given by this variable.</p> <p><b>Returns:</b> With the Hurricane database you cannot create physical components whithout a net. All segments used for signaling blockage area are grouped inside a unique net, which name is given by this variable.</p>
<dl class="section user"><dt>Remark:\n Be sure to use a significant name which is not likely to collide</dt><dd>with true nets. </dd></dl> <dl class="section user"><dt>Remark: Be sure to use a significant name which is not likely to collide</dt><dd>with true nets. </dd></dl>
</div> </div>
</div> </div>
@ -998,7 +998,7 @@ Public Member Functions</h2></td></tr>
</table> </table>
</div><div class="memdoc"> </div><div class="memdoc">
<p>With the Hurricane database you cannot create physical components whithout a net. All segments used for signaling blockage area are grouped inside a unique net, which name is given by this variable.</p> <p>With the Hurricane database you cannot create physical components whithout a net. All segments used for signaling blockage area are grouped inside a unique net, which name is given by this variable.</p>
<dl class="section user"><dt>Remark:\n Be sure to use a significant name which is not likely to collide</dt><dd>with true nets. </dd></dl> <dl class="section user"><dt>Remark: Be sure to use a significant name which is not likely to collide</dt><dd>with true nets. </dd></dl>
</div> </div>
</div> </div>
@ -1136,7 +1136,7 @@ Public Member Functions</h2></td></tr>
<hr> <hr>
<table class="footer1"> <table class="footer1">
<tr> <tr>
<td class="LFooter"><small>Generated by doxygen 1.9.1 on Tue Feb 21 2023</small></td> <td class="LFooter"><small>Generated by doxygen 1.8.14 on Sun Nov 21 2021</small></td>
<td class="RFooter"><a href='#pagetop'><small>Return to top of page</small></a></td> <td class="RFooter"><a href='#pagetop'><small>Return to top of page</small></a></td>
</tr> </tr>
</table> </table>

View File

@ -24,7 +24,7 @@
--> -->
<br> <br>
<body onload="javascript:toggleLevel(1)"> <body onload="javascript:toggleLevel(1)">
<!-- Generated by Doxygen 1.9.1 --> <!-- Generated by Doxygen 1.8.14 -->
<script type="text/javascript" src="menudata.js"></script> <script type="text/javascript" src="menudata.js"></script>
<script type="text/javascript" src="menu.js"></script> <script type="text/javascript" src="menu.js"></script>
<script type="text/javascript"> <script type="text/javascript">
@ -54,7 +54,7 @@ $(function() {
<hr> <hr>
<table class="footer1"> <table class="footer1">
<tr> <tr>
<td class="LFooter"><small>Generated by doxygen 1.9.1 on Tue Feb 21 2023</small></td> <td class="LFooter"><small>Generated by doxygen 1.8.14 on Sun Nov 21 2021</small></td>
<td class="RFooter"><a href='#pagetop'><small>Return to top of page</small></a></td> <td class="RFooter"><a href='#pagetop'><small>Return to top of page</small></a></td>
</tr> </tr>
</table> </table>

View File

@ -24,7 +24,7 @@
--> -->
<br> <br>
<body onload="javascript:toggleLevel(1)"> <body onload="javascript:toggleLevel(1)">
<!-- Generated by Doxygen 1.9.1 --> <!-- Generated by Doxygen 1.8.14 -->
<script type="text/javascript" src="menudata.js"></script> <script type="text/javascript" src="menudata.js"></script>
<script type="text/javascript" src="menu.js"></script> <script type="text/javascript" src="menu.js"></script>
<script type="text/javascript"> <script type="text/javascript">
@ -55,15 +55,15 @@ $(function() {
<table class="memberdecls"> <table class="memberdecls">
<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-methods"></a> <tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-methods"></a>
Public Member Functions</h2></td></tr> Public Member Functions</h2></td></tr>
<tr class="memitem:a63941f6c930c08087935ea3e276ee9a9"><td class="memItemLeft" align="right" valign="top">virtual void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classCRL_1_1GraphicTool.html#a63941f6c930c08087935ea3e276ee9a9">addToMenu</a> (<a class="elRef" href="../viewer/classHurricane_1_1CellViewer.html">CellViewer</a> *)=0</td></tr> <tr class="memitem:a63941f6c930c08087935ea3e276ee9a9"><td class="memItemLeft" align="right" valign="top">virtual void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classCRL_1_1GraphicTool.html#a63941f6c930c08087935ea3e276ee9a9">addToMenu</a> (<a class="elRef" doxygen="/dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/viewer/html/viewer.tag:../viewer/" href="../viewer/classHurricane_1_1CellViewer.html">CellViewer</a> *)=0</td></tr>
<tr class="separator:a63941f6c930c08087935ea3e276ee9a9"><td class="memSeparator" colspan="2">&#160;</td></tr> <tr class="separator:a63941f6c930c08087935ea3e276ee9a9"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a4420ce085389f1f9111735031467848d"><td class="memItemLeft" align="right" valign="top">virtual const <a class="elRef" href="../hurricane/classHurricane_1_1Name.html">Name</a> &amp;&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classCRL_1_1GraphicTool.html#a4420ce085389f1f9111735031467848d">getName</a> () const =0</td></tr> <tr class="memitem:a4420ce085389f1f9111735031467848d"><td class="memItemLeft" align="right" valign="top">virtual const <a class="elRef" doxygen="/dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/html/hurricane.tag:../hurricane/" href="../hurricane/classHurricane_1_1Name.html">Name</a> &amp;&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classCRL_1_1GraphicTool.html#a4420ce085389f1f9111735031467848d">getName</a> () const =0</td></tr>
<tr class="separator:a4420ce085389f1f9111735031467848d"><td class="memSeparator" colspan="2">&#160;</td></tr> <tr class="separator:a4420ce085389f1f9111735031467848d"><td class="memSeparator" colspan="2">&#160;</td></tr>
</table> </table>
<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2> <a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
<div class="textblock"><p>Base Class to Hook ToolEngines into the CellViewer. </p> <div class="textblock"><p>Base Class to Hook ToolEngines into the CellViewer. </p>
<p>This class implement the graphical conterpart of a <a class="el" href="classCRL_1_1ToolEngine.html" title="Base Class of all Coriolis Tools.">ToolEngine</a>. It is designed to work with the <a class="elRef" href="../unicorn/namespaceUnicorn.html">Unicorn</a> GUI, to insert new menus and possibly define new graphical overlays (that are <em>not</em> associated to <a class="elRef" href="../hurricane/classHurricane_1_1BasicLayer.html">Hurricane::BasicLayer</a>).</p> <p>This class implement the graphical conterpart of a <a class="el" href="classCRL_1_1ToolEngine.html" title="Base Class of all Coriolis Tools. ">ToolEngine</a>. It is designed to work with the <a class="elRef" doxygen="/dsk/l1/jpc/coriolis-2.x/src/coriolis/unicorn/doc/unicorn/html/unicorn.tag:../unicorn/" href="../unicorn/namespaceUnicorn.html">Unicorn</a> GUI, to insert new menus and possibly define new graphical overlays (that are <em>not</em> associated to <a class="elRef" doxygen="/dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/html/hurricane.tag:../hurricane/" href="../hurricane/classHurricane_1_1BasicLayer.html">Hurricane::BasicLayer</a>).</p>
<p>Derived classes should provide a method that returns a new <a class="el" href="classCRL_1_1GraphicTool.html" title="Base Class to Hook ToolEngines into the CellViewer.">GraphicTool</a> to be passed to the <a class="elRef" href="../unicorn/classUnicorn_1_1UnicornGui.html#a89346bccf1908c92786987d046aa6175">Unicorn::UnicornGui::registerTool()</a> method. For our tools, we choose to systematically implement a <code>static</code> method which we name <em>grab()</em>. </p> <p>Derived classes should provide a method that returns a new <a class="el" href="classCRL_1_1GraphicTool.html" title="Base Class to Hook ToolEngines into the CellViewer. ">GraphicTool</a> to be passed to the <a class="elRef" doxygen="/dsk/l1/jpc/coriolis-2.x/src/coriolis/unicorn/doc/unicorn/html/unicorn.tag:../unicorn/" href="../unicorn/classUnicorn_1_1UnicornGui.html#a89346bccf1908c92786987d046aa6175">Unicorn::UnicornGui::registerTool()</a> method. For our tools, we choose to systematically implement a <code>static</code> method which we name <em>grab()</em>. </p>
</div><h2 class="groupheader">Member Function Documentation</h2> </div><h2 class="groupheader">Member Function Documentation</h2>
<a id="a63941f6c930c08087935ea3e276ee9a9"></a> <a id="a63941f6c930c08087935ea3e276ee9a9"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a63941f6c930c08087935ea3e276ee9a9">&#9670;&nbsp;</a></span>addToMenu()</h2> <h2 class="memtitle"><span class="permalink"><a href="#a63941f6c930c08087935ea3e276ee9a9">&#9670;&nbsp;</a></span>addToMenu()</h2>
@ -77,7 +77,7 @@ Public Member Functions</h2></td></tr>
<tr> <tr>
<td class="memname">void CRL::GraphicTool::addToMenu </td> <td class="memname">void CRL::GraphicTool::addToMenu </td>
<td>(</td> <td>(</td>
<td class="paramtype"><a class="elRef" href="../viewer/classHurricane_1_1CellViewer.html">CellViewer</a> *&#160;</td> <td class="paramtype"><a class="elRef" doxygen="/dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/viewer/html/viewer.tag:../viewer/" href="../viewer/classHurricane_1_1CellViewer.html">CellViewer</a> *&#160;</td>
<td class="paramname"><em>viewer</em></td><td>)</td> <td class="paramname"><em>viewer</em></td><td>)</td>
<td></td> <td></td>
</tr> </tr>
@ -102,7 +102,7 @@ Public Member Functions</h2></td></tr>
<td class="mlabels-left"> <td class="mlabels-left">
<table class="memname"> <table class="memname">
<tr> <tr>
<td class="memname">const <a class="elRef" href="../hurricane/classHurricane_1_1Name.html">Hurricane::Name</a> &amp; CRL::GraphicTool::getName </td> <td class="memname">const <a class="elRef" doxygen="/dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/html/hurricane.tag:../hurricane/" href="../hurricane/classHurricane_1_1Name.html">Hurricane::Name</a> &amp; CRL::GraphicTool::getName </td>
<td>(</td> <td>(</td>
<td class="paramname"></td><td>)</td> <td class="paramname"></td><td>)</td>
<td> const</td> <td> const</td>
@ -127,7 +127,7 @@ Public Member Functions</h2></td></tr>
<hr> <hr>
<table class="footer1"> <table class="footer1">
<tr> <tr>
<td class="LFooter"><small>Generated by doxygen 1.9.1 on Tue Feb 21 2023</small></td> <td class="LFooter"><small>Generated by doxygen 1.8.14 on Sun Nov 21 2021</small></td>
<td class="RFooter"><a href='#pagetop'><small>Return to top of page</small></a></td> <td class="RFooter"><a href='#pagetop'><small>Return to top of page</small></a></td>
</tr> </tr>
</table> </table>

View File

@ -24,7 +24,7 @@
--> -->
<br> <br>
<body onload="javascript:toggleLevel(1)"> <body onload="javascript:toggleLevel(1)">
<!-- Generated by Doxygen 1.9.1 --> <!-- Generated by Doxygen 1.8.14 -->
<script type="text/javascript" src="menudata.js"></script> <script type="text/javascript" src="menudata.js"></script>
<script type="text/javascript" src="menu.js"></script> <script type="text/javascript" src="menu.js"></script>
<script type="text/javascript"> <script type="text/javascript">
@ -68,7 +68,7 @@ $(function() {
<hr> <hr>
<table class="footer1"> <table class="footer1">
<tr> <tr>
<td class="LFooter"><small>Generated by doxygen 1.9.1 on Tue Feb 21 2023</small></td> <td class="LFooter"><small>Generated by doxygen 1.8.14 on Sun Nov 21 2021</small></td>
<td class="RFooter"><a href='#pagetop'><small>Return to top of page</small></a></td> <td class="RFooter"><a href='#pagetop'><small>Return to top of page</small></a></td>
</tr> </tr>
</table> </table>

View File

@ -24,7 +24,7 @@
--> -->
<br> <br>
<body onload="javascript:toggleLevel(1)"> <body onload="javascript:toggleLevel(1)">
<!-- Generated by Doxygen 1.9.1 --> <!-- Generated by Doxygen 1.8.14 -->
<script type="text/javascript" src="menudata.js"></script> <script type="text/javascript" src="menudata.js"></script>
<script type="text/javascript" src="menu.js"></script> <script type="text/javascript" src="menu.js"></script>
<script type="text/javascript"> <script type="text/javascript">
@ -58,26 +58,26 @@ Public Member Functions</h2></td></tr>
<tr class="separator:a4726a734f9aff09873c4034e5169a93a"><td class="memSeparator" colspan="2">&#160;</td></tr> <tr class="separator:a4726a734f9aff09873c4034e5169a93a"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a210f2ca35bdb8c8e0ccb3a671659554e"><td class="memItemLeft" align="right" valign="top"><a class="el" href="classCRL_1_1RoutingGauge.html">RoutingGauge</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classCRL_1_1RoutingGauge.html#a210f2ca35bdb8c8e0ccb3a671659554e">getClone</a> () const</td></tr> <tr class="memitem:a210f2ca35bdb8c8e0ccb3a671659554e"><td class="memItemLeft" align="right" valign="top"><a class="el" href="classCRL_1_1RoutingGauge.html">RoutingGauge</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classCRL_1_1RoutingGauge.html#a210f2ca35bdb8c8e0ccb3a671659554e">getClone</a> () const</td></tr>
<tr class="separator:a210f2ca35bdb8c8e0ccb3a671659554e"><td class="memSeparator" colspan="2">&#160;</td></tr> <tr class="separator:a210f2ca35bdb8c8e0ccb3a671659554e"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a9a8eb201ffaca26bb563f7a34846c0c4"><td class="memItemLeft" align="right" valign="top">const <a class="elRef" href="../hurricane/classHurricane_1_1Name.html">Name</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classCRL_1_1RoutingGauge.html#a9a8eb201ffaca26bb563f7a34846c0c4">getName</a> () const</td></tr> <tr class="memitem:a9a8eb201ffaca26bb563f7a34846c0c4"><td class="memItemLeft" align="right" valign="top">const <a class="elRef" doxygen="/dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/html/hurricane.tag:../hurricane/" href="../hurricane/classHurricane_1_1Name.html">Name</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classCRL_1_1RoutingGauge.html#a9a8eb201ffaca26bb563f7a34846c0c4">getName</a> () const</td></tr>
<tr class="separator:a9a8eb201ffaca26bb563f7a34846c0c4"><td class="memSeparator" colspan="2">&#160;</td></tr> <tr class="separator:a9a8eb201ffaca26bb563f7a34846c0c4"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a34cb010c6d36875f4890bddc78fb8861"><td class="memItemLeft" align="right" valign="top"><a class="elRef" href="../hurricane/classHurricane_1_1Technology.html">Technology</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classCRL_1_1RoutingGauge.html#a34cb010c6d36875f4890bddc78fb8861">getTechnology</a> () const</td></tr> <tr class="memitem:a34cb010c6d36875f4890bddc78fb8861"><td class="memItemLeft" align="right" valign="top"><a class="elRef" doxygen="/dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/html/hurricane.tag:../hurricane/" href="../hurricane/classHurricane_1_1Technology.html">Technology</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classCRL_1_1RoutingGauge.html#a34cb010c6d36875f4890bddc78fb8861">getTechnology</a> () const</td></tr>
<tr class="separator:a34cb010c6d36875f4890bddc78fb8861"><td class="memSeparator" colspan="2">&#160;</td></tr> <tr class="separator:a34cb010c6d36875f4890bddc78fb8861"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:aed316848ee74c270bf117562e8d5faa0"><td class="memItemLeft" align="right" valign="top">size_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classCRL_1_1RoutingGauge.html#aed316848ee74c270bf117562e8d5faa0">getDepth</a> () const</td></tr> <tr class="memitem:aed316848ee74c270bf117562e8d5faa0"><td class="memItemLeft" align="right" valign="top">size_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classCRL_1_1RoutingGauge.html#aed316848ee74c270bf117562e8d5faa0">getDepth</a> () const</td></tr>
<tr class="separator:aed316848ee74c270bf117562e8d5faa0"><td class="memSeparator" colspan="2">&#160;</td></tr> <tr class="separator:aed316848ee74c270bf117562e8d5faa0"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:aa0f0e65f45814ba0104daafbc271a12d"><td class="memItemLeft" align="right" valign="top"><a class="el" href="classCRL_1_1RoutingLayerGauge.html">RoutingLayerGauge</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classCRL_1_1RoutingGauge.html#aa0f0e65f45814ba0104daafbc271a12d">getLayerGauge</a> (const <a class="elRef" href="../hurricane/classHurricane_1_1Layer.html">Layer</a> *) const</td></tr> <tr class="memitem:aa0f0e65f45814ba0104daafbc271a12d"><td class="memItemLeft" align="right" valign="top"><a class="el" href="classCRL_1_1RoutingLayerGauge.html">RoutingLayerGauge</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classCRL_1_1RoutingGauge.html#aa0f0e65f45814ba0104daafbc271a12d">getLayerGauge</a> (const <a class="elRef" doxygen="/dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/html/hurricane.tag:../hurricane/" href="../hurricane/classHurricane_1_1Layer.html">Layer</a> *) const</td></tr>
<tr class="separator:aa0f0e65f45814ba0104daafbc271a12d"><td class="memSeparator" colspan="2">&#160;</td></tr> <tr class="separator:aa0f0e65f45814ba0104daafbc271a12d"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:ac429c6ad1b2af7c588c60eff35c2d02e"><td class="memItemLeft" align="right" valign="top">size_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classCRL_1_1RoutingGauge.html#ac429c6ad1b2af7c588c60eff35c2d02e">getLayerDepth</a> (const <a class="elRef" href="../hurricane/classHurricane_1_1Layer.html">Layer</a> *) const</td></tr> <tr class="memitem:ac429c6ad1b2af7c588c60eff35c2d02e"><td class="memItemLeft" align="right" valign="top">size_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classCRL_1_1RoutingGauge.html#ac429c6ad1b2af7c588c60eff35c2d02e">getLayerDepth</a> (const <a class="elRef" doxygen="/dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/html/hurricane.tag:../hurricane/" href="../hurricane/classHurricane_1_1Layer.html">Layer</a> *) const</td></tr>
<tr class="separator:ac429c6ad1b2af7c588c60eff35c2d02e"><td class="memSeparator" colspan="2">&#160;</td></tr> <tr class="separator:ac429c6ad1b2af7c588c60eff35c2d02e"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:ac553c4dc3f51576a3128ad42d5a006b2"><td class="memItemLeft" align="right" valign="top">unsigned int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classCRL_1_1RoutingGauge.html#ac553c4dc3f51576a3128ad42d5a006b2">getLayerDirection</a> (const <a class="elRef" href="../hurricane/classHurricane_1_1Layer.html">Layer</a> *) const</td></tr> <tr class="memitem:ac553c4dc3f51576a3128ad42d5a006b2"><td class="memItemLeft" align="right" valign="top">unsigned int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classCRL_1_1RoutingGauge.html#ac553c4dc3f51576a3128ad42d5a006b2">getLayerDirection</a> (const <a class="elRef" doxygen="/dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/html/hurricane.tag:../hurricane/" href="../hurricane/classHurricane_1_1Layer.html">Layer</a> *) const</td></tr>
<tr class="separator:ac553c4dc3f51576a3128ad42d5a006b2"><td class="memSeparator" colspan="2">&#160;</td></tr> <tr class="separator:ac553c4dc3f51576a3128ad42d5a006b2"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a1b6d28bbee28db727ffe13e6205dbae8"><td class="memItemLeft" align="right" valign="top"><a class="el" href="classCRL_1_1RoutingLayerGauge.html">RoutingLayerGauge</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classCRL_1_1RoutingGauge.html#a1b6d28bbee28db727ffe13e6205dbae8">getLayerGauge</a> (size_t depth) const</td></tr> <tr class="memitem:a1b6d28bbee28db727ffe13e6205dbae8"><td class="memItemLeft" align="right" valign="top"><a class="el" href="classCRL_1_1RoutingLayerGauge.html">RoutingLayerGauge</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classCRL_1_1RoutingGauge.html#a1b6d28bbee28db727ffe13e6205dbae8">getLayerGauge</a> (size_t depth) const</td></tr>
<tr class="separator:a1b6d28bbee28db727ffe13e6205dbae8"><td class="memSeparator" colspan="2">&#160;</td></tr> <tr class="separator:a1b6d28bbee28db727ffe13e6205dbae8"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a6d6c1951c8728886d3fb702891685b94"><td class="memItemLeft" align="right" valign="top">const <a class="elRef" href="../hurricane/classHurricane_1_1Layer.html">Layer</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classCRL_1_1RoutingGauge.html#a6d6c1951c8728886d3fb702891685b94">getRoutingLayer</a> (size_t depth) const</td></tr>
<tr class="separator:a6d6c1951c8728886d3fb702891685b94"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a4b603c0fd5f21db1c93d8a747ec1f4ba"><td class="memItemLeft" align="right" valign="top"><a class="elRef" href="../hurricane/classHurricane_1_1Layer.html">Layer</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classCRL_1_1RoutingGauge.html#a4b603c0fd5f21db1c93d8a747ec1f4ba">getContactLayer</a> (size_t depth) const</td></tr>
<tr class="separator:a4b603c0fd5f21db1c93d8a747ec1f4ba"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:ab237249b41f605947765118cd1c59635"><td class="memItemLeft" align="right" valign="top">unsigned int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classCRL_1_1RoutingGauge.html#ab237249b41f605947765118cd1c59635">getLayerDirection</a> (size_t depth) const</td></tr> <tr class="memitem:ab237249b41f605947765118cd1c59635"><td class="memItemLeft" align="right" valign="top">unsigned int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classCRL_1_1RoutingGauge.html#ab237249b41f605947765118cd1c59635">getLayerDirection</a> (size_t depth) const</td></tr>
<tr class="separator:ab237249b41f605947765118cd1c59635"><td class="memSeparator" colspan="2">&#160;</td></tr> <tr class="separator:ab237249b41f605947765118cd1c59635"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a6d6c1951c8728886d3fb702891685b94"><td class="memItemLeft" align="right" valign="top">const <a class="elRef" doxygen="/dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/html/hurricane.tag:../hurricane/" href="../hurricane/classHurricane_1_1Layer.html">Layer</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classCRL_1_1RoutingGauge.html#a6d6c1951c8728886d3fb702891685b94">getRoutingLayer</a> (size_t depth) const</td></tr>
<tr class="separator:a6d6c1951c8728886d3fb702891685b94"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a4b603c0fd5f21db1c93d8a747ec1f4ba"><td class="memItemLeft" align="right" valign="top"><a class="elRef" doxygen="/dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/html/hurricane.tag:../hurricane/" href="../hurricane/classHurricane_1_1Layer.html">Layer</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classCRL_1_1RoutingGauge.html#a4b603c0fd5f21db1c93d8a747ec1f4ba">getContactLayer</a> (size_t depth) const</td></tr>
<tr class="separator:a4b603c0fd5f21db1c93d8a747ec1f4ba"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:ae8cebef061519fb2df94e3a9dcf09e6e"><td class="memItemLeft" align="right" valign="top">const vector&lt; <a class="el" href="classCRL_1_1RoutingLayerGauge.html">RoutingLayerGauge</a> * &gt; &amp;&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classCRL_1_1RoutingGauge.html#ae8cebef061519fb2df94e3a9dcf09e6e">getLayerGauges</a> () const</td></tr> <tr class="memitem:ae8cebef061519fb2df94e3a9dcf09e6e"><td class="memItemLeft" align="right" valign="top">const vector&lt; <a class="el" href="classCRL_1_1RoutingLayerGauge.html">RoutingLayerGauge</a> * &gt; &amp;&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classCRL_1_1RoutingGauge.html#ae8cebef061519fb2df94e3a9dcf09e6e">getLayerGauges</a> () const</td></tr>
<tr class="separator:ae8cebef061519fb2df94e3a9dcf09e6e"><td class="memSeparator" colspan="2">&#160;</td></tr> <tr class="separator:ae8cebef061519fb2df94e3a9dcf09e6e"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a32313fbc68080e0b7e03b3e06dc1d9c5"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classCRL_1_1RoutingGauge.html#a32313fbc68080e0b7e03b3e06dc1d9c5">addLayerGauge</a> (<a class="el" href="classCRL_1_1RoutingLayerGauge.html">RoutingLayerGauge</a> *layerGauge)</td></tr> <tr class="memitem:a32313fbc68080e0b7e03b3e06dc1d9c5"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classCRL_1_1RoutingGauge.html#a32313fbc68080e0b7e03b3e06dc1d9c5">addLayerGauge</a> (<a class="el" href="classCRL_1_1RoutingLayerGauge.html">RoutingLayerGauge</a> *layerGauge)</td></tr>
@ -174,7 +174,7 @@ Static Public Member Functions</h2></td></tr>
<td class="mlabels-left"> <td class="mlabels-left">
<table class="memname"> <table class="memname">
<tr> <tr>
<td class="memname">const <a class="elRef" href="../hurricane/classHurricane_1_1Name.html">Name</a> CRL::RoutingGauge::getName </td> <td class="memname">const <a class="elRef" doxygen="/dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/html/hurricane.tag:../hurricane/" href="../hurricane/classHurricane_1_1Name.html">Name</a> CRL::RoutingGauge::getName </td>
<td>(</td> <td>(</td>
<td class="paramname"></td><td>)</td> <td class="paramname"></td><td>)</td>
<td> const</td> <td> const</td>
@ -200,7 +200,7 @@ Static Public Member Functions</h2></td></tr>
<td class="mlabels-left"> <td class="mlabels-left">
<table class="memname"> <table class="memname">
<tr> <tr>
<td class="memname"><a class="elRef" href="../hurricane/classHurricane_1_1Technology.html">Hurricane::Technology</a> * CRL::RoutingGauge::getTechnology </td> <td class="memname"><a class="elRef" doxygen="/dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/html/hurricane.tag:../hurricane/" href="../hurricane/classHurricane_1_1Technology.html">Hurricane::Technology</a> * CRL::RoutingGauge::getTechnology </td>
<td>(</td> <td>(</td>
<td class="paramname"></td><td>)</td> <td class="paramname"></td><td>)</td>
<td> const</td> <td> const</td>
@ -251,13 +251,13 @@ Static Public Member Functions</h2></td></tr>
<tr> <tr>
<td class="memname"><a class="el" href="classCRL_1_1RoutingLayerGauge.html">RoutingLayerGauge</a> * CRL::RoutingGauge::getLayerGauge </td> <td class="memname"><a class="el" href="classCRL_1_1RoutingLayerGauge.html">RoutingLayerGauge</a> * CRL::RoutingGauge::getLayerGauge </td>
<td>(</td> <td>(</td>
<td class="paramtype">const <a class="elRef" href="../hurricane/classHurricane_1_1Layer.html">Layer</a> *&#160;</td> <td class="paramtype">const <a class="elRef" doxygen="/dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/html/hurricane.tag:../hurricane/" href="../hurricane/classHurricane_1_1Layer.html">Layer</a> *&#160;</td>
<td class="paramname"><em>layer</em></td><td>)</td> <td class="paramname"><em>layer</em></td><td>)</td>
<td> const</td> <td> const</td>
</tr> </tr>
</table> </table>
</div><div class="memdoc"> </div><div class="memdoc">
<p><b>Returns:</b> the <a class="el" href="classCRL_1_1RoutingLayerGauge.html" title="Gauge of a Layer for the detailed routing.">RoutingLayerGauge</a> associated with <code>layer</code>. NULL if <code>layer</code> is not managed by the gauge. </p> <p><b>Returns:</b> the <a class="el" href="classCRL_1_1RoutingLayerGauge.html" title="Gauge of a Layer for the detailed routing. ">RoutingLayerGauge</a> associated with <code>layer</code>. NULL if <code>layer</code> is not managed by the gauge. </p>
<p class="reference">Referenced by <a class="el" href="classCRL_1_1RoutingGauge.html#ab237249b41f605947765118cd1c59635">getLayerDirection()</a>.</p> <p class="reference">Referenced by <a class="el" href="classCRL_1_1RoutingGauge.html#ab237249b41f605947765118cd1c59635">getLayerDirection()</a>.</p>
@ -272,7 +272,7 @@ Static Public Member Functions</h2></td></tr>
<tr> <tr>
<td class="memname">size_t CRL::RoutingGauge::getLayerDepth </td> <td class="memname">size_t CRL::RoutingGauge::getLayerDepth </td>
<td>(</td> <td>(</td>
<td class="paramtype">const <a class="elRef" href="../hurricane/classHurricane_1_1Layer.html">Layer</a> *&#160;</td> <td class="paramtype">const <a class="elRef" doxygen="/dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/html/hurricane.tag:../hurricane/" href="../hurricane/classHurricane_1_1Layer.html">Layer</a> *&#160;</td>
<td class="paramname"><em>layer</em></td><td>)</td> <td class="paramname"><em>layer</em></td><td>)</td>
<td> const</td> <td> const</td>
</tr> </tr>
@ -291,7 +291,7 @@ Static Public Member Functions</h2></td></tr>
<tr> <tr>
<td class="memname">unsigned int CRL::RoutingGauge::getLayerDirection </td> <td class="memname">unsigned int CRL::RoutingGauge::getLayerDirection </td>
<td>(</td> <td>(</td>
<td class="paramtype">const <a class="elRef" href="../hurricane/classHurricane_1_1Layer.html">Layer</a> *&#160;</td> <td class="paramtype">const <a class="elRef" doxygen="/dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/html/hurricane.tag:../hurricane/" href="../hurricane/classHurricane_1_1Layer.html">Layer</a> *&#160;</td>
<td class="paramname"><em>layer</em></td><td>)</td> <td class="paramname"><em>layer</em></td><td>)</td>
<td> const</td> <td> const</td>
</tr> </tr>
@ -316,45 +316,7 @@ Static Public Member Functions</h2></td></tr>
</tr> </tr>
</table> </table>
</div><div class="memdoc"> </div><div class="memdoc">
<p><b>Returns:</b> the <a class="el" href="classCRL_1_1RoutingLayerGauge.html" title="Gauge of a Layer for the detailed routing.">RoutingLayerGauge</a> at position <code>depth</code>. </p> <p><b>Returns:</b> the <a class="el" href="classCRL_1_1RoutingLayerGauge.html" title="Gauge of a Layer for the detailed routing. ">RoutingLayerGauge</a> at position <code>depth</code>. </p>
</div>
</div>
<a id="a6d6c1951c8728886d3fb702891685b94"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a6d6c1951c8728886d3fb702891685b94">&#9670;&nbsp;</a></span>getRoutingLayer()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">const <a class="elRef" href="../hurricane/classHurricane_1_1Layer.html">Layer</a> * CRL::RoutingGauge::getRoutingLayer </td>
<td>(</td>
<td class="paramtype">size_t&#160;</td>
<td class="paramname"><em>depth</em></td><td>)</td>
<td> const</td>
</tr>
</table>
</div><div class="memdoc">
<p><b>Returns:</b> the Layer at position <code>depth</code>. </p>
</div>
</div>
<a id="a4b603c0fd5f21db1c93d8a747ec1f4ba"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a4b603c0fd5f21db1c93d8a747ec1f4ba">&#9670;&nbsp;</a></span>getContactLayer()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname"><a class="elRef" href="../hurricane/classHurricane_1_1Layer.html">Layer</a> * CRL::RoutingGauge::getContactLayer </td>
<td>(</td>
<td class="paramtype">size_t&#160;</td>
<td class="paramname"><em>depth</em></td><td>)</td>
<td> const</td>
</tr>
</table>
</div><div class="memdoc">
<p><b>Returns:</b> the Contact Layer at position <code>depth</code>. </p>
</div> </div>
</div> </div>
@ -385,6 +347,44 @@ Static Public Member Functions</h2></td></tr>
<p class="reference">References <a class="el" href="classCRL_1_1RoutingLayerGauge.html#a14971f88ab84cdd1cbe3a5e31f039fa1">CRL::RoutingLayerGauge::getDirection()</a>, and <a class="el" href="classCRL_1_1RoutingGauge.html#aa0f0e65f45814ba0104daafbc271a12d">getLayerGauge()</a>.</p> <p class="reference">References <a class="el" href="classCRL_1_1RoutingLayerGauge.html#a14971f88ab84cdd1cbe3a5e31f039fa1">CRL::RoutingLayerGauge::getDirection()</a>, and <a class="el" href="classCRL_1_1RoutingGauge.html#aa0f0e65f45814ba0104daafbc271a12d">getLayerGauge()</a>.</p>
</div>
</div>
<a id="a6d6c1951c8728886d3fb702891685b94"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a6d6c1951c8728886d3fb702891685b94">&#9670;&nbsp;</a></span>getRoutingLayer()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">const <a class="elRef" doxygen="/dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/html/hurricane.tag:../hurricane/" href="../hurricane/classHurricane_1_1Layer.html">Layer</a> * CRL::RoutingGauge::getRoutingLayer </td>
<td>(</td>
<td class="paramtype">size_t&#160;</td>
<td class="paramname"><em>depth</em></td><td>)</td>
<td> const</td>
</tr>
</table>
</div><div class="memdoc">
<p><b>Returns:</b> the Layer at position <code>depth</code>. </p>
</div>
</div>
<a id="a4b603c0fd5f21db1c93d8a747ec1f4ba"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a4b603c0fd5f21db1c93d8a747ec1f4ba">&#9670;&nbsp;</a></span>getContactLayer()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname"><a class="elRef" doxygen="/dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/html/hurricane.tag:../hurricane/" href="../hurricane/classHurricane_1_1Layer.html">Layer</a> * CRL::RoutingGauge::getContactLayer </td>
<td>(</td>
<td class="paramtype">size_t&#160;</td>
<td class="paramname"><em>depth</em></td><td>)</td>
<td> const</td>
</tr>
</table>
</div><div class="memdoc">
<p><b>Returns:</b> the Contact Layer at position <code>depth</code>. </p>
</div> </div>
</div> </div>
<a id="ae8cebef061519fb2df94e3a9dcf09e6e"></a> <a id="ae8cebef061519fb2df94e3a9dcf09e6e"></a>
@ -401,7 +401,7 @@ Static Public Member Functions</h2></td></tr>
</tr> </tr>
</table> </table>
</div><div class="memdoc"> </div><div class="memdoc">
<p><b>Returns:</b> the stack of <a class="el" href="classCRL_1_1RoutingLayerGauge.html" title="Gauge of a Layer for the detailed routing.">RoutingLayerGauge</a>. </p> <p><b>Returns:</b> the stack of <a class="el" href="classCRL_1_1RoutingLayerGauge.html" title="Gauge of a Layer for the detailed routing. ">RoutingLayerGauge</a>. </p>
</div> </div>
</div> </div>
@ -451,7 +451,7 @@ Static Public Member Functions</h2></td></tr>
<hr> <hr>
<table class="footer1"> <table class="footer1">
<tr> <tr>
<td class="LFooter"><small>Generated by doxygen 1.9.1 on Tue Feb 21 2023</small></td> <td class="LFooter"><small>Generated by doxygen 1.8.14 on Sun Nov 21 2021</small></td>
<td class="RFooter"><a href='#pagetop'><small>Return to top of page</small></a></td> <td class="RFooter"><a href='#pagetop'><small>Return to top of page</small></a></td>
</tr> </tr>
</table> </table>

View File

@ -24,7 +24,7 @@
--> -->
<br> <br>
<body onload="javascript:toggleLevel(1)"> <body onload="javascript:toggleLevel(1)">
<!-- Generated by Doxygen 1.9.1 --> <!-- Generated by Doxygen 1.8.14 -->
<script type="text/javascript" src="menudata.js"></script> <script type="text/javascript" src="menudata.js"></script>
<script type="text/javascript" src="menu.js"></script> <script type="text/javascript" src="menu.js"></script>
<script type="text/javascript"> <script type="text/javascript">
@ -70,7 +70,7 @@ $(function() {
<hr> <hr>
<table class="footer1"> <table class="footer1">
<tr> <tr>
<td class="LFooter"><small>Generated by doxygen 1.9.1 on Tue Feb 21 2023</small></td> <td class="LFooter"><small>Generated by doxygen 1.8.14 on Sun Nov 21 2021</small></td>
<td class="RFooter"><a href='#pagetop'><small>Return to top of page</small></a></td> <td class="RFooter"><a href='#pagetop'><small>Return to top of page</small></a></td>
</tr> </tr>
</table> </table>

View File

@ -24,7 +24,7 @@
--> -->
<br> <br>
<body onload="javascript:toggleLevel(1)"> <body onload="javascript:toggleLevel(1)">
<!-- Generated by Doxygen 1.9.1 --> <!-- Generated by Doxygen 1.8.14 -->
<script type="text/javascript" src="menudata.js"></script> <script type="text/javascript" src="menudata.js"></script>
<script type="text/javascript" src="menu.js"></script> <script type="text/javascript" src="menu.js"></script>
<script type="text/javascript"> <script type="text/javascript">
@ -56,9 +56,9 @@ $(function() {
Public Member Functions</h2></td></tr> Public Member Functions</h2></td></tr>
<tr class="memitem:a323c68a66f89908a1376d5464655efe3"><td class="memItemLeft" align="right" valign="top">virtual void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classCRL_1_1RoutingLayerGauge.html#a323c68a66f89908a1376d5464655efe3">destroy</a> ()</td></tr> <tr class="memitem:a323c68a66f89908a1376d5464655efe3"><td class="memItemLeft" align="right" valign="top">virtual void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classCRL_1_1RoutingLayerGauge.html#a323c68a66f89908a1376d5464655efe3">destroy</a> ()</td></tr>
<tr class="separator:a323c68a66f89908a1376d5464655efe3"><td class="memSeparator" colspan="2">&#160;</td></tr> <tr class="separator:a323c68a66f89908a1376d5464655efe3"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a7e024262e549b6109b720c07e28ab16c"><td class="memItemLeft" align="right" valign="top">const <a class="elRef" href="../hurricane/classHurricane_1_1Layer.html">Layer</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classCRL_1_1RoutingLayerGauge.html#a7e024262e549b6109b720c07e28ab16c">getLayer</a> () const</td></tr> <tr class="memitem:a7e024262e549b6109b720c07e28ab16c"><td class="memItemLeft" align="right" valign="top">const <a class="elRef" doxygen="/dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/html/hurricane.tag:../hurricane/" href="../hurricane/classHurricane_1_1Layer.html">Layer</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classCRL_1_1RoutingLayerGauge.html#a7e024262e549b6109b720c07e28ab16c">getLayer</a> () const</td></tr>
<tr class="separator:a7e024262e549b6109b720c07e28ab16c"><td class="memSeparator" colspan="2">&#160;</td></tr> <tr class="separator:a7e024262e549b6109b720c07e28ab16c"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:aa6c48e5acc6985997aa0417ef614f69d"><td class="memItemLeft" align="right" valign="top">const <a class="elRef" href="../hurricane/classHurricane_1_1Layer.html">Layer</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classCRL_1_1RoutingLayerGauge.html#aa6c48e5acc6985997aa0417ef614f69d">getBlockageLayer</a> () const</td></tr> <tr class="memitem:aa6c48e5acc6985997aa0417ef614f69d"><td class="memItemLeft" align="right" valign="top">const <a class="elRef" doxygen="/dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/html/hurricane.tag:../hurricane/" href="../hurricane/classHurricane_1_1Layer.html">Layer</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classCRL_1_1RoutingLayerGauge.html#aa6c48e5acc6985997aa0417ef614f69d">getBlockageLayer</a> () const</td></tr>
<tr class="separator:aa6c48e5acc6985997aa0417ef614f69d"><td class="memSeparator" colspan="2">&#160;</td></tr> <tr class="separator:aa6c48e5acc6985997aa0417ef614f69d"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a2c154cf6be98a71ab29d98faafae485f"><td class="memItemLeft" align="right" valign="top">unsigned int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classCRL_1_1RoutingLayerGauge.html#a2c154cf6be98a71ab29d98faafae485f">getDepth</a> () const</td></tr> <tr class="memitem:a2c154cf6be98a71ab29d98faafae485f"><td class="memItemLeft" align="right" valign="top">unsigned int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classCRL_1_1RoutingLayerGauge.html#a2c154cf6be98a71ab29d98faafae485f">getDepth</a> () const</td></tr>
<tr class="separator:a2c154cf6be98a71ab29d98faafae485f"><td class="memSeparator" colspan="2">&#160;</td></tr> <tr class="separator:a2c154cf6be98a71ab29d98faafae485f"><td class="memSeparator" colspan="2">&#160;</td></tr>
@ -68,30 +68,30 @@ Public Member Functions</h2></td></tr>
<tr class="separator:ab0e0d9e98b9a75312433a39aef247950"><td class="memSeparator" colspan="2">&#160;</td></tr> <tr class="separator:ab0e0d9e98b9a75312433a39aef247950"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a2f118224198a7794629e3582f2f7a80b"><td class="memItemLeft" align="right" valign="top">double&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classCRL_1_1RoutingLayerGauge.html#a2f118224198a7794629e3582f2f7a80b">getDensity</a> () const</td></tr> <tr class="memitem:a2f118224198a7794629e3582f2f7a80b"><td class="memItemLeft" align="right" valign="top">double&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classCRL_1_1RoutingLayerGauge.html#a2f118224198a7794629e3582f2f7a80b">getDensity</a> () const</td></tr>
<tr class="separator:a2f118224198a7794629e3582f2f7a80b"><td class="memSeparator" colspan="2">&#160;</td></tr> <tr class="separator:a2f118224198a7794629e3582f2f7a80b"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a35211769a258807de8d24380b56f3c7c"><td class="memItemLeft" align="right" valign="top"><a class="elRef" href="../hurricane/classHurricane_1_1DbU.html#a4fbfa3e8c89347af76c9628ea06c4146">DbU::Unit</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classCRL_1_1RoutingLayerGauge.html#a35211769a258807de8d24380b56f3c7c">getOffset</a> () const</td></tr> <tr class="memitem:a35211769a258807de8d24380b56f3c7c"><td class="memItemLeft" align="right" valign="top"><a class="elRef" doxygen="/dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/html/hurricane.tag:../hurricane/" href="../hurricane/group__DbUGroup.html#ga4fbfa3e8c89347af76c9628ea06c4146">DbU::Unit</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classCRL_1_1RoutingLayerGauge.html#a35211769a258807de8d24380b56f3c7c">getOffset</a> () const</td></tr>
<tr class="separator:a35211769a258807de8d24380b56f3c7c"><td class="memSeparator" colspan="2">&#160;</td></tr> <tr class="separator:a35211769a258807de8d24380b56f3c7c"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a94c216b22d35e8cb6a91a9597ba592ce"><td class="memItemLeft" align="right" valign="top"><a class="elRef" href="../hurricane/classHurricane_1_1DbU.html#a4fbfa3e8c89347af76c9628ea06c4146">DbU::Unit</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classCRL_1_1RoutingLayerGauge.html#a94c216b22d35e8cb6a91a9597ba592ce">getPitch</a> () const</td></tr> <tr class="memitem:a94c216b22d35e8cb6a91a9597ba592ce"><td class="memItemLeft" align="right" valign="top"><a class="elRef" doxygen="/dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/html/hurricane.tag:../hurricane/" href="../hurricane/group__DbUGroup.html#ga4fbfa3e8c89347af76c9628ea06c4146">DbU::Unit</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classCRL_1_1RoutingLayerGauge.html#a94c216b22d35e8cb6a91a9597ba592ce">getPitch</a> () const</td></tr>
<tr class="separator:a94c216b22d35e8cb6a91a9597ba592ce"><td class="memSeparator" colspan="2">&#160;</td></tr> <tr class="separator:a94c216b22d35e8cb6a91a9597ba592ce"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:aaf1ada741341b95d0f24fff97a242ef1"><td class="memItemLeft" align="right" valign="top"><a class="elRef" href="../hurricane/classHurricane_1_1DbU.html#a4fbfa3e8c89347af76c9628ea06c4146">DbU::Unit</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classCRL_1_1RoutingLayerGauge.html#aaf1ada741341b95d0f24fff97a242ef1">getHalfPitch</a> () const</td></tr> <tr class="memitem:aaf1ada741341b95d0f24fff97a242ef1"><td class="memItemLeft" align="right" valign="top"><a class="elRef" doxygen="/dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/html/hurricane.tag:../hurricane/" href="../hurricane/group__DbUGroup.html#ga4fbfa3e8c89347af76c9628ea06c4146">DbU::Unit</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classCRL_1_1RoutingLayerGauge.html#aaf1ada741341b95d0f24fff97a242ef1">getHalfPitch</a> () const</td></tr>
<tr class="separator:aaf1ada741341b95d0f24fff97a242ef1"><td class="memSeparator" colspan="2">&#160;</td></tr> <tr class="separator:aaf1ada741341b95d0f24fff97a242ef1"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:ab29fa7895f4fe661eb85bed9f6a5860e"><td class="memItemLeft" align="right" valign="top"><a class="elRef" href="../hurricane/classHurricane_1_1DbU.html#a4fbfa3e8c89347af76c9628ea06c4146">DbU::Unit</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classCRL_1_1RoutingLayerGauge.html#ab29fa7895f4fe661eb85bed9f6a5860e">getWireWidth</a> () const</td></tr> <tr class="memitem:ab29fa7895f4fe661eb85bed9f6a5860e"><td class="memItemLeft" align="right" valign="top"><a class="elRef" doxygen="/dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/html/hurricane.tag:../hurricane/" href="../hurricane/group__DbUGroup.html#ga4fbfa3e8c89347af76c9628ea06c4146">DbU::Unit</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classCRL_1_1RoutingLayerGauge.html#ab29fa7895f4fe661eb85bed9f6a5860e">getWireWidth</a> () const</td></tr>
<tr class="separator:ab29fa7895f4fe661eb85bed9f6a5860e"><td class="memSeparator" colspan="2">&#160;</td></tr> <tr class="separator:ab29fa7895f4fe661eb85bed9f6a5860e"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a57183085c39be7edcb87f4f770f8e535"><td class="memItemLeft" align="right" valign="top"><a class="elRef" href="../hurricane/classHurricane_1_1DbU.html#a4fbfa3e8c89347af76c9628ea06c4146">DbU::Unit</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classCRL_1_1RoutingLayerGauge.html#a57183085c39be7edcb87f4f770f8e535">getHalfWireWidth</a> () const</td></tr> <tr class="memitem:a57183085c39be7edcb87f4f770f8e535"><td class="memItemLeft" align="right" valign="top"><a class="elRef" doxygen="/dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/html/hurricane.tag:../hurricane/" href="../hurricane/group__DbUGroup.html#ga4fbfa3e8c89347af76c9628ea06c4146">DbU::Unit</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classCRL_1_1RoutingLayerGauge.html#a57183085c39be7edcb87f4f770f8e535">getHalfWireWidth</a> () const</td></tr>
<tr class="separator:a57183085c39be7edcb87f4f770f8e535"><td class="memSeparator" colspan="2">&#160;</td></tr> <tr class="separator:a57183085c39be7edcb87f4f770f8e535"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:ac0783d29a7f9f6a2f02ac72f3196d637"><td class="memItemLeft" align="right" valign="top"><a class="elRef" href="../hurricane/classHurricane_1_1DbU.html#a4fbfa3e8c89347af76c9628ea06c4146">DbU::Unit</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classCRL_1_1RoutingLayerGauge.html#ac0783d29a7f9f6a2f02ac72f3196d637">getViaWidth</a> () const</td></tr> <tr class="memitem:ac0783d29a7f9f6a2f02ac72f3196d637"><td class="memItemLeft" align="right" valign="top"><a class="elRef" doxygen="/dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/html/hurricane.tag:../hurricane/" href="../hurricane/group__DbUGroup.html#ga4fbfa3e8c89347af76c9628ea06c4146">DbU::Unit</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classCRL_1_1RoutingLayerGauge.html#ac0783d29a7f9f6a2f02ac72f3196d637">getViaWidth</a> () const</td></tr>
<tr class="separator:ac0783d29a7f9f6a2f02ac72f3196d637"><td class="memSeparator" colspan="2">&#160;</td></tr> <tr class="separator:ac0783d29a7f9f6a2f02ac72f3196d637"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a0f090ea25ef6f88e691fc6e572f79e16"><td class="memItemLeft" align="right" valign="top"><a class="elRef" href="../hurricane/classHurricane_1_1DbU.html#a4fbfa3e8c89347af76c9628ea06c4146">DbU::Unit</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classCRL_1_1RoutingLayerGauge.html#a0f090ea25ef6f88e691fc6e572f79e16">getHalfViaWidth</a> () const</td></tr> <tr class="memitem:a0f090ea25ef6f88e691fc6e572f79e16"><td class="memItemLeft" align="right" valign="top"><a class="elRef" doxygen="/dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/html/hurricane.tag:../hurricane/" href="../hurricane/group__DbUGroup.html#ga4fbfa3e8c89347af76c9628ea06c4146">DbU::Unit</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classCRL_1_1RoutingLayerGauge.html#a0f090ea25ef6f88e691fc6e572f79e16">getHalfViaWidth</a> () const</td></tr>
<tr class="separator:a0f090ea25ef6f88e691fc6e572f79e16"><td class="memSeparator" colspan="2">&#160;</td></tr> <tr class="separator:a0f090ea25ef6f88e691fc6e572f79e16"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:ab8d5ae22c453605226b2695c2568c4f5"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classCRL_1_1RoutingLayerGauge.html#ab8d5ae22c453605226b2695c2568c4f5">divide</a> (<a class="elRef" href="../hurricane/classHurricane_1_1DbU.html#a4fbfa3e8c89347af76c9628ea06c4146">DbU::Unit</a> dividend, long &amp;quotient, long &amp;modulo) const</td></tr> <tr class="memitem:ab8d5ae22c453605226b2695c2568c4f5"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classCRL_1_1RoutingLayerGauge.html#ab8d5ae22c453605226b2695c2568c4f5">divide</a> (<a class="elRef" doxygen="/dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/html/hurricane.tag:../hurricane/" href="../hurricane/group__DbUGroup.html#ga4fbfa3e8c89347af76c9628ea06c4146">DbU::Unit</a> dividend, long &amp;quotient, long &amp;modulo) const</td></tr>
<tr class="separator:ab8d5ae22c453605226b2695c2568c4f5"><td class="memSeparator" colspan="2">&#160;</td></tr> <tr class="separator:ab8d5ae22c453605226b2695c2568c4f5"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:ab9bbb7959ca58438d59709398044daae"><td class="memItemLeft" align="right" valign="top">unsigned int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classCRL_1_1RoutingLayerGauge.html#ab9bbb7959ca58438d59709398044daae">getTrackNumber</a> (<a class="elRef" href="../hurricane/classHurricane_1_1DbU.html#a4fbfa3e8c89347af76c9628ea06c4146">DbU::Unit</a> start, <a class="elRef" href="../hurricane/classHurricane_1_1DbU.html#a4fbfa3e8c89347af76c9628ea06c4146">DbU::Unit</a> stop) const</td></tr> <tr class="memitem:ab9bbb7959ca58438d59709398044daae"><td class="memItemLeft" align="right" valign="top">unsigned int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classCRL_1_1RoutingLayerGauge.html#ab9bbb7959ca58438d59709398044daae">getTrackNumber</a> (<a class="elRef" doxygen="/dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/html/hurricane.tag:../hurricane/" href="../hurricane/group__DbUGroup.html#ga4fbfa3e8c89347af76c9628ea06c4146">DbU::Unit</a> start, <a class="elRef" doxygen="/dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/html/hurricane.tag:../hurricane/" href="../hurricane/group__DbUGroup.html#ga4fbfa3e8c89347af76c9628ea06c4146">DbU::Unit</a> stop) const</td></tr>
<tr class="separator:ab9bbb7959ca58438d59709398044daae"><td class="memSeparator" colspan="2">&#160;</td></tr> <tr class="separator:ab9bbb7959ca58438d59709398044daae"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:ad61cdf130c8b739bb44a01cfd5968022"><td class="memItemLeft" align="right" valign="top">long&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classCRL_1_1RoutingLayerGauge.html#ad61cdf130c8b739bb44a01cfd5968022">getTrackIndex</a> (<a class="elRef" href="../hurricane/classHurricane_1_1DbU.html#a4fbfa3e8c89347af76c9628ea06c4146">DbU::Unit</a> start, <a class="elRef" href="../hurricane/classHurricane_1_1DbU.html#a4fbfa3e8c89347af76c9628ea06c4146">DbU::Unit</a> stop, <a class="elRef" href="../hurricane/classHurricane_1_1DbU.html#a4fbfa3e8c89347af76c9628ea06c4146">DbU::Unit</a> position, unsigned mode) const</td></tr> <tr class="memitem:ad61cdf130c8b739bb44a01cfd5968022"><td class="memItemLeft" align="right" valign="top">long&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classCRL_1_1RoutingLayerGauge.html#ad61cdf130c8b739bb44a01cfd5968022">getTrackIndex</a> (<a class="elRef" doxygen="/dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/html/hurricane.tag:../hurricane/" href="../hurricane/group__DbUGroup.html#ga4fbfa3e8c89347af76c9628ea06c4146">DbU::Unit</a> start, <a class="elRef" doxygen="/dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/html/hurricane.tag:../hurricane/" href="../hurricane/group__DbUGroup.html#ga4fbfa3e8c89347af76c9628ea06c4146">DbU::Unit</a> stop, <a class="elRef" doxygen="/dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/html/hurricane.tag:../hurricane/" href="../hurricane/group__DbUGroup.html#ga4fbfa3e8c89347af76c9628ea06c4146">DbU::Unit</a> position, unsigned mode) const</td></tr>
<tr class="separator:ad61cdf130c8b739bb44a01cfd5968022"><td class="memSeparator" colspan="2">&#160;</td></tr> <tr class="separator:ad61cdf130c8b739bb44a01cfd5968022"><td class="memSeparator" colspan="2">&#160;</td></tr>
</table><table class="memberdecls"> </table><table class="memberdecls">
<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-static-methods"></a> <tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-static-methods"></a>
Static Public Member Functions</h2></td></tr> Static Public Member Functions</h2></td></tr>
<tr class="memitem:afb41e7be2a6d258a691aacbe7a78154f"><td class="memItemLeft" align="right" valign="top">static <a class="el" href="classCRL_1_1RoutingLayerGauge.html">RoutingLayerGauge</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classCRL_1_1RoutingLayerGauge.html#afb41e7be2a6d258a691aacbe7a78154f">create</a> (const <a class="elRef" href="../hurricane/classHurricane_1_1Layer.html">Layer</a> *layer, <a class="el" href="namespaceConstant.html#ac081a99f2b64361919ed5d9f37c0f9af">Constant::Direction</a> direction, <a class="el" href="namespaceConstant.html#ab2e46a17cc373a268c5c24fa0e2067e5">Constant::LayerGaugeType</a> type, unsigned int depth, double density, <a class="elRef" href="../hurricane/classHurricane_1_1DbU.html#a4fbfa3e8c89347af76c9628ea06c4146">DbU::Unit</a> offset, <a class="elRef" href="../hurricane/classHurricane_1_1DbU.html#a4fbfa3e8c89347af76c9628ea06c4146">DbU::Unit</a> pitch, <a class="elRef" href="../hurricane/classHurricane_1_1DbU.html#a4fbfa3e8c89347af76c9628ea06c4146">DbU::Unit</a> wireWidth, <a class="elRef" href="../hurricane/classHurricane_1_1DbU.html#a4fbfa3e8c89347af76c9628ea06c4146">DbU::Unit</a> pwireWidth, <a class="elRef" href="../hurricane/classHurricane_1_1DbU.html#a4fbfa3e8c89347af76c9628ea06c4146">DbU::Unit</a> viaWidth, <a class="elRef" href="../hurricane/classHurricane_1_1DbU.html#a4fbfa3e8c89347af76c9628ea06c4146">DbU::Unit</a> obsDw)</td></tr> <tr class="memitem:afb41e7be2a6d258a691aacbe7a78154f"><td class="memItemLeft" align="right" valign="top">static <a class="el" href="classCRL_1_1RoutingLayerGauge.html">RoutingLayerGauge</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classCRL_1_1RoutingLayerGauge.html#afb41e7be2a6d258a691aacbe7a78154f">create</a> (const <a class="elRef" doxygen="/dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/html/hurricane.tag:../hurricane/" href="../hurricane/classHurricane_1_1Layer.html">Layer</a> *layer, <a class="el" href="namespaceConstant.html#ac081a99f2b64361919ed5d9f37c0f9af">Constant::Direction</a> direction, <a class="el" href="namespaceConstant.html#ab2e46a17cc373a268c5c24fa0e2067e5">Constant::LayerGaugeType</a> type, unsigned int depth, double density, <a class="elRef" doxygen="/dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/html/hurricane.tag:../hurricane/" href="../hurricane/group__DbUGroup.html#ga4fbfa3e8c89347af76c9628ea06c4146">DbU::Unit</a> offset, <a class="elRef" doxygen="/dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/html/hurricane.tag:../hurricane/" href="../hurricane/group__DbUGroup.html#ga4fbfa3e8c89347af76c9628ea06c4146">DbU::Unit</a> pitch, <a class="elRef" doxygen="/dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/html/hurricane.tag:../hurricane/" href="../hurricane/group__DbUGroup.html#ga4fbfa3e8c89347af76c9628ea06c4146">DbU::Unit</a> wireWidth, <a class="elRef" doxygen="/dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/html/hurricane.tag:../hurricane/" href="../hurricane/group__DbUGroup.html#ga4fbfa3e8c89347af76c9628ea06c4146">DbU::Unit</a> pwireWidth, <a class="elRef" doxygen="/dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/html/hurricane.tag:../hurricane/" href="../hurricane/group__DbUGroup.html#ga4fbfa3e8c89347af76c9628ea06c4146">DbU::Unit</a> viaWidth, <a class="elRef" doxygen="/dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/html/hurricane.tag:../hurricane/" href="../hurricane/group__DbUGroup.html#ga4fbfa3e8c89347af76c9628ea06c4146">DbU::Unit</a> obsDw)</td></tr>
<tr class="separator:afb41e7be2a6d258a691aacbe7a78154f"><td class="memSeparator" colspan="2">&#160;</td></tr> <tr class="separator:afb41e7be2a6d258a691aacbe7a78154f"><td class="memSeparator" colspan="2">&#160;</td></tr>
</table> </table>
<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2> <a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
@ -109,7 +109,7 @@ Static Public Member Functions</h2></td></tr>
<tr> <tr>
<td class="memname"><a class="el" href="classCRL_1_1RoutingLayerGauge.html">RoutingLayerGauge</a> * CRL::RoutingLayerGauge::create </td> <td class="memname"><a class="el" href="classCRL_1_1RoutingLayerGauge.html">RoutingLayerGauge</a> * CRL::RoutingLayerGauge::create </td>
<td>(</td> <td>(</td>
<td class="paramtype">const <a class="elRef" href="../hurricane/classHurricane_1_1Layer.html">Layer</a> *&#160;</td> <td class="paramtype">const <a class="elRef" doxygen="/dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/html/hurricane.tag:../hurricane/" href="../hurricane/classHurricane_1_1Layer.html">Layer</a> *&#160;</td>
<td class="paramname"><em>layer</em>, </td> <td class="paramname"><em>layer</em>, </td>
</tr> </tr>
<tr> <tr>
@ -139,37 +139,37 @@ Static Public Member Functions</h2></td></tr>
<tr> <tr>
<td class="paramkey"></td> <td class="paramkey"></td>
<td></td> <td></td>
<td class="paramtype"><a class="elRef" href="../hurricane/classHurricane_1_1DbU.html#a4fbfa3e8c89347af76c9628ea06c4146">DbU::Unit</a>&#160;</td> <td class="paramtype"><a class="elRef" doxygen="/dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/html/hurricane.tag:../hurricane/" href="../hurricane/group__DbUGroup.html#ga4fbfa3e8c89347af76c9628ea06c4146">DbU::Unit</a>&#160;</td>
<td class="paramname"><em>offset</em>, </td> <td class="paramname"><em>offset</em>, </td>
</tr> </tr>
<tr> <tr>
<td class="paramkey"></td> <td class="paramkey"></td>
<td></td> <td></td>
<td class="paramtype"><a class="elRef" href="../hurricane/classHurricane_1_1DbU.html#a4fbfa3e8c89347af76c9628ea06c4146">DbU::Unit</a>&#160;</td> <td class="paramtype"><a class="elRef" doxygen="/dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/html/hurricane.tag:../hurricane/" href="../hurricane/group__DbUGroup.html#ga4fbfa3e8c89347af76c9628ea06c4146">DbU::Unit</a>&#160;</td>
<td class="paramname"><em>pitch</em>, </td> <td class="paramname"><em>pitch</em>, </td>
</tr> </tr>
<tr> <tr>
<td class="paramkey"></td> <td class="paramkey"></td>
<td></td> <td></td>
<td class="paramtype"><a class="elRef" href="../hurricane/classHurricane_1_1DbU.html#a4fbfa3e8c89347af76c9628ea06c4146">DbU::Unit</a>&#160;</td> <td class="paramtype"><a class="elRef" doxygen="/dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/html/hurricane.tag:../hurricane/" href="../hurricane/group__DbUGroup.html#ga4fbfa3e8c89347af76c9628ea06c4146">DbU::Unit</a>&#160;</td>
<td class="paramname"><em>wireWidth</em>, </td> <td class="paramname"><em>wireWidth</em>, </td>
</tr> </tr>
<tr> <tr>
<td class="paramkey"></td> <td class="paramkey"></td>
<td></td> <td></td>
<td class="paramtype"><a class="elRef" href="../hurricane/classHurricane_1_1DbU.html#a4fbfa3e8c89347af76c9628ea06c4146">DbU::Unit</a>&#160;</td> <td class="paramtype"><a class="elRef" doxygen="/dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/html/hurricane.tag:../hurricane/" href="../hurricane/group__DbUGroup.html#ga4fbfa3e8c89347af76c9628ea06c4146">DbU::Unit</a>&#160;</td>
<td class="paramname"><em>pwireWidth</em>, </td> <td class="paramname"><em>pwireWidth</em>, </td>
</tr> </tr>
<tr> <tr>
<td class="paramkey"></td> <td class="paramkey"></td>
<td></td> <td></td>
<td class="paramtype"><a class="elRef" href="../hurricane/classHurricane_1_1DbU.html#a4fbfa3e8c89347af76c9628ea06c4146">DbU::Unit</a>&#160;</td> <td class="paramtype"><a class="elRef" doxygen="/dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/html/hurricane.tag:../hurricane/" href="../hurricane/group__DbUGroup.html#ga4fbfa3e8c89347af76c9628ea06c4146">DbU::Unit</a>&#160;</td>
<td class="paramname"><em>viaWidth</em>, </td> <td class="paramname"><em>viaWidth</em>, </td>
</tr> </tr>
<tr> <tr>
<td class="paramkey"></td> <td class="paramkey"></td>
<td></td> <td></td>
<td class="paramtype"><a class="elRef" href="../hurricane/classHurricane_1_1DbU.html#a4fbfa3e8c89347af76c9628ea06c4146">DbU::Unit</a>&#160;</td> <td class="paramtype"><a class="elRef" doxygen="/dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/html/hurricane.tag:../hurricane/" href="../hurricane/group__DbUGroup.html#ga4fbfa3e8c89347af76c9628ea06c4146">DbU::Unit</a>&#160;</td>
<td class="paramname"><em>obsDw</em>&#160;</td> <td class="paramname"><em>obsDw</em>&#160;</td>
</tr> </tr>
<tr> <tr>
@ -237,7 +237,7 @@ Static Public Member Functions</h2></td></tr>
<td class="mlabels-left"> <td class="mlabels-left">
<table class="memname"> <table class="memname">
<tr> <tr>
<td class="memname">const <a class="elRef" href="../hurricane/classHurricane_1_1Layer.html">Layer</a> * CRL::RoutingLayerGauge::getLayer </td> <td class="memname">const <a class="elRef" doxygen="/dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/html/hurricane.tag:../hurricane/" href="../hurricane/classHurricane_1_1Layer.html">Layer</a> * CRL::RoutingLayerGauge::getLayer </td>
<td>(</td> <td>(</td>
<td class="paramname"></td><td>)</td> <td class="paramname"></td><td>)</td>
<td> const</td> <td> const</td>
@ -263,7 +263,7 @@ Static Public Member Functions</h2></td></tr>
<td class="mlabels-left"> <td class="mlabels-left">
<table class="memname"> <table class="memname">
<tr> <tr>
<td class="memname">const <a class="elRef" href="../hurricane/classHurricane_1_1Layer.html">Layer</a> * CRL::RoutingLayerGauge::getBlockageLayer </td> <td class="memname">const <a class="elRef" doxygen="/dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/html/hurricane.tag:../hurricane/" href="../hurricane/classHurricane_1_1Layer.html">Layer</a> * CRL::RoutingLayerGauge::getBlockageLayer </td>
<td>(</td> <td>(</td>
<td class="paramname"></td><td>)</td> <td class="paramname"></td><td>)</td>
<td> const</td> <td> const</td>
@ -301,7 +301,7 @@ Static Public Member Functions</h2></td></tr>
</tr> </tr>
</table> </table>
</div><div class="memdoc"> </div><div class="memdoc">
<p><b>Returns:</b> the depth (position) of the gauge inside the complete <a class="el" href="classCRL_1_1RoutingGauge.html" title="Gauge for the detailed routing.">RoutingGauge</a>. </p> <p><b>Returns:</b> the depth (position) of the gauge inside the complete <a class="el" href="classCRL_1_1RoutingGauge.html" title="Gauge for the detailed routing. ">RoutingGauge</a>. </p>
</div> </div>
</div> </div>
@ -395,7 +395,7 @@ Static Public Member Functions</h2></td></tr>
<td class="mlabels-left"> <td class="mlabels-left">
<table class="memname"> <table class="memname">
<tr> <tr>
<td class="memname"><a class="elRef" href="../hurricane/classHurricane_1_1DbU.html#a4fbfa3e8c89347af76c9628ea06c4146">DbU::Unit</a> CRL::RoutingLayerGauge::getOffset </td> <td class="memname"><a class="elRef" doxygen="/dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/html/hurricane.tag:../hurricane/" href="../hurricane/group__DbUGroup.html#ga4fbfa3e8c89347af76c9628ea06c4146">DbU::Unit</a> CRL::RoutingLayerGauge::getOffset </td>
<td>(</td> <td>(</td>
<td class="paramname"></td><td>)</td> <td class="paramname"></td><td>)</td>
<td> const</td> <td> const</td>
@ -421,7 +421,7 @@ Static Public Member Functions</h2></td></tr>
<td class="mlabels-left"> <td class="mlabels-left">
<table class="memname"> <table class="memname">
<tr> <tr>
<td class="memname"><a class="elRef" href="../hurricane/classHurricane_1_1DbU.html#a4fbfa3e8c89347af76c9628ea06c4146">DbU::Unit</a> CRL::RoutingLayerGauge::getPitch </td> <td class="memname"><a class="elRef" doxygen="/dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/html/hurricane.tag:../hurricane/" href="../hurricane/group__DbUGroup.html#ga4fbfa3e8c89347af76c9628ea06c4146">DbU::Unit</a> CRL::RoutingLayerGauge::getPitch </td>
<td>(</td> <td>(</td>
<td class="paramname"></td><td>)</td> <td class="paramname"></td><td>)</td>
<td> const</td> <td> const</td>
@ -447,7 +447,7 @@ Static Public Member Functions</h2></td></tr>
<td class="mlabels-left"> <td class="mlabels-left">
<table class="memname"> <table class="memname">
<tr> <tr>
<td class="memname"><a class="elRef" href="../hurricane/classHurricane_1_1DbU.html#a4fbfa3e8c89347af76c9628ea06c4146">DbU::Unit</a> CRL::RoutingLayerGauge::getHalfPitch </td> <td class="memname"><a class="elRef" doxygen="/dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/html/hurricane.tag:../hurricane/" href="../hurricane/group__DbUGroup.html#ga4fbfa3e8c89347af76c9628ea06c4146">DbU::Unit</a> CRL::RoutingLayerGauge::getHalfPitch </td>
<td>(</td> <td>(</td>
<td class="paramname"></td><td>)</td> <td class="paramname"></td><td>)</td>
<td> const</td> <td> const</td>
@ -473,7 +473,7 @@ Static Public Member Functions</h2></td></tr>
<td class="mlabels-left"> <td class="mlabels-left">
<table class="memname"> <table class="memname">
<tr> <tr>
<td class="memname"><a class="elRef" href="../hurricane/classHurricane_1_1DbU.html#a4fbfa3e8c89347af76c9628ea06c4146">DbU::Unit</a> CRL::RoutingLayerGauge::getWireWidth </td> <td class="memname"><a class="elRef" doxygen="/dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/html/hurricane.tag:../hurricane/" href="../hurricane/group__DbUGroup.html#ga4fbfa3e8c89347af76c9628ea06c4146">DbU::Unit</a> CRL::RoutingLayerGauge::getWireWidth </td>
<td>(</td> <td>(</td>
<td class="paramname"></td><td>)</td> <td class="paramname"></td><td>)</td>
<td> const</td> <td> const</td>
@ -499,7 +499,7 @@ Static Public Member Functions</h2></td></tr>
<td class="mlabels-left"> <td class="mlabels-left">
<table class="memname"> <table class="memname">
<tr> <tr>
<td class="memname"><a class="elRef" href="../hurricane/classHurricane_1_1DbU.html#a4fbfa3e8c89347af76c9628ea06c4146">DbU::Unit</a> CRL::RoutingLayerGauge::getHalfWireWidth </td> <td class="memname"><a class="elRef" doxygen="/dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/html/hurricane.tag:../hurricane/" href="../hurricane/group__DbUGroup.html#ga4fbfa3e8c89347af76c9628ea06c4146">DbU::Unit</a> CRL::RoutingLayerGauge::getHalfWireWidth </td>
<td>(</td> <td>(</td>
<td class="paramname"></td><td>)</td> <td class="paramname"></td><td>)</td>
<td> const</td> <td> const</td>
@ -525,7 +525,7 @@ Static Public Member Functions</h2></td></tr>
<td class="mlabels-left"> <td class="mlabels-left">
<table class="memname"> <table class="memname">
<tr> <tr>
<td class="memname"><a class="elRef" href="../hurricane/classHurricane_1_1DbU.html#a4fbfa3e8c89347af76c9628ea06c4146">DbU::Unit</a> CRL::RoutingLayerGauge::getViaWidth </td> <td class="memname"><a class="elRef" doxygen="/dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/html/hurricane.tag:../hurricane/" href="../hurricane/group__DbUGroup.html#ga4fbfa3e8c89347af76c9628ea06c4146">DbU::Unit</a> CRL::RoutingLayerGauge::getViaWidth </td>
<td>(</td> <td>(</td>
<td class="paramname"></td><td>)</td> <td class="paramname"></td><td>)</td>
<td> const</td> <td> const</td>
@ -551,7 +551,7 @@ Static Public Member Functions</h2></td></tr>
<td class="mlabels-left"> <td class="mlabels-left">
<table class="memname"> <table class="memname">
<tr> <tr>
<td class="memname"><a class="elRef" href="../hurricane/classHurricane_1_1DbU.html#a4fbfa3e8c89347af76c9628ea06c4146">DbU::Unit</a> CRL::RoutingLayerGauge::getHalfViaWidth </td> <td class="memname"><a class="elRef" doxygen="/dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/html/hurricane.tag:../hurricane/" href="../hurricane/group__DbUGroup.html#ga4fbfa3e8c89347af76c9628ea06c4146">DbU::Unit</a> CRL::RoutingLayerGauge::getHalfViaWidth </td>
<td>(</td> <td>(</td>
<td class="paramname"></td><td>)</td> <td class="paramname"></td><td>)</td>
<td> const</td> <td> const</td>
@ -576,7 +576,7 @@ Static Public Member Functions</h2></td></tr>
<tr> <tr>
<td class="memname">void CRL::RoutingLayerGauge::divide </td> <td class="memname">void CRL::RoutingLayerGauge::divide </td>
<td>(</td> <td>(</td>
<td class="paramtype"><a class="elRef" href="../hurricane/classHurricane_1_1DbU.html#a4fbfa3e8c89347af76c9628ea06c4146">DbU::Unit</a>&#160;</td> <td class="paramtype"><a class="elRef" doxygen="/dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/html/hurricane.tag:../hurricane/" href="../hurricane/group__DbUGroup.html#ga4fbfa3e8c89347af76c9628ea06c4146">DbU::Unit</a>&#160;</td>
<td class="paramname"><em>dividend</em>, </td> <td class="paramname"><em>dividend</em>, </td>
</tr> </tr>
<tr> <tr>
@ -618,13 +618,13 @@ Static Public Member Functions</h2></td></tr>
<tr> <tr>
<td class="memname">unsigned int CRL::RoutingLayerGauge::getTrackNumber </td> <td class="memname">unsigned int CRL::RoutingLayerGauge::getTrackNumber </td>
<td>(</td> <td>(</td>
<td class="paramtype"><a class="elRef" href="../hurricane/classHurricane_1_1DbU.html#a4fbfa3e8c89347af76c9628ea06c4146">DbU::Unit</a>&#160;</td> <td class="paramtype"><a class="elRef" doxygen="/dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/html/hurricane.tag:../hurricane/" href="../hurricane/group__DbUGroup.html#ga4fbfa3e8c89347af76c9628ea06c4146">DbU::Unit</a>&#160;</td>
<td class="paramname"><em>start</em>, </td> <td class="paramname"><em>start</em>, </td>
</tr> </tr>
<tr> <tr>
<td class="paramkey"></td> <td class="paramkey"></td>
<td></td> <td></td>
<td class="paramtype"><a class="elRef" href="../hurricane/classHurricane_1_1DbU.html#a4fbfa3e8c89347af76c9628ea06c4146">DbU::Unit</a>&#160;</td> <td class="paramtype"><a class="elRef" doxygen="/dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/html/hurricane.tag:../hurricane/" href="../hurricane/group__DbUGroup.html#ga4fbfa3e8c89347af76c9628ea06c4146">DbU::Unit</a>&#160;</td>
<td class="paramname"><em>stop</em>&#160;</td> <td class="paramname"><em>stop</em>&#160;</td>
</tr> </tr>
<tr> <tr>
@ -647,19 +647,19 @@ Static Public Member Functions</h2></td></tr>
<tr> <tr>
<td class="memname">unsigned int CRL::RoutingLayerGauge::getTrackIndex </td> <td class="memname">unsigned int CRL::RoutingLayerGauge::getTrackIndex </td>
<td>(</td> <td>(</td>
<td class="paramtype"><a class="elRef" href="../hurricane/classHurricane_1_1DbU.html#a4fbfa3e8c89347af76c9628ea06c4146">DbU::Unit</a>&#160;</td> <td class="paramtype"><a class="elRef" doxygen="/dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/html/hurricane.tag:../hurricane/" href="../hurricane/group__DbUGroup.html#ga4fbfa3e8c89347af76c9628ea06c4146">DbU::Unit</a>&#160;</td>
<td class="paramname"><em>start</em>, </td> <td class="paramname"><em>start</em>, </td>
</tr> </tr>
<tr> <tr>
<td class="paramkey"></td> <td class="paramkey"></td>
<td></td> <td></td>
<td class="paramtype"><a class="elRef" href="../hurricane/classHurricane_1_1DbU.html#a4fbfa3e8c89347af76c9628ea06c4146">DbU::Unit</a>&#160;</td> <td class="paramtype"><a class="elRef" doxygen="/dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/html/hurricane.tag:../hurricane/" href="../hurricane/group__DbUGroup.html#ga4fbfa3e8c89347af76c9628ea06c4146">DbU::Unit</a>&#160;</td>
<td class="paramname"><em>stop</em>, </td> <td class="paramname"><em>stop</em>, </td>
</tr> </tr>
<tr> <tr>
<td class="paramkey"></td> <td class="paramkey"></td>
<td></td> <td></td>
<td class="paramtype"><a class="elRef" href="../hurricane/classHurricane_1_1DbU.html#a4fbfa3e8c89347af76c9628ea06c4146">DbU::Unit</a>&#160;</td> <td class="paramtype"><a class="elRef" doxygen="/dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/html/hurricane.tag:../hurricane/" href="../hurricane/group__DbUGroup.html#ga4fbfa3e8c89347af76c9628ea06c4146">DbU::Unit</a>&#160;</td>
<td class="paramname"><em>position</em>, </td> <td class="paramname"><em>position</em>, </td>
</tr> </tr>
<tr> <tr>
@ -688,7 +688,7 @@ Static Public Member Functions</h2></td></tr>
<hr> <hr>
<table class="footer1"> <table class="footer1">
<tr> <tr>
<td class="LFooter"><small>Generated by doxygen 1.9.1 on Tue Feb 21 2023</small></td> <td class="LFooter"><small>Generated by doxygen 1.8.14 on Sun Nov 21 2021</small></td>
<td class="RFooter"><a href='#pagetop'><small>Return to top of page</small></a></td> <td class="RFooter"><a href='#pagetop'><small>Return to top of page</small></a></td>
</tr> </tr>
</table> </table>

View File

@ -24,7 +24,7 @@
--> -->
<br> <br>
<body onload="javascript:toggleLevel(1)"> <body onload="javascript:toggleLevel(1)">
<!-- Generated by Doxygen 1.9.1 --> <!-- Generated by Doxygen 1.8.14 -->
<script type="text/javascript" src="menudata.js"></script> <script type="text/javascript" src="menudata.js"></script>
<script type="text/javascript" src="menu.js"></script> <script type="text/javascript" src="menu.js"></script>
<script type="text/javascript"> <script type="text/javascript">
@ -64,7 +64,7 @@ $(function() {
<hr> <hr>
<table class="footer1"> <table class="footer1">
<tr> <tr>
<td class="LFooter"><small>Generated by doxygen 1.9.1 on Tue Feb 21 2023</small></td> <td class="LFooter"><small>Generated by doxygen 1.8.14 on Sun Nov 21 2021</small></td>
<td class="RFooter"><a href='#pagetop'><small>Return to top of page</small></a></td> <td class="RFooter"><a href='#pagetop'><small>Return to top of page</small></a></td>
</tr> </tr>
</table> </table>

View File

@ -24,7 +24,7 @@
--> -->
<br> <br>
<body onload="javascript:toggleLevel(1)"> <body onload="javascript:toggleLevel(1)">
<!-- Generated by Doxygen 1.9.1 --> <!-- Generated by Doxygen 1.8.14 -->
<script type="text/javascript" src="menudata.js"></script> <script type="text/javascript" src="menudata.js"></script>
<script type="text/javascript" src="menu.js"></script> <script type="text/javascript" src="menu.js"></script>
<script type="text/javascript"> <script type="text/javascript">
@ -91,7 +91,7 @@ Static Public Member Functions</h2></td></tr>
</table> </table>
<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2> <a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
<div class="textblock"><p>An ordered list of search pathes. </p> <div class="textblock"><p>An ordered list of search pathes. </p>
<p>The <a class="el" href="classCRL_1_1SearchPath.html" title="An ordered list of search pathes.">SearchPath</a> is an <a class="el" href="classCRL_1_1AllianceFramework.html" title="A Framework to work with Alliance formats.">AllianceFramework</a> owned object, and as such it's constructors &amp; destructors are made inaccessible by the outside world. </p> <p>The <a class="el" href="classCRL_1_1SearchPath.html" title="An ordered list of search pathes. ">SearchPath</a> is an <a class="el" href="classCRL_1_1AllianceFramework.html" title="A Framework to work with Alliance formats. ">AllianceFramework</a> owned object, and as such it's constructors &amp; destructors are made inaccessible by the outside world. </p>
</div><h2 class="groupheader">Member Function Documentation</h2> </div><h2 class="groupheader">Member Function Documentation</h2>
<a id="aef473ae1037c8cb792a3af02baea6fdc"></a> <a id="aef473ae1037c8cb792a3af02baea6fdc"></a>
<h2 class="memtitle"><span class="permalink"><a href="#aef473ae1037c8cb792a3af02baea6fdc">&#9670;&nbsp;</a></span>extractLibName()</h2> <h2 class="memtitle"><span class="permalink"><a href="#aef473ae1037c8cb792a3af02baea6fdc">&#9670;&nbsp;</a></span>extractLibName()</h2>
@ -439,7 +439,7 @@ Static Public Member Functions</h2></td></tr>
</tr> </tr>
</table> </table>
</div><div class="memdoc"> </div><div class="memdoc">
<dl class="section return"><dt>Returns</dt><dd>The search path element at position <code>index</code>. If <code>index</code> is out of bounds, an empty <a class="el" href="classCRL_1_1SearchPath_1_1Element.html" title="An element of the search path (mapping a directory).">Element</a> is returned. </dd></dl> <dl class="section return"><dt>Returns</dt><dd>The search path element at position <code>index</code>. If <code>index</code> is out of bounds, an empty <a class="el" href="classCRL_1_1SearchPath_1_1Element.html" title="An element of the search path (mapping a directory). ">Element</a> is returned. </dd></dl>
</div> </div>
</div> </div>
@ -452,7 +452,7 @@ Static Public Member Functions</h2></td></tr>
<hr> <hr>
<table class="footer1"> <table class="footer1">
<tr> <tr>
<td class="LFooter"><small>Generated by doxygen 1.9.1 on Tue Feb 21 2023</small></td> <td class="LFooter"><small>Generated by doxygen 1.8.14 on Sun Nov 21 2021</small></td>
<td class="RFooter"><a href='#pagetop'><small>Return to top of page</small></a></td> <td class="RFooter"><a href='#pagetop'><small>Return to top of page</small></a></td>
</tr> </tr>
</table> </table>

View File

@ -24,7 +24,7 @@
--> -->
<br> <br>
<body onload="javascript:toggleLevel(1)"> <body onload="javascript:toggleLevel(1)">
<!-- Generated by Doxygen 1.9.1 --> <!-- Generated by Doxygen 1.8.14 -->
<script type="text/javascript" src="menudata.js"></script> <script type="text/javascript" src="menudata.js"></script>
<script type="text/javascript" src="menu.js"></script> <script type="text/javascript" src="menu.js"></script>
<script type="text/javascript"> <script type="text/javascript">
@ -56,7 +56,7 @@ $(function() {
<hr> <hr>
<table class="footer1"> <table class="footer1">
<tr> <tr>
<td class="LFooter"><small>Generated by doxygen 1.9.1 on Tue Feb 21 2023</small></td> <td class="LFooter"><small>Generated by doxygen 1.8.14 on Sun Nov 21 2021</small></td>
<td class="RFooter"><a href='#pagetop'><small>Return to top of page</small></a></td> <td class="RFooter"><a href='#pagetop'><small>Return to top of page</small></a></td>
</tr> </tr>
</table> </table>

View File

@ -24,7 +24,7 @@
--> -->
<br> <br>
<body onload="javascript:toggleLevel(1)"> <body onload="javascript:toggleLevel(1)">
<!-- Generated by Doxygen 1.9.1 --> <!-- Generated by Doxygen 1.8.14 -->
<script type="text/javascript" src="menudata.js"></script> <script type="text/javascript" src="menudata.js"></script>
<script type="text/javascript" src="menu.js"></script> <script type="text/javascript" src="menu.js"></script>
<script type="text/javascript"> <script type="text/javascript">
@ -190,7 +190,7 @@ Public Member Functions</h2></td></tr>
<hr> <hr>
<table class="footer1"> <table class="footer1">
<tr> <tr>
<td class="LFooter"><small>Generated by doxygen 1.9.1 on Tue Feb 21 2023</small></td> <td class="LFooter"><small>Generated by doxygen 1.8.14 on Sun Nov 21 2021</small></td>
<td class="RFooter"><a href='#pagetop'><small>Return to top of page</small></a></td> <td class="RFooter"><a href='#pagetop'><small>Return to top of page</small></a></td>
</tr> </tr>
</table> </table>

Some files were not shown because too many files have changed in this diff Show More