Implementation of DataBase native save/restore in JSON (step 2).

* New: In boostrap, in ccb.py, added support for the "support" project
    which contains external dependencies. Currently contains only
    RapidJSON. Those dependencies must be cloned here manually.
* New: In Hurricane, Initializer class for an ordered static initialization
    across different compilation modules.
* Change: In Hurricane, at DataBase level, no longer save the Cells in
    the libraries, but create and ordered list of Cell. Deepest cells
    (leaf cells) first. To avoid dependency problems.
* New: In Hurricane, JSON support for Property.
* New; In CRL, added JSON support for AllianceFramework, Environement &
    Catalog and their associated properties. Adjustment of the
    AllianceLibrary creation policy.
This commit is contained in:
Jean-Paul Chaput 2016-01-21 00:25:39 +01:00
parent f537a10d45
commit 5baddeb558
90 changed files with 2813 additions and 447 deletions

View File

@ -55,8 +55,8 @@ check_dir:
install: check_dir install: check_dir
@./bootstrap/ccb.py $(DEVTOOLSET_OPTION) --project=coriolis --make="$(SMP_FLAGS) install" @./bootstrap/ccb.py $(DEVTOOLSET_OPTION) --project=support --project=coriolis --make="$(SMP_FLAGS) install"
@./bootstrap/ccb.py $(DEVTOOLSET_OPTION) --project=coriolis --make="-j1 install" --doc @./bootstrap/ccb.py $(DEVTOOLSET_OPTION) --project=support --project=coriolis --make="-j1 install" --doc
@echo ""; \ @echo ""; \
echo "============================================================================"; \ echo "============================================================================"; \
echo "Coriolis has been successfully built"; \ echo "Coriolis has been successfully built"; \

View File

@ -47,13 +47,16 @@ To build Coriolis, ensure the following prerequisites are met:
* bison & flex. * bison & flex.
* Qt 4 or 5. * Qt 4 or 5.
* libxml2. * libxml2.
* 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:~$ cd ~/coriolis-2.x/src ego@home:~$ cd ~/coriolis-2.x/src
ego@home:src$ git clone https://www-soc.lip6.fr/git/coriolis.git ego@home:src$ git clone https://www-soc.lip6.fr/git/coriolis.git
ego@home:src$ cd coriolis ego@home:src$ cd coriolis

View File

@ -6,7 +6,12 @@
projectdir = 'coriolis-2.x' projectdir = 'coriolis-2.x'
projects = [ projects = [
{ 'name' : "coriolis" { 'name' : "support"
, 'tools' : [ "rapidjson"
]
, 'repository': 'No_repository_for_support'
}
, { 'name' : "coriolis"
, 'tools' : [ "bootstrap" , 'tools' : [ "bootstrap"
, "vlsisapd" , "vlsisapd"
, "hurricane" , "hurricane"

View File

@ -150,8 +150,9 @@ class Builder:
def _build ( self, tool ): def _build ( self, tool ):
toolSourceDir = os.path.join ( self.sourceDir, tool.getToolDir() ) toolSourceDir = os.path.join ( self.sourceDir, tool.getToolDir() )
toolBuildDir = os.path.join ( self.buildDir , tool.name ) toolBuildDir = os.path.join ( self.buildDir , tool.name )
cmakeInstallDir = os.path.join ( self.installDir, "share", "cmake", "Modules" )
# Supplied directly in the CMakeLists.txt. # Supplied directly in the CMakeLists.txt.
#cmakeModules = os.path.join ( self.installDir, "share", "cmake", "Modules" ) #cmakeModules = os.path.join ( self.installDir, "share", "cmake", "Modules" )
@ -170,8 +171,10 @@ class Builder:
if self._qt5: command += [ "-D", "WITH_QT5: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" ]
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_DIR:STRING=%s" % cmakeInstallDir
#, "-D", "CMAKE_MODULE_PATH:STRING=%s" % cmakeModules #, "-D", "CMAKE_MODULE_PATH:STRING=%s" % cmakeModules
, toolSourceDir ] , toolSourceDir ]
@ -191,6 +194,7 @@ class Builder:
, "-D", "CHECK_DETERMINISM:STRING=%s" % self._checkDeterminism , "-D", "CHECK_DETERMINISM:STRING=%s" % self._checkDeterminism
, "-D", "CMAKE_VERBOSE_MAKEFILE:STRING=%s" % self._verboseMakefile , "-D", "CMAKE_VERBOSE_MAKEFILE:STRING=%s" % self._verboseMakefile
, "-D", "CMAKE_INSTALL_PREFIX:STRING=%s" % self.installDir , "-D", "CMAKE_INSTALL_PREFIX:STRING=%s" % self.installDir
, "-D", "CMAKE_INSTALL_DIR:STRING=%s" % cmakeInstallDir
] ]
if self.libSuffix: if self.libSuffix:
command += [ "-D", "LIB_SUFFIX:STRING=%s" % self.libSuffix ] command += [ "-D", "LIB_SUFFIX:STRING=%s" % self.libSuffix ]

View File

@ -11,6 +11,7 @@ cellsTop = allianceTop+'/cells/'
allianceConfig = \ allianceConfig = \
( ( 'CATALOG' , 'CATAL') ( ( 'CATALOG' , 'CATAL')
, ( 'WORKING_LIBRARY' , '.') , ( 'WORKING_LIBRARY' , '.')
# , ( 'SYSTEM_LIBRARY' , ( (cellsTop+'ramlib' , AddMode.Append), ) )
, ( 'SYSTEM_LIBRARY' , ( (cellsTop+'sxlib' , AddMode.Append) , ( 'SYSTEM_LIBRARY' , ( (cellsTop+'sxlib' , AddMode.Append)
, (cellsTop+'dp_sxlib', AddMode.Append) , (cellsTop+'dp_sxlib', AddMode.Append)
, (cellsTop+'ramlib' , AddMode.Append) , (cellsTop+'ramlib' , AddMode.Append)

View File

@ -226,6 +226,7 @@ namespace CRL {
Catalog* catalog = AllianceFramework::get()->getCatalog(); Catalog* catalog = AllianceFramework::get()->getCatalog();
CellLoaders* loaders = CellLoaders::get(); CellLoaders* loaders = CellLoaders::get();
getCellsDatas().clear();
forEach ( Cell*, icell, library->getLibrary()->getCells() ) { forEach ( Cell*, icell, library->getLibrary()->getCells() ) {
CellDatas* datas = new CellDatas(*icell); CellDatas* datas = new CellDatas(*icell);
getCellsDatas().push_back( datas ); getCellsDatas().push_back( datas );
@ -245,6 +246,7 @@ namespace CRL {
CellDatas* key = new CellDatas( cellName ); CellDatas* key = new CellDatas( cellName );
auto idatas = lower_bound( getCellsDatas().begin(), getCellsDatas().end(), key, LessCellDatas ); auto idatas = lower_bound( getCellsDatas().begin(), getCellsDatas().end(), key, LessCellDatas );
if ( (idatas == getCellsDatas().end()) if ( (idatas == getCellsDatas().end())
or ((*idatas)->getName() != cellName ) ) { or ((*idatas)->getName() != cellName ) ) {
getCellsDatas().push_back( key ); getCellsDatas().push_back( key );

View File

@ -86,6 +86,10 @@ namespace CRL {
} }
void CellsWidget::updateLibrary ()
{ _baseModel->updateLibrary(); }
void CellsWidget::updateSelected () void CellsWidget::updateSelected ()
{ if (_selected.isValid()) _baseModel->emitDataChanged(_selected); } { if (_selected.isValid()) _baseModel->emitDataChanged(_selected); }

View File

@ -139,5 +139,8 @@ namespace CRL {
} }
void LibraryManager::updateLibrary ( Cell* )
{ _cellsWidget->updateLibrary(); }
} // CRL namespace. } // CRL namespace.

View File

@ -60,7 +60,9 @@ namespace CRL {
}; };
inline const AllianceLibrary* CellsModel::getLibrary () const { return (const AllianceLibrary*)_ilibrary->first; } inline const AllianceLibrary* CellsModel::getLibrary () const
{ return (_ilibrary != _libraries.end()) ? (const AllianceLibrary*)_ilibrary->first : NULL; }
inline const std::vector<CellDatas*>& CellsModel::getCellsDatas () const { return _ilibrary->second; } inline const std::vector<CellDatas*>& CellsModel::getCellsDatas () const { return _ilibrary->second; }
inline std::vector<CellDatas*>& CellsModel::getCellsDatas () { return _ilibrary->second; } inline std::vector<CellDatas*>& CellsModel::getCellsDatas () { return _ilibrary->second; }

View File

@ -47,6 +47,7 @@ namespace CRL {
void selectedCell ( CellDatas* ); void selectedCell ( CellDatas* );
public slots: public slots:
void updateSelected (); void updateSelected ();
void updateLibrary ();
void selectCurrent ( const QModelIndex& index, const QModelIndex& ); void selectCurrent ( const QModelIndex& index, const QModelIndex& );
void setLibrary ( const AllianceLibrary* ); void setLibrary ( const AllianceLibrary* );
private: private:

View File

@ -50,10 +50,11 @@ namespace CRL {
LibraryManager ( QWidget* parent=NULL ); LibraryManager ( QWidget* parent=NULL );
inline void setCellViewer ( CellViewer* ); inline void setCellViewer ( CellViewer* );
inline CellViewer* getCellViewer () const; inline CellViewer* getCellViewer () const;
public slots: public slots:
void toggleShow (); void toggleShow ();
void setLibrary ( const AllianceLibrary* library ); void setLibrary ( const AllianceLibrary* library );
CellViewer* openCell ( Cell*, unsigned int flags ); CellViewer* openCell ( Cell*, unsigned int flags );
void updateLibrary ( Cell* );
private: private:
LibrariesWidget* _librariesWidget; LibrariesWidget* _librariesWidget;
CellsWidget* _cellsWidget; CellsWidget* _cellsWidget;

View File

@ -15,9 +15,10 @@
#include <unistd.h> #include <unistd.h>
#include "vlsisapd/utilities/Path.h" #include "vlsisapd/utilities/Path.h"
#include "hurricane/Initializer.h"
#include "hurricane/Warning.h" #include "hurricane/Warning.h"
#include "hurricane/Technology.h"
#include "hurricane/DataBase.h" #include "hurricane/DataBase.h"
#include "hurricane/Technology.h"
#include "hurricane/Library.h" #include "hurricane/Library.h"
#include "hurricane/Cell.h" #include "hurricane/Cell.h"
#include "hurricane/Instance.h" #include "hurricane/Instance.h"
@ -35,10 +36,14 @@
namespace CRL { namespace CRL {
using namespace std::placeholders; using namespace std::placeholders;
using Hurricane::Initializer;
using Hurricane::JsonTypes;
using Hurricane::JsonArray;
using Hurricane::Warning; using Hurricane::Warning;
using Hurricane::tab; using Hurricane::tab;
using Hurricane::Graphics; using Hurricane::Graphics;
using Hurricane::ForEachIterator; using Hurricane::ForEachIterator;
using Hurricane::getCollection;
using Hurricane::Instance; using Hurricane::Instance;
using Hurricane::PrivateProperty; using Hurricane::PrivateProperty;
@ -53,6 +58,8 @@ namespace CRL {
static Name getPropertyName (); static Name getPropertyName ();
virtual Name getName () const; virtual Name getName () const;
inline AllianceFramework* getFramework () const; inline AllianceFramework* getFramework () const;
virtual bool hasJson () const;
virtual void toJson ( JsonWriter*, const DBo* ) const;
virtual string _getTypeName () const; virtual string _getTypeName () const;
virtual Record* _getRecord () const; virtual Record* _getRecord () const;
private: private:
@ -60,10 +67,19 @@ namespace CRL {
AllianceFramework* _framework; AllianceFramework* _framework;
private: private:
inline AllianceFrameworkProperty ( AllianceFramework* ); inline AllianceFrameworkProperty ( AllianceFramework* );
public:
class JsonProperty : public JsonObject {
public:
static void initialize ();
JsonProperty ( unsigned long flags );
virtual string getTypeName () const;
virtual JsonProperty* clone ( unsigned long ) const;
virtual void toData ( JsonStack& );
};
}; };
Name AllianceFrameworkProperty::_name = "AllianceFramework"; Name AllianceFrameworkProperty::_name = "AllianceFrameworkProperty";
inline AllianceFrameworkProperty::AllianceFrameworkProperty ( AllianceFramework* af ) inline AllianceFrameworkProperty::AllianceFrameworkProperty ( AllianceFramework* af )
@ -107,6 +123,56 @@ namespace CRL {
} }
bool AllianceFrameworkProperty::hasJson () const
{ return true; }
void AllianceFrameworkProperty::toJson ( JsonWriter* w, const DBo* ) const
{
w->startObject();
std::string tname = getString(getPropertyName());
jsonWrite( w, "@typename" , tname );
jsonWrite( w, "_framework", _framework );
w->endObject();
}
Initializer<AllianceFrameworkProperty::JsonProperty> jsonFrameworkPropertyInit ( 20 );
AllianceFrameworkProperty::JsonProperty::JsonProperty ( unsigned long flags )
: JsonObject(flags)
{
add( "_framework", typeid(AllianceFramework*) );
}
string AllianceFrameworkProperty::JsonProperty::getTypeName () const
{ return getString(AllianceFrameworkProperty::getPropertyName()); }
void AllianceFrameworkProperty::JsonProperty::initialize ()
{ JsonTypes::registerType( new JsonProperty (JsonWriter::RegisterMode) ); }
AllianceFrameworkProperty::JsonProperty* AllianceFrameworkProperty::JsonProperty::clone ( unsigned long flags ) const
{ return new JsonProperty ( flags ); }
void AllianceFrameworkProperty::JsonProperty::toData ( JsonStack& stack )
{
check( stack, "AllianceFrameworkProperty::JsonProperty::toData" );
DBo* dbo = stack.back_dbo();
AllianceFramework* framework = get<AllianceFramework*>(stack,"_framework");
AllianceFrameworkProperty* property
= AllianceFrameworkProperty::create(framework);
if (dbo) dbo->put( property );
update( stack, property );
}
// ------------------------------------------------------------------- // -------------------------------------------------------------------
// Class : "CRL::AllianceFramework". // Class : "CRL::AllianceFramework".
@ -173,7 +239,7 @@ namespace CRL {
void AllianceFramework::_bindLibraries () void AllianceFramework::_bindLibraries ()
{ {
DataBase* db = DataBase::getDB (); DataBase* db = DataBase::getDB ();
unsigned int flags = InSearchPath; unsigned int flags = AppendLibrary;
SearchPath& LIBRARIES = _environment.getLIBRARIES (); SearchPath& LIBRARIES = _environment.getLIBRARIES ();
Library* rootLibrary = db->getRootLibrary (); Library* rootLibrary = db->getRootLibrary ();
@ -239,7 +305,7 @@ namespace CRL {
} }
AllianceLibrary* AllianceFramework::getAllianceLibrary ( const Name &libName, unsigned int& flags ) AllianceLibrary* AllianceFramework::getAllianceLibrary ( const Name &libName, unsigned int flags )
{ {
for ( size_t ilib=0 ; ilib<_libraries.size() ; ++ilib ) { for ( size_t ilib=0 ; ilib<_libraries.size() ; ++ilib ) {
if ( _libraries[ilib]->getLibrary()->getName() == libName ) if ( _libraries[ilib]->getLibrary()->getName() == libName )
@ -331,7 +397,7 @@ namespace CRL {
} }
AllianceLibrary* AllianceFramework::createLibrary ( const string& path, unsigned int& flags, string libName ) AllianceLibrary* AllianceFramework::createLibrary ( const string& path, unsigned int flags, string libName )
{ {
if ( libName.empty() ) libName = SearchPath::extractLibName(path); if ( libName.empty() ) libName = SearchPath::extractLibName(path);
@ -339,7 +405,7 @@ namespace CRL {
string dupLibName = libName; string dupLibName = libName;
for ( size_t duplicate=1 ; true ; ++duplicate ) { for ( size_t duplicate=1 ; true ; ++duplicate ) {
AllianceLibrary* library = getAllianceLibrary ( dupLibName, flags ); AllianceLibrary* library = getAllianceLibrary ( dupLibName, flags & ~CreateLibrary );
if (library == NULL) break; if (library == NULL) break;
ostringstream oss; ostringstream oss;
@ -355,31 +421,38 @@ namespace CRL {
// } // }
SearchPath& LIBRARIES = _environment.getLIBRARIES (); SearchPath& LIBRARIES = _environment.getLIBRARIES ();
if ( not (flags & InSearchPath) ) LIBRARIES.prepend ( path, dupLibName ); if ( not (flags & AppendLibrary) ) LIBRARIES.prepend ( path, dupLibName );
else LIBRARIES.select ( path ); else LIBRARIES.select ( path );
AllianceLibrary* library = new AllianceLibrary ( path, Library::create(getParentLibrary(),dupLibName) ); Library* hlibrary = getParentLibrary()->getLibrary( dupLibName );
if (not hlibrary)
hlibrary = Library::create( getParentLibrary(), dupLibName );
AllianceLibrary* alibrary = new AllianceLibrary ( path, hlibrary );
AllianceLibraries::iterator ilib = _libraries.begin(); AllianceLibraries::iterator ilib = _libraries.begin();
for ( size_t i=0 ; i<LIBRARIES.getIndex() ; ++i, ++ilib ); if (LIBRARIES.getIndex() != SearchPath::npos)
for ( size_t i=0 ; i<LIBRARIES.getIndex() ; ++i, ++ilib );
else
ilib = _libraries.end();
_libraries.insert ( ilib, library ); _libraries.insert ( ilib, alibrary );
string catalog = path + "/" + _environment.getCATALOG(); string catalog = path + "/" + _environment.getCATALOG();
if ( _catalog.loadFromFile(catalog,library->getLibrary()) ) flags |= HasCatalog; if ( _catalog.loadFromFile(catalog,alibrary->getLibrary()) ) flags |= HasCatalog;
ParserFormatSlot& parser = _parsers.getParserSlot ( path, Catalog::State::Physical, _environment ); ParserFormatSlot& parser = _parsers.getParserSlot ( path, Catalog::State::Physical, _environment );
if ( not parser.loadByLib() ) return library; if ( not parser.loadByLib() ) return alibrary;
// Load the whole library. // Load the whole library.
if ( ! _readLocate(dupLibName,Catalog::State::State::Logical,true) ) return library; if ( ! _readLocate(dupLibName,Catalog::State::State::Logical,true) ) return alibrary;
// Call the parser function. // Call the parser function.
(parser.getParsLib())( _environment.getLIBRARIES().getSelected() , library->getLibrary() , _catalog ); (parser.getParsLib())( _environment.getLIBRARIES().getSelected() , alibrary->getLibrary() , _catalog );
return library; return alibrary;
} }
@ -673,4 +746,53 @@ namespace CRL {
} }
void AllianceFramework::toJson ( JsonWriter* w ) const
{
w->startObject();
jsonWrite( w, "@typename" , _getTypeName() );
jsonWrite( w, "_environment", &_environment );
jsonWrite( w, "+libraries" , getCollection(getAllianceLibraries()) );
// Environement & Catalog...
w->endObject();
}
// -------------------------------------------------------------------
// Class : "CRL::JsonAllianceFramework".
Initializer<JsonAllianceFramework> jsonFrameworkInit ( 20 );
JsonAllianceFramework::JsonAllianceFramework (unsigned long flags )
: JsonObject(flags)
{
// Environement & Catalog...
add( "_environment", typeid(Environment*) );
add( "+libraries" , typeid(JsonArray) );
}
string JsonAllianceFramework::getTypeName () const
{ return "AllianceFramework"; }
void JsonAllianceFramework::initialize ()
{ JsonTypes::registerType( new JsonAllianceFramework (JsonWriter::RegisterMode) ); }
JsonAllianceFramework* JsonAllianceFramework::clone ( unsigned long flags ) const
{ return new JsonAllianceFramework ( flags ); }
void JsonAllianceFramework::toData ( JsonStack& stack )
{
check( stack, "JsonAllianceFramework::toData" );
// It's a singleton. Do not create it...
AllianceFramework* framework = AllianceFramework::get();
update( stack, framework );
}
} // End of CRL namespace. } // End of CRL namespace.

View File

@ -1,67 +1,38 @@
// -*- C++ -*- // -*- C++ -*-
// //
// This file is part of the Coriolis Project. // This file is part of the Coriolis Software.
// Copyright (C) Laboratoire LIP6 - Departement ASIM // Copyright (c) UPMC 2008-2015, All Rights Reserved
// Universite Pierre et Marie Curie
// //
// Main contributors : // +-----------------------------------------------------------------+
// Christophe Alexandre <Christophe.Alexandre@lip6.fr>
// Sophie Belloeil <Sophie.Belloeil@lip6.fr>
// Hugo Clément <Hugo.Clement@lip6.fr>
// Jean-Paul Chaput <Jean-Paul.Chaput@lip6.fr>
// Damien Dupuis <Damien.Dupuis@lip6.fr>
// Christian Masson <Christian.Masson@lip6.fr>
// Marek Sroka <Marek.Sroka@lip6.fr>
//
// The Coriolis Project is free software; you can redistribute it
// and/or modify it under the terms of the GNU General Public License
// as published by the Free Software Foundation; either version 2 of
// the License, or (at your option) any later version.
//
// The Coriolis Project is distributed in the hope that it will be
// useful, but WITHOUT ANY WARRANTY; without even the implied warranty
// of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with the Coriolis Project; if not, write to the Free Software
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
// USA
//
// License-Tag
// Authors-Tag
// ===================================================================
//
// $Id$
//
// x-----------------------------------------------------------------x
// | |
// | C O R I O L I S | // | C O R I O L I S |
// | Alliance / Hurricane Interface | // | Alliance / Hurricane Interface |
// | | // | |
// | Author : Rémy Escassut | // | Author : Jean-Paul CHAPUT |
// | E-mail : Remy.Escassut@silvaco.com | // | E-mail : Jean-Paul.Chaput@lip6.fr |
// | =============================================================== | // | =============================================================== |
// | C++ Header : "./AllianceLibrary.cpp" | // | C++ Module : "./AllianceLibrary.cpp" |
// | *************************************************************** | // +-----------------------------------------------------------------+
// | U p d a t e s |
// | |
// x-----------------------------------------------------------------x
# include "hurricane/Library.h"
# include "crlcore/Utilities.h"
# include "crlcore/AllianceLibrary.h"
#include "hurricane/Warning.h"
#include "hurricane/SharedPath.h"
#include "hurricane/Library.h"
#include "hurricane/DataBase.h"
#include "crlcore/Utilities.h"
#include "crlcore/AllianceLibrary.h"
#include "crlcore/AllianceFramework.h"
namespace CRL { namespace CRL {
using namespace std;
using Hurricane::Initializer;
using Hurricane::JsonTypes;
using Hurricane::Warning;
using Hurricane::Name;
using Hurricane::SharedPath;
using Hurricane::DataBase;
// ------------------------------------------------------------------- // -------------------------------------------------------------------
// Class : "AllianceDirectory". // Class : "AllianceDirectory".
@ -113,6 +84,89 @@ namespace CRL {
} }
void AllianceLibrary::toJson ( JsonWriter* w ) const
{
w->startObject();
jsonWrite( w, "@typename", _getTypeName() );
jsonWrite( w, "_path" , _path );
jsonWrite( w, "_library" , _library->getHierarchicalName() );
w->endObject();
}
// -------------------------------------------------------------------
// Class : "JsonAllianceLibrary".
Initializer<JsonAllianceLibrary> jsonAllianceLibraryInit ( 0 );
void JsonAllianceLibrary::initialize ()
{ JsonTypes::registerType( new JsonAllianceLibrary (JsonWriter::RegisterMode) ); }
JsonAllianceLibrary::JsonAllianceLibrary ( unsigned long flags )
: JsonObject(flags)
{
add( "_path" , typeid(string) );
add( "_library", typeid(string) );
}
string JsonAllianceLibrary::getTypeName () const
{ return "AllianceLibrary"; }
JsonAllianceLibrary* JsonAllianceLibrary::clone ( unsigned long flags ) const
{ return new JsonAllianceLibrary ( flags ); }
void JsonAllianceLibrary::toData ( JsonStack& stack )
{
check( stack, "JsonAllianceLibrary::toData" );
string libDbPath = get<string>( stack,"_library" );
string libOsPath = get<string>( stack,"_path" );
AllianceFramework* af = AllianceFramework::get();
Library* library = DataBase::getDB()->getLibrary( libDbPath
, DataBase::CreateLib|DataBase::WarnCreateLib );
AllianceLibrary* aLibrary = NULL;
if (library) {
aLibrary = af->getAllianceLibrary( library );
}
if (not aLibrary) {
char separator = SharedPath::getNameSeparator();
size_t dot = libDbPath.rfind( separator );
Name libName = libDbPath.substr(dot+1);
aLibrary = af->getAllianceLibrary( libName, AllianceFramework::AppendLibrary );
if (not aLibrary) {
aLibrary = af->getAllianceLibrary( libOsPath
, AllianceFramework::CreateLibrary
| AllianceFramework::AppendLibrary );
}
if (not library) library = aLibrary->getLibrary();
}
if (aLibrary->getLibrary() != library) {
cerr << Warning( "JsonAllianceLibrary::toData(): Underlying Hurricane Library discrepency for \"%s\".\n"
" (may be caused by a change in search path order)"
, getString(library->getName()).c_str()
) << endl;
}
if (aLibrary->getPath() != Name(libOsPath)) {
cerr << Warning( "JsonAllianceLibrary::toData(): Underlying OS path discrepency for \"%s\":\n"
" - Blob: %s\n"
" - System: %s"
, getString(library->getName()).c_str()
, libOsPath.c_str()
, getString(aLibrary->getPath()).c_str()
) << endl;
}
update( stack, aLibrary );
}
} // End of CRL namespace. } // End of CRL namespace.

View File

@ -17,15 +17,25 @@
# include <iomanip> # include <iomanip>
using namespace std; using namespace std;
#include "hurricane/Initializer.h"
#include "hurricane/SharedPath.h"
#include "hurricane/Collection.h" #include "hurricane/Collection.h"
#include "hurricane/DataBase.h"
#include "hurricane/Library.h" #include "hurricane/Library.h"
#include "hurricane/Name.h" #include "hurricane/Name.h"
#include "crlcore/Utilities.h" #include "crlcore/Utilities.h"
#include "crlcore/Catalog.h" #include "crlcore/Catalog.h"
#include "crlcore/AllianceFramework.h"
namespace CRL { namespace CRL {
using Hurricane::inltrace;
using Hurricane::tab;
using Hurricane::Initializer;
using Hurricane::JsonTypes;
using Hurricane::SharedPath;
using Hurricane::DataBase;
const char* MissingStateProperty = "%s:\n\n Missing Catalog State Property in cell \"%s\".\n"; const char* MissingStateProperty = "%s:\n\n Missing Catalog State Property in cell \"%s\".\n";
@ -89,6 +99,81 @@ namespace CRL {
return record; return record;
} }
void Catalog::State::toJson ( JsonWriter* w ) const
{
w->startObject();
jsonWrite( w, "@typename", _getTypeName() );
jsonWrite( w, "_flags" , _getString() );
jsonWrite( w, "_depth" , _depth );
string cellName = "";
if (_cell) cellName = getString( _cell->getHierarchicalName() );
jsonWrite( w, "_cell", cellName );
w->endObject();
}
Initializer<Catalog::State::JsonState> jsonCatalogStateInit ( 20 );
Catalog::State::JsonState::JsonState ( unsigned long flags )
: JsonObject(flags)
{
add( "_flags", typeid(string) );
add( "_depth", typeid(int64_t) );
add( "_cell" , typeid(string) );
}
string Catalog::State::JsonState::getTypeName () const
{ return "Catalog::State"; }
void Catalog::State::JsonState::initialize ()
{ JsonTypes::registerType( new JsonState (JsonWriter::RegisterMode) ); }
Catalog::State::JsonState* Catalog::State::JsonState::clone ( unsigned long flags ) const
{ return new JsonState ( flags ); }
void Catalog::State::JsonState::toData ( JsonStack& stack )
{
check( stack, "Catalog::State::JsonState::toData" );
string cellPath = get<string> ( stack, "_cell" );
string sflags = get<string> ( stack, "_flags" );
unsigned int depth = get<int64_t>( stack, "_depth" );
char separator = SharedPath::getNameSeparator();
size_t dot = cellPath.rfind( separator );
string cellName = cellPath.substr(dot+1);
string libraryName = cellPath.substr(0,dot);
Library* library = DataBase::getDB()->getLibrary( libraryName
, DataBase::CreateLib|DataBase::WarnCreateLib );
Cell* cell = library->getCell( cellName );
Catalog* catalog = AllianceFramework::get()->getCatalog();
Catalog::State* state = catalog->getState( cellName );
if (not state) state = catalog->getState( cellName, true );
if (state->getCell () != cell ) state->setCell ( cell );
if (state->getLibrary() != library) state->setLibrary( library );
state->setDepth( depth );
state->setFlattenLeaf( (sflags[0] == 'C') );
state->setFeed( (sflags[1] == 'F') );
state->setPad( (sflags[2] == 'P') );
state->setGds( (sflags[3] == 'G') );
state->setDelete( (sflags[4] == 'D') );
state->setInMemory( (sflags[5] == 'm') );
update( stack, state );
}
// ------------------------------------------------------------------- // -------------------------------------------------------------------
// Class : "Catalog". // Class : "Catalog".
@ -248,8 +333,7 @@ namespace CRL {
// ------------------------------------------------------------------- // -------------------------------------------------------------------
// Class : "CatalogProperty" // Class : "CatalogProperty"
Name CatalogProperty::_name = "Catalog::State::Property";
Name CatalogProperty::_name = "Alliance Catalog State";
CatalogProperty* CatalogProperty::create ( Catalog::State* state ) CatalogProperty* CatalogProperty::create ( Catalog::State* state )
@ -306,6 +390,76 @@ namespace CRL {
} }
bool CatalogProperty::hasJson () const
{ return true; }
void CatalogProperty::toJson ( JsonWriter* w, const DBo* ) const
{
w->startObject();
std::string tname = getString(getPropertyName());
jsonWrite( w, "@typename", tname );
jsonWrite( w, "_state" , _state );
w->endObject();
}
// -------------------------------------------------------------------
// Class : "JsonCatalogProperty"
Initializer<JsonCatalogProperty> jsonCatalogPropertyInit ( 20 );
JsonCatalogProperty::JsonCatalogProperty ( unsigned long flags )
: JsonObject(flags)
{
add( "_state", typeid(Catalog::State*) );
}
string JsonCatalogProperty::getTypeName () const
{ return getString(CatalogProperty::getPropertyName()); }
void JsonCatalogProperty::initialize ()
{ JsonTypes::registerType( new JsonCatalogProperty (JsonWriter::RegisterMode) ); }
JsonCatalogProperty* JsonCatalogProperty::clone ( unsigned long flags ) const
{ return new JsonCatalogProperty ( flags ); }
void JsonCatalogProperty::toData ( JsonStack& stack )
{
check( stack, "JsonCatalogProperty::toData" );
DBo* dbo = stack.back_dbo();
Catalog::State* state = get<Catalog::State*>( stack, "_state" );
CatalogProperty* property = NULL;
ltrace(51) << "topDBo:" << dbo << endl;
Cell* cell = dynamic_cast<Cell*>( dbo );
if (cell) {
Property* base = cell->getProperty( CatalogProperty::getPropertyName() );
if (base) {
property = static_cast<CatalogProperty*>( base );
if (property->getState() != state) {
cerr << Error( "JsonCatalogProperty::toData(): State object incoherency on Cell \"%s\"."
, getString(cell->getName()).c_str()
) << endl;
}
} else {
property = CatalogProperty::create( state );
cell->put( property );
}
}
// NULL Cell means we are parsing the Catalog.
update( stack, property );
}
// ------------------------------------------------------------------- // -------------------------------------------------------------------
// Class : "CatalogExtension" // Class : "CatalogExtension"

View File

@ -22,6 +22,7 @@
#include "crlcore/Utilities.h" #include "crlcore/Utilities.h"
#include "crlcore/XmlParser.h" #include "crlcore/XmlParser.h"
#include "crlcore/Environment.h" #include "crlcore/Environment.h"
#include "crlcore/AllianceFramework.h"
namespace { namespace {
@ -505,6 +506,12 @@ namespace {
namespace CRL { namespace CRL {
using Hurricane::Initializer;
using Hurricane::JsonTypes;
// -------------------------------------------------------------------
// Class : "Environment".
Environment::Environment () Environment::Environment ()
: _CORIOLIS_TOP (CORIOLIS_TOP) : _CORIOLIS_TOP (CORIOLIS_TOP)
@ -753,4 +760,83 @@ namespace CRL {
} }
void Environment::toJson ( JsonWriter* w ) const
{
w->startObject();
jsonWrite( w, "@typename" , _getTypeName() );
jsonWrite( w, "_CORIOLIS_TOP", _CORIOLIS_TOP );
jsonWrite( w, "_displayStyle", _displayStyle );
jsonWrite( w, "_SCALE_X" , _SCALE_X );
jsonWrite( w, "_IN_LO" , _IN_LO );
jsonWrite( w, "_IN_PH" , _IN_PH );
jsonWrite( w, "_OUT_LO" , _OUT_LO );
jsonWrite( w, "_OUT_PH" , _OUT_PH );
jsonWrite( w, "_POWER" , _POWER );
jsonWrite( w, "_GROUND" , _GROUND );
jsonWrite( w, "_CLOCK" , _CLOCK );
jsonWrite( w, "_BLOCKAGE" , _BLOCKAGE );
jsonWrite( w, "_pad" , _pad );
jsonWrite( w, "_CATALOG" , _CATALOG );
w->endObject();
}
// -------------------------------------------------------------------
// Class : "JsonEnvironment".
Initializer<JsonEnvironment> jsonEnvironmentInit ( 0 );
void JsonEnvironment::initialize ()
{ JsonTypes::registerType( new JsonEnvironment (JsonWriter::RegisterMode) ); }
JsonEnvironment::JsonEnvironment ( unsigned long flags )
: JsonObject(flags)
{
add( "_CORIOLIS_TOP", typeid(string) );
add( "_displayStyle", typeid(string) );
add( "_SCALE_X" , typeid(int64_t) );
add( "_IN_LO" , typeid(string) );
add( "_IN_PH" , typeid(string) );
add( "_OUT_LO" , typeid(string) );
add( "_OUT_PH" , typeid(string) );
add( "_POWER" , typeid(string) );
add( "_GROUND" , typeid(string) );
add( "_BLOCKAGE" , typeid(string) );
add( "_pad" , typeid(string) );
add( "_CATALOG" , typeid(string) );
add( "_CLOCK" , typeid(string) );
}
string JsonEnvironment::getTypeName () const
{ return "Environment"; }
JsonEnvironment* JsonEnvironment::clone ( unsigned long flags ) const
{ return new JsonEnvironment ( flags ); }
void JsonEnvironment::toData ( JsonStack& stack )
{
check( stack, "JsonEnvironment::toData" );
Environment* environement = AllianceFramework::get()->getEnvironment();
environement->setDisplayStyle( get<string> (stack,"_displayStyle").c_str() );
environement->setSCALE_X ( get<int64_t>(stack,"_SCALE_X" ) );
environement->setIN_LO ( get<string> (stack,"_IN_LO" ).c_str() );
environement->setIN_PH ( get<string> (stack,"_IN_PH" ).c_str() );
environement->setOUT_LO ( get<string> (stack,"_OUT_LO" ).c_str() );
environement->setOUT_PH ( get<string> (stack,"_OUT_PH" ).c_str() );
environement->setPOWER ( get<string> (stack,"_POWER" ).c_str() );
environement->setGROUND ( get<string> (stack,"_GROUND" ).c_str() );
environement->setCLOCK ( get<string> (stack,"_CLOCK" ).c_str() );
environement->setBLOCKAGE ( get<string> (stack,"_BLOCKAGE" ).c_str() );
environement->setPad ( get<string> (stack,"_pad" ).c_str() );
environement->setCATALOG ( get<string> (stack,"_CATALOG" ).c_str() );
update( stack, environement );
}
} // End of CRL namespace. } // End of CRL namespace.

View File

@ -1,4 +1,3 @@
// -*- C++ -*- // -*- C++ -*-
// //
// This file is part of the Coriolis Software. // This file is part of the Coriolis Software.
@ -18,17 +17,19 @@
#ifndef CRL_ALLIANCE_FRAMEWORK_H #ifndef CRL_ALLIANCE_FRAMEWORK_H
#define CRL_ALLIANCE_FRAMEWORK_H #define CRL_ALLIANCE_FRAMEWORK_H
#include <map> #include <map>
#include <limits> #include <limits>
#include "hurricane/Cell.h" #include "hurricane/Cell.h"
#include "crlcore/Environment.h" #include "crlcore/Environment.h"
#include "crlcore/AllianceLibrary.h" #include "crlcore/AllianceLibrary.h"
#include "crlcore/Catalog.h" #include "crlcore/Catalog.h"
#include "crlcore/ParsersDrivers.h" #include "crlcore/ParsersDrivers.h"
namespace CRL { namespace CRL {
using Hurricane::JsonObject;
using Hurricane::JsonStack;
using Hurricane::Cell; using Hurricane::Cell;
using Hurricane::Net; using Hurricane::Net;
class RoutingGauge; class RoutingGauge;
@ -37,8 +38,13 @@ namespace CRL {
class AllianceFramework { class AllianceFramework {
public: public:
enum InstancesCountFlags { Recursive=0x1, IgnoreFeeds=0x2 }; enum InstancesCountFlags { Recursive = (1<<0)
enum LibraryFlags { CreateLibrary=0x1, InSearchPath=0x2, HasCatalog=0x4 }; , IgnoreFeeds = (1<<1)
};
enum LibraryFlags { CreateLibrary = (1<<0)
, AppendLibrary = (1<<1)
, HasCatalog = (1<<2)
};
public: public:
// Constructors. // Constructors.
static AllianceFramework* create (); static AllianceFramework* create ();
@ -72,9 +78,9 @@ namespace CRL {
inline Library* getParentLibrary (); inline Library* getParentLibrary ();
Library* getLibrary ( unsigned int index ); Library* getLibrary ( unsigned int index );
AllianceLibrary* getAllianceLibrary ( unsigned int index ); AllianceLibrary* getAllianceLibrary ( unsigned int index );
AllianceLibrary* getAllianceLibrary ( const Name& libName, unsigned int& flags ); AllianceLibrary* getAllianceLibrary ( const Name& libName, unsigned int flags );
AllianceLibrary* getAllianceLibrary ( Library* ); AllianceLibrary* getAllianceLibrary ( Library* );
AllianceLibrary* createLibrary ( const string& path, unsigned int& flags, string libName="" ); AllianceLibrary* createLibrary ( const string& path, unsigned int flags, string libName="" );
inline const AllianceLibraries& getAllianceLibraries () const; inline const AllianceLibraries& getAllianceLibraries () const;
void saveLibrary ( Library* ); void saveLibrary ( Library* );
void saveLibrary ( AllianceLibrary* ); void saveLibrary ( AllianceLibrary* );
@ -95,6 +101,7 @@ namespace CRL {
unsigned int loadLibraryCells ( const Name& ); unsigned int loadLibraryCells ( const Name& );
static size_t getInstancesCount ( Cell*, unsigned int flags ); static size_t getInstancesCount ( Cell*, unsigned int flags );
// Hurricane Managment. // Hurricane Managment.
void toJson ( JsonWriter* ) const;
inline string _getTypeName () const; inline string _getTypeName () const;
string _getString () const; string _getString () const;
Record* _getRecord () const; Record* _getRecord () const;
@ -159,6 +166,16 @@ namespace CRL {
inline string AllianceFramework::_getTypeName () const { return "AllianceFramework"; } inline string AllianceFramework::_getTypeName () const { return "AllianceFramework"; }
class JsonAllianceFramework : public JsonObject {
public:
static void initialize ();
JsonAllianceFramework( unsigned long );
virtual string getTypeName () const;
virtual JsonAllianceFramework* clone ( unsigned long ) const;
virtual void toData ( JsonStack& );
};
} // CRL namespace. } // CRL namespace.

View File

@ -30,7 +30,8 @@ namespace Hurricane {
namespace CRL { namespace CRL {
using std::vector; using std::vector;
using Hurricane::JsonObject;
using Hurricane::JsonStack;
using Hurricane::Name; using Hurricane::Name;
using Hurricane::Library; using Hurricane::Library;
using Hurricane::Record; using Hurricane::Record;
@ -53,6 +54,7 @@ namespace CRL {
inline const Name& getPath () const; inline const Name& getPath () const;
inline Library* getLibrary () const; inline Library* getLibrary () const;
// Hurricane management. // Hurricane management.
void toJson ( JsonWriter* ) const;
inline std::string _getTypeName () const; inline std::string _getTypeName () const;
std::string _getString () const; std::string _getString () const;
Record* _getRecord () const; Record* _getRecord () const;
@ -74,6 +76,19 @@ namespace CRL {
inline std::string AllianceLibrary::_getTypeName () const { return _TName("AllianceLibrary"); } inline std::string AllianceLibrary::_getTypeName () const { return _TName("AllianceLibrary"); }
// -------------------------------------------------------------------
// Class : "JsonAllianceLibrary".
class JsonAllianceLibrary : public JsonObject {
public:
static void initialize ();
JsonAllianceLibrary ( unsigned long flags );
virtual std::string getTypeName () const;
virtual JsonAllianceLibrary* clone ( unsigned long flags ) const;
virtual void toData ( JsonStack& );
};
} // CRL namespace. } // CRL namespace.

View File

@ -34,6 +34,8 @@ namespace CRL {
using std::string; using std::string;
using std::map; using std::map;
using Hurricane::JsonObject;
using Hurricane::JsonStack;
using Hurricane::_TName; using Hurricane::_TName;
using Hurricane::Name; using Hurricane::Name;
using Hurricane::Record; using Hurricane::Record;
@ -106,6 +108,7 @@ namespace CRL {
inline bool setDelete ( bool value ); inline bool setDelete ( bool value );
inline bool setPhysical ( bool value ); inline bool setPhysical ( bool value );
inline bool setLogical ( bool value ); inline bool setLogical ( bool value );
inline bool setInMemory ( bool value );
// Accessors. // Accessors.
inline Cell* getCell () const; inline Cell* getCell () const;
inline Library* getLibrary () const; inline Library* getLibrary () const;
@ -116,6 +119,7 @@ namespace CRL {
inline Library* setLibrary ( Library* library ); inline Library* setLibrary ( Library* library );
inline void setDepth ( unsigned int depth ); inline void setDepth ( unsigned int depth );
// Hurricane Management. // Hurricane Management.
void toJson ( JsonWriter* w ) const;
inline string _getTypeName () const; inline string _getTypeName () const;
string _getString () const; string _getString () const;
Record* _getRecord () const; Record* _getRecord () const;
@ -126,7 +130,18 @@ namespace CRL {
unsigned int _depth; unsigned int _depth;
Cell* _cell; Cell* _cell;
Library* _library; Library* _library;
};
// Json Property.
public:
class JsonState : public JsonObject {
public:
static void initialize ();
JsonState ( unsigned long flags );
virtual string getTypeName () const;
virtual JsonState* clone ( unsigned long ) const;
virtual void toData ( JsonStack& );
};
};
private: private:
// Attributes. // Attributes.
@ -142,7 +157,6 @@ namespace CRL {
// ------------------------------------------------------------------- // -------------------------------------------------------------------
// Class : "CRL::CatalogProperty". // Class : "CRL::CatalogProperty".
class CatalogProperty : public PrivateProperty { class CatalogProperty : public PrivateProperty {
public: public:
@ -154,6 +168,8 @@ namespace CRL {
inline Catalog::State* getState () const; inline Catalog::State* getState () const;
inline void setState ( Catalog::State* state ); inline void setState ( Catalog::State* state );
virtual void onReleasedBy ( DBo* owner ); virtual void onReleasedBy ( DBo* owner );
virtual bool hasJson () const;
virtual void toJson ( JsonWriter* w, const DBo* ) const;
virtual string _getTypeName () const; virtual string _getTypeName () const;
virtual string _getString () const; virtual string _getString () const;
virtual Record* _getRecord () const; virtual Record* _getRecord () const;
@ -168,6 +184,19 @@ namespace CRL {
}; };
// -------------------------------------------------------------------
// Class : "CRL::JsonCatalogProperty".
class JsonCatalogProperty : public JsonObject {
public:
static void initialize ();
JsonCatalogProperty ( unsigned long );
virtual string getTypeName () const;
virtual JsonCatalogProperty* clone ( unsigned long ) const;
virtual void toData ( JsonStack& );
};
// ------------------------------------------------------------------- // -------------------------------------------------------------------
// Inline Functions. // Inline Functions.
@ -193,6 +222,7 @@ namespace CRL {
inline bool Catalog::State::setDelete ( bool value ) { return setFlags(Delete ,value); } inline bool Catalog::State::setDelete ( bool value ) { return setFlags(Delete ,value); }
inline bool Catalog::State::setPhysical ( bool value ) { return setFlags(Physical ,value); } inline bool Catalog::State::setPhysical ( bool value ) { return setFlags(Physical ,value); }
inline bool Catalog::State::setLogical ( bool value ) { return setFlags(Logical ,value); } inline bool Catalog::State::setLogical ( bool value ) { return setFlags(Logical ,value); }
inline bool Catalog::State::setInMemory ( bool value ) { return setFlags(InMemory ,value); }
inline Library* Catalog::State::setLibrary ( Library* library ) { return _library = library; } inline Library* Catalog::State::setLibrary ( Library* library ) { return _library = library; }
inline void Catalog::State::setDepth ( unsigned int depth ) { _depth = depth; } inline void Catalog::State::setDepth ( unsigned int depth ) { _depth = depth; }
inline Cell* Catalog::State::getCell () const { return _cell; } inline Cell* Catalog::State::getCell () const { return _cell; }

View File

@ -19,11 +19,18 @@
#include <regex.h> #include <regex.h>
#include <string> #include <string>
#include <crlcore/SearchPath.h> #include "hurricane/Commons.h"
#include "crlcore/SearchPath.h"
namespace CRL { namespace CRL {
using Hurricane::JsonObject;
using Hurricane::JsonStack;
// -------------------------------------------------------------------
// Class : "Environment".
class Environment { class Environment {
public: public:
@ -76,6 +83,7 @@ namespace CRL {
void addSYSTEM_LIBRARY ( const char* value, const char* libName, unsigned int mode=Append ); void addSYSTEM_LIBRARY ( const char* value, const char* libName, unsigned int mode=Append );
// Methods. // Methods.
std::string getPrint () const; std::string getPrint () const;
void toJson ( JsonWriter* ) const;
inline std::string _getTypeName () const; inline std::string _getTypeName () const;
std::string _getString () const; std::string _getString () const;
Record* _getRecord () const; Record* _getRecord () const;
@ -134,6 +142,19 @@ namespace CRL {
inline std::string Environment::_getTypeName () const { return "Environment"; } inline std::string Environment::_getTypeName () const { return "Environment"; }
// -------------------------------------------------------------------
// Class : "JsonEnvironment".
class JsonEnvironment : public JsonObject {
public:
static void initialize ();
JsonEnvironment ( unsigned long flags );
virtual std::string getTypeName () const;
virtual JsonEnvironment* clone ( unsigned long flags ) const;
virtual void toData ( JsonStack& );
};
} // CRL namespace. } // CRL namespace.

View File

@ -41,79 +41,80 @@
<li><a class="reference internal" href="#release-1-0-1963" id="id15">Release 1.0.1963</a></li> <li><a class="reference internal" href="#release-1-0-1963" id="id15">Release 1.0.1963</a></li>
<li><a class="reference internal" href="#release-1-0-2049" id="id16">Release 1.0.2049</a></li> <li><a class="reference internal" href="#release-1-0-2049" id="id16">Release 1.0.2049</a></li>
<li><a class="reference internal" href="#release-v2-0-1" id="id17">Release v2.0.1</a></li> <li><a class="reference internal" href="#release-v2-0-1" id="id17">Release v2.0.1</a></li>
<li><a class="reference internal" href="#release-v2-1" id="id18"><strong>Release v2.1</strong></a></li> <li><a class="reference internal" href="#release-v2-1" id="id18">Release v2.1</a></li>
<li><a class="reference internal" href="#release-v2-2" id="id19"><strong>Release v2.2</strong></a></li>
</ul> </ul>
</li> </li>
<li><a class="reference internal" href="#installation" id="id19">Installation</a><ul> <li><a class="reference internal" href="#installation" id="id20">Installation</a><ul>
<li><a class="reference internal" href="#fixed-directory-tree" id="id20">Fixed Directory Tree</a></li> <li><a class="reference internal" href="#fixed-directory-tree" id="id21">Fixed Directory Tree</a></li>
<li><a class="reference internal" href="#building-coriolis" id="id21">Building Coriolis</a><ul> <li><a class="reference internal" href="#building-coriolis" id="id22">Building Coriolis</a><ul>
<li><a class="reference internal" href="#building-the-devel-branch" id="id22">Building the Devel Branch</a></li> <li><a class="reference internal" href="#building-the-devel-branch" id="id23">Building the Devel Branch</a></li>
<li><a class="reference internal" href="#additionnal-requirement-under-macos" id="id23">Additionnal Requirement under <span class="sc">MacOS</span></a></li> <li><a class="reference internal" href="#additionnal-requirement-under-macos" id="id24">Additionnal Requirement under <span class="sc">MacOS</span></a></li>
</ul> </ul>
</li> </li>
<li><a class="reference internal" href="#packaging-coriolis" id="id24">Packaging Coriolis</a></li> <li><a class="reference internal" href="#packaging-coriolis" id="id25">Packaging Coriolis</a></li>
<li><a class="reference internal" href="#hooking-up-into-alliance" id="id25">Hooking up into <span class="sc">Alliance</span></a></li> <li><a class="reference internal" href="#hooking-up-into-alliance" id="id26">Hooking up into <span class="sc">Alliance</span></a></li>
<li><a class="reference internal" href="#setting-up-the-environment-coriolisenv-py" id="id26">Setting up the Environment (coriolisEnv.py)</a></li> <li><a class="reference internal" href="#setting-up-the-environment-coriolisenv-py" id="id27">Setting up the Environment (coriolisEnv.py)</a></li>
</ul> </ul>
</li> </li>
<li><a class="reference internal" href="#documentation" id="id27">Documentation</a><ul> <li><a class="reference internal" href="#documentation" id="id28">Documentation</a><ul>
<li><a class="reference internal" href="#general-software-architecture" id="id28">General Software Architecture</a></li> <li><a class="reference internal" href="#general-software-architecture" id="id29">General Software Architecture</a></li>
</ul> </ul>
</li> </li>
<li><a class="reference internal" href="#coriolis-configuration-initialisation" id="id29">Coriolis Configuration &amp; Initialisation</a><ul> <li><a class="reference internal" href="#coriolis-configuration-initialisation" id="id30">Coriolis Configuration &amp; Initialisation</a><ul>
<li><a class="reference internal" href="#first-stage-symbolic-technology-selection" id="id30">First Stage: Symbolic Technology Selection</a></li> <li><a class="reference internal" href="#first-stage-symbolic-technology-selection" id="id31">First Stage: Symbolic Technology Selection</a></li>
<li><a class="reference internal" href="#second-stage-technology-configuration-loading" id="id31">Second Stage: Technology Configuration Loading</a></li> <li><a class="reference internal" href="#second-stage-technology-configuration-loading" id="id32">Second Stage: Technology Configuration Loading</a></li>
<li><a class="reference internal" href="#configuration-helpers" id="id32">Configuration Helpers</a><ul> <li><a class="reference internal" href="#configuration-helpers" id="id33">Configuration Helpers</a><ul>
<li><a class="reference internal" href="#id1" id="id33"><span class="sc">Alliance</span> Helper</a></li> <li><a class="reference internal" href="#id1" id="id34"><span class="sc">Alliance</span> Helper</a></li>
<li><a class="reference internal" href="#tools-configuration-helpers" id="id34">Tools Configuration Helpers</a></li> <li><a class="reference internal" href="#tools-configuration-helpers" id="id35">Tools Configuration Helpers</a></li>
</ul> </ul>
</li> </li>
<li><a class="reference internal" href="#hacking-the-configuration-files" id="id35">Hacking the Configuration Files</a></li> <li><a class="reference internal" href="#hacking-the-configuration-files" id="id36">Hacking the Configuration Files</a></li>
</ul> </ul>
</li> </li>
<li><a class="reference internal" href="#cgt-the-graphical-interface" id="id36">CGT - The Graphical Interface</a></li> <li><a class="reference internal" href="#cgt-the-graphical-interface" id="id37">CGT - The Graphical Interface</a></li>
<li><a class="reference internal" href="#id2" id="id37">Viewer &amp; Tools</a><ul> <li><a class="reference internal" href="#id2" id="id38">Viewer &amp; Tools</a><ul>
<li><a class="reference internal" href="#stratus-netlist-capture" id="id38"><span class="sc">Stratus</span> Netlist Capture</a></li> <li><a class="reference internal" href="#stratus-netlist-capture" id="id39"><span class="sc">Stratus</span> Netlist Capture</a></li>
<li><a class="reference internal" href="#the-hurricane-data-base" id="id39">The <span class="sc">Hurricane</span> Data-Base</a></li> <li><a class="reference internal" href="#the-hurricane-data-base" id="id40">The <span class="sc">Hurricane</span> Data-Base</a></li>
<li><a class="reference internal" href="#synthetizing-and-loading-a-design" id="id40">Synthetizing and loading a design</a><ul> <li><a class="reference internal" href="#synthetizing-and-loading-a-design" id="id41">Synthetizing and loading a design</a><ul>
<li><a class="reference internal" href="#synthesis-under-yosys" id="id41">Synthesis under Yosys</a></li> <li><a class="reference internal" href="#synthesis-under-yosys" id="id42">Synthesis under Yosys</a></li>
<li><a class="reference internal" href="#synthesis-under-alliance" id="id42">Synthesis under Alliance</a></li> <li><a class="reference internal" href="#synthesis-under-alliance" id="id43">Synthesis under Alliance</a></li>
</ul> </ul>
</li> </li>
<li><a class="reference internal" href="#etesian-placer" id="id43">Etesian -- Placer</a><ul> <li><a class="reference internal" href="#etesian-placer" id="id44">Etesian -- Placer</a><ul>
<li><a class="reference internal" href="#etesian-configuration-parameters" id="id44">Etesian Configuration Parameters</a></li> <li><a class="reference internal" href="#etesian-configuration-parameters" id="id45">Etesian Configuration Parameters</a></li>
</ul> </ul>
</li> </li>
<li><a class="reference internal" href="#knik-global-router" id="id45">Knik -- Global Router</a></li> <li><a class="reference internal" href="#knik-global-router" id="id46">Knik -- Global Router</a></li>
<li><a class="reference internal" href="#kite-detailed-router" id="id46">Kite -- Detailed Router</a><ul> <li><a class="reference internal" href="#kite-detailed-router" id="id47">Kite -- Detailed Router</a><ul>
<li><a class="reference internal" href="#kite-configuration-parameters" id="id47">Kite Configuration Parameters</a></li> <li><a class="reference internal" href="#kite-configuration-parameters" id="id48">Kite Configuration Parameters</a></li>
</ul> </ul>
</li> </li>
<li><a class="reference internal" href="#executing-python-scripts-in-cgt" id="id48">Executing Python Scripts in Cgt</a></li> <li><a class="reference internal" href="#executing-python-scripts-in-cgt" id="id49">Executing Python Scripts in Cgt</a></li>
<li><a class="reference internal" href="#printing-snapshots" id="id49">Printing &amp; Snapshots</a></li> <li><a class="reference internal" href="#printing-snapshots" id="id50">Printing &amp; Snapshots</a></li>
<li><a class="reference internal" href="#memento-of-shortcuts-in-graphic-mode" id="id50">Memento of Shortcuts in Graphic Mode</a></li> <li><a class="reference internal" href="#memento-of-shortcuts-in-graphic-mode" id="id51">Memento of Shortcuts in Graphic Mode</a></li>
<li><a class="reference internal" href="#cgt-command-line-options" id="id51">Cgt Command Line Options</a></li> <li><a class="reference internal" href="#cgt-command-line-options" id="id52">Cgt Command Line Options</a></li>
<li><a class="reference internal" href="#miscellaneous-settings" id="id52">Miscellaneous Settings</a></li> <li><a class="reference internal" href="#miscellaneous-settings" id="id53">Miscellaneous Settings</a></li>
</ul> </ul>
</li> </li>
<li><a class="reference internal" href="#id3" id="id53">The Controller</a><ul> <li><a class="reference internal" href="#id3" id="id54">The Controller</a><ul>
<li><a class="reference internal" href="#id4" id="id54">The Look Tab</a></li> <li><a class="reference internal" href="#id4" id="id55">The Look Tab</a></li>
<li><a class="reference internal" href="#id5" id="id55">The Filter Tab</a></li> <li><a class="reference internal" href="#id5" id="id56">The Filter Tab</a></li>
<li><a class="reference internal" href="#id6" id="id56">The Layers&amp;Go Tab</a></li> <li><a class="reference internal" href="#id6" id="id57">The Layers&amp;Go Tab</a></li>
<li><a class="reference internal" href="#id7" id="id57">The Netlist Tab</a></li> <li><a class="reference internal" href="#id7" id="id58">The Netlist Tab</a></li>
<li><a class="reference internal" href="#id8" id="id58">The Selection Tab</a></li> <li><a class="reference internal" href="#id8" id="id59">The Selection Tab</a></li>
<li><a class="reference internal" href="#id9" id="id59">The Inspector Tab</a></li> <li><a class="reference internal" href="#id9" id="id60">The Inspector Tab</a></li>
<li><a class="reference internal" href="#id10" id="id60">The Settings Tab</a></li> <li><a class="reference internal" href="#id10" id="id61">The Settings Tab</a></li>
</ul> </ul>
</li> </li>
<li><a class="reference internal" href="#python-interface-for-hurricane-coriolis" id="id61">Python Interface for <span class="sc">Hurricane</span> / <span class="sc">Coriolis</span></a></li> <li><a class="reference internal" href="#python-interface-for-hurricane-coriolis" id="id62">Python Interface for <span class="sc">Hurricane</span> / <span class="sc">Coriolis</span></a></li>
<li><a class="reference internal" href="#plugins" id="id62">Plugins</a><ul> <li><a class="reference internal" href="#plugins" id="id63">Plugins</a><ul>
<li><a class="reference internal" href="#chip-placement" id="id63">Chip Placement</a></li> <li><a class="reference internal" href="#chip-placement" id="id64">Chip Placement</a></li>
<li><a class="reference internal" href="#clock-tree" id="id64">Clock Tree</a></li> <li><a class="reference internal" href="#clock-tree" id="id65">Clock Tree</a></li>
<li><a class="reference internal" href="#recursive-save-rsave" id="id65">Recursive-Save (RSave)</a></li> <li><a class="reference internal" href="#recursive-save-rsave" id="id66">Recursive-Save (RSave)</a></li>
</ul> </ul>
</li> </li>
<li><a class="reference internal" href="#a-simple-example-am2901" id="id66">A Simple Example: AM2901</a></li> <li><a class="reference internal" href="#a-simple-example-am2901" id="id67">A Simple Example: AM2901</a></li>
</ul> </ul>
</li> </li>
</ul> </ul>
@ -215,7 +216,7 @@ achieve a speedup factor greater than 20...</li>
</ol> </ol>
</div> </div>
<div class="section" id="release-v2-1"> <div class="section" id="release-v2-1">
<h3><a class="toc-backref" href="#id18"><strong>Release v2.1</strong></a></h3> <h3><a class="toc-backref" href="#id18">Release v2.1</a></h3>
<ol class="arabic simple"> <ol class="arabic simple">
<li>Replace the old simulated annealing placer <span class="sc">Mauka</span> by the analytical placer <li>Replace the old simulated annealing placer <span class="sc">Mauka</span> by the analytical placer
<span class="sc">Etesian</span> and its legalization and detailed placement tools.</li> <span class="sc">Etesian</span> and its legalization and detailed placement tools.</li>
@ -229,11 +230,19 @@ is back from <tt class="docutils literal">.conf</tt> to <tt class="docutils lite
<!-- When shifting to the left, the right-half part of the screen gets --> <!-- When shifting to the left, the right-half part of the screen gets -->
<!-- badly redrawn. Uses |CTRL_L| to refresh. It will be corrected as soon --> <!-- badly redrawn. Uses |CTRL_L| to refresh. It will be corrected as soon -->
<!-- as possible. --> <!-- as possible. -->
</div>
<div class="section" id="release-v2-2">
<h3><a class="toc-backref" href="#id19"><strong>Release v2.2</strong></a></h3>
<ol class="arabic simple">
<li>Added JSON import/export of the whole Hurricane DataBase. Two save mode
are supported: <em>Cell</em> mode (standalone) or <em>Blob</em> mode, which dump the
whole design down and including the standard cells.</li>
</ol>
<p><span class="raw-html"><hr></span></p> <p><span class="raw-html"><hr></span></p>
</div> </div>
</div> </div>
<div class="section" id="installation"> <div class="section" id="installation">
<h2><a class="toc-backref" href="#id19">Installation</a></h2> <h2><a class="toc-backref" href="#id20">Installation</a></h2>
<div class="note"> <div class="note">
<p class="first admonition-title">Note</p> <p class="first admonition-title">Note</p>
<p class="last">As the sources are being released, the binary packaging is dropped. <p class="last">As the sources are being released, the binary packaging is dropped.
@ -245,9 +254,11 @@ running the <span class="cb">ccb</span> installer.</p>
<ul class="simple"> <ul class="simple">
<li>cmake</li> <li>cmake</li>
<li>C++11-capable compiler</li> <li>C++11-capable compiler</li>
<li><a class="reference external" href="http://miloyip.github.io/rapidjson/">RapidJSON</a></li>
<li>python2.7</li> <li>python2.7</li>
<li>boost</li> <li>boost</li>
<li>libxml2</li> <li>libxml2</li>
<li>bzip2</li>
<li>yacc &amp; lex</li> <li>yacc &amp; lex</li>
<li>Qt 4 or Qt 5</li> <li>Qt 4 or Qt 5</li>
</ul> </ul>
@ -272,7 +283,7 @@ A repository of <span class="sc">coin-or</span> packages backported from <span c
<p>For other distributions, refer to their own packaging system.</p> <p>For other distributions, refer to their own packaging system.</p>
<p><span class="raw-html"><hr></span></p> <p><span class="raw-html"><hr></span></p>
<div class="section" id="fixed-directory-tree"> <div class="section" id="fixed-directory-tree">
<h3><a class="toc-backref" href="#id20">Fixed Directory Tree</a></h3> <h3><a class="toc-backref" href="#id21">Fixed Directory Tree</a></h3>
<p>In order to simplificate the work of the <span class="cb">ccb</span> installer, the source, build <p>In order to simplificate the work of the <span class="cb">ccb</span> installer, the source, build
and installation tree is fixed. To successfully compile <span class="sc">Coriolis</span> you must and installation tree is fixed. To successfully compile <span class="sc">Coriolis</span> you must
follow it exactly. The tree is relative to the home directory of the user follow it exactly. The tree is relative to the home directory of the user
@ -366,23 +377,30 @@ and Python modules (which must be dynamic).</p>
<p><span class="raw-html"><hr></span></p> <p><span class="raw-html"><hr></span></p>
</div> </div>
<div class="section" id="building-coriolis"> <div class="section" id="building-coriolis">
<h3><a class="toc-backref" href="#id21">Building Coriolis</a></h3> <h3><a class="toc-backref" href="#id22">Building Coriolis</a></h3>
<p>The first step is to create the source directory and pull the <span class="cb">git</span> repository:</p> <p>First step is to install the prerequisites. Currently, only <a class="reference external" href="http://miloyip.github.io/rapidjson/">RapidJSON</a>:</p>
<pre class="literal-block">
dummy&#64;lepka:~$ mkdir -p ~/coriolis-2.x/src/support
dummy&#64;lepka:~$ git clone http://github.com/miloyip/rapidjson
</pre>
<p>The second step is to create the source directory and pull the <span class="cb">git</span> repository:</p>
<pre class="literal-block"> <pre class="literal-block">
dummy&#64;lepka:~$ mkdir -p ~/coriolis-2.x/src dummy&#64;lepka:~$ mkdir -p ~/coriolis-2.x/src
dummy&#64;lepka:~$ cd ~/coriolis-2.x/src dummy&#64;lepka:~$ cd ~/coriolis-2.x/src
dummy&#64;lepka:~$ git clone https://www-soc.lip6.fr/git/coriolis.git dummy&#64;lepka:~$ git clone https://www-soc.lip6.fr/git/coriolis.git
</pre> </pre>
<p>Second and final step, build &amp; install:</p> <p>Third and final step, build &amp; install:</p>
<pre class="literal-block"> <pre class="literal-block">
dummy&#64;lepka:src$ ./bootstrap/ccp.py --project=coriolis \ dummy&#64;lepka:src$ ./bootstrap/ccp.py --project=support \
--project=coriolis \
--make=&quot;-j4 install&quot; --make=&quot;-j4 install&quot;
dummy&#64;lepka:src$ ./bootstrap/ccb.py --project=coriolis \ dummy&#64;lepka:src$ ./bootstrap/ccb.py --project=support \
--project=coriolis \
--doc --make=&quot;-j1 install&quot; --doc --make=&quot;-j1 install&quot;
</pre> </pre>
<p>We need two steps because the documentation do not support to be generated with <p>We need to separate to perform a separate installation of the documentation because it
a parallel build. So we compile &amp; install in a first step in <tt class="docutils literal"><span class="pre">-j4</span></tt> (or whatever) do not support to be generated with a parallel build. So we compile &amp; install in a first
then we generate the documentation in <tt class="docutils literal"><span class="pre">-j1</span></tt></p> stage in <tt class="docutils literal"><span class="pre">-j4</span></tt> (or whatever) then we generate the documentation in <tt class="docutils literal"><span class="pre">-j1</span></tt></p>
<p>Under <span class="sc">rhel6</span> or clones, you must build using the <span class="cb">devtoolset2</span>:</p> <p>Under <span class="sc">rhel6</span> or clones, you must build using the <span class="cb">devtoolset2</span>:</p>
<pre class="literal-block"> <pre class="literal-block">
dummy&#64;lepka:src$ ./bootstrap/ccp.py --project=coriolis \ dummy&#64;lepka:src$ ./bootstrap/ccp.py --project=coriolis \
@ -392,7 +410,7 @@ dummy&#64;lepka:src$ ./bootstrap/ccp.py --project=coriolis \
<p>The complete list of <span class="cb">ccb</span> functionalities can be accessed with the <tt class="docutils literal"><span class="pre">--help</span></tt> argument. <p>The complete list of <span class="cb">ccb</span> functionalities can be accessed with the <tt class="docutils literal"><span class="pre">--help</span></tt> argument.
It also may be run in graphical mode (<tt class="docutils literal"><span class="pre">--gui</span></tt>).</p> It also may be run in graphical mode (<tt class="docutils literal"><span class="pre">--gui</span></tt>).</p>
<div class="section" id="building-the-devel-branch"> <div class="section" id="building-the-devel-branch">
<h4><a class="toc-backref" href="#id22">Building the Devel Branch</a></h4> <h4><a class="toc-backref" href="#id23">Building the Devel Branch</a></h4>
<p>In the <span class="sc">Coriolis</span> <span class="cb">git</span> repository, two branches are present:</p> <p>In the <span class="sc">Coriolis</span> <span class="cb">git</span> repository, two branches are present:</p>
<ul> <ul>
<li><p class="first">The <span class="cb">master</span> branch, which contains the latest stable version. This is the <li><p class="first">The <span class="cb">master</span> branch, which contains the latest stable version. This is the
@ -418,7 +436,7 @@ dummy&#64;lepka:work$ gdb python core.XXXX
<p><span class="raw-html"><hr></span></p> <p><span class="raw-html"><hr></span></p>
</div> </div>
<div class="section" id="additionnal-requirement-under-macos"> <div class="section" id="additionnal-requirement-under-macos">
<h4><a class="toc-backref" href="#id23">Additionnal Requirement under <span class="sc">MacOS</span></a></h4> <h4><a class="toc-backref" href="#id24">Additionnal Requirement under <span class="sc">MacOS</span></a></h4>
<p><span class="sc">Coriolis</span> make uses of the <span class="cb">boost::python</span> module, but the <span class="sc">MacPorts</span> <span class="cb">boost</span> <p><span class="sc">Coriolis</span> make uses of the <span class="cb">boost::python</span> module, but the <span class="sc">MacPorts</span> <span class="cb">boost</span>
seems unable to work with the <span class="sc">Python</span> bundled with <span class="sc">MacOS</span>. So you have to install seems unable to work with the <span class="sc">Python</span> bundled with <span class="sc">MacOS</span>. So you have to install
both of them from <span class="sc">MacPorts</span>:</p> both of them from <span class="sc">MacPorts</span>:</p>
@ -433,7 +451,7 @@ the system.</p>
</div> </div>
</div> </div>
<div class="section" id="packaging-coriolis"> <div class="section" id="packaging-coriolis">
<h3><a class="toc-backref" href="#id24">Packaging Coriolis</a></h3> <h3><a class="toc-backref" href="#id25">Packaging Coriolis</a></h3>
<p>Packager should not uses <span class="cb">ccb</span>, instead <tt class="docutils literal">bootstrap/Makefile.package</tt> is provided <p>Packager should not uses <span class="cb">ccb</span>, instead <tt class="docutils literal">bootstrap/Makefile.package</tt> is provided
to emulate a top-level <tt class="docutils literal">autotool</tt> makefile. Just copy it in the root of the to emulate a top-level <tt class="docutils literal">autotool</tt> makefile. Just copy it in the root of the
<span class="sc">Coriolis</span> git repository (<tt class="docutils literal"><span class="pre">~/corriolis-2.x/src/coriolis/</span></tt>) and build.</p> <span class="sc">Coriolis</span> git repository (<tt class="docutils literal"><span class="pre">~/corriolis-2.x/src/coriolis/</span></tt>) and build.</p>
@ -444,7 +462,7 @@ to emulate a top-level <tt class="docutils literal">autotool</tt> makefile. Just
</ul> </ul>
</div> </div>
<div class="section" id="hooking-up-into-alliance"> <div class="section" id="hooking-up-into-alliance">
<h3><a class="toc-backref" href="#id25">Hooking up into <span class="sc">Alliance</span></a></h3> <h3><a class="toc-backref" href="#id26">Hooking up into <span class="sc">Alliance</span></a></h3>
<p><span class="sc">Coriolis</span> relies on <span class="sc">Alliance</span> for the cell libraries. So after installing or <p><span class="sc">Coriolis</span> relies on <span class="sc">Alliance</span> for the cell libraries. So after installing or
packaging, you must configure it so that it can found those libraries.</p> packaging, you must configure it so that it can found those libraries.</p>
<p>This is done by editing the one variable <span class="cb">cellsTop</span> in the <span class="sc">Alliance</span> helper <p>This is done by editing the one variable <span class="cb">cellsTop</span> in the <span class="sc">Alliance</span> helper
@ -453,7 +471,7 @@ cells libraries. In a typical installation, this is generally
<span class="cb">/usr/share/alliance/cells</span>.</p> <span class="cb">/usr/share/alliance/cells</span>.</p>
</div> </div>
<div class="section" id="setting-up-the-environment-coriolisenv-py"> <div class="section" id="setting-up-the-environment-coriolisenv-py">
<h3><a class="toc-backref" href="#id26">Setting up the Environment (coriolisEnv.py)</a></h3> <h3><a class="toc-backref" href="#id27">Setting up the Environment (coriolisEnv.py)</a></h3>
<p>To simplify the tedious task of configuring your environment, a helper is provided <p>To simplify the tedious task of configuring your environment, a helper is provided
in the <tt class="docutils literal">bootstrap</tt> source directory (also installed in the directory in the <tt class="docutils literal">bootstrap</tt> source directory (also installed in the directory
<tt class="docutils literal"><span class="pre">.../install/etc/coriolis2/</span></tt>) :</p> <tt class="docutils literal"><span class="pre">.../install/etc/coriolis2/</span></tt>) :</p>
@ -479,7 +497,7 @@ alias c2r='eval &quot;`~/coriolis-2.x/src/coriolis/bootstrap/coriolisEnv.py`&quo
</div> </div>
</div> </div>
<div class="section" id="documentation"> <div class="section" id="documentation">
<h2><a class="toc-backref" href="#id27">Documentation</a></h2> <h2><a class="toc-backref" href="#id28">Documentation</a></h2>
<p>The general index of the documentation for the various parts of Coriolis <p>The general index of the documentation for the various parts of Coriolis
are avalaibles here <a class="reference external" href="file:///usr/share/doc/coriolis2/index.html">Coriolis Tools Documentation</a>.</p> are avalaibles here <a class="reference external" href="file:///usr/share/doc/coriolis2/index.html">Coriolis Tools Documentation</a>.</p>
<div class="note"> <div class="note">
@ -491,7 +509,7 @@ mimic <em>as closely as possible</em> the C++ interface, so the documentation
applies to both languages with only minor syntactic changes.</p> applies to both languages with only minor syntactic changes.</p>
</div> </div>
<div class="section" id="general-software-architecture"> <div class="section" id="general-software-architecture">
<h3><a class="toc-backref" href="#id28">General Software Architecture</a></h3> <h3><a class="toc-backref" href="#id29">General Software Architecture</a></h3>
<p><span class="sc">Coriolis</span> has been build with respect of the classical paradigm that the <p><span class="sc">Coriolis</span> has been build with respect of the classical paradigm that the
computational instensive parts have been written in C++, and almost computational instensive parts have been written in C++, and almost
everything else in <span class="sc">Python</span>. To build the <span class="sc">Python</span> interface we used everything else in <span class="sc">Python</span>. To build the <span class="sc">Python</span> interface we used
@ -506,7 +524,7 @@ or C++/<span class="sc">Python</span> secure bi-directional object deletion.</li
</div> </div>
</div> </div>
<div class="section" id="coriolis-configuration-initialisation"> <div class="section" id="coriolis-configuration-initialisation">
<h2><a class="toc-backref" href="#id29">Coriolis Configuration &amp; Initialisation</a></h2> <h2><a class="toc-backref" href="#id30">Coriolis Configuration &amp; Initialisation</a></h2>
<p>All configuration &amp; initialization files are Python scripts, despite their <p>All configuration &amp; initialization files are Python scripts, despite their
<span class="cb">.conf</span> extention. From a syntactic point of view, there is no difference <span class="cb">.conf</span> extention. From a syntactic point of view, there is no difference
between the system-wide configuration files and the user's configuration, between the system-wide configuration files and the user's configuration,
@ -518,7 +536,7 @@ they may use the same Python helpers.
<li>Loading the complete configuration for the given technology.</li> <li>Loading the complete configuration for the given technology.</li>
</ol> </ol>
<div class="section" id="first-stage-symbolic-technology-selection"> <div class="section" id="first-stage-symbolic-technology-selection">
<h3><a class="toc-backref" href="#id30">First Stage: Symbolic Technology Selection</a></h3> <h3><a class="toc-backref" href="#id31">First Stage: Symbolic Technology Selection</a></h3>
<p><span class="raw-html"><p class="empty"></p></span> <p><span class="raw-html"><p class="empty"></p></span>
The initialization process is done by executing, in order, the following The initialization process is done by executing, in order, the following
file(s):</p> file(s):</p>
@ -559,7 +577,7 @@ realTechno = 'hcmos9'
</pre> </pre>
</div> </div>
<div class="section" id="second-stage-technology-configuration-loading"> <div class="section" id="second-stage-technology-configuration-loading">
<h3><a class="toc-backref" href="#id31">Second Stage: Technology Configuration Loading</a></h3> <h3><a class="toc-backref" href="#id32">Second Stage: Technology Configuration Loading</a></h3>
<p><span class="raw-html"><p class="empty"></p></span> <p><span class="raw-html"><p class="empty"></p></span>
The <span class="cb">TECHNO</span> variable is set by the first stage and it's the name of the The <span class="cb">TECHNO</span> variable is set by the first stage and it's the name of the
symbolic technology. A directory of that name, with all the configuration files, symbolic technology. A directory of that name, with all the configuration files,
@ -604,7 +622,7 @@ which <em>must</em> contain a <span class="cb">coriolisConfigure()</span> functi
</div> </div>
</div> </div>
<div class="section" id="configuration-helpers"> <div class="section" id="configuration-helpers">
<h3><a class="toc-backref" href="#id32">Configuration Helpers</a></h3> <h3><a class="toc-backref" href="#id33">Configuration Helpers</a></h3>
<p>To ease the writing of configuration files, a set of small helpers <p>To ease the writing of configuration files, a set of small helpers
is available. They allow to setup the configuration parameters through is available. They allow to setup the configuration parameters through
simple assembly of tuples. The helpers are installed under the directory:</p> simple assembly of tuples. The helpers are installed under the directory:</p>
@ -614,7 +632,7 @@ simple assembly of tuples. The helpers are installed under the directory:</p>
<p>Where <span class="cb">&lt;install&gt;/</span> is the root of the installation.</p> <p>Where <span class="cb">&lt;install&gt;/</span> is the root of the installation.</p>
<p><span class="raw-html"><hr></span></p> <p><span class="raw-html"><hr></span></p>
<div class="section" id="id1"> <div class="section" id="id1">
<span id="alliance-helper"></span><h4><a class="toc-backref" href="#id33"><span class="sc">Alliance</span> Helper</a></h4> <span id="alliance-helper"></span><h4><a class="toc-backref" href="#id34"><span class="sc">Alliance</span> Helper</a></h4>
<p>The configuration file must provide a <span class="cb">allianceConfig</span> tuple of <p>The configuration file must provide a <span class="cb">allianceConfig</span> tuple of
the form:</p> the form:</p>
<pre class="literal-block"> <pre class="literal-block">
@ -707,7 +725,7 @@ allianceConfig = \
</pre> </pre>
</div> </div>
<div class="section" id="tools-configuration-helpers"> <div class="section" id="tools-configuration-helpers">
<h4><a class="toc-backref" href="#id34">Tools Configuration Helpers</a></h4> <h4><a class="toc-backref" href="#id35">Tools Configuration Helpers</a></h4>
<p>All the tools uses the same helper to load their configuration (a.k.a. <p>All the tools uses the same helper to load their configuration (a.k.a.
<em>Configuration Helper</em>). Currently the following configuration system-wide <em>Configuration Helper</em>). Currently the following configuration system-wide
configuration files are defined:</p> configuration files are defined:</p>
@ -783,7 +801,7 @@ by the tools. The list of parameters is detailed in each tool section.</li>
</div> </div>
</div> </div>
<div class="section" id="hacking-the-configuration-files"> <div class="section" id="hacking-the-configuration-files">
<h3><a class="toc-backref" href="#id35">Hacking the Configuration Files</a></h3> <h3><a class="toc-backref" href="#id36">Hacking the Configuration Files</a></h3>
<p>Asides from the symbols that gets used by the configuration helpers like <p>Asides from the symbols that gets used by the configuration helpers like
<span class="cb">allianceConfig</span> or <span class="cb">parametersTable</span>, you can put pretty much anything <span class="cb">allianceConfig</span> or <span class="cb">parametersTable</span>, you can put pretty much anything
in <span class="cb">&lt;CWD&gt;/.coriolis2/settings.py</span> (that is, written in <span class="sc">Python</span>).</p> in <span class="cb">&lt;CWD&gt;/.coriolis2/settings.py</span> (that is, written in <span class="sc">Python</span>).</p>
@ -818,7 +836,7 @@ for fileName in os.listdir('.'):
</div> </div>
</div> </div>
<div class="section" id="cgt-the-graphical-interface"> <div class="section" id="cgt-the-graphical-interface">
<h2><a class="toc-backref" href="#id36">CGT - The Graphical Interface</a></h2> <h2><a class="toc-backref" href="#id37">CGT - The Graphical Interface</a></h2>
<p>The <span class="sc">Coriolis</span> graphical interface is split up into two windows.</p> <p>The <span class="sc">Coriolis</span> graphical interface is split up into two windows.</p>
<ul class="simple"> <ul class="simple">
<li>The <strong>Viewer</strong>, with the following features:<ul> <li>The <strong>Viewer</strong>, with the following features:<ul>
@ -848,15 +866,15 @@ They are closely related to Configuration &amp; Initialisation.</li>
<p><span class="raw-html"><center><img src="./images/Controller-1.png" alt="Controller Basic Snapshot"></center></span></p> <p><span class="raw-html"><center><img src="./images/Controller-1.png" alt="Controller Basic Snapshot"></center></span></p>
</div> </div>
<div class="section" id="id2"> <div class="section" id="id2">
<span id="viewer-tools"></span><h2><a class="toc-backref" href="#id37">Viewer &amp; Tools</a></h2> <span id="viewer-tools"></span><h2><a class="toc-backref" href="#id38">Viewer &amp; Tools</a></h2>
<div class="section" id="stratus-netlist-capture"> <div class="section" id="stratus-netlist-capture">
<h3><a class="toc-backref" href="#id38"><span class="sc">Stratus</span> Netlist Capture</a></h3> <h3><a class="toc-backref" href="#id39"><span class="sc">Stratus</span> Netlist Capture</a></h3>
<p><span class="sc">Stratus</span> is the replacement for <span class="sc">GenLib</span> procedural netlist capture language. <p><span class="sc">Stratus</span> is the replacement for <span class="sc">GenLib</span> procedural netlist capture language.
It is designed as a set of <span class="sc">Python</span> classes, and comes with it's own documentation It is designed as a set of <span class="sc">Python</span> classes, and comes with it's own documentation
(<a class="reference external" href="file:///usr/share/doc/coriolis2/en/html/stratus/index.html">Stratus Documentation</a>)</p> (<a class="reference external" href="file:///usr/share/doc/coriolis2/en/html/stratus/index.html">Stratus Documentation</a>)</p>
</div> </div>
<div class="section" id="the-hurricane-data-base"> <div class="section" id="the-hurricane-data-base">
<h3><a class="toc-backref" href="#id39">The <span class="sc">Hurricane</span> Data-Base</a></h3> <h3><a class="toc-backref" href="#id40">The <span class="sc">Hurricane</span> Data-Base</a></h3>
<p>The <span class="sc">Alliance</span> flow is based on the <span class="sc">mbk</span> data-base, which has one data-structure <p>The <span class="sc">Alliance</span> flow is based on the <span class="sc">mbk</span> data-base, which has one data-structure
for each view. That is, <span class="cb">Lofig</span> for the <em>logical</em> view and <span class="cb">Phfig</span> for the <em>physical</em> for each view. That is, <span class="cb">Lofig</span> for the <em>logical</em> view and <span class="cb">Phfig</span> for the <em>physical</em>
view. The place and route tools were responsible for maintaining (or not) the view. The place and route tools were responsible for maintaining (or not) the
@ -884,14 +902,14 @@ state.</li>
</ul> </ul>
</div> </div>
<div class="section" id="synthetizing-and-loading-a-design"> <div class="section" id="synthetizing-and-loading-a-design">
<h3><a class="toc-backref" href="#id40">Synthetizing and loading a design</a></h3> <h3><a class="toc-backref" href="#id41">Synthetizing and loading a design</a></h3>
<p><span class="sc">Coriolis</span> supports several file formats. It can load all file format <p><span class="sc">Coriolis</span> supports several file formats. It can load all file format
from the <span class="sc">Alliance</span> toolchain (.ap for layout, behavioural and structural vhdl .vbe and .vst), from the <span class="sc">Alliance</span> toolchain (.ap for layout, behavioural and structural vhdl .vbe and .vst),
BLIF netlist format as well as benchmark formats from the ISPD contests.</p> BLIF netlist format as well as benchmark formats from the ISPD contests.</p>
<p>It can be compiled with LEF/DEF support, although it requires acceptance of the SI2 license <p>It can be compiled with LEF/DEF support, although it requires acceptance of the SI2 license
and may not be compiled in your version of the software.</p> and may not be compiled in your version of the software.</p>
<div class="section" id="synthesis-under-yosys"> <div class="section" id="synthesis-under-yosys">
<h4><a class="toc-backref" href="#id41">Synthesis under Yosys</a></h4> <h4><a class="toc-backref" href="#id42">Synthesis under Yosys</a></h4>
<p>You can create a BLIF file from the <span class="sc">Yosys</span> synthetizer, which can be imported under Coriolis. <p>You can create a BLIF file from the <span class="sc">Yosys</span> synthetizer, which can be imported under Coriolis.
Most libraries are specified as a .lib liberty file and a .lef LEF file. Most libraries are specified as a .lib liberty file and a .lef LEF file.
<span class="sc">Yosys</span> opens most .lib files with minor modifications, but LEF support in Coriolis relies on SI2. <span class="sc">Yosys</span> opens most .lib files with minor modifications, but LEF support in Coriolis relies on SI2.
@ -901,13 +919,13 @@ If Coriolis hasn't been compiled against it, the library is given in <span class
with <span class="sc">Yosys</span> and import it (as Blif without the extension) under Coriolis to perform place&amp;route.</p> with <span class="sc">Yosys</span> and import it (as Blif without the extension) under Coriolis to perform place&amp;route.</p>
</div> </div>
<div class="section" id="synthesis-under-alliance"> <div class="section" id="synthesis-under-alliance">
<h4><a class="toc-backref" href="#id42">Synthesis under Alliance</a></h4> <h4><a class="toc-backref" href="#id43">Synthesis under Alliance</a></h4>
<p><span class="sc">Alliance</span> is an older toolchain but has been extensively used for years. Coriolis can import <p><span class="sc">Alliance</span> is an older toolchain but has been extensively used for years. Coriolis can import
and write Alliance designs and libraries directly.</p> and write Alliance designs and libraries directly.</p>
</div> </div>
</div> </div>
<div class="section" id="etesian-placer"> <div class="section" id="etesian-placer">
<h3><a class="toc-backref" href="#id43">Etesian -- Placer</a></h3> <h3><a class="toc-backref" href="#id44">Etesian -- Placer</a></h3>
<p>The <span class="sc">Etesian</span> placer is a state of the art (as of 2015) analytical placer. It is <p>The <span class="sc">Etesian</span> placer is a state of the art (as of 2015) analytical placer. It is
within <tt class="docutils literal">5%</tt> of other placers' solutions, but is normally a bit worse than ePlace. within <tt class="docutils literal">5%</tt> of other placers' solutions, but is normally a bit worse than ePlace.
This <span class="sc">Coriolis</span> tool is actually an encapsulation of <span class="sc">Coloquinte</span> which <em>is</em> the placer.</p> This <span class="sc">Coriolis</span> tool is actually an encapsulation of <span class="sc">Coloquinte</span> which <em>is</em> the placer.</p>
@ -947,7 +965,7 @@ Timing and routability analysis are not included either, and the returned placem
may be unroutable.</p> may be unroutable.</p>
<p><span class="raw-html"><hr></span></p> <p><span class="raw-html"><hr></span></p>
<div class="section" id="etesian-configuration-parameters"> <div class="section" id="etesian-configuration-parameters">
<h4><a class="toc-backref" href="#id44">Etesian Configuration Parameters</a></h4> <h4><a class="toc-backref" href="#id45">Etesian Configuration Parameters</a></h4>
<table border="1" class="docutils"> <table border="1" class="docutils">
<colgroup> <colgroup>
<col width="43%" /> <col width="43%" />
@ -1018,7 +1036,7 @@ More refreshing slows the placer.</p>
</div> </div>
</div> </div>
<div class="section" id="knik-global-router"> <div class="section" id="knik-global-router">
<h3><a class="toc-backref" href="#id45">Knik -- Global Router</a></h3> <h3><a class="toc-backref" href="#id46">Knik -- Global Router</a></h3>
<p>The quality of <span class="sc">Knik</span> global routing solutions are equivalent to those of <a class="reference external" href="http://vlsicad.eecs.umich.edu/BK/FGR/">FGR</a> 1.0. <p>The quality of <span class="sc">Knik</span> global routing solutions are equivalent to those of <a class="reference external" href="http://vlsicad.eecs.umich.edu/BK/FGR/">FGR</a> 1.0.
For an in-depth description of <span class="sc">Knik</span> algorithms, you may download the thesis of For an in-depth description of <span class="sc">Knik</span> algorithms, you may download the thesis of
D. <span class="sc">Dupuis</span> avalaible from here~: <a class="reference external" href="http://www-soc.lip6.fr/en/users/damiendupuis/PhD/">Knik Thesis</a>.</p> D. <span class="sc">Dupuis</span> avalaible from here~: <a class="reference external" href="http://www-soc.lip6.fr/en/users/damiendupuis/PhD/">Knik Thesis</a>.</p>
@ -1033,7 +1051,7 @@ a global routing <em>solution</em> can be saved to disk and reloaded for later u
</ul> </ul>
</div> </div>
<div class="section" id="kite-detailed-router"> <div class="section" id="kite-detailed-router">
<h3><a class="toc-backref" href="#id46">Kite -- Detailed Router</a></h3> <h3><a class="toc-backref" href="#id47">Kite -- Detailed Router</a></h3>
<p><span class="sc">Kite</span> no longer suffers from the limitations of <span class="sc">Nero</span>. It can route big designs <p><span class="sc">Kite</span> no longer suffers from the limitations of <span class="sc">Nero</span>. It can route big designs
as its runtime and memory footprint is almost linear (with respect to the number as its runtime and memory footprint is almost linear (with respect to the number
of gates). It has successfully routed design of more than <cite>150K</cite> gates. of gates). It has successfully routed design of more than <cite>150K</cite> gates.
@ -1084,7 +1102,7 @@ that step.</p>
<span class="sc">Kite</span> (on GCells) until the routing is finalized. Special layers appears <span class="sc">Kite</span> (on GCells) until the routing is finalized. Special layers appears
to that effect in the <a class="reference internal" href="#the-layers-go-tab">The Layers&amp;Go Tab</a>.</p> to that effect in the <a class="reference internal" href="#the-layers-go-tab">The Layers&amp;Go Tab</a>.</p>
<div class="section" id="kite-configuration-parameters"> <div class="section" id="kite-configuration-parameters">
<h4><a class="toc-backref" href="#id47">Kite Configuration Parameters</a></h4> <h4><a class="toc-backref" href="#id48">Kite Configuration Parameters</a></h4>
<p>As <span class="sc">Knik</span> is only called through <span class="sc">Kite</span>, it's parameters also have <p>As <span class="sc">Knik</span> is only called through <span class="sc">Kite</span>, it's parameters also have
the <span class="cb">kite.</span> prefix.</p> the <span class="cb">kite.</span> prefix.</p>
<p>The <span class="sc">Katabatic</span> parameters control the layer assignment step.</p> <p>The <span class="sc">Katabatic</span> parameters control the layer assignment step.</p>
@ -1208,7 +1226,7 @@ topological modification</td>
</div> </div>
</div> </div>
<div class="section" id="executing-python-scripts-in-cgt"> <div class="section" id="executing-python-scripts-in-cgt">
<span id="python-scripts-in-cgt"></span><h3><a class="toc-backref" href="#id48">Executing Python Scripts in Cgt</a></h3> <span id="python-scripts-in-cgt"></span><h3><a class="toc-backref" href="#id49">Executing Python Scripts in Cgt</a></h3>
<p>Python/Stratus scripts can be executed either in text or graphical mode.</p> <p>Python/Stratus scripts can be executed either in text or graphical mode.</p>
<div class="note"> <div class="note">
<p class="first admonition-title">Note</p> <p class="first admonition-title">Note</p>
@ -1228,7 +1246,7 @@ initializations and <em>before</em> any other argument is processed.</p>
<p>For more explanation on Python scripts see <a class="reference internal" href="#python-interface-to-coriolis">Python Interface to Coriolis</a>.</p> <p>For more explanation on Python scripts see <a class="reference internal" href="#python-interface-to-coriolis">Python Interface to Coriolis</a>.</p>
</div> </div>
<div class="section" id="printing-snapshots"> <div class="section" id="printing-snapshots">
<h3><a class="toc-backref" href="#id49">Printing &amp; Snapshots</a></h3> <h3><a class="toc-backref" href="#id50">Printing &amp; Snapshots</a></h3>
<p>Printing or saving into a <span class="sc">pdf</span> is fairly simple, just uses the <strong>File -&gt; Print</strong> <p>Printing or saving into a <span class="sc">pdf</span> is fairly simple, just uses the <strong>File -&gt; Print</strong>
menu or the <span class="fboxtt">CTRL+P</span> shortcut to open the dialog box.</p> menu or the <span class="fboxtt">CTRL+P</span> shortcut to open the dialog box.</p>
<p>The print functionality uses exactly the same rendering mechanism as for the <p>The print functionality uses exactly the same rendering mechanism as for the
@ -1271,7 +1289,7 @@ or similar.</p>
Saving into an image is subject to the same remarks as for <span class="sc">pdf</span>.</p> Saving into an image is subject to the same remarks as for <span class="sc">pdf</span>.</p>
</div> </div>
<div class="section" id="memento-of-shortcuts-in-graphic-mode"> <div class="section" id="memento-of-shortcuts-in-graphic-mode">
<h3><a class="toc-backref" href="#id50">Memento of Shortcuts in Graphic Mode</a></h3> <h3><a class="toc-backref" href="#id51">Memento of Shortcuts in Graphic Mode</a></h3>
<p>The main application binary is <span class="cb">cgt</span>.</p> <p>The main application binary is <span class="cb">cgt</span>.</p>
<table border="1" class="docutils"> <table border="1" class="docutils">
<colgroup> <colgroup>
@ -1408,7 +1426,7 @@ in which this model is instanciated).</td>
</table> </table>
</div> </div>
<div class="section" id="cgt-command-line-options"> <div class="section" id="cgt-command-line-options">
<h3><a class="toc-backref" href="#id51">Cgt Command Line Options</a></h3> <h3><a class="toc-backref" href="#id52">Cgt Command Line Options</a></h3>
<p>Appart from the obvious <tt class="docutils literal"><span class="pre">--text</span></tt> options, all can be used for text and graphical mode.</p> <p>Appart from the obvious <tt class="docutils literal"><span class="pre">--text</span></tt> options, all can be used for text and graphical mode.</p>
<table border="1" class="docutils"> <table border="1" class="docutils">
<colgroup> <colgroup>
@ -1493,7 +1511,7 @@ routed design :</p>
</ul> </ul>
</div> </div>
<div class="section" id="miscellaneous-settings"> <div class="section" id="miscellaneous-settings">
<h3><a class="toc-backref" href="#id52">Miscellaneous Settings</a></h3> <h3><a class="toc-backref" href="#id53">Miscellaneous Settings</a></h3>
<table border="1" class="docutils"> <table border="1" class="docutils">
<colgroup> <colgroup>
<col width="46%" /> <col width="46%" />
@ -1566,7 +1584,7 @@ To generate one set this flag to <span class="cb">True</span></td>
</div> </div>
</div> </div>
<div class="section" id="id3"> <div class="section" id="id3">
<span id="the-controller"></span><h2><a class="toc-backref" href="#id53">The Controller</a></h2> <span id="the-controller"></span><h2><a class="toc-backref" href="#id54">The Controller</a></h2>
<p>The <em>Controller</em> window is composed of seven tabs:</p> <p>The <em>Controller</em> window is composed of seven tabs:</p>
<ol class="arabic simple"> <ol class="arabic simple">
<li><a class="reference internal" href="#the-look-tab">The Look Tab</a> to select the display style.</li> <li><a class="reference internal" href="#the-look-tab">The Look Tab</a> to select the display style.</li>
@ -1581,14 +1599,14 @@ the current selection.</li>
<li><a class="reference internal" href="#the-settings-tab">The Settings Tab</a> access all the tool's configuration settings.</li> <li><a class="reference internal" href="#the-settings-tab">The Settings Tab</a> access all the tool's configuration settings.</li>
</ol> </ol>
<div class="section" id="id4"> <div class="section" id="id4">
<span id="the-look-tab"></span><h3><a class="toc-backref" href="#id54">The Look Tab</a></h3> <span id="the-look-tab"></span><h3><a class="toc-backref" href="#id55">The Look Tab</a></h3>
<p>You can select how the layout will be displayed. There is a special one <p>You can select how the layout will be displayed. There is a special one
<tt class="docutils literal">Printer.Coriolis</tt> specifically designed for <a class="reference internal" href="#printing-snapshots">Printing &amp; Snapshots</a>. <tt class="docutils literal">Printer.Coriolis</tt> specifically designed for <a class="reference internal" href="#printing-snapshots">Printing &amp; Snapshots</a>.
You should select it prior to calling the print or snapshot dialog boxes.</p> You should select it prior to calling the print or snapshot dialog boxes.</p>
<p><span class="raw-html"><center><img src="./images/Controller-Look-1.png" alt="Controller Basic Snapshot"></center></span></p> <p><span class="raw-html"><center><img src="./images/Controller-Look-1.png" alt="Controller Basic Snapshot"></center></span></p>
</div> </div>
<div class="section" id="id5"> <div class="section" id="id5">
<span id="the-filter-tab"></span><h3><a class="toc-backref" href="#id55">The Filter Tab</a></h3> <span id="the-filter-tab"></span><h3><a class="toc-backref" href="#id56">The Filter Tab</a></h3>
<p>The filter tab let you select what hierarchical levels of your design will be <p>The filter tab let you select what hierarchical levels of your design will be
displayed. Hierarchy level are numbered top-down: the level 0 correspond to displayed. Hierarchy level are numbered top-down: the level 0 correspond to
the top-level cell, the level one to the instances of the top-level Cell and the top-level cell, the level one to the instances of the top-level Cell and
@ -1611,7 +1629,7 @@ They have been made <em>very</em> visibles as big violet lines...</p>
<p><span class="raw-html"><center><img src="./images/Controller-Filter-1.png" alt="Controller Basic Snapshot"></center></span></p> <p><span class="raw-html"><center><img src="./images/Controller-Filter-1.png" alt="Controller Basic Snapshot"></center></span></p>
</div> </div>
<div class="section" id="id6"> <div class="section" id="id6">
<span id="the-layers-go-tab"></span><h3><a class="toc-backref" href="#id56">The Layers&amp;Go Tab</a></h3> <span id="the-layers-go-tab"></span><h3><a class="toc-backref" href="#id57">The Layers&amp;Go Tab</a></h3>
<p>Control the individual display of all <em>layers</em> and <em>Gos</em>.</p> <p>Control the individual display of all <em>layers</em> and <em>Gos</em>.</p>
<ul class="simple"> <ul class="simple">
<li><em>Layers</em> correspond to a true physical layer. From a <span class="sc">Hurricane</span> point of <li><em>Layers</em> correspond to a true physical layer. From a <span class="sc">Hurricane</span> point of
@ -1629,7 +1647,7 @@ to easily locate congested areas.</li>
<p><span class="raw-html"><center><img src="./images/Controller-LayersGos-1.png" alt="Controller Basic Snapshot"></center></span></p> <p><span class="raw-html"><center><img src="./images/Controller-LayersGos-1.png" alt="Controller Basic Snapshot"></center></span></p>
</div> </div>
<div class="section" id="id7"> <div class="section" id="id7">
<span id="the-netlist-tab"></span><h3><a class="toc-backref" href="#id57">The Netlist Tab</a></h3> <span id="the-netlist-tab"></span><h3><a class="toc-backref" href="#id58">The Netlist Tab</a></h3>
<p>The <em>Netlist</em> tab shows the list of nets... By default the tab is not <p>The <em>Netlist</em> tab shows the list of nets... By default the tab is not
<em>synched</em> with the displayed Cell. To see the nets you must check the <em>synched</em> with the displayed Cell. To see the nets you must check the
<strong>Sync Netlist</strong> checkbox. You can narrow the set of displayed nets by <strong>Sync Netlist</strong> checkbox. You can narrow the set of displayed nets by
@ -1642,7 +1660,7 @@ is highlited in the <em>Viewer</em>.</p>
<span class="raw-html"><center><img src="./images/Viewer-Netlist-1.png" alt="Controller Basic Snapshot"></center></span></p> <span class="raw-html"><center><img src="./images/Viewer-Netlist-1.png" alt="Controller Basic Snapshot"></center></span></p>
</div> </div>
<div class="section" id="id8"> <div class="section" id="id8">
<span id="the-selection-tab"></span><h3><a class="toc-backref" href="#id58">The Selection Tab</a></h3> <span id="the-selection-tab"></span><h3><a class="toc-backref" href="#id59">The Selection Tab</a></h3>
<p>The <em>Selection</em> tab list all the components currently selecteds. They <p>The <em>Selection</em> tab list all the components currently selecteds. They
can be filtered thanks to the filter pattern.</p> can be filtered thanks to the filter pattern.</p>
<p>Used in conjunction with the <em>Netlist</em> <strong>Sync Selection</strong> you will all see <p>Used in conjunction with the <em>Netlist</em> <strong>Sync Selection</strong> you will all see
@ -1655,7 +1673,7 @@ the <tt class="docutils literal">t</tt> key...</p>
<p><span class="raw-html"><center><img src="./images/Controller-Selection-1.png" alt="Controller Basic Snapshot"></center></span></p> <p><span class="raw-html"><center><img src="./images/Controller-Selection-1.png" alt="Controller Basic Snapshot"></center></span></p>
</div> </div>
<div class="section" id="id9"> <div class="section" id="id9">
<span id="the-inspector-tab"></span><h3><a class="toc-backref" href="#id59">The Inspector Tab</a></h3> <span id="the-inspector-tab"></span><h3><a class="toc-backref" href="#id60">The Inspector Tab</a></h3>
<p>This tab is very useful, but mostly for <span class="sc">Coriolis</span> developpers. It allows <p>This tab is very useful, but mostly for <span class="sc">Coriolis</span> developpers. It allows
to browse through the live DataBase. The <em>Inspector</em> provide three entry points:</p> to browse through the live DataBase. The <em>Inspector</em> provide three entry points:</p>
<ul class="simple"> <ul class="simple">
@ -1681,13 +1699,13 @@ is deleted, you will crash the application...</p>
<span class="raw-html"><center><img src="./images/Controller-Inspector-3.png" alt="Controller Basic Snapshot"></center></span></p> <span class="raw-html"><center><img src="./images/Controller-Inspector-3.png" alt="Controller Basic Snapshot"></center></span></p>
</div> </div>
<div class="section" id="id10"> <div class="section" id="id10">
<span id="the-settings-tab"></span><h3><a class="toc-backref" href="#id60">The Settings Tab</a></h3> <span id="the-settings-tab"></span><h3><a class="toc-backref" href="#id61">The Settings Tab</a></h3>
<p>Here comes the description of the <em>Settings</em> tab.</p> <p>Here comes the description of the <em>Settings</em> tab.</p>
<p><span class="raw-html"><center><img src="./images/Controller-Settings-1.png" alt="Controller Basic Snapshot"></center></span></p> <p><span class="raw-html"><center><img src="./images/Controller-Settings-1.png" alt="Controller Basic Snapshot"></center></span></p>
</div> </div>
</div> </div>
<div class="section" id="python-interface-for-hurricane-coriolis"> <div class="section" id="python-interface-for-hurricane-coriolis">
<span id="python-interface-to-coriolis"></span><h2><a class="toc-backref" href="#id61">Python Interface for <span class="sc">Hurricane</span> / <span class="sc">Coriolis</span></a></h2> <span id="python-interface-to-coriolis"></span><h2><a class="toc-backref" href="#id62">Python Interface for <span class="sc">Hurricane</span> / <span class="sc">Coriolis</span></a></h2>
<p>The (almost) complete interface of <span class="sc">Hurricane</span> is exported as a <span class="sc">Python</span> module <p>The (almost) complete interface of <span class="sc">Hurricane</span> is exported as a <span class="sc">Python</span> module
and some part of the other components of <span class="sc">Coriolis</span> (each one in a separate and some part of the other components of <span class="sc">Coriolis</span> (each one in a separate
module). The interface has been made to mirror as closely as possible the module). The interface has been made to mirror as closely as possible the
@ -1766,13 +1784,13 @@ lauched through <span class="cb">cgt</span>.</td>
</ol> </ol>
</div> </div>
<div class="section" id="plugins"> <div class="section" id="plugins">
<h2><a class="toc-backref" href="#id62">Plugins</a></h2> <h2><a class="toc-backref" href="#id63">Plugins</a></h2>
<p>Plugins are <span class="sc">Python</span> scripts specially crafted to integrate with <span class="cb">cgt</span>. <p>Plugins are <span class="sc">Python</span> scripts specially crafted to integrate with <span class="cb">cgt</span>.
Their entry point is a <span class="cb">ScriptMain()</span> method as described in Their entry point is a <span class="cb">ScriptMain()</span> method as described in
<a class="reference internal" href="#python-interface-to-coriolis">Python Interface to Coriolis</a>. They can be called by user scripts <a class="reference internal" href="#python-interface-to-coriolis">Python Interface to Coriolis</a>. They can be called by user scripts
through this method.</p> through this method.</p>
<div class="section" id="chip-placement"> <div class="section" id="chip-placement">
<h3><a class="toc-backref" href="#id63">Chip Placement</a></h3> <h3><a class="toc-backref" href="#id64">Chip Placement</a></h3>
<p>Automatically perform the placement of a complete chip. This plugin, as well <p>Automatically perform the placement of a complete chip. This plugin, as well
as the other P&amp;R tools expect a specific top-level hierarchy for the design. as the other P&amp;R tools expect a specific top-level hierarchy for the design.
The top-level hierarchy must contains the instances of all the I/O pads and The top-level hierarchy must contains the instances of all the I/O pads and
@ -1947,7 +1965,7 @@ only four rails (2* <tt class="docutils literal">power</tt>, 2* <tt class="docut
</div> </div>
</div> </div>
<div class="section" id="clock-tree"> <div class="section" id="clock-tree">
<h3><a class="toc-backref" href="#id64">Clock Tree</a></h3> <h3><a class="toc-backref" href="#id65">Clock Tree</a></h3>
<p>Insert a clock tree into a block. The clock tree uses the H strategy. <p>Insert a clock tree into a block. The clock tree uses the H strategy.
The clock net is splitted into sub-nets, one for each branch of the The clock net is splitted into sub-nets, one for each branch of the
tree.</p> tree.</p>
@ -2039,14 +2057,14 @@ into retirement very soon</td>
</table> </table>
</div> </div>
<div class="section" id="recursive-save-rsave"> <div class="section" id="recursive-save-rsave">
<h3><a class="toc-backref" href="#id65">Recursive-Save (RSave)</a></h3> <h3><a class="toc-backref" href="#id66">Recursive-Save (RSave)</a></h3>
<p>Perform a recursive top down save of all the models from the top cell <p>Perform a recursive top down save of all the models from the top cell
loaded in <span class="cb">cgt</span>. Force a write of any non-terminal model. This plugin is used loaded in <span class="cb">cgt</span>. Force a write of any non-terminal model. This plugin is used
by the clock tree plugin after the netlist clock sub-nets creation.</p> by the clock tree plugin after the netlist clock sub-nets creation.</p>
</div> </div>
</div> </div>
<div class="section" id="a-simple-example-am2901"> <div class="section" id="a-simple-example-am2901">
<h2><a class="toc-backref" href="#id66">A Simple Example: AM2901</a></h2> <h2><a class="toc-backref" href="#id67">A Simple Example: AM2901</a></h2>
<p>To illustrate the capabilities of <span class="sc">Coriolis</span> tools and <span class="sc">Python</span> scripting, a small <p>To illustrate the capabilities of <span class="sc">Coriolis</span> tools and <span class="sc">Python</span> scripting, a small
example, derived from the <span class="sc">Alliance</span> <span class="cb">AM2901</span> is supplied.</p> example, derived from the <span class="sc">Alliance</span> <span class="cb">AM2901</span> is supplied.</p>
<p>This example contains only the synthetized netlists and the <span class="cb">doChip.py</span> script <p>This example contains only the synthetized netlists and the <span class="cb">doChip.py</span> script

View File

@ -129,6 +129,7 @@
.. _hMETIS: http://glaros.dtc.umn.edu/gkhome/views/metis .. _hMETIS: http://glaros.dtc.umn.edu/gkhome/views/metis
.. _Knik Thesis: http://www-soc.lip6.fr/en/users/damiendupuis/PhD/ .. _Knik Thesis: http://www-soc.lip6.fr/en/users/damiendupuis/PhD/
.. _Coin Or Home: http://www.coin-or.org/index.html .. _Coin Or Home: http://www.coin-or.org/index.html
.. _RapidJSON: http://miloyip.github.io/rapidjson/
.. _coriolis2-1.0.2049-1.slsoc6.i686.rpm: http://asim.lip6.fr/pub/coriolis/2.0/coriolis2-1.0.2049-1.slsoc6.i686.rpm .. _coriolis2-1.0.2049-1.slsoc6.i686.rpm: http://asim.lip6.fr/pub/coriolis/2.0/coriolis2-1.0.2049-1.slsoc6.i686.rpm
.. _coriolis2-1.0.2049-1.slsoc6.x86_64.rpm: http://asim.lip6.fr/pub/coriolis/2.0/coriolis2-1.0.2049-1.slsoc6.x86_64.rpm .. _coriolis2-1.0.2049-1.slsoc6.x86_64.rpm: http://asim.lip6.fr/pub/coriolis/2.0/coriolis2-1.0.2049-1.slsoc6.x86_64.rpm
@ -317,8 +318,8 @@ Release v2.0.1
achieve a speedup factor greater than 20... achieve a speedup factor greater than 20...
**Release v2.1** Release v2.1
~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~
#. Replace the old simulated annealing placer |Mauka| by the analytical placer #. Replace the old simulated annealing placer |Mauka| by the analytical placer
|Etesian| and its legalization and detailed placement tools. |Etesian| and its legalization and detailed placement tools.
@ -332,7 +333,14 @@ Release v2.0.1
.. When shifting to the left, the right-half part of the screen gets .. When shifting to the left, the right-half part of the screen gets
.. badly redrawn. Uses |CTRL_L| to refresh. It will be corrected as soon .. badly redrawn. Uses |CTRL_L| to refresh. It will be corrected as soon
.. as possible. .. as possible.
**Release v2.2**
~~~~~~~~~~~~~~~~
#. Added JSON import/export of the whole Hurricane DataBase. Two save mode
are supported: *Cell* mode (standalone) or *Blob* mode, which dump the
whole design down and including the standard cells.
|newpage| |newpage|
@ -352,9 +360,11 @@ Main building prerequisites:
* cmake * cmake
* C++11-capable compiler * C++11-capable compiler
* RapidJSON_
* python2.7 * python2.7
* boost * boost
* libxml2 * libxml2
* bzip2
* yacc & lex * yacc & lex
* Qt 4 or Qt 5 * Qt 4 or Qt 5
@ -437,22 +447,29 @@ automatically created either by |ccb| or the build system.
Building Coriolis Building Coriolis
~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~
The first step is to create the source directory and pull the |git| repository: :: First step is to install the prerequisites. Currently, only RapidJSON_: ::
dummy@lepka:~$ mkdir -p ~/coriolis-2.x/src/support
dummy@lepka:~$ git clone http://github.com/miloyip/rapidjson
The second step is to create the source directory and pull the |git| repository: ::
dummy@lepka:~$ mkdir -p ~/coriolis-2.x/src dummy@lepka:~$ mkdir -p ~/coriolis-2.x/src
dummy@lepka:~$ cd ~/coriolis-2.x/src dummy@lepka:~$ cd ~/coriolis-2.x/src
dummy@lepka:~$ git clone https://www-soc.lip6.fr/git/coriolis.git dummy@lepka:~$ git clone https://www-soc.lip6.fr/git/coriolis.git
Second and final step, build & install: :: Third and final step, build & install: ::
dummy@lepka:src$ ./bootstrap/ccp.py --project=coriolis \ dummy@lepka:src$ ./bootstrap/ccp.py --project=support \
--project=coriolis \
--make="-j4 install" --make="-j4 install"
dummy@lepka:src$ ./bootstrap/ccb.py --project=coriolis \ dummy@lepka:src$ ./bootstrap/ccb.py --project=support \
--project=coriolis \
--doc --make="-j1 install" --doc --make="-j1 install"
We need two steps because the documentation do not support to be generated with We need to separate to perform a separate installation of the documentation because it
a parallel build. So we compile & install in a first step in ``-j4`` (or whatever) do not support to be generated with a parallel build. So we compile & install in a first
then we generate the documentation in ``-j1`` stage in ``-j4`` (or whatever) then we generate the documentation in ``-j1``
Under |RHEL6| or clones, you must build using the |devtoolset2|: :: Under |RHEL6| or clones, you must build using the |devtoolset2|: ::

View File

@ -478,6 +478,7 @@ namespace Etesian {
//masterCell->setAbutmentBox( topAb ); //masterCell->setAbutmentBox( topAb );
//instance->setTransformation( Transformation() ); // (0,0,ID). //instance->setTransformation( Transformation() ); // (0,0,ID).
//instance->setPlacementStatus( Instance::PlacementStatus::PLACED ); //instance->setPlacementStatus( Instance::PlacementStatus::PLACED );
occurrence.makeInvalid();
instance->slaveAbutmentBox(); instance->slaveAbutmentBox();
} }
} }

View File

@ -18,6 +18,7 @@
setup_qt() setup_qt()
find_package(LibXml2 REQUIRED) find_package(LibXml2 REQUIRED)
find_package(BZip2 REQUIRED)
find_package(BISON REQUIRED) find_package(BISON REQUIRED)
find_package(FLEX REQUIRED) find_package(FLEX REQUIRED)
find_package(PythonLibs REQUIRED) find_package(PythonLibs REQUIRED)

View File

@ -0,0 +1,29 @@
// -*- C++ -*-
namespace Hurricane {
/*! \class Initializer
* \brief Register a static initialization function.
*
* \section secInitializerMechanism Initializer Mechanism
*
* In C++, there is currently no way to guarantee the order into
* which the static initialization (variables) in various modules
* will be done.
*
* The Initializer template class provide a way to perform a static
* initialization across multiple modules in an ordered fashion,
* thus solving potential dependency problems between initialisation.
*/
//! \function Initializer::Initializer ( unsigned int order );
//! Register a static initializer for the template type \c T.
//! Initializer is a object that must be kept in a \c static
//! variable in a compilation unit (i.e. a \c .cpp file).
//!
//! The template type \c T (a class) must provide a static function
//! named \c initialize, with exactly the following signature:
//! <code>void T::initialize()</code>.
}

View File

@ -0,0 +1,198 @@
// -*- C++ -*-
namespace Hurricane {
//! \addtogroup JsonSupport
//! \{
/*! \class JsonObject
* \brief Support for JSON export.
*
*/
//! \function JsonObject::JsonObject ( unsigned long flags );
//! \param flags Flags sets by derived classes.
//!
//! Base object to be used by all JSON parsers. Provides
//! helpers functions. Store three separated lists of
//! requirements/attributes needes to build the object.
//! - \c stackeds : thoses are \b not attributes of the
//! current object, but other objects that are expected
//! to be already in the stack. They are needed to build the
//! current object. Their key must start with a \c '.'
//! character.
//! - \c attributes : the simple attributes of the object.
//! Their key must start with a \c '_'.
//! - \c collections : any container, collection or whatever
//! set of other objects part of the current object.
//! Their key must start with a \c '+' character.
//!
//! For adding a requirement/attribute, see JsonObject::add().
//! \function string JsonObject::getTypeName () const;
//! \Return The typename of the concrete object, that is, the value
//! of the \c @typename key of the JSON object.
//! \function string JsonObject::getStackName () const;
//! \Return The key with which the DataBase object will be pushed on
//! the parser stack.
//!
//! If the current object is associated to an attribute (that
//! is, a key in JSON), then the \c name attribute of the JsonObject
//! should have been set, and it will be returned here.
//!
//! If the \c name attribute has not been set (for example,
//! because we are in an array). Then the typename (JsonObject::getTypeName()),
//! prefixed by a \c '.' character will be returned.
//!
//! If the JsonObject is, for instance, a JsonBox (typename: \c "Box") :
//! - If \c name is set to \c "_abutmentBox", the box will be stacked
//! with that key.
//! - If \c name is \b not set, then the key will be \c ".Box".
//! \function JsonObject* JsonObject::setFlags ( unsigned long mask );
//! \param mask Flag(s) to be raised.
//! \return The current object.
//! \function JsonObject* JsonObject::resetFlags ( unsigned long mask );
//! \param mask Flag(s) to be lowered.
//! \return The current object.
//! \function bool JsonObject::issetFlags ( unsigned long mask ) const;
//! \param mask The combination of flags to be checked.
//! \return \true if \b all the flags given in \c mask are sets.
//! \function bool JsonObject::check ( JsonStack& stack, string fname ) const;
//! \param stack Where the objects already parsed are stored.
//! \param fname The function name on behalf of which the check is
//! performed.
//! \return \true if the check is successful.
//!
//! Check that the \c stack actually contains all the objects (i.e. attributes)
//! needed to build the current object. The list of \e attributes is built
//! using the JsonObject::add() function. If an attribute is missing, a warning
//! is issued, but the parser will try to continue.
//! \function bool JsonObject::has ( const string& key ) const;
//! \param key The key name to search for.
//! \return \true if the object possess such a key.
//! \function void JsonObject::add ( const string& key, type_index tid );
//! \param key The requirement/attribute to add.
//! \param tid The type index of the attribute.
//!
//! Adds a new requirement or attribute to the object. The first character
//! of the key tells which kind it is:
//! - \c '.' : a requirement (not part of the object) that must be present
//! in the stack.
//! - \c '_' : a simple attribute of the object.
//! - \c '+' : belongs to a collection or container.
//!
//! A more detailed description could be found in JsonObject::JsonObject().
//! \function void JsonObject::remove ( const string& key );
//! \param key The key of the requirement/attribute to remove.
//!
//! Removes an attribute from the current object.
//! \function T JsonObject::get ( JsonStack& stack, const string& key ) const;
//! \param stack The object stack of the parser.
//! \param key The key of the requested object.
//! \return The first object associated with \c key, starting <em>from the top</em>
//! of the stack.
//!
//! Retrieve requirements or attributes from the parser stack.
//! - If no element with a corresponding key is found, an empty element
//! of type \c T is returned (by calling the default \c T constructor).
//! - If an element matching the key is found, \b but it's type do not
//! match \c T, an exception from \c any_cast<> will be thrown.
//! \function void JsonObject::copyAttrs ( const JsonObject* other, bool reset=false );
//! \param other The object from which to copy attributes.
//! \param reset Whether to keep or erase the original attributes of the object.
//!
//! Copy the attributes from \c other into the current object. \b Only the
//! \b attributes are copied. Neither the requirements, nor the collections.
//! By default, the attributes are added to the existing one of the object,
//! but if \c reset is \true, the original ones will be suppresseds.
//! \function void JsonObject::clear ();
//! Removes all requirements/attributes/collections of the object.
//! Also unbind it from any generated DataBase object.
//! \function string JsonObject::getName () const;
//! \Return The name of the whole object as attribute.
//!
//! During the parsing of the JSON structure, excepted when in an array,
//! an object is associated with a key. This is the string returned by
//! this function. It is called \c getName() instead of \c getKey() to
//! avoid confusing with the attributes keys.
//! \function void JsonObject::setName ( const string& name );
//! \param name Set the key associated to this object.
//!
//! See JsonObject::getName() for the meaning of the name (key).
//! \function T& JsonObject::getObject () const;
//! \Return The associated DataBase object.
//!
//! Once all the attributes have been gathered, the creation of the
//! DataBase object is triggered by calling JsonObject::toData().
//! We keep track of that DataBase object by storing it (or a pointer
//! to it) in an \c boost::any field of the JsonObject.
//! \function void JsonObject::setObject ( T );
//! \param T The DataBase object.
//!
//! Associate the constructed DataBase object \c T to the JSON
//! object (for later access).
//! \function bool JsonObject::isBound () const;
//! \Return \true if a DataBase object is associated to the JSON object
//! (see JsonObject::setObject()).
//! \function JsonObject* JsonObject::clone ( unsigned long flags ) const;
//! \Return a new \b empty object <em>of the same dynamic type</em>
//! as the source one.
//!
//! This is not a true clone operation in the sense that the datas
//! of the original object are not copied. The cloning is about the
//! type, and is the result of a call to the \c new operator.
//!
//! \Important This method must be overloaded in each concrete derived class.
//! \function void JsonObject::toData ( JsonStack& stack );
//! \param The parser object stack.
//!
//! \Important This method must be overloaded in each concrete derived class.
//!
//! Creates the DataBase object. The requirements and attributes
//! must be on top of the stack, they are popped, the DataBase object
//! is created from them and the result is then pushed back.
//! \function unsigned int JsonObject::presetId ( JsonStack& stack );
//! \param The parser object stack.
//! \Return the <em>next id</em> that has been set.
//!
//! \Remark This is a helper for JsonStack::toData().
//!
//! In blob mode, the DataBase must be restored <em>as is</em>,
//! including the \c ids of all the Entities (see Entity).
//! This function read from the stack the \c _id attribute
//! and sets it so that the next Entity created will use it.
//! \function void JsonObject::update ( JsonStack& stack, T hobject );
//! \param The parser object stack.
//! \param hobject the newly created DataBase object.
//!
//! \Remark This is a helper for JsonStack::toData().
//!
//! Pop the attributes from the stack. Push the newly created
//! object and bind it to the JsonObject.
//! \}
}

View File

@ -0,0 +1,241 @@
// -*- C++ -*-
namespace Hurricane {
/*! \defgroup JsonSupport JSON Support
* \brief JSON Import/Export of the DataBase
*
* \section secJsonSupportIntro Introduction
*
* One key feature of the Hurricane DataBase is it's hierarchical
* managment. But unfortunatly the simple approach of saving a design
* Cell by Cell, hierarchical level by hierarchical level makes it
* very difficult to save the trans-hierarchical informations (mainly
* is the occurrences)
*
* One solution is to save the design and all it's levels, down and
* including the standard cells. With all the levels saved, we then
* can add the occurrences and all the attached trans-hierarchical
* informations. We call that comprehensive saving of a design,
* a <em>design blob</em>.
*
* Instead of creating one more ad-hoc format, we just dump the
* DataBase objects in a mirror like way in JSON format.
*
* As it is a textual format, the generated files are larges.
* So the files are compressed through \c gzip.
*
*
* \section secJsonSemantic JSON Additional Semantic
*
* To ease the work of the parser, some semantic has been added
* to the JSON objects representing a Hurricane DataBase.
* -# The first key/value pair must have the key \c "@typename"
* and give the kind of JsonObject associated. The value is
* the string returned by \c JsonObject::getTypeName().
* -# Attributes keys must start by a \c '_' character.
* (yes, I know, the C++ convention has changed and it should
* be put at the end).
* -# Collections or containers must be put \e after all the
* scalar attributes and their keys must start by a \c '+'
* character.
*
\code{.json}
{
"@typename": "Cell",
"_id": 3,
"_library": "RootLibrary.AllianceFramework.sxlib",
"_name": "o3_x2",
"_abutmentBox": {
"@typename": "Box",
"_xMin": 0,
"_yMin": 0,
"_xMax": 72000,
"_yMax": 120000
},
"+instanceMap": [],
"+netMap": [
],
}
\endcode
*
* \section secJsonDriver JSON Driver Support
*
* The driver is implemented through overloads (template and
* non-template) of the \c jsonWriter() function. For the
* template overload to work, even for non-Hurricane classes,
* it is defined outside the Hurricane namespace.
*
* For POD types, four overloads of \c jsonWriter() are defined:
*
\code
void jsonWrite ( JsonWriter* w, const int* v );
void jsonWrite ( JsonWriter* w, int v );
void jsonWrite ( JsonWriter* w, const std::string& key, const int* value )
void jsonWrite ( JsonWriter* w, const std::string& key, int value )
\endcode
*
* The first two writes the object (here: \c int) "as is" while
* the two later writes a pair key/object.
*
* For other class/object that needs to be writen in the JSON file,
* they must provide a \c toJson() function. It doesn't even need
* to be virtual. For Point:
*
\code
void Point::toJson ( JsonWriter* w ) const
{
w->startObject();
jsonWrite( w, "@typename", "Point" );
jsonWrite( w, "_x", getX() );
jsonWrite( w, "_y", getY() );
w->endObject();
}
\endcode
*
* This function allows three templates of \c jsonWrite() to be
* used with an object of class Point:
*
\code
template<typename C>
void jsonWrite ( JsonWriter* w, const C* object );
template<typename C>
void jsonWrite ( JsonWriter* w, const std::string& key, C* object );
template<typename C>
void jsonWrite ( JsonWriter* w, const std::string& key, const C* object );
\endcode
*
* Note that through those three overloads we only provides
* support for pointers to object. The driving mechanism is
* designed in such a way that passing arguments by value is
* not supported for non-POD types. Trying to do so will
* result in an unsupported message inside the generated
* JSON file.
*
*
* \subsection secJsonDriverDBo DBos Special Case
*
* For DBo objects, a complete parallel hierarchy of JsonObjects
* mimicking the one of DBos has been implemented. The \c toJson()
* function is implemented in the DBo base object, and the
* derived classes must implement the following virtual functions:
*
\code
class DBo {
public:
virtual void _toJson ( JsonWriter* ) const;
virtual void _toJsonCollections ( JsonWriter* ) const;
virtual void _toJsonSignature ( JsonWriter* ) const;
void toJson ( JsonWriter* ) const;
void toJsonSignature ( JsonWriter* ) const;
\endcode
*
* The JSON driver functions is splitted in two parts:
* - \c _toJson() must drive the scalar attributes.
* - \c _toJsonCollections() must drive the various collections
* or containers.
* This is to ensure that all the scalars attributes are put
* before the collections, event through inheritance.
*
* The additionnal \c toJsonSignature() method provide the
* signature for an Entity which is used by an occurrence.
* The signature of an occurrence is needed when we create
* a JSON for a Cell only. In that case we cannot directly save
* the transhierarchical informations, so we need a way to
* characterize the deep Entity (which is not part of the
* saved Cell). Most of the time, the signature is the scalar
* attributes of the occurrenced object, it is far from foolproof,
* but it will do for now.
*
*
* \section secJsonParser JSON Parser Support
*
* To enable JSON parsing support for an object, say Point,
* an associated \c JsonPoint class must be created. This
* class must be derived (directly or not) from JsonObject.
* It must implement one static functions and four methods,
* as shown below.
*
\code
class JsonPoint : public JsonObject {
public:
static void initialize ();
JsonPoint (unsigned long flags);
virtual string getTypeName();
virtual JsonPoint* clone (unsigned long flags);
virtual void toData (JsonStack&);
};
\endcode
*
* The \c initialize() static function must be present in
* concrete class only. It is used to register the Json
* object into the parser during the static initialization
* of the program.
*
\code
#include "hurricane/Initializer.h"
#include "hurricane/Point.h"
Initializer<JsonPoint> jsonPointInit ( 0 );
void JsonPoint::initialize ()
{ JsonTypes::registerType( new JsonPoint (JsonWriter::RegisterMode) ); }
\endcode
*
* The constructor has to declare requirements, attributes,
* and collections needed to build the DataBase object.
* Note the the requirements are not part of the objects
* but only needed to build it.
*
\code{.cpp}
JsonPoint::JsonPoint ( unsigned long flags )
: JsonObject(flags)
{
add( "_x", typeid(int64_t) );
add( "_y", typeid(int64_t) );
}
\endcode
*
* The \c getTypeName() virtual function must return the
* typename used for the \c "@typename" key in the JSON
* file. Most of the time it's the same name as the
* object itself, but not always.
*
\code{.cpp}
string JsonPoint::getTypeName () const
{ return "Point"; }
\endcode
*
* The \c clone() virtual function must return a brand new
* Json object of the same type. The datas of the orignal
* object \b must not be copied. The cloning is about the
* class type, not the contents.
*
\code
JsonPoint* JsonPoint::clone ( unsigned long flags ) const
{ return new JsonPoint ( flags ); }
\endcode
*
* The \c toData() virtual function actually gather the
* attributes to recreate the DataBase object. It needs
* the parser stack to pull the attributes and to push
* the created object.
*
\code{.cpp}
void JsonPoint::toData ( JsonStack& stack )
{
check( stack, "JsonPoint::toData" );
Point point ( DbU::fromDb(get<int64_t>(stack,"_x"))
, DbU::fromDb(get<int64_t>(stack,"_y")) );
update( stack, point );
}
\endcode
*/
} // Hurricane namespace.

View File

@ -13,7 +13,4 @@
* relation between a name and a value. * relation between a name and a value.
*/ */
// \}
} // End of Hurricane namespace. } // End of Hurricane namespace.

View File

@ -586,6 +586,11 @@ WARN_LOGFILE = doxygen.warn.log
# with spaces. # with spaces.
INPUT = Generalities.dox \ INPUT = Generalities.dox \
JsonSupport.dox \
Initializer.dox \
../../src/hurricane/hurricane/Initializer.h \
JsonObject.dox \
../../src/hurricane/hurricane/JsonReader.h \
Hurricane.dox \ Hurricane.dox \
../../src/hurricane/hurricane/Commons.h \ ../../src/hurricane/hurricane/Commons.h \
Commons.dox \ Commons.dox \

View File

@ -17,8 +17,8 @@
// not, see <http://www.gnu.org/licenses/>. // not, see <http://www.gnu.org/licenses/>.
// **************************************************************************************************** // ****************************************************************************************************
#include "hurricane/Error.h"
#include "hurricane/Box.h" #include "hurricane/Box.h"
#include "hurricane/Error.h"
namespace Hurricane { namespace Hurricane {
@ -365,6 +365,13 @@ void Box::toJson(JsonWriter* w) const
w->endObject(); w->endObject();
} }
Initializer<JsonBox> jsonBoxInit ( 0 );
void JsonBox::initialize()
// **************************
{ JsonTypes::registerType( new JsonBox (JsonWriter::RegisterMode) ); }
JsonBox::JsonBox(unsigned long flags) JsonBox::JsonBox(unsigned long flags)
// ********************************** // **********************************
: JsonObject(flags) : JsonObject(flags)

View File

@ -2,11 +2,15 @@
include_directories ( ${HURRICANE_SOURCE_DIR}/src/hurricane include_directories ( ${HURRICANE_SOURCE_DIR}/src/hurricane
${CONFIGURATION_INCLUDE_DIR} ${CONFIGURATION_INCLUDE_DIR}
${Boost_INCLUDE_DIRS} ${Boost_INCLUDE_DIRS}
${BZIP2_INCLUDE_DIR}
) )
set ( includes hurricane/Mask.h set ( includes hurricane/Mask.h
hurricane/Flags.h hurricane/Flags.h
hurricane/Initializer.h
hurricane/DebugSession.h hurricane/DebugSession.h
hurricane/Backtrace.h hurricane/Backtrace.h
hurricane/FileReadGzStream.h
hurricane/FileWriteGzStream.h
hurricane/JsonWriter.h hurricane/JsonWriter.h
hurricane/JsonReader.h hurricane/JsonReader.h
hurricane/Signature.h hurricane/Signature.h
@ -98,9 +102,12 @@
) )
set ( cpps Record.cpp set ( cpps Record.cpp
Slot.cpp Slot.cpp
Initializer.cpp
Commons.cpp Commons.cpp
Flags.cpp Flags.cpp
Backtrace.cpp Backtrace.cpp
FileReadGzStream.cpp
FileWriteGzStream.cpp
JsonWriter.cpp JsonWriter.cpp
JsonReader.cpp JsonReader.cpp
Signature.cpp Signature.cpp
@ -176,7 +183,7 @@
) )
add_library ( hurricane ${cpps} ) add_library ( hurricane ${cpps} )
target_link_libraries ( hurricane ${Boost_LIBRARIES} ) target_link_libraries ( hurricane ${Boost_LIBRARIES} ${BZIP2_LIBRARIES} )
set_target_properties ( hurricane PROPERTIES VERSION 1.0 SOVERSION 1 ) set_target_properties ( hurricane PROPERTIES VERSION 1.0 SOVERSION 1 )
install ( TARGETS hurricane DESTINATION lib${LIB_SUFFIX} ) install ( TARGETS hurricane DESTINATION lib${LIB_SUFFIX} )
install ( FILES ${includes} DESTINATION include/coriolis2/hurricane ) install ( FILES ${includes} DESTINATION include/coriolis2/hurricane )

View File

@ -21,8 +21,8 @@
#include "hurricane/Warning.h" #include "hurricane/Warning.h"
#include "hurricane/SharedName.h" #include "hurricane/SharedName.h"
#include "hurricane/Cell.h"
#include "hurricane/DataBase.h" #include "hurricane/DataBase.h"
#include "hurricane/Cell.h"
#include "hurricane/Library.h" #include "hurricane/Library.h"
#include "hurricane/Instance.h" #include "hurricane/Instance.h"
#include "hurricane/Net.h" #include "hurricane/Net.h"
@ -43,6 +43,10 @@
namespace Hurricane { namespace Hurricane {
// ****************************************************************************************************
// UniquifyRelation implementation
// ****************************************************************************************************
const Name Cell::UniquifyRelation::_name = "Cell::UniquifyRelation"; const Name Cell::UniquifyRelation::_name = "Cell::UniquifyRelation";
@ -99,6 +103,18 @@ namespace Hurricane {
} }
string Cell::UniquifyRelation::getTrunkName ( Name name )
{
string trunk = getString(name);
size_t suffix = trunk.rfind( "_u" );
if (suffix != string::npos)
trunk = trunk.substr( 0, suffix );
return trunk;
}
Record* Cell::UniquifyRelation::_getRecord () const Record* Cell::UniquifyRelation::_getRecord () const
{ {
Record* record = Relation::_getRecord(); Record* record = Relation::_getRecord();
@ -109,6 +125,158 @@ namespace Hurricane {
} }
bool Cell::UniquifyRelation::hasJson () const
{ return true; }
void Cell::UniquifyRelation::toJson ( JsonWriter* w, const DBo* owner ) const
{
w->startObject();
std::string tname = getString( staticGetName() );
if (getMasterOwner() == owner) {
jsonWrite( w, "@typename" , tname );
jsonWrite( w, "_refcount" , getOwners().getSize() );
jsonWrite( w, "_duplicates", _duplicates );
} else {
tname.insert( 0, "&" );
jsonWrite( w, "@typename", tname );
Cell* masterOwner = dynamic_cast<Cell*>( getMasterOwner() );
if (masterOwner) {
jsonWrite( w, "_masterOwner", masterOwner->getHierarchicalName() );
} else {
cerr << Error( "UniquifyRelation::toJson(): Master owner is not a Cell (%s)."
, getString(owner).c_str()
) << endl;
jsonWrite( w, "_masterOwner", "" );
}
}
w->endObject();
}
// ****************************************************************************************************
// UniquifyRelation::JsonProperty implementation
// ****************************************************************************************************
Initializer<Cell::UniquifyRelation::JsonProperty> jsonUniquifyRelationInit ( 10 );
Cell::UniquifyRelation::JsonProperty::JsonProperty ( unsigned long flags )
: JsonObject(flags)
{
add( "_refcount" , typeid(int64_t) );
add( "_duplicates", typeid(int64_t) );
}
string Cell::UniquifyRelation::JsonProperty::getTypeName () const
{ return getString(Cell::UniquifyRelation::staticGetName()); }
void Cell::UniquifyRelation::JsonProperty::initialize ()
{ JsonTypes::registerType( new Cell::UniquifyRelation::JsonProperty (JsonWriter::RegisterMode) ); }
Cell::UniquifyRelation::JsonProperty* Cell::UniquifyRelation::JsonProperty::clone ( unsigned long flags ) const
{ return new Cell::UniquifyRelation::JsonProperty ( flags ); }
void Cell::UniquifyRelation::JsonProperty::toData ( JsonStack& stack )
{
check( stack, "Cell::UniquifyRelation::JsonProperty::toData" );
DBo* dbo = stack.back_dbo();
unsigned int refcount = get<int64_t>( stack, "_refcount" );
unsigned int duplicates = get<int64_t>( stack, "_duplicates" );
UniquifyRelation* relation = NULL;
Cell* cell = dynamic_cast<Cell*>( dbo );
ltrace(51) << "topDBo:" << dbo << endl;
if (cell) {
relation = UniquifyRelation::get( cell );
if (not relation) {
string tag = cell->getHierarchicalName()+"::"+getString(UniquifyRelation::staticGetName());
relation = dynamic_cast<UniquifyRelation*>( SharedProperty::getOrphaned( tag ) );
if (not relation) {
relation = Cell::UniquifyRelation::create( cell );
SharedProperty::addOrphaned( tag, relation );
}
SharedProperty::refOrphaned( tag );
SharedProperty::countOrphaned( tag, refcount );
cell->put( relation );
}
relation->_setMasterOwner( cell );
relation->_setDuplicates ( duplicates );
}
update( stack, relation );
}
// ****************************************************************************************************
// UniquifyRelation::JsonPropertyRef implementation
// ****************************************************************************************************
Initializer<Cell::UniquifyRelation::JsonPropertyRef> jsonUniquifyRelationRefInit ( 10 );
Cell::UniquifyRelation::JsonPropertyRef::JsonPropertyRef ( unsigned long flags )
: JsonObject(flags)
{
add( "_masterOwner", typeid(string) );
}
string Cell::UniquifyRelation::JsonPropertyRef::getTypeName () const
{ return string("&")+getString(Cell::UniquifyRelation::staticGetName()); }
void Cell::UniquifyRelation::JsonPropertyRef::initialize ()
{ JsonTypes::registerType( new Cell::UniquifyRelation::JsonPropertyRef (JsonWriter::RegisterMode) ); }
Cell::UniquifyRelation::JsonPropertyRef* Cell::UniquifyRelation::JsonPropertyRef::clone ( unsigned long flags ) const
{ return new Cell::UniquifyRelation::JsonPropertyRef ( flags ); }
void Cell::UniquifyRelation::JsonPropertyRef::toData ( JsonStack& stack )
{
check( stack, "Cell::UniquifyRelation::JsonPropertyRef::toData" );
DBo* dbo = stack.back_dbo();
string masterName = get<string>( stack, "_masterOwner" );
UniquifyRelation* relation = NULL;
Cell* cell = dynamic_cast<Cell*>( dbo );
string tag = masterName+"::"+getString(UniquifyRelation::staticGetName());
if (cell) {
if (not relation) {
relation = dynamic_cast<UniquifyRelation*>( SharedProperty::getOrphaned( tag ) );
if (not relation) {
relation = Cell::UniquifyRelation::create( cell );
SharedProperty::addOrphaned( tag, relation );
}
}
if (relation) {
cell->put( relation );
SharedProperty::refOrphaned( tag );
}
}
update( stack, relation );
}
// ****************************************************************************************************
// Cell Slice related implementation
// ****************************************************************************************************
void Cell::_insertSlice ( ExtensionSlice* slice ) void Cell::_insertSlice ( ExtensionSlice* slice )
{ {
ExtensionSliceMap::iterator islice = _extensionSlices.find ( slice->getName() ); ExtensionSliceMap::iterator islice = _extensionSlices.find ( slice->getName() );
@ -177,14 +345,14 @@ Cell::Cell(Library* library, const Name& name)
_observers(), _observers(),
_flags(Flags::Terminal) _flags(Flags::Terminal)
{ {
if (!_library) if (!_library)
throw Error("Can't create " + _TName("Cell") + " : null library"); throw Error("Can't create " + _TName("Cell") + " : null library");
if (name.isEmpty()) if (name.isEmpty())
throw Error("Can't create " + _TName("Cell") + " : empty name"); throw Error("Can't create " + _TName("Cell") + " : empty name");
if (_library->getCell(_name)) if (_library->getCell(_name))
throw Error("Can't create " + _TName("Cell") + " " + getString(_name) + " : already exists"); throw Error("Can't create " + _TName("Cell") + " " + getString(_name) + " : already exists");
} }
Cell* Cell::create(Library* library, const Name& name) Cell* Cell::create(Library* library, const Name& name)
@ -895,9 +1063,11 @@ void Cell::_toJson(JsonWriter* writer) const
void Cell::_toJsonCollections(JsonWriter* writer) const void Cell::_toJsonCollections(JsonWriter* writer) const
// ***************************************** // *****************************************
{ {
writer->setFlags( JsonWriter::CellObject );
jsonWrite( writer, "+instanceMap", getInstances() ); jsonWrite( writer, "+instanceMap", getInstances() );
jsonWrite( writer, "+netMap" , getNets() ); jsonWrite( writer, "+netMap" , getNets() );
Inherit::_toJsonCollections( writer ); Inherit::_toJsonCollections( writer );
writer->resetFlags( JsonWriter::CellObject );
} }
// **************************************************************************************************** // ****************************************************************************************************
@ -1217,6 +1387,10 @@ void Cell::MarkerSet::_setNextElement(Marker* marker, Marker* nextMarker) const
// JsonCell implementation // JsonCell implementation
// **************************************************************************************************** // ****************************************************************************************************
Initializer<JsonCell> jsonCellInitialize ( 10 );
JsonCell::JsonCell(unsigned long flags) JsonCell::JsonCell(unsigned long flags)
// ************************************ // ************************************
: JsonEntity(flags) : JsonEntity(flags)
@ -1233,6 +1407,10 @@ string JsonCell::getTypeName() const
// ********************************* // *********************************
{ return "Cell"; } { return "Cell"; }
void JsonCell::initialize()
// *************************
{ JsonTypes::registerType( new JsonCell (JsonWriter::RegisterMode) ); }
JsonCell* JsonCell::clone(unsigned long flags) const JsonCell* JsonCell::clone(unsigned long flags) const
// ************************************************* // *************************************************
{ return new JsonCell ( flags ); } { return new JsonCell ( flags ); }
@ -1243,8 +1421,9 @@ void JsonCell::toData(JsonStack& stack)
check( stack, "JsonCell::toData" ); check( stack, "JsonCell::toData" );
presetId( stack ); presetId( stack );
Cell* cell = Cell::create( DataBase::getDB()->getLibrary( get<string>(stack,"_library") ) Library* library = DataBase::getDB()->getLibrary( get<string>(stack,"_library")
, get<string>(stack,"_name") ); , DataBase::CreateLib|DataBase::WarnCreateLib );
Cell* cell = Cell::create( library, get<string>(stack,"_name") );
cell->setAbutmentBox( stack.as<Box>("_abutmentBox") ); cell->setAbutmentBox( stack.as<Box>("_abutmentBox") );
update( stack, cell ); update( stack, cell );

View File

@ -541,6 +541,13 @@ string Contact_Hooks::Locator::_getString() const
// JsonContact implementation // JsonContact implementation
// **************************************************************************************************** // ****************************************************************************************************
Initializer<JsonContact> jsonContactInit ( 0 );
void JsonContact::initialize()
// ****************************
{ JsonTypes::registerType( new JsonContact (JsonWriter::RegisterMode) ); }
JsonContact::JsonContact(unsigned long flags) JsonContact::JsonContact(unsigned long flags)
// ****************************************** // ******************************************
: JsonComponent(flags) : JsonComponent(flags)

View File

@ -29,8 +29,9 @@
// +-----------------------------------------------------------------+ // +-----------------------------------------------------------------+
#include "hurricane/Property.h"
#include "hurricane/DBo.h" #include "hurricane/DBo.h"
#include "hurricane/Initializer.h"
#include "hurricane/Property.h"
#include "hurricane/Quark.h" #include "hurricane/Quark.h"
#include "hurricane/Error.h" #include "hurricane/Error.h"
@ -160,6 +161,9 @@ namespace Hurricane {
{ {
writer->key( "+propertySet" ); writer->key( "+propertySet" );
writer->startArray(); writer->startArray();
for ( Property* property : getProperties() ) {
if (property->hasJson()) property->toJson( writer, this );
}
writer->endArray(); writer->endArray();
} }
@ -212,7 +216,7 @@ namespace Hurricane {
// Class : "Hurricane::JsonDBo". // Class : "Hurricane::JsonDBo".
JsonDBo::JsonDBo ( unsigned int flags ) JsonDBo::JsonDBo ( unsigned int flags )
: JsonObject(flags) : JsonObject(flags | JsonWriter::DBoObject)
{ } { }

View File

@ -17,12 +17,91 @@
// not, see <http://www.gnu.org/licenses/>. // not, see <http://www.gnu.org/licenses/>.
// **************************************************************************************************** // ****************************************************************************************************
#include "hurricane/DataBase.h" #include "hurricane/Initializer.h"
#include "hurricane/Warning.h"
#include "hurricane/Error.h"
#include "hurricane/SharedPath.h" #include "hurricane/SharedPath.h"
#include "hurricane/UpdateSession.h"
#include "hurricane/DataBase.h"
#include "hurricane/Technology.h" #include "hurricane/Technology.h"
#include "hurricane/Library.h" #include "hurricane/Library.h"
#include "hurricane/Error.h"
#include "hurricane/UpdateSession.h"
namespace {
using namespace std;
using namespace Hurricane;
class CellDepths {
public:
typedef map<Cell* const,int> CellMap;
typedef multimap<int,Cell* const> DepthMap;
public:
CellDepths ( Library* );
inline const DepthMap& getDepths () const;
private:
void _gatherCells ( Library* );
void _computeDepths ();
int _computeDepth ( pair<Cell* const,int>& );
private:
CellMap _cellMap;
DepthMap _depthMap;
};
inline const CellDepths::DepthMap& CellDepths::getDepths () const { return _depthMap; }
CellDepths::CellDepths ( Library* library )
: _cellMap ()
, _depthMap()
{
_gatherCells ( library );
_computeDepths();
}
void CellDepths::_gatherCells ( Library* library )
{
for ( Cell* cell : library->getCells() ) _cellMap.insert( make_pair(cell,-1) );
for ( Library* childLibrary : library->getLibraries() )
_gatherCells( childLibrary );
}
int CellDepths::_computeDepth ( pair<Cell* const,int>& cellDepth )
{
if (cellDepth.second != -1) return cellDepth.second;
int depth = 0;
if (not cellDepth.first->isTerminal()) {
for ( Instance* instance : cellDepth.first->getInstances() ) {
Cell* masterCell = instance->getMasterCell();
pair<Cell* const,int>& masterDepth = *(_cellMap.find( masterCell ));
depth = std::max( depth, _computeDepth(masterDepth)+1 );
}
}
cellDepth.second = depth;
return cellDepth.second;
}
void CellDepths::_computeDepths ()
{
_depthMap.clear();
for ( auto cellDepth : _cellMap ) {
_computeDepth( cellDepth );
_depthMap.insert( make_pair(cellDepth.second,cellDepth.first) );
}
}
} // Anonymous namespace.
namespace Hurricane { namespace Hurricane {
@ -34,6 +113,7 @@ namespace Hurricane {
DataBase* DataBase::_db = NULL; DataBase* DataBase::_db = NULL;
DataBase::DataBase() DataBase::DataBase()
// ***************** // *****************
: Inherit(), : Inherit(),
@ -57,9 +137,10 @@ DataBase* DataBase::create()
void DataBase::_postCreate() void DataBase::_postCreate()
// ************************* // *************************
{ {
Inherit::_postCreate(); Init::runOnce();
Inherit::_postCreate();
_db = this; _db = this;
} }
void DataBase::_preDestroy() void DataBase::_preDestroy()
@ -101,11 +182,11 @@ DataBase* DataBase::getDB()
return _db; return _db;
} }
Library* DataBase::getLibrary(string rpath) const Library* DataBase::getLibrary(string rpath, unsigned int flags)
// ********************************************** // ************************************************************
{ {
Library* current = getRootLibrary(); Library* parent = getRootLibrary();
if (not current) return NULL; if ( not parent and (not (flags & CreateLib)) ) return NULL;
char separator = SharedPath::getNameSeparator(); char separator = SharedPath::getNameSeparator();
Name childName; Name childName;
@ -113,33 +194,54 @@ Library* DataBase::getLibrary(string rpath) const
if (dot != string::npos) { if (dot != string::npos) {
childName = rpath.substr( 0, dot ); childName = rpath.substr( 0, dot );
rpath = rpath.substr( dot+1 ); rpath = rpath.substr( dot+1 );
} else } else {
childName = rpath; childName = rpath;
rpath.clear();
}
if (childName != current->getName()) if (not parent) {
parent = Library::create( this, childName );
if (flags & WarnCreateLib) {
cerr << Warning( "DataBase::getLibrary(): Creating Root library \"%s\"."
, getString(childName).c_str()
) << endl;
}
}
if (childName != parent->getName())
return NULL; return NULL;
while ( dot != string::npos ) { while ( (dot != string::npos) and parent ) {
dot = rpath.find( separator ); dot = rpath.find( separator );
if (dot != string::npos) { if (dot != string::npos) {
childName = rpath.substr( 0, dot ); childName = rpath.substr( 0, dot );
rpath = rpath.substr( dot+1 ); rpath = rpath.substr( dot+1 );
} else } else {
childName = rpath; childName = rpath;
rpath.clear();
}
current = current->getLibrary( childName ); Library* child = parent->getLibrary( childName );
if ( not child and (flags & CreateLib) ) {
child = Library::create( parent, childName );
if (flags & WarnCreateLib) {
cerr << Warning( "DataBase::getLibrary(): Creating library \"%s\" (parent:\"%s\")."
, getString(childName).c_str()
, getString(parent->getName()).c_str()
) << endl;
}
}
parent = child;
} }
return current; return parent;
} }
Cell* DataBase::getCell(string rpath) const Cell* DataBase::getCell(string rpath, unsigned int flags)
// **************************************** // ******************************************************
{ {
char separator = SharedPath::getNameSeparator(); char separator = SharedPath::getNameSeparator();
size_t dot = rpath.rfind( separator ); size_t dot = rpath.rfind( separator );
string cellName = rpath.substr(dot+1); string cellName = rpath.substr(dot+1);
Library* library = getLibrary( rpath.substr(0,dot) ); Library* library = getLibrary( rpath.substr(0,dot), flags );
Cell* cell = NULL; Cell* cell = NULL;
if (library) if (library)
@ -151,6 +253,61 @@ Cell* DataBase::getCell(string rpath) const
} }
void DataBase::_toJson(JsonWriter* w) const
// ****************************************
{
Inherit::_toJson( w );
jsonWrite( w, "_rootLibrary" , _rootLibrary );
w->key( "+cellsOrderedByDepth" );
w->startArray();
CellDepths cells = CellDepths( _rootLibrary );
for ( auto depthCell : cells.getDepths() ) {
depthCell.second->toJson( w );
}
w->endArray();
}
// ****************************************************************************************************
// JsonDataBase implementation
// ****************************************************************************************************
Initializer<JsonDataBase> jsonDataBaseInit ( 0 );
JsonDataBase::JsonDataBase(unsigned long flags)
// ********************************************
: JsonDBo(flags)
{
add( "_rootLibrary", typeid(Library*) );
}
string JsonDataBase::getTypeName() const
// *********************************
{ return "DataBase"; }
void JsonDataBase::initialize()
// *****************************
{ JsonTypes::registerType( new JsonDataBase (JsonWriter::RegisterMode) ); }
JsonDataBase* JsonDataBase::clone(unsigned long flags) const
// *************************************************
{ return new JsonDataBase ( flags ); }
void JsonDataBase::toData(JsonStack& stack)
// ***************************************
{
check( stack, "JsonDataBase::toData" );
DataBase* db = DataBase::getDB();
update( stack, db );
}
} // End of Hurricane namespace. } // End of Hurricane namespace.

View File

@ -132,6 +132,12 @@ namespace Hurricane {
// ------------------------------------------------------------------- // -------------------------------------------------------------------
// Class : "JsonDeepNet". // Class : "JsonDeepNet".
Initializer<JsonDeepNet> jsonDeepNetInit ( 0 );
void JsonDeepNet::initialize ()
{ JsonTypes::registerType( new JsonDeepNet (JsonWriter::RegisterMode) ); }
JsonDeepNet::JsonDeepNet ( unsigned long flags ) JsonDeepNet::JsonDeepNet ( unsigned long flags )
: JsonNet(flags) : JsonNet(flags)
{ {

View File

@ -15,9 +15,8 @@
#include <iostream> #include <iostream>
#include "hurricane/DesignBlob.h"
#include "hurricane/DataBase.h" #include "hurricane/DataBase.h"
#include "hurricane/Library.h" #include "hurricane/Cell.h"
#include "hurricane/DesignBlob.h" #include "hurricane/DesignBlob.h"
@ -35,7 +34,7 @@ namespace Hurricane {
w->startObject(); w->startObject();
jsonWrite( w, "@typename", _getTypeName() ); jsonWrite( w, "@typename", _getTypeName() );
jsonWrite( w, "_topCell" , getTopCell()->getHierarchicalName() ); jsonWrite( w, "_topCell" , getTopCell()->getHierarchicalName() );
jsonWrite( w, "_library" , DataBase::getDB()->getRootLibrary() ); jsonWrite( w, "_database", DataBase::getDB() );
w->endObject(); w->endObject();
} }
@ -43,13 +42,20 @@ namespace Hurricane {
// ------------------------------------------------------------------- // -------------------------------------------------------------------
// Class : "JsonDesignBlob". // Class : "JsonDesignBlob".
Initializer<JsonDesignBlob> jsonDesignBlobInit ( 0 );
void JsonDesignBlob::initialize ()
{ JsonTypes::registerType( new JsonDesignBlob (JsonWriter::RegisterMode) ); }
JsonDesignBlob::JsonDesignBlob ( unsigned long flags ) JsonDesignBlob::JsonDesignBlob ( unsigned long flags )
: JsonObject(flags) : JsonObject(flags)
{ {
ltrace(51) << "JsonDesignblob::JsonDesignblob()" << endl; ltrace(51) << "JsonDesignblob::JsonDesignblob()" << endl;
add( "_library", typeid(Library*) ); add( "_topCell" , typeid(string) );
add( "_topCell", typeid(string) ); add( "_database", typeid(DataBase*) );
} }
@ -65,7 +71,8 @@ namespace Hurricane {
{ {
check( stack, "JsonDesignBlob::toData" ); check( stack, "JsonDesignBlob::toData" );
DesignBlob* designBlob = new DesignBlob ( DataBase::getDB()->getCell(get<string>(stack,"_topCell")) ); DesignBlob* designBlob = new DesignBlob
( DataBase::getDB()->getCell( get<string>(stack,"_topCell"), DataBase::NoFlags ) );
update( stack, designBlob ); update( stack, designBlob );
} }

View File

@ -0,0 +1,83 @@
// -*- mode: C++ -*-
//
// This file is part of the Coriolis Software.
// Copyright (c) UPMC 2016-2015, All Rights Reserved
//
// +-----------------------------------------------------------------+
// | C O R I O L I S |
// | V L S I B a c k e n d D a t a - B a s e |
// | |
// | Author : Jean-Paul CHAPUT |
// | E-mail : Jean-Paul.Chaput@lip6.fr |
// | =============================================================== |
// | C++ Module : "./FileReadGzStream.h" |
// +-----------------------------------------------------------------+
#include <bzlib.h>
#include "hurricane/Error.h"
#include "hurricane/FileReadGzStream.h"
namespace Hurricane {
// -------------------------------------------------------------------
// Class : "FileReadGzStream".
FileReadGzStream::FileReadGzStream ( std::FILE* fp
, char* buffer
, size_t bufferSize
)
: fp_ (fp)
, bzfp_ (NULL)
, buffer_ (buffer)
, bufferSize_(bufferSize)
, bufferLast_(0)
, current_ (buffer_)
, readCount_ (0)
, count_ (0)
, eof_ (false)
, bzerror_ (BZ_OK)
{
assert(fp_ != 0);
assert(bufferSize >= 4);
bzfp_ = BZ2_bzReadOpen( &bzerror_, fp_, 0, 0, NULL, 0 );
if (bzerror_ != BZ_OK) {
cerr << Error( "FileReadGzStream::FileReadGzstream(): Unable to initialize bzip2 stream." ) << endl;
eof_ = true;
}
Read();
}
void FileReadGzStream::Read ()
{
if (current_ < bufferLast_)
++current_;
else if (not eof_) {
count_ += readCount_;
readCount_ = BZ2_bzRead( &bzerror_, bzfp_, buffer_, bufferSize_ );
bufferLast_ = buffer_ + readCount_ - 1;
current_ = buffer_;
if (readCount_ < bufferSize_) {
buffer_[readCount_] = '\0';
++bufferLast_;
eof_ = true;
}
if (bzerror_ != BZ_OK) {
eof_ = true;
if (bzerror_ != BZ_STREAM_END) {
cerr << Error( "FileReadGzStream::Read(): Unexpected termination of bzip2 stream." ) << endl;
}
BZ2_bzReadClose ( &bzerror_, bzfp_ );
}
}
}
} // Hurricane namespace.

View File

@ -0,0 +1,79 @@
// -*- mode: C++ -*-
//
// This file is part of the Coriolis Software.
// Copyright (c) UPMC 2016-2015, All Rights Reserved
//
// +-----------------------------------------------------------------+
// | C O R I O L I S |
// | V L S I B a c k e n d D a t a - B a s e |
// | |
// | Author : Jean-Paul CHAPUT |
// | E-mail : Jean-Paul.Chaput@lip6.fr |
// | =============================================================== |
// | C++ Module : "./FileWriteGzStream.h" |
// +-----------------------------------------------------------------+
#include <bzlib.h>
#include "hurricane/Error.h"
#include "hurricane/FileWriteGzStream.h"
namespace Hurricane {
// -------------------------------------------------------------------
// Class : "FileWriteGzStream".
FileWriteGzStream::FileWriteGzStream ( std::FILE* fp
, char* buffer
, size_t bufferSize
)
: fp_ (fp)
, bzfp_ (NULL)
, buffer_ (buffer)
, bufferEnd_(buffer + bufferSize), current_(buffer_)
, bzerror_ (BZ_OK)
{
assert(fp_ != 0);
bzfp_ = BZ2_bzWriteOpen( &bzerror_, fp_, 9, 0, 0 );
if (bzerror_ != BZ_OK) {
cerr << Error( "FileWriteGzStream::FileWriteGzstream(): Unable to initialize bzip2 stream." ) << endl;
}
}
FileWriteGzStream::~FileWriteGzStream ()
{
if (not bzfp_) return;
unsigned int bytesin = 0;
unsigned int bytesout = 0;
BZ2_bzWriteClose( &bzerror_, bzfp_, 0, &bytesin, &bytesout );
if (bzerror_ != BZ_OK) {
cerr << Error( "FileWriteGzStream::~FileWritegzstream(): I/O error while closing stream." ) << endl;
}
}
void FileWriteGzStream::Flush ()
{
if (current_ != buffer_) {
BZ2_bzWrite( &bzerror_,bzfp_, buffer_, static_cast<int>(current_ - buffer_) );
if (bzerror_ != BZ_OK) {
unsigned int bytesin = 0;
unsigned int bytesout = 0;
BZ2_bzWriteClose( &bzerror_, bzfp_, 0, &bytesin, &bytesout );
if (bzerror_ != BZ_OK) {
cerr << Error( "FileWriteGzStream::Write(): I/O error in bzip2 stream." ) << endl;
}
}
current_ = buffer_;
}
}
} // Hurricane namespace.

View File

@ -208,6 +208,13 @@ Record* Horizontal::_getRecord() const
// JsonHorizontal implementation // JsonHorizontal implementation
// **************************************************************************************************** // ****************************************************************************************************
Initializer<JsonHorizontal> jsonHorizontalInit ( 0 );
void JsonHorizontal::initialize()
// *******************************
{ JsonTypes::registerType( new JsonHorizontal (JsonWriter::RegisterMode) ); }
JsonHorizontal::JsonHorizontal(unsigned long flags) JsonHorizontal::JsonHorizontal(unsigned long flags)
// ************************************************ // ************************************************
: JsonSegment(flags) : JsonSegment(flags)

View File

@ -0,0 +1,78 @@
// -*- C++ -*-
//
// Copyright (c) BULL S.A. 2015-2015, All Rights Reserved
//
// This file is part of Hurricane.
//
// Hurricane is free software: you can redistribute it and/or modify
// it under the terms of the GNU Lesser General Public License as
// published by the Free Software Foundation, either version 3 of the
// License, or (at your option) any later version.
//
// Hurricane is distributed in the hope that it will be useful, but
// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHAN-
// TABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the Lesser GNU
// General Public License for more details.
//
// You should have received a copy of the Lesser GNU General Public
// License along with Hurricane. If not, see
// <http://www.gnu.org/licenses/>.
//
// +-----------------------------------------------------------------+
// | H U R R I C A N E |
// | V L S I B a c k e n d D a t a - B a s e |
// | |
// | Authors : Jean-Paul Chaput |
// | E-mail : Jean-Paul.Chaput@lip6.fr |
// | =============================================================== |
// | C++ Module : "./Initializer.cpp" |
// +-----------------------------------------------------------------+
#include <iostream>
#include "hurricane/Initializer.h"
namespace Hurricane {
using namespace std;
// -------------------------------------------------------------------
// Class : "Init".
bool Init::_run = false;
Init::InitializerMap* Init::_initializers = NULL;
void Init::destroy ()
{
if (_initializers) delete _initializers;
_initializers = NULL;
_run = false;
}
Init::InitializerMap& Init::initializers ()
{
if (not _initializers) _initializers = new InitializerMap();
return *_initializers;
}
void Init::addInitializer ( unsigned int order,initializer_t initFunction )
{ initializers().insert( make_pair(order,initFunction) ); }
bool Init::runOnce ()
{
if (_run) return false;
for ( auto init : initializers() ) init.second();
_run = true;
return true;
}
} // Hurricane namespace.

View File

@ -498,9 +498,10 @@ void Instance::uniquify()
if (not _getSharedPathMap().isEmpty()) { if (not _getSharedPathMap().isEmpty()) {
cerr << Warning( "Instance::uniquify(): While uniquifying model %s of instance %s, SharedPathMap is not empty.\n" cerr << Warning( "Instance::uniquify(): While uniquifying model %s of instance %s, SharedPathMap is not empty.\n"
" (Entity's Occurrences will still uses the original master Cell)" " (%u Entity's Occurrences will still uses the original master Cell)"
, getString(_masterCell->getName()).c_str() , getString(_masterCell->getName()).c_str()
, getString(getName()).c_str() , getString(getName()).c_str()
, _getSharedPathMap()._getSize()
) << endl; ) << endl;
} }
@ -754,6 +755,12 @@ Record* Instance::PlacementStatus::_getRecord() const
// JsonInstance implementation // JsonInstance implementation
// **************************************************************************************************** // ****************************************************************************************************
Initializer<JsonInstance> jsonInstanceInit ( 0 );
void JsonInstance::initialize()
// *****************************
{ JsonTypes::registerType( new JsonInstance (JsonWriter::RegisterMode) ); }
JsonInstance::JsonInstance(unsigned long flags) JsonInstance::JsonInstance(unsigned long flags)
// ******************************************** // ********************************************
: JsonEntity(flags) : JsonEntity(flags)
@ -782,7 +789,7 @@ void JsonInstance::toData(JsonStack& stack)
Instance* instance = Instance::create Instance* instance = Instance::create
( get<Cell* >(stack,".Cell") ( get<Cell* >(stack,".Cell")
, get<string>(stack,"_name") , get<string>(stack,"_name")
, DataBase::getDB()->getCell( get<string>(stack,"_masterCell") ) , DataBase::getDB()->getCell( get<string>(stack,"_masterCell"), DataBase::NoFlags )
, get<Transformation>(stack,"_transformation") , get<Transformation>(stack,"_transformation")
, Instance::PlacementStatus(get<string>(stack,"_placementStatus") ) , Instance::PlacementStatus(get<string>(stack,"_placementStatus") )
); );

View File

@ -32,6 +32,8 @@
#include "rapidjson/filereadstream.h" #include "rapidjson/filereadstream.h"
#include "rapidjson/reader.h" #include "rapidjson/reader.h"
// Needed for registering. May be deleted later. // Needed for registering. May be deleted later.
#include "hurricane/Initializer.h"
#include "hurricane/FileReadGzStream.h"
#include "hurricane/DebugSession.h" #include "hurricane/DebugSession.h"
#include "hurricane/Warning.h" #include "hurricane/Warning.h"
#include "hurricane/JsonReader.h" #include "hurricane/JsonReader.h"
@ -112,14 +114,14 @@ namespace {
JsonReader ( const JsonReader& ); JsonReader ( const JsonReader& );
JsonReader& operator= ( const JsonReader& ) const; JsonReader& operator= ( const JsonReader& ) const;
private: private:
unsigned long _flags; unsigned long _flags;
size_t _bufferSize; size_t _bufferSize;
char* _buffer; char* _buffer;
FILE* _file; FILE* _file;
FileReadStream* _stream; FileReadGzStream* _stream;
JsonStack _stack; JsonStack _stack;
Reader _reader; Reader _reader;
HurricaneHandler _handler; HurricaneHandler _handler;
}; };
@ -150,7 +152,8 @@ namespace {
bool HurricaneHandler::Null () bool HurricaneHandler::Null ()
{ {
if (isDummy()) return true; if (isDummy()) return true;
stack().push_back<void*>( _key, NULL ); stack().push_back<DBo*>( _key, (DBo*)NULL );
_key.clear();
return true; return true;
} }
@ -159,6 +162,7 @@ namespace {
{ {
if (isDummy()) return true; if (isDummy()) return true;
stack().push_back<bool>( _key, v ); stack().push_back<bool>( _key, v );
_key.clear();
return true; return true;
} }
@ -167,6 +171,7 @@ namespace {
{ {
if (isDummy()) return true; if (isDummy()) return true;
stack().push_back<int64_t>( _key, v ); stack().push_back<int64_t>( _key, v );
_key.clear();
return true; return true;
} }
@ -175,6 +180,7 @@ namespace {
{ {
if (isDummy()) return true; if (isDummy()) return true;
stack().push_back<int64_t>( _key, v ); stack().push_back<int64_t>( _key, v );
_key.clear();
return true; return true;
} }
@ -183,6 +189,7 @@ namespace {
{ {
if (isDummy()) return true; if (isDummy()) return true;
stack().push_back<int64_t>( _key, v ); stack().push_back<int64_t>( _key, v );
_key.clear();
return true; return true;
} }
@ -191,6 +198,7 @@ namespace {
{ {
if (isDummy()) return true; if (isDummy()) return true;
stack().push_back<int64_t>( _key, v ); stack().push_back<int64_t>( _key, v );
_key.clear();
return true; return true;
} }
@ -199,6 +207,7 @@ namespace {
{ {
if (isDummy()) return true; if (isDummy()) return true;
stack().push_back<double>( _key, v ); stack().push_back<double>( _key, v );
_key.clear();
return true; return true;
} }
@ -211,6 +220,7 @@ namespace {
if (_key != "@typename") { if (_key != "@typename") {
cerr << Warning("JsonReader::parse(): First field is not @typename, skipping object." ) << endl; cerr << Warning("JsonReader::parse(): First field is not @typename, skipping object." ) << endl;
_key.clear();
return true; return true;
} }
@ -239,10 +249,12 @@ namespace {
} }
ltrace(51) << "HurricaneHandler::String() [key/typename] \"" << value << "\"." << endl; ltrace(51) << "HurricaneHandler::String() [key/typename] \"" << value << "\"." << endl;
_key.clear();
return true; return true;
} }
stack().push_back<string>( _key, value ); stack().push_back<string>( _key, value );
_key.clear();
return true; return true;
} }
@ -276,8 +288,9 @@ namespace {
ltracein(50); ltracein(50);
_state |= TypenameKey; _state |= TypenameKey;
_objectName = (_key == ".Array") ? "" : _key; _objectName = _key;
_objects.push_back( new JsonDummy() ); _objects.push_back( new JsonDummy() );
_key.clear();
ltrace(51) << "_objects.push_back(NULL), size():" << _objects.size() << "." << endl; ltrace(51) << "_objects.push_back(NULL), size():" << _objects.size() << "." << endl;
ltracein(50); ltracein(50);
@ -302,11 +315,12 @@ namespace {
} }
} }
//if (_objects.size() > 1) { ltrace(51) << "_objects.pop_back(), size():" << _objects.size() << "." << endl;
ltrace(51) << "_objects.pop_back(), size():" << _objects.size() << "." << endl; if (_objects.back()->issetFlags(JsonWriter::DBoObject))
delete _objects.back(); stack().pop_back_dbo();
_objects.pop_back();
//} delete _objects.back();
_objects.pop_back();
ltraceout(50); ltraceout(50);
return true; return true;
@ -323,20 +337,16 @@ namespace {
cerr << Warning("JsonReader::parse(): Array attributes must start by \'+\' %s.", _key.c_str() ) << endl; cerr << Warning("JsonReader::parse(): Array attributes must start by \'+\' %s.", _key.c_str() ) << endl;
return true; return true;
} }
_key.clear();
_key = ".Array";
return true; return true;
} }
bool HurricaneHandler::EndArray ( SizeType ) bool HurricaneHandler::EndArray ( SizeType )
{ {
ltraceout(50); ltraceout(50);
ltrace(50) << "HurricaneHandler::EndArray()" << endl; ltrace(50) << "HurricaneHandler::EndArray()" << endl;
ltracein(50);
_key.clear();
ltraceout(50);
return true; return true;
} }
@ -382,9 +392,9 @@ namespace {
{ {
close(); close();
DebugSession::open( 50 ); //DebugSession::open( 50 );
fileName += ".json"; fileName += ".json.bz2";
_file = fopen( fileName.c_str(), "r" ); _file = fopen( fileName.c_str(), "r" );
ltrace(50) << "_file:" << _file << ", _buffer:" << (void*)_buffer << endl; ltrace(50) << "_file:" << _file << ", _buffer:" << (void*)_buffer << endl;
@ -393,7 +403,7 @@ namespace {
, fileName.c_str() ); , fileName.c_str() );
} }
_stream = new FileReadStream ( _file, _buffer, _bufferSize ); _stream = new FileReadGzStream ( _file, _buffer, _bufferSize );
if (issetFlags(JsonWriter::DesignBlobMode)) if (issetFlags(JsonWriter::DesignBlobMode))
Entity::enableForcedIdMode(); Entity::enableForcedIdMode();
@ -402,8 +412,10 @@ namespace {
if (issetFlags(JsonWriter::DesignBlobMode)) if (issetFlags(JsonWriter::DesignBlobMode))
Entity::disableForcedIdMode(); Entity::disableForcedIdMode();
DebugSession::close(); //DebugSession::close();
close(); close();
SharedProperty::clearOrphaneds();
} }
@ -588,6 +600,8 @@ namespace Hurricane {
// ------------------------------------------------------------------- // -------------------------------------------------------------------
// Class : "JsonTypes". // Class : "JsonTypes".
Initializer<JsonTypes> jsonTypesInitialize ( 10 );
JsonTypes* JsonTypes::_jsonTypes = NULL; JsonTypes* JsonTypes::_jsonTypes = NULL;
@ -635,29 +649,7 @@ namespace Hurricane {
void JsonTypes::initialize () void JsonTypes::initialize ()
{ { if (not _jsonTypes) _jsonTypes = new JsonTypes (); }
if (_jsonTypes) return;
_jsonTypes = new JsonTypes ();
_jsonTypes->_registerType( new JsonPoint (JsonWriter::RegisterMode) );
_jsonTypes->_registerType( new JsonBox (JsonWriter::RegisterMode) );
_jsonTypes->_registerType( new JsonTransformation(JsonWriter::RegisterMode) );
_jsonTypes->_registerType( new JsonLibrary (JsonWriter::RegisterMode) );
_jsonTypes->_registerType( new JsonCell (JsonWriter::RegisterMode) );
_jsonTypes->_registerType( new JsonNet (JsonWriter::RegisterMode) );
_jsonTypes->_registerType( new JsonDeepNet (JsonWriter::RegisterMode) );
_jsonTypes->_registerType( new JsonPlugRef (JsonWriter::RegisterMode) );
_jsonTypes->_registerType( new JsonRoutingPad (JsonWriter::RegisterMode) );
_jsonTypes->_registerType( new JsonContact (JsonWriter::RegisterMode) );
_jsonTypes->_registerType( new JsonVertical (JsonWriter::RegisterMode) );
_jsonTypes->_registerType( new JsonHorizontal (JsonWriter::RegisterMode) );
_jsonTypes->_registerType( new JsonPad (JsonWriter::RegisterMode) );
_jsonTypes->_registerType( new JsonInstance (JsonWriter::RegisterMode) );
_jsonTypes->_registerType( new JsonPlug (JsonWriter::RegisterMode) );
_jsonTypes->_registerType( new JsonOccurrence (JsonWriter::RegisterMode) );
_jsonTypes->_registerType( new JsonSignature (JsonWriter::RegisterMode) );
_jsonTypes->_registerType( new JsonDesignBlob (JsonWriter::RegisterMode) );
}
// ------------------------------------------------------------------- // -------------------------------------------------------------------

View File

@ -29,14 +29,16 @@
// +-----------------------------------------------------------------+ // +-----------------------------------------------------------------+
#include "rapidjson/filewritestream.h" //#include "rapidjson/filewritestream.h"
#include "rapidjson/prettywriter.h" #include "rapidjson/prettywriter.h"
#include "hurricane/Commons.h" #include "hurricane/Commons.h"
#include "hurricane/FileWriteGzStream.h"
//namespace Hurricane { //namespace Hurricane {
typedef rapidjson::PrettyWriter<rapidjson::FileWriteStream> JsonOfstream; //typedef rapidjson::PrettyWriter<rapidjson::FileWriteStream> JsonOfstream;
typedef rapidjson::PrettyWriter<Hurricane::FileWriteGzStream> JsonOfstream;
#define _WRITER reinterpret_cast<JsonOfstream*>(_writer) #define _WRITER reinterpret_cast<JsonOfstream*>(_writer)
@ -53,7 +55,8 @@
, _writer (NULL) , _writer (NULL)
{ {
_file = fopen( fileName.c_str(), "w" ); _file = fopen( fileName.c_str(), "w" );
_stream = new rapidjson::FileWriteStream ( _file, _buffer, _bufferSize ); //_stream = new rapidjson::FileWriteGzStream ( _file, _buffer, _bufferSize );
_stream = new Hurricane::FileWriteGzStream ( _file, _buffer, _bufferSize );
_writer = new JsonOfstream ( *_stream ); _writer = new JsonOfstream ( *_stream );
_WRITER->SetIndent( ' ', 2 ); _WRITER->SetIndent( ' ', 2 );
} }

View File

@ -234,7 +234,7 @@ void Library::_toJson(JsonWriter* w) const
Inherit::_toJson( w ); Inherit::_toJson( w );
jsonWrite( w, "_name" , getName() ); jsonWrite( w, "_name" , getName() );
jsonWrite( w, "+cellMap" , getCells() ); //jsonWrite( w, "+cellMap" , getCells() );
jsonWrite( w, "+libraryMap", getLibraries() ); jsonWrite( w, "+libraryMap", getLibraries() );
} }
@ -243,13 +243,19 @@ void Library::_toJson(JsonWriter* w) const
// JsonLibrary implementation // JsonLibrary implementation
// **************************************************************************************************** // ****************************************************************************************************
Initializer<JsonLibrary> jsonLibraryInit ( 0 );
void JsonLibrary::initialize()
// **************************
{ JsonTypes::registerType( new JsonLibrary (JsonWriter::RegisterMode) ); }
JsonLibrary::JsonLibrary(unsigned long flags) JsonLibrary::JsonLibrary(unsigned long flags)
// ************************************ // ************************************
: JsonDBo(flags) : JsonDBo(flags)
{ {
add( ".Library" , typeid(Library*) ); //add( ".Library" , typeid(Library*) );
add( "_name" , typeid(string) ); add( "_name" , typeid(string) );
add( "+cellMap" , typeid(JsonArray) ); //add( "+cellMap" , typeid(JsonArray) );
add( "+libraryMap", typeid(JsonArray) ); add( "+libraryMap", typeid(JsonArray) );
} }
@ -267,11 +273,14 @@ void JsonLibrary::toData(JsonStack& stack)
check( stack, "JsonLibrary::toData" ); check( stack, "JsonLibrary::toData" );
Name libName ( get<string> ( stack, "_name" ) ); Name libName ( get<string> ( stack, "_name" ) );
Library* parent = get<Library*>( stack, ".Library" );
if (not parent)
parent = get<Library*>( stack, "_library" );
Library* library = NULL; Library* library = NULL;
Library* parent = NULL;
if (stack.rhas(".Library"))
parent = get<Library*>( stack, ".Library" );
else if (stack.rhas("_rootLibrary"))
parent = get<Library*>( stack, "_rootLibrary" );
if (parent) { if (parent) {
library = parent->getLibrary( libName ); library = parent->getLibrary( libName );
if (not library) if (not library)

View File

@ -267,14 +267,14 @@ Net::Net(Cell* cell, const Name& name)
_nextOfCellNetMap(NULL), _nextOfCellNetMap(NULL),
_mainName(this) _mainName(this)
{ {
if (!_cell) if (!_cell)
throw Error("Can't create " + _TName("Net") + " : null cell"); throw Error("Can't create " + _TName("Net") + " : null cell");
if (name.isEmpty()) if (name.isEmpty())
throw Error("Can't create " + _TName("Net") + " : empty name"); throw Error("Can't create " + _TName("Net") + " : empty name");
if (_cell->getNet(_name)) if (_cell->getNet(_name))
throw Error("Can't create " + _TName("Net ") + getString(_name) + " : already exists"); throw Error("Can't create " + _TName("Net ") + getString(_name) + " : already exists");
} }
Net* Net::create(Cell* cell, const Name& name) Net* Net::create(Cell* cell, const Name& name)
@ -1064,6 +1064,12 @@ string Net_SlavePlugs::Locator::_getString() const
// JsonNet implementation // JsonNet implementation
// **************************************************************************************************** // ****************************************************************************************************
Initializer<JsonNet> jsonNetInit ( 0 );
void JsonNet::initialize()
// **************************
{ JsonTypes::registerType( new JsonNet (JsonWriter::RegisterMode) ); }
JsonNet::JsonNet(unsigned long flags) JsonNet::JsonNet(unsigned long flags)
// ********************************** // **********************************
: JsonEntity (flags) : JsonEntity (flags)

View File

@ -14,8 +14,9 @@
// +-----------------------------------------------------------------+ // +-----------------------------------------------------------------+
#include "hurricane/NetRoutingProperty.h" #include "hurricane/NetRoutingProperty.h"
#include "hurricane/Net.h" #include "hurricane/Initializer.h"
#include "hurricane/Net.h"
namespace Hurricane { namespace Hurricane {
@ -24,13 +25,18 @@ namespace Hurricane {
using Hurricane::Property; using Hurricane::Property;
// -------------------------------------------------------------------
// Class : "NetRoutingState"
string NetRoutingState::_getString () const string NetRoutingState::_getString () const
{ {
string s; string s;
if (isFixed ()) s += 'f'; s += (isExcluded ()) ? 'e' : '-';
if (isManualGlobalRoute ()) s += 'm'; s += (isFixed ()) ? 'f' : '-';
if (isAutomaticGlobalRoute()) s += 'a'; s += (isUnconnected ()) ? 'u' : '-';
s += (isManualGlobalRoute ()) ? 'm' : '-';
s += (isAutomaticGlobalRoute()) ? 'a' : '-';
return s; return s;
} }
@ -101,6 +107,88 @@ namespace Hurricane {
} }
bool NetRoutingProperty::hasJson () const
{ return true; }
void NetRoutingProperty::toJson ( JsonWriter* w, const DBo* ) const
{
w->startObject();
jsonWrite( w, "@typename", _getTypeName() );
jsonWrite( w, "_state" , _state._getString() );
w->endObject();
}
// -------------------------------------------------------------------
// Class : "JsonNetRoutingProperty"
Initializer<JsonNetRoutingProperty> jsonNetRoutingPropertyInit ( 20 );
JsonNetRoutingProperty::JsonNetRoutingProperty ( unsigned long flags )
: JsonObject(flags)
{
add( "_state", typeid(string) );
}
string JsonNetRoutingProperty::getTypeName () const
{ return "NetRoutingProperty"; }
void JsonNetRoutingProperty::initialize ()
{ JsonTypes::registerType( new JsonNetRoutingProperty (JsonWriter::RegisterMode) ); }
JsonNetRoutingProperty* JsonNetRoutingProperty::clone ( unsigned long flags ) const
{ return new JsonNetRoutingProperty ( flags ); }
void JsonNetRoutingProperty::toData ( JsonStack& stack )
{
check( stack, "JsonNetRoutingProperty::toData" );
string sflags = get<string>( stack, "_state" );
unsigned int flags = 0;
flags |= (sflags[0] == 'e') ? NetRoutingState::Excluded : 0;
flags |= (sflags[1] == 'f') ? NetRoutingState::Fixed : 0;
flags |= (sflags[2] == 'u') ? NetRoutingState::Unconnected : 0;
flags |= (sflags[3] == 'm') ? NetRoutingState::ManualGlobalRoute : 0;
flags |= (sflags[4] == 'a') ? NetRoutingState::AutomaticGlobalRoute : 0;
NetRoutingProperty* property = NULL;
DBo* dbo = stack.back_dbo();
if (dbo) {
Net* net = dynamic_cast<Net*>( dbo );
if (net) {
property = dynamic_cast<NetRoutingProperty*>( net->getProperty( NetRoutingProperty::getPropertyName() ) );
if (property) {
cerr << Error( "JsonNetRoutingProperty::toData(): %s has already a NetRoutingProperty (overwrite)."
, getString(net).c_str()
) << endl;
NetRoutingState* state = property->getState();
state->unsetFlags( (unsigned int)-1 );
state->setFlags( flags );
} else {
property = NetRoutingProperty::create( net );
property->getState()->setFlags( flags );
net->put( property );
}
} else {
cerr << Error( "JsonNetRoutingProperty::toData(): %s must be a Net."
, getString(dbo).c_str()
) << endl;
}
} else {
cerr << Error( "JsonNetRoutingProperty::toData(): No DBo in stack to attach to." ) << endl;
}
update( stack, property );
}
// ------------------------------------------------------------------- // -------------------------------------------------------------------
// Class : "NetRoutingExtension" // Class : "NetRoutingExtension"

View File

@ -34,23 +34,23 @@ namespace Hurricane {
// **************************************************************************************************** // ****************************************************************************************************
Occurrence::Occurrence(const Entity* entity) Occurrence::Occurrence(const Entity* entity)
// ********************************* // *****************************************
: _entity(const_cast<Entity*>(entity)), : _entity(const_cast<Entity*>(entity))
_sharedPath(NULL) , _sharedPath(NULL)
{ {
} }
Occurrence::Occurrence(const Entity* entity, const Path& path) Occurrence::Occurrence(const Entity* entity, const Path& path)
// *************************************************** // ***********************************************************
: _entity(const_cast<Entity*>(entity)), : _entity(const_cast<Entity*>(entity))
_sharedPath(path._getSharedPath()) , _sharedPath(path._getSharedPath())
{ {
if (!_entity) { if (!_entity) {
throw Error("Can't create " + _TName("Occurrence") + " : null entity"); throw Error("Can't create " + _TName("Occurrence") + " : null entity");
} }
if (_sharedPath) if (_sharedPath)
if (_entity->getCell() != _sharedPath->getMasterCell()) if (_entity->getCell() != _sharedPath->getMasterCell())
throw Error("Can't create " + _TName("Occurrence") + " : incompatible path"); throw Error("Can't create " + _TName("Occurrence") + " : incompatible path");
} }
Occurrence::Occurrence(const Occurrence& occurrence) Occurrence::Occurrence(const Occurrence& occurrence)
@ -324,6 +324,14 @@ string Occurrence::getName() const
return description; return description;
} }
Initializer<JsonOccurrence> jsonOccurrenceInit ( 0 );
void JsonOccurrence::initialize()
// *******************************
{ JsonTypes::registerType( new JsonOccurrence (JsonWriter::RegisterMode) ); }
JsonOccurrence::JsonOccurrence(unsigned long flags) JsonOccurrence::JsonOccurrence(unsigned long flags)
// ************************************************ // ************************************************
: JsonObject(flags) : JsonObject(flags)

View File

@ -153,6 +153,13 @@ Record* Pad::_getRecord() const
// JsonPad implementation // JsonPad implementation
// **************************************************************************************************** // ****************************************************************************************************
Initializer<JsonPad> jsonPadInit ( 0 );
void JsonPad::initialize()
// ************************
{ JsonTypes::registerType( new JsonPad (JsonWriter::RegisterMode) ); }
JsonPad::JsonPad(unsigned long flags) JsonPad::JsonPad(unsigned long flags)
// ********************************** // **********************************
: JsonComponent(flags) : JsonComponent(flags)

View File

@ -236,6 +236,13 @@ string Plug::getName() const
// JsonPlug implementation // JsonPlug implementation
// **************************************************************************************************** // ****************************************************************************************************
Initializer<JsonPlug> jsonPlugInit ( 0 );
void JsonPlug::initialize()
// *************************
{ JsonTypes::registerType( new JsonPlug (JsonWriter::RegisterMode) ); }
JsonPlug::JsonPlug(unsigned long flags) JsonPlug::JsonPlug(unsigned long flags)
// ************************************ // ************************************
: JsonComponent(flags) : JsonComponent(flags)
@ -294,6 +301,12 @@ void JsonPlug::toData(JsonStack& stack)
// JsonPlugRef implementation // JsonPlugRef implementation
// **************************************************************************************************** // ****************************************************************************************************
Initializer<JsonPlugRef> jsonPlugRefInit ( 0 );
void JsonPlugRef::initialize()
// ****************************
{ JsonTypes::registerType( new JsonPlugRef (JsonWriter::RegisterMode) ); }
JsonPlugRef::JsonPlugRef(unsigned long flags) JsonPlugRef::JsonPlugRef(unsigned long flags)
// ****************************************** // ******************************************
: JsonObject(flags) : JsonObject(flags)

View File

@ -126,6 +126,7 @@ Record* Point::_getRecord() const
void Point::toJson ( JsonWriter* w ) const void Point::toJson ( JsonWriter* w ) const
// **************************************** // ****************************************
{ {
w->startObject(); w->startObject();
jsonWrite( w, "@typename", "Point" ); jsonWrite( w, "@typename", "Point" );
jsonWrite( w, "_x", getX() ); jsonWrite( w, "_x", getX() );
@ -133,6 +134,12 @@ void Point::toJson ( JsonWriter* w ) const
w->endObject(); w->endObject();
} }
Initializer<JsonPoint> jsonPointInit ( 0 );
void JsonPoint::initialize()
// **************************
{ JsonTypes::registerType( new JsonPoint (JsonWriter::RegisterMode) ); }
JsonPoint::JsonPoint(unsigned long flags) JsonPoint::JsonPoint(unsigned long flags)
// ************************************** // **************************************
: JsonObject(flags) : JsonObject(flags)

View File

@ -1,4 +1,3 @@
// -*- C++ -*- // -*- C++ -*-
// //
// Copyright (c) BULL S.A. 2000-2015, All Rights Reserved // Copyright (c) BULL S.A. 2000-2015, All Rights Reserved
@ -86,6 +85,13 @@ namespace Hurricane {
} }
bool Property::hasJson () const
{ return false; }
void Property::toJson ( JsonWriter*, const DBo* ) const
{ }
// ------------------------------------------------------------------- // -------------------------------------------------------------------
// Class : "Hurricane::PrivateProperty". // Class : "Hurricane::PrivateProperty".
@ -141,6 +147,76 @@ namespace Hurricane {
// ------------------------------------------------------------------- // -------------------------------------------------------------------
// Class : "Hurricane::SharedProperty". // Class : "Hurricane::SharedProperty".
SharedProperty::OrphanedMap SharedProperty::_orphaneds;
const SharedProperty::OrphanedMap& SharedProperty::getOrphaneds ()
{ return _orphaneds; }
SharedProperty* SharedProperty::getOrphaned ( const string& tag )
{
auto iorphaned = _orphaneds.find( tag );
if (iorphaned != _orphaneds.end()) return (*iorphaned).second._property;
return NULL;
}
void SharedProperty::addOrphaned ( const string& tag, SharedProperty* property )
{
auto iorphaned = _orphaneds.find( tag );
if (iorphaned == _orphaneds.end()) {
_orphaneds.insert( make_pair(tag,Orphaned(property)) );
} else {
if ((*iorphaned).second._property != property) {
cerr << Error( "SharedProperty::addOrphaned(): Multiple properties with the same tag \"%s\"."
, tag.c_str()
) << endl;
}
}
}
void SharedProperty::refOrphaned ( const string& tag )
{
auto iorphaned = _orphaneds.find( tag );
if (iorphaned != _orphaneds.end()) {
(*iorphaned).second._refcount++;
}
}
void SharedProperty::countOrphaned ( const string& tag , unsigned int count )
{
auto iorphaned = _orphaneds.find( tag );
if (iorphaned != _orphaneds.end()) {
(*iorphaned).second._count = count;
}
}
void SharedProperty::removeOrphaned ( const string& tag )
{
auto iorphaned = _orphaneds.find( tag );
if (iorphaned != _orphaneds.end()) _orphaneds.erase( iorphaned );
}
void SharedProperty::clearOrphaneds ()
{
for ( auto element : _orphaneds ) {
if (element.second._refcount != element.second._count) {
cerr << Error( "SharedProperty::clearOrphaneds(): On tag \"%s\", count:%u refcount:%u."
, element.first.c_str()
, element.second._count
, element.second._refcount
) << endl;
}
}
_orphaneds.clear();
}
SharedProperty::SharedProperty () SharedProperty::SharedProperty ()
: Property() : Property()

View File

@ -403,6 +403,13 @@ namespace Hurricane {
// ------------------------------------------------------------------- // -------------------------------------------------------------------
// Class : "JsonRoutingPad". // Class : "JsonRoutingPad".
Initializer<JsonRoutingPad> jsonRoutingPadInit ( 0 );
void JsonRoutingPad::initialize ()
{ JsonTypes::registerType( new JsonRoutingPad (JsonWriter::RegisterMode) ); }
JsonRoutingPad::JsonRoutingPad ( unsigned long flags ) JsonRoutingPad::JsonRoutingPad ( unsigned long flags )
: JsonComponent(flags) : JsonComponent(flags)
{ {

View File

@ -59,6 +59,13 @@ namespace Hurricane {
// ------------------------------------------------------------------- // -------------------------------------------------------------------
// Class : "JsonSignature". // Class : "JsonSignature".
Initializer<JsonSignature> jsonSignatureInit ( 0 );
void JsonSignature::initialize ()
{ JsonTypes::registerType( new JsonSignature (JsonWriter::RegisterMode) ); }
JsonSignature::JsonSignature ( unsigned long flags ) JsonSignature::JsonSignature ( unsigned long flags )
: JsonObject (flags) : JsonObject (flags)
, _subTypeName("unset") , _subTypeName("unset")

View File

@ -320,9 +320,15 @@ Record* Transformation::Orientation::_getRecord() const
// **************************************************************************************************** // ****************************************************************************************************
// Transformation::Orientation implementation // JsonTransformation implementation
// **************************************************************************************************** // ****************************************************************************************************
Initializer<JsonTransformation> jsonTransformationInit ( 0 );
void JsonTransformation::initialize()
// **************************
{ JsonTypes::registerType( new JsonTransformation (JsonWriter::RegisterMode) ); }
JsonTransformation::JsonTransformation(unsigned long flags) JsonTransformation::JsonTransformation(unsigned long flags)
// ******************************************************** // ********************************************************
: JsonObject(flags) : JsonObject(flags)

View File

@ -36,8 +36,7 @@ stack<UpdateSession*>* UPDATOR_STACK = NULL;
UpdateSession::UpdateSession() UpdateSession::UpdateSession()
// *************************** // ***************************
: Inherit() : Inherit()
{ { }
}
void UpdateSession::destroy() void UpdateSession::destroy()
// ************************* // *************************
@ -126,9 +125,9 @@ Record* UpdateSession::_getRecord() const
return record; return record;
} }
void UpdateSession::onCapturedBy(DBo* owner) void UpdateSession::onCapturedBy(DBo* owner)
// ***************************************** // *****************************************
{ {
if ( not dynamic_cast<Go*>(owner) and not dynamic_cast<Cell*>(owner) ) if ( not dynamic_cast<Go*>(owner) and not dynamic_cast<Cell*>(owner) )
throw Error( "Bad update session capture : not a graphic object (Go) or a Cell" ); throw Error( "Bad update session capture : not a graphic object (Go) or a Cell" );
@ -137,8 +136,7 @@ Record* UpdateSession::_getRecord() const
void UpdateSession::onNotOwned() void UpdateSession::onNotOwned()
// ***************************** // *****************************
{ { }
}
@ -146,9 +144,9 @@ void UpdateSession::onNotOwned()
// Go::invalidate implementation : located here to access UPDATOR_STACK variable // Go::invalidate implementation : located here to access UPDATOR_STACK variable
// **************************************************************************************************** // ****************************************************************************************************
void Go::invalidate(bool propagateFlag) void Go::invalidate(bool propagateFlag)
// ************************************ // ************************************
{ {
// trace << "invalidate(" << this << ")" << endl; // trace << "invalidate(" << this << ")" << endl;
// trace_in(); // trace_in();

View File

@ -211,6 +211,13 @@ Record* Vertical::_getRecord() const
// JsonVertical implementation // JsonVertical implementation
// **************************************************************************************************** // ****************************************************************************************************
Initializer<JsonVertical> jsonVerticalInit ( 0 );
void JsonVertical::initialize()
// *****************************
{ JsonTypes::registerType( new JsonVertical (JsonWriter::RegisterMode) ); }
JsonVertical::JsonVertical(unsigned long flags) JsonVertical::JsonVertical(unsigned long flags)
// ******************************************** // ********************************************
: JsonSegment(flags) : JsonSegment(flags)

View File

@ -130,6 +130,7 @@ class Box {
class JsonBox : public JsonObject { class JsonBox : public JsonObject {
// ******************************** // ********************************
public: static void initialize();
public: JsonBox(unsigned long); public: JsonBox(unsigned long);
public: virtual string getTypeName() const; public: virtual string getTypeName() const;
public: virtual JsonBox* clone(unsigned long) const; public: virtual JsonBox* clone(unsigned long) const;

View File

@ -110,15 +110,39 @@ class Cell : public Entity {
virtual Name getName () const; virtual Name getName () const;
static Name staticGetName (); static Name staticGetName ();
Name getUniqueName (); Name getUniqueName ();
static std::string getTrunkName ( Name name );
virtual bool hasJson () const;
virtual void toJson ( JsonWriter*, const DBo* ) const;
inline void _setOwner ( Cell* );
inline void _setDuplicates ( unsigned int );
virtual string _getTypeName () const; virtual string _getTypeName () const;
virtual Record* _getRecord () const; virtual Record* _getRecord () const;
private: private:
static const Name _name; static const Name _name;
unsigned int _duplicates; unsigned int _duplicates;
private: private:
UniquifyRelation ( Cell* ); UniquifyRelation ( Cell* );
protected: protected:
virtual void _preDestroy (); virtual void _preDestroy ();
public:
class JsonProperty : public JsonObject {
public:
static void initialize ();
JsonProperty ( unsigned long flags );
virtual string getTypeName () const;
virtual JsonProperty* clone ( unsigned long ) const;
virtual void toData ( JsonStack& );
};
public:
class JsonPropertyRef : public JsonObject {
public:
static void initialize ();
JsonPropertyRef ( unsigned long flags );
virtual string getTypeName () const;
virtual JsonPropertyRef* clone ( unsigned long ) const;
virtual void toData ( JsonStack& );
};
}; };
class ClonedSet : public Collection<Cell*> { class ClonedSet : public Collection<Cell*> {
@ -446,9 +470,14 @@ inline Cell::ClonedSet::ClonedSet ( const ClonedSet& other )
{ } { }
inline void Cell::UniquifyRelation::_setOwner ( Cell* owner ) { _setMasterOwner(owner); }
inline void Cell::UniquifyRelation::_setDuplicates ( unsigned int duplicates ) { _duplicates=duplicates; }
class JsonCell : public JsonEntity { class JsonCell : public JsonEntity {
// ********************************* // *********************************
public: static void initialize();
public: JsonCell(unsigned long flags); public: JsonCell(unsigned long flags);
public: virtual string getTypeName() const; public: virtual string getTypeName() const;
public: virtual JsonCell* clone(unsigned long) const; public: virtual JsonCell* clone(unsigned long) const;

View File

@ -739,6 +739,7 @@ inline Hurricane::Record* getRecord ( const std::multiset<Element,Compare>* s )
// x-----------------------------------------------------------------x // x-----------------------------------------------------------------x
#include "hurricane/Slot.h" #include "hurricane/Slot.h"
#include "hurricane/Initializer.h"
#include "hurricane/Tabulation.h" #include "hurricane/Tabulation.h"
#include "hurricane/JsonWriter.h" #include "hurricane/JsonWriter.h"
#include "hurricane/JsonReader.h" #include "hurricane/JsonReader.h"

View File

@ -152,6 +152,7 @@ class Contact : public Component {
class JsonContact : public JsonComponent { class JsonContact : public JsonComponent {
// *************************************** // ***************************************
public: static void initialize();
public: JsonContact(unsigned long flags); public: JsonContact(unsigned long flags);
public: virtual string getTypeName() const; public: virtual string getTypeName() const;
public: virtual JsonContact* clone(unsigned long) const; public: virtual JsonContact* clone(unsigned long) const;

View File

@ -89,8 +89,16 @@ namespace Hurricane {
class JsonDBo : public JsonObject { class JsonDBo : public JsonObject {
public: public:
JsonDBo ( unsigned int flags ); JsonDBo ( unsigned int flags );
}; template<typename T> inline void update ( JsonStack&, T );
};
template<typename T> inline void JsonDBo::update ( JsonStack& stack, T hobject )
{
JsonObject::update<T>( stack, hobject );
stack.push_back_dbo( dynamic_cast<DBo*>(hobject) );
}
} // Hurricane namespace. } // Hurricane namespace.

View File

@ -21,6 +21,7 @@
#define HURRICANE_DATA_BASE #define HURRICANE_DATA_BASE
#include <functional> #include <functional>
#include <map>
#include "hurricane/DBo.h" #include "hurricane/DBo.h"
#include "hurricane/DbU.h" #include "hurricane/DbU.h"
@ -43,6 +44,9 @@ class DataBase : public DBo {
// ***** // *****
public: typedef DBo Inherit; public: typedef DBo Inherit;
public: enum Flags { NoFlags = 0
, CreateLib =(1<<0)
, WarnCreateLib=(1<<2) };
// Attributes // Attributes
// ********** // **********
@ -64,6 +68,7 @@ class DataBase : public DBo {
protected: virtual void _preDestroy(); protected: virtual void _preDestroy();
public: virtual void _toJson(JsonWriter*) const;
public: virtual string _getTypeName() const {return _TName("DataBase");}; public: virtual string _getTypeName() const {return _TName("DataBase");};
public: virtual string _getString() const; public: virtual string _getString() const;
public: virtual Record* _getRecord() const; public: virtual Record* _getRecord() const;
@ -79,12 +84,29 @@ class DataBase : public DBo {
public: Technology* getTechnology() const {return _technology;}; public: Technology* getTechnology() const {return _technology;};
public: Library* getRootLibrary() const {return _rootLibrary;}; public: Library* getRootLibrary() const {return _rootLibrary;};
public: Library* getLibrary(string) const; public: Library* getLibrary(string,unsigned int flags);
public: Cell* getCell(string) const; public: Cell* getCell(string, unsigned int flags);
public: static DataBase* getDB(); public: static DataBase* getDB();
}; };
// ****************************************************************************************************
// JsonDataBase declaration
// ****************************************************************************************************
class JsonDataBase : public JsonDBo {
// ********************************
public: static void initialize();
public: JsonDataBase(unsigned long flags);
public: virtual string getTypeName() const;
public: virtual JsonDataBase* clone(unsigned long) const;
public: virtual void toData(JsonStack&);
};
} // End of Hurricane namespace. } // End of Hurricane namespace.

View File

@ -71,6 +71,7 @@ namespace Hurricane {
class JsonDeepNet : public JsonNet { class JsonDeepNet : public JsonNet {
public: public:
static void initialize ();
JsonDeepNet ( unsigned long flags ); JsonDeepNet ( unsigned long flags );
virtual ~JsonDeepNet (); virtual ~JsonDeepNet ();
virtual string getTypeName () const; virtual string getTypeName () const;

View File

@ -48,6 +48,7 @@ namespace Hurricane {
class JsonDesignBlob : public JsonObject { class JsonDesignBlob : public JsonObject {
public: public:
static void initialize ();
JsonDesignBlob ( unsigned long flags ); JsonDesignBlob ( unsigned long flags );
virtual std::string getTypeName () const; virtual std::string getTypeName () const;
virtual JsonDesignBlob* clone ( unsigned long ) const; virtual JsonDesignBlob* clone ( unsigned long ) const;

View File

@ -87,14 +87,14 @@ namespace Hurricane {
public: public:
JsonEntity ( unsigned long flags ); JsonEntity ( unsigned long flags );
template<typename T> inline void update ( JsonStack&, T ); template<typename T> inline void update ( JsonStack&, T );
}; };
template<typename T> inline void JsonEntity::update ( JsonStack& stack, T hobject ) template<typename T> inline void JsonEntity::update ( JsonStack& stack, T hobject )
{ {
unsigned int jsonId = get<int64_t>(stack,"_id"); unsigned int jsonId = get<int64_t>(stack,"_id");
JsonObject::update<T>( stack, hobject ); JsonDBo::update<T>( stack, hobject );
stack.addEntity( jsonId, hobject ); stack.addEntity( jsonId, hobject );
} }

View File

@ -0,0 +1,73 @@
// -*- mode: C++ -*-
//
// This file is part of the Coriolis Software.
// Copyright (c) UPMC 2016-2015, All Rights Reserved
//
// +-----------------------------------------------------------------+
// | C O R I O L I S |
// | V L S I B a c k e n d D a t a - B a s e |
// | |
// | Author : Jean-Paul CHAPUT |
// | E-mail : Jean-Paul.Chaput@lip6.fr |
// | =============================================================== |
// | C++ Header : "./hurricane/FileReadGzStream.h" |
// +-----------------------------------------------------------------+
#ifndef HURRICANE_FILEREADGZSTREAM_H
#define HURRICANE_FILEREADGZSTREAM_H
namespace Hurricane {
typedef void BZFILE; // Must be identical to the typedef in <bzlib.h>.
// -------------------------------------------------------------------
// Class : "FileReadGzStream".
class FileReadGzStream {
public:
typedef char Ch;
public:
FileReadGzStream ( std::FILE* fp
, char* buffer
, size_t bufferSize
);
inline Ch Peek () const;
inline Ch Take ();
inline size_t Tell () const;
inline void Put ( Ch );
inline void Flush ();
inline Ch* PutBegin ();
inline size_t PutEnd ( Ch* );
inline const Ch* Peek4 () const;
private:
void Read ();
private:
std::FILE* fp_;
BZFILE* bzfp_;
Ch* buffer_;
size_t bufferSize_;
Ch* bufferLast_;
Ch* current_;
size_t readCount_;
size_t count_;
bool eof_;
int bzerror_;
};
inline FileReadGzStream::Ch FileReadGzStream::Peek () const { return *current_; }
inline FileReadGzStream::Ch FileReadGzStream::Take () { Ch c = *current_; Read(); return c; }
inline size_t FileReadGzStream::Tell () const { return count_ + static_cast<size_t>(current_ - buffer_); }
inline void FileReadGzStream::Put ( Ch ) { assert(false); }
inline void FileReadGzStream::Flush () { assert(false); }
inline FileReadGzStream::Ch* FileReadGzStream::PutBegin () { assert(false); return 0; }
inline size_t FileReadGzStream::PutEnd ( Ch* ) { assert(false); return 0; }
inline const FileReadGzStream::Ch* FileReadGzStream::Peek4 () const { return (current_ + 4 <= bufferLast_) ? current_ : 0; }
} // Hurricane namespace.
#endif // HURRICANE_FILEREADGZSTREAM_H

View File

@ -0,0 +1,100 @@
// -*- mode: C++ -*-
//
// This file is part of the Coriolis Software.
// Copyright (c) UPMC 2016-2015, All Rights Reserved
//
// +-----------------------------------------------------------------+
// | C O R I O L I S |
// | V L S I B a c k e n d D a t a - B a s e |
// | |
// | Author : Jean-Paul CHAPUT |
// | E-mail : Jean-Paul.Chaput@lip6.fr |
// | =============================================================== |
// | C++ Header : "./hurricane/FileWriteGzStream.h" |
// +-----------------------------------------------------------------+
#ifndef HURRICANE_FILEWRITEGZSTREAM_H
#define HURRICANE_FILEWRITEGZSTREAM_H
#include "rapidjson/rapidjson.h"
namespace Hurricane {
typedef void BZFILE; // Must be identical to the typedef in <bzlib.h>.
class FileWriteGzStream {
public:
typedef char Ch;
public:
FileWriteGzStream ( std::FILE* fp, char* buffer, size_t bufferSize );
~FileWriteGzStream ();
inline void Put ( char c );
inline void PutN ( char c, size_t n );
void Flush ();
inline char Peek () const;
inline char Take ();
inline size_t Tell () const;
inline char* PutBegin ();
inline size_t PutEnd ( char* );
private:
FileWriteGzStream ( const FileWriteGzStream& );
FileWriteGzStream& operator= ( const FileWriteGzStream& );
private:
std::FILE* fp_;
BZFILE* bzfp_;
char* buffer_;
char* bufferEnd_;
char* current_;
int bzerror_;
};
inline void FileWriteGzStream::Put ( char c )
{
if (current_ >= bufferEnd_) Flush();
*current_++ = c;
}
inline void FileWriteGzStream::PutN ( char c, size_t n )
{
size_t avail = static_cast<size_t>( bufferEnd_ - current_ );
while (n > avail) {
std::memset( current_, c, avail );
current_ += avail;
Flush();
n -= avail;
avail = static_cast<size_t>( bufferEnd_ - current_ );
}
if (n > 0) {
std::memset( current_, c, n );
current_ += n;
}
}
// Not implemented
inline char FileWriteGzStream::Peek () const { assert(false); return 0; }
inline char FileWriteGzStream::Take () { assert(false); return 0; }
inline size_t FileWriteGzStream::Tell () const { assert(false); return 0; }
inline char* FileWriteGzStream::PutBegin () { assert(false); return 0; }
inline size_t FileWriteGzStream::PutEnd ( char* ) { assert(false); return 0; }
} // Hurricane namespace.
namespace rapidjson {
template<>
inline void PutN ( Hurricane::FileWriteGzStream& stream, char c, size_t n ) { stream.PutN(c,n); }
} // rapidjson namespace.
#endif // HURRICANE_FILEWRITEGZSTREAM_H

View File

@ -116,6 +116,7 @@ class Horizontal : public Segment {
class JsonHorizontal : public JsonSegment { class JsonHorizontal : public JsonSegment {
// **************************************** // ****************************************
public: static void initialize();
public: JsonHorizontal(unsigned long flags); public: JsonHorizontal(unsigned long flags);
public: virtual string getTypeName() const; public: virtual string getTypeName() const;
public: virtual JsonHorizontal* clone(unsigned long) const; public: virtual JsonHorizontal* clone(unsigned long) const;

View File

@ -0,0 +1,72 @@
// -*- C++ -*-
//
// Copyright (c) BULL S.A. 2015-2015, All Rights Reserved
//
// This file is part of Hurricane.
//
// Hurricane is free software: you can redistribute it and/or modify
// it under the terms of the GNU Lesser General Public License as
// published by the Free Software Foundation, either version 3 of the
// License, or (at your option) any later version.
//
// Hurricane is distributed in the hope that it will be useful, but
// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHAN-
// TABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the Lesser GNU
// General Public License for more details.
//
// You should have received a copy of the Lesser GNU General Public
// License along with Hurricane. If not, see
// <http://www.gnu.org/licenses/>.
//
// +-----------------------------------------------------------------+
// | H U R R I C A N E |
// | V L S I B a c k e n d D a t a - B a s e |
// | |
// | Authors : Jean-Paul Chaput |
// | E-mail : Jean-Paul.Chaput@lip6.fr |
// | =============================================================== |
// | C++ Header : "./hurricane/Initializer.h" |
// +-----------------------------------------------------------------+
#ifndef HURRICANE_INITIALIZER_H
#define HURRICANE_INITIALIZER_H
#include <functional>
#include <map>
namespace Hurricane {
// -------------------------------------------------------------------
// Class : "Init".
class Init {
public:
typedef std::function<void(void)> initializer_t;
typedef std::multimap<unsigned int,initializer_t> InitializerMap;
public:
static void destroy ();
static InitializerMap& initializers ();
static void addInitializer ( unsigned int order, initializer_t );
static bool runOnce ();
private:
static bool _run;
static InitializerMap* _initializers;
};
// -------------------------------------------------------------------
// Class : "Initializer".
template<typename T>
class Initializer {
public:
inline Initializer ( unsigned int order ) { Init::addInitializer( order, T::initialize ); }
};
} // Hurricane namespace.
#endif // HURRICANE_INITIALIZER_H

View File

@ -197,6 +197,7 @@ class Instance : public Go {
class JsonInstance : public JsonEntity { class JsonInstance : public JsonEntity {
// ************************************* // *************************************
public: static void initialize();
public: JsonInstance(unsigned long flags); public: JsonInstance(unsigned long flags);
public: virtual string getTypeName() const; public: virtual string getTypeName() const;
public: virtual JsonInstance* clone(unsigned long) const; public: virtual JsonInstance* clone(unsigned long) const;

View File

@ -32,6 +32,10 @@
#ifndef HURRICANE_JSON_READER_H #ifndef HURRICANE_JSON_READER_H
#define HURRICANE_JSON_READER_H #define HURRICANE_JSON_READER_H
#ifndef HURRICANE_SLOT_H
#error "JsonWriter.h must be included through Commons.h"
#endif
#include <iostream> #include <iostream>
#include <typeinfo> #include <typeinfo>
#include <typeindex> #include <typeindex>
@ -45,6 +49,7 @@
namespace Hurricane { namespace Hurricane {
class DBo;
class Hook; class Hook;
class Entity; class Entity;
class Cell; class Cell;
@ -86,7 +91,7 @@ namespace Hurricane {
virtual bool isDummy () const; virtual bool isDummy () const;
virtual std::string getTypeName () const = 0; virtual std::string getTypeName () const = 0;
inline std::string getStackName () const; inline std::string getStackName () const;
bool check ( JsonStack&, string fname ) const; bool check ( JsonStack&, std::string fname ) const;
void print ( std::ostream& ) const; void print ( std::ostream& ) const;
bool has ( const std::string& key ) const; bool has ( const std::string& key ) const;
void add ( const std::string& key, std::type_index tid ); void add ( const std::string& key, std::type_index tid );
@ -95,12 +100,11 @@ namespace Hurricane {
inline void copyAttrs ( const JsonObject*, bool reset=false ); inline void copyAttrs ( const JsonObject*, bool reset=false );
inline void clear (); inline void clear ();
inline std::string getName () const; inline std::string getName () const;
inline void setName ( const string& ); inline void setName ( const std::string& );
template<typename T> inline T& getObject () const; template<typename T> inline T& getObject () const;
template<typename T> inline void setObject ( T& ) ; template<typename T> inline void setObject ( T ) ;
inline bool isBound () const; inline bool isBound () const;
virtual JsonObject* clone ( unsigned long flags ) const = 0; virtual JsonObject* clone ( unsigned long flags ) const = 0;
template<typename C> void toJson ( JsonWriter*, C* object ) const;
virtual void toData ( JsonStack& ); virtual void toData ( JsonStack& );
unsigned int presetId ( JsonStack& ); unsigned int presetId ( JsonStack& );
template<typename T> inline void update ( JsonStack&, T ); template<typename T> inline void update ( JsonStack&, T );
@ -130,7 +134,7 @@ namespace Hurricane {
template<typename T> inline T& JsonObject::getObject () const template<typename T> inline T& JsonObject::getObject () const
{ return boost::any_cast<T>(_object); } { return boost::any_cast<T>(_object); }
template<typename T> inline void JsonObject::setObject ( T& t ) template<typename T> inline void JsonObject::setObject ( T t )
{ _object = t; } { _object = t; }
inline void JsonObject::copyAttrs ( const JsonObject* other, bool reset ) inline void JsonObject::copyAttrs ( const JsonObject* other, bool reset )
@ -294,6 +298,9 @@ namespace Hurricane {
inline int rhas ( const std::string& ) const; inline int rhas ( const std::string& ) const;
template<typename T> inline T as ( const std::string& ) const; template<typename T> inline T as ( const std::string& ) const;
template<typename T> inline T as ( int ) const; template<typename T> inline T as ( int ) const;
inline void push_back_dbo ( DBo* );
inline void pop_back_dbo ();
inline DBo* back_dbo () const;
template<typename T> inline T getEntity ( unsigned int ) const; template<typename T> inline T getEntity ( unsigned int ) const;
void addEntity ( unsigned int jsonId, Entity* ); void addEntity ( unsigned int jsonId, Entity* );
void addHookLink ( Hook*, unsigned int jsonId, const std::string& jsonNext ); void addHookLink ( Hook*, unsigned int jsonId, const std::string& jsonNext );
@ -309,18 +316,19 @@ namespace Hurricane {
private: private:
unsigned long _flags; unsigned long _flags;
vector<Element> _stack; vector<Element> _stack;
vector<DBo*> _dbos;
std::map<unsigned int,Entity*> _entities; std::map<unsigned int,Entity*> _entities;
HookLut _hooks; HookLut _hooks;
}; };
inline JsonStack::JsonStack () inline JsonStack::JsonStack ()
: _flags(0), _stack(), _entities(), _hooks() : _flags(0), _stack(), _dbos(), _entities(), _hooks()
{ } { }
template<typename T> inline void JsonStack::push_back ( const std::string& key, T t ) template<typename T> inline void JsonStack::push_back ( const std::string& key, T t )
{ {
ltrace(51) << "JsonStack::push_back() key:" << key << " value:" << t ltrace(51) << "JsonStack::push_back(T) key:" << key << " value:" << t
<< " (" << demangle(typeid(T)) << ")." << endl; << " (" << demangle(typeid(T)) << ")." << endl;
_stack.push_back(std::make_pair(key,boost::any(t))); _stack.push_back(std::make_pair(key,boost::any(t)));
} }
@ -333,7 +341,8 @@ namespace Hurricane {
<< (count+1) << " elements remains to pop." << std::endl; << (count+1) << " elements remains to pop." << std::endl;
break; break;
} }
ltrace(51) << "| _stack.pop_back() " << _stack.back().first << endl; ltrace(51) << "| _stack.pop_back() \"" << _stack.back().first
<< "\", size:" << _stack.size() << ", dbos:" << _dbos.size() << endl;
_stack.pop_back(); _stack.pop_back();
} }
} }
@ -395,6 +404,7 @@ namespace Hurricane {
return boost::any_cast<T>( _stack[i].second ); return boost::any_cast<T>( _stack[i].second );
} }
template<typename T> inline T JsonStack::getEntity ( unsigned int id ) const template<typename T> inline T JsonStack::getEntity ( unsigned int id ) const
{ {
std::map<unsigned int,Entity*>::const_iterator it = _entities.find(id); std::map<unsigned int,Entity*>::const_iterator it = _entities.find(id);
@ -402,6 +412,9 @@ namespace Hurricane {
return dynamic_cast<T>((*it).second); return dynamic_cast<T>((*it).second);
} }
inline void JsonStack::push_back_dbo ( DBo* dbo ) { _dbos.push_back(dbo); }
inline void JsonStack::pop_back_dbo () { _dbos.pop_back(); }
inline DBo* JsonStack::back_dbo () const { return (_dbos.empty()) ? NULL : _dbos.back(); }
inline void JsonStack::clearHookLinks () { _hooks.clear(); } inline void JsonStack::clearHookLinks () { _hooks.clear(); }
inline size_t JsonStack::size () const { return _stack.size(); } inline size_t JsonStack::size () const { return _stack.size(); }
inline JsonStack* JsonStack::setFlags ( unsigned long mask ) { _flags |= mask; return this; } inline JsonStack* JsonStack::setFlags ( unsigned long mask ) { _flags |= mask; return this; }
@ -419,8 +432,10 @@ namespace Hurricane {
return stack.as<T>( index ); return stack.as<T>( index );
} }
template<typename T> inline void JsonObject::update ( JsonStack& stack, T hobject ) template<typename T>
inline void JsonObject::update ( JsonStack& stack, T hobject )
{ {
ltrace(51) << "JsonObject::update<T>()" << endl;
stack.pop_back( _attributes.size() ); stack.pop_back( _attributes.size() );
stack.push_back<T>( getStackName(), hobject ); stack.push_back<T>( getStackName(), hobject );
setObject<T>( hobject ); setObject<T>( hobject );

View File

@ -43,6 +43,9 @@ namespace rapidjson {
class FileWriteStream; class FileWriteStream;
} }
namespace Hurricane {
class FileWriteGzStream;
}
//namespace Hurricane { //namespace Hurricane {
@ -55,6 +58,11 @@ namespace rapidjson {
, DesignBlobMode = (1<<1) , DesignBlobMode = (1<<1)
, CellMode = (1<<2) , CellMode = (1<<2)
, RegisterMode = (1<<3) , RegisterMode = (1<<3)
, RegisterStatus = (1<<4)
, RegisterType = (1<<5)
, UnregisterType = (1<<6)
, CellObject = (1<<7)
, DBoObject = (1<<8)
}; };
public: public:
JsonWriter ( std::string fileName ); JsonWriter ( std::string fileName );
@ -88,12 +96,13 @@ namespace rapidjson {
JsonWriter ( const JsonWriter& ); JsonWriter ( const JsonWriter& );
JsonWriter& operator= ( const JsonWriter& ) const; JsonWriter& operator= ( const JsonWriter& ) const;
private: private:
unsigned long _flags; unsigned long _flags;
size_t _bufferSize; size_t _bufferSize;
char* _buffer; char* _buffer;
FILE* _file; FILE* _file;
rapidjson::FileWriteStream* _stream; //rapidjson::FileWriteStream* _stream;
void* _writer; Hurricane::FileWriteGzStream* _stream;
void* _writer;
}; };
@ -172,6 +181,15 @@ inline void jsonWrite ( JsonWriter* w, const std::string& key, const std::strin
{ w->key( key ); w->write( value ); } { w->key( key ); w->write( value ); }
template<typename C>
inline void jsonWrite ( JsonWriter* w, const std::string& key, const C& )
{
w->key( key );
std::string message = "Unsupported type " + Hurricane::demangle(typeid(C).name());
w->write( message.c_str() );
}
template<typename C> template<typename C>
inline void jsonWrite ( JsonWriter* w, const C* object ) inline void jsonWrite ( JsonWriter* w, const C* object )
{ {
@ -187,6 +205,13 @@ inline void jsonWrite ( JsonWriter* w, const C* object )
} }
template<typename C>
inline void jsonWrite ( JsonWriter* w, const std::string& key, C* object )
{
jsonWrite( w, key, const_cast<const C*>(object) );
}
template<typename C> template<typename C>
inline void jsonWrite ( JsonWriter* w, const std::string& key, const C* object ) inline void jsonWrite ( JsonWriter* w, const std::string& key, const C* object )
{ {

View File

@ -129,6 +129,7 @@ class Library : public DBo {
class JsonLibrary : public JsonDBo { class JsonLibrary : public JsonDBo {
// ******************************* // *******************************
public: static void initialize();
public: JsonLibrary(unsigned long flags); public: JsonLibrary(unsigned long flags);
public: virtual string getTypeName() const; public: virtual string getTypeName() const;
public: virtual JsonLibrary* clone(unsigned long) const; public: virtual JsonLibrary* clone(unsigned long) const;

View File

@ -262,6 +262,7 @@ class Net : public Entity {
class JsonNet : public JsonEntity { class JsonNet : public JsonEntity {
// ******************************** // ********************************
public: static void initialize();
public: JsonNet(unsigned long flags); public: JsonNet(unsigned long flags);
public: virtual ~JsonNet(); public: virtual ~JsonNet();
public: virtual string getTypeName() const; public: virtual string getTypeName() const;

View File

@ -46,8 +46,9 @@ namespace Hurricane {
, MixedPreRoute = Fixed|ManualGlobalRoute , MixedPreRoute = Fixed|ManualGlobalRoute
}; };
public: public:
inline bool isUnconnected () const; inline bool isExcluded () const;
inline bool isFixed () const; inline bool isFixed () const;
inline bool isUnconnected () const;
inline bool isManualGlobalRoute () const; inline bool isManualGlobalRoute () const;
inline bool isAutomaticGlobalRoute () const; inline bool isAutomaticGlobalRoute () const;
inline bool isMixedPreRoute () const; inline bool isMixedPreRoute () const;
@ -69,8 +70,9 @@ namespace Hurricane {
inline NetRoutingState::NetRoutingState ( Net* net, unsigned int flags ) : _net(net), _flags(flags) { } inline NetRoutingState::NetRoutingState ( Net* net, unsigned int flags ) : _net(net), _flags(flags) { }
inline bool NetRoutingState::isUnconnected () const { return _flags & Unconnected; }; inline bool NetRoutingState::isExcluded () const { return _flags & Excluded; };
inline bool NetRoutingState::isFixed () const { return _flags & Fixed; }; inline bool NetRoutingState::isFixed () const { return _flags & Fixed; };
inline bool NetRoutingState::isUnconnected () const { return _flags & Unconnected; };
inline bool NetRoutingState::isManualGlobalRoute () const { return _flags & ManualGlobalRoute; }; inline bool NetRoutingState::isManualGlobalRoute () const { return _flags & ManualGlobalRoute; };
inline bool NetRoutingState::isAutomaticGlobalRoute () const { return _flags & AutomaticGlobalRoute; }; inline bool NetRoutingState::isAutomaticGlobalRoute () const { return _flags & AutomaticGlobalRoute; };
inline bool NetRoutingState::isMixedPreRoute () const { return _flags & MixedPreRoute; }; inline bool NetRoutingState::isMixedPreRoute () const { return _flags & MixedPreRoute; };
@ -94,6 +96,8 @@ namespace Hurricane {
virtual Name getName () const; virtual Name getName () const;
inline NetRoutingState* getState (); inline NetRoutingState* getState ();
virtual void onReleasedBy ( DBo* owner ); virtual void onReleasedBy ( DBo* owner );
virtual bool hasJson () const;
virtual void toJson ( JsonWriter*, const DBo* ) const;
virtual std::string _getTypeName () const; virtual std::string _getTypeName () const;
virtual std::string _getString () const; virtual std::string _getString () const;
virtual Record* _getRecord () const; virtual Record* _getRecord () const;
@ -111,6 +115,19 @@ namespace Hurricane {
inline NetRoutingState* NetRoutingProperty::getState () { return &_state; } inline NetRoutingState* NetRoutingProperty::getState () { return &_state; }
// -------------------------------------------------------------------
// Class : "Hurricane::JsonNetRoutingProperty".
class JsonNetRoutingProperty : public JsonObject {
public:
static void initialize ();
JsonNetRoutingProperty ( unsigned long );
virtual std::string getTypeName () const;
virtual JsonNetRoutingProperty* clone ( unsigned long ) const;
virtual void toData ( JsonStack& );
};
// ------------------------------------------------------------------- // -------------------------------------------------------------------
// Class : "Hurricane::NetRoutingExtension". // Class : "Hurricane::NetRoutingExtension".

View File

@ -113,6 +113,7 @@ class Occurrence {
class JsonOccurrence : public JsonObject { class JsonOccurrence : public JsonObject {
// ********************************** // **********************************
public: static void initialize();
public: JsonOccurrence(unsigned long); public: JsonOccurrence(unsigned long);
public: virtual string getTypeName() const; public: virtual string getTypeName() const;
public: virtual JsonOccurrence* clone(unsigned long) const; public: virtual JsonOccurrence* clone(unsigned long) const;

View File

@ -85,6 +85,7 @@ class Pad : public Component {
class JsonPad : public JsonComponent { class JsonPad : public JsonComponent {
// *********************************** // ***********************************
public: static void initialize();
public: JsonPad(unsigned long flags); public: JsonPad(unsigned long flags);
public: virtual string getTypeName() const; public: virtual string getTypeName() const;
public: virtual JsonPad* clone(unsigned long) const; public: virtual JsonPad* clone(unsigned long) const;

View File

@ -118,6 +118,7 @@ class Plug : public Component {
class JsonPlug : public JsonComponent { class JsonPlug : public JsonComponent {
// ************************************ // ************************************
public: static void initialize();
public: JsonPlug(unsigned long flags); public: JsonPlug(unsigned long flags);
public: virtual string getTypeName() const; public: virtual string getTypeName() const;
public: virtual JsonPlug* clone(unsigned long) const; public: virtual JsonPlug* clone(unsigned long) const;
@ -128,6 +129,7 @@ class JsonPlug : public JsonComponent {
class JsonPlugRef : public JsonObject { class JsonPlugRef : public JsonObject {
// ************************************ // ************************************
public: static void initialize();
public: JsonPlugRef(unsigned long flags); public: JsonPlugRef(unsigned long flags);
public: virtual string getTypeName() const; public: virtual string getTypeName() const;
public: virtual JsonPlugRef* clone(unsigned long) const; public: virtual JsonPlugRef* clone(unsigned long) const;

View File

@ -90,6 +90,7 @@ class Point {
class JsonPoint : public JsonObject { class JsonPoint : public JsonObject {
// ********************************** // **********************************
public: static void initialize();
public: JsonPoint(unsigned long); public: JsonPoint(unsigned long);
public: virtual string getTypeName() const; public: virtual string getTypeName() const;
public: virtual JsonPoint* clone(unsigned long) const; public: virtual JsonPoint* clone(unsigned long) const;

View File

@ -1,4 +1,3 @@
// -*- C++ -*- // -*- C++ -*-
// //
// Copyright (c) BULL S.A. 2000-2015, All Rights Reserved // Copyright (c) BULL S.A. 2000-2015, All Rights Reserved
@ -19,12 +18,7 @@
// License along with Hurricane. If not, see // License along with Hurricane. If not, see
// <http://www.gnu.org/licenses/>. // <http://www.gnu.org/licenses/>.
// //
// =================================================================== // +-----------------------------------------------------------------+
//
// $Id$
//
// x-----------------------------------------------------------------x
// | |
// | H U R R I C A N E | // | H U R R I C A N E |
// | V L S I B a c k e n d D a t a - B a s e | // | V L S I B a c k e n d D a t a - B a s e |
// | | // | |
@ -32,14 +26,11 @@
// | E-mail : Jean-Paul.Chaput@lip6.fr | // | E-mail : Jean-Paul.Chaput@lip6.fr |
// | =============================================================== | // | =============================================================== |
// | C++ Header : "./hurricane/Property.h" | // | C++ Header : "./hurricane/Property.h" |
// | *************************************************************** | // +-----------------------------------------------------------------+
// | U p d a t e s |
// | |
// x-----------------------------------------------------------------x
#ifndef __HURRICANE_PROPERTY__ #ifndef HURRICANE_PROPERTY_H
#define __HURRICANE_PROPERTY__ #define HURRICANE_PROPERTY_H
#include "hurricane/Name.h" #include "hurricane/Name.h"
#include "hurricane/Properties.h" #include "hurricane/Properties.h"
@ -53,6 +44,13 @@ namespace Hurricane {
extern const char* propertyTypeNameError; extern const char* propertyTypeNameError;
// -------------------------------------------------------------------
// Classes : template enable/disable Json support.
struct JsonEnabled { enum State { enabled=1 }; };
struct JsonDisabled { enum State { enabled=0 }; };
// ------------------------------------------------------------------- // -------------------------------------------------------------------
// Class : "Hurricane::Property". // Class : "Hurricane::Property".
@ -76,6 +74,8 @@ namespace Hurricane {
virtual void onCapturedBy ( DBo* owner ) = 0; virtual void onCapturedBy ( DBo* owner ) = 0;
virtual void onReleasedBy ( DBo* owner ) = 0; virtual void onReleasedBy ( DBo* owner ) = 0;
// Hurricane Managment. // Hurricane Managment.
virtual bool hasJson () const;
virtual void toJson ( JsonWriter*, const DBo* ) const;
virtual string _getTypeName () const = 0; virtual string _getTypeName () const = 0;
virtual string _getString () const; virtual string _getString () const;
virtual Record* _getRecord () const; virtual Record* _getRecord () const;
@ -160,8 +160,8 @@ namespace Hurricane {
// Template Class : "Hurricane::StandardPrivateProperty". // Template Class : "Hurricane::StandardPrivateProperty".
template<typename Value> class StandardPrivateProperty : public PrivateProperty { template<typename Value, typename JsonState=JsonDisabled>
class StandardPrivateProperty : public PrivateProperty {
public: public:
static Name staticGetName (); static Name staticGetName ();
static Value* staticGetValue ( const DBo* ); static Value* staticGetValue ( const DBo* );
@ -173,49 +173,99 @@ namespace Hurricane {
virtual Name getName () const; virtual Name getName () const;
Value& getValue () const; Value& getValue () const;
void setValue ( const Value& ); void setValue ( const Value& );
virtual bool hasJson () const;
virtual void toJson ( JsonWriter*, const DBo* ) const;
virtual string _getTypeName () const; virtual string _getTypeName () const;
virtual string _getString () const; virtual string _getString () const;
virtual Record* _getRecord () const; virtual Record* _getRecord () const;
private: private:
// Internal: Attributes. // Internal: Attributes.
static Name _name; static Name _name;
static DBo* _owner; static DBo* _owner;
static StandardPrivateProperty* _cache; static StandardPrivateProperty* _cache;
mutable Value _value; mutable Value _value;
protected: protected:
// Internal: Constructor. // Internal: Constructor.
StandardPrivateProperty (); StandardPrivateProperty ();
StandardPrivateProperty ( const Value& ); StandardPrivateProperty ( const Value& );
public:
class JsonProperty : public JsonObject {
public:
static void initialize ();
JsonProperty ( unsigned long flags );
virtual string getTypeName () const;
virtual JsonProperty* clone ( unsigned long ) const;
virtual void toData ( JsonStack& );
};
}; };
template<typename Value> template<typename Value, typename JsonState>
DBo* StandardPrivateProperty<Value>::_owner = NULL; StandardPrivateProperty<Value,JsonState>::JsonProperty::JsonProperty ( unsigned long flags )
: JsonObject(flags)
{
if (flags & JsonWriter::RegisterMode)
cerr << "Registering JsonProperty" << endl;
add( "_value", typeid(Value) );
}
template<typename Value> template<typename Value, typename JsonState>
StandardPrivateProperty<Value>* StandardPrivateProperty<Value>::_cache = NULL; string StandardPrivateProperty<Value,JsonState>::JsonProperty::getTypeName () const
{ return getString(StandardPrivateProperty<Value,JsonState>::staticGetName()); }
template<typename Value> template<typename Value, typename JsonState>
Name StandardPrivateProperty<Value>::staticGetName () void StandardPrivateProperty<Value,JsonState>::JsonProperty::initialize ()
{ JsonTypes::registerType( new JsonProperty (JsonWriter::RegisterMode) ); }
template<typename Value, typename JsonState>
typename StandardPrivateProperty<Value,JsonState>::JsonProperty*
StandardPrivateProperty<Value,JsonState>::JsonProperty::clone ( unsigned long flags ) const
{ return new JsonProperty ( flags ); }
template<typename Value, typename JsonState>
void StandardPrivateProperty<Value,JsonState>::JsonProperty::toData ( JsonStack& stack )
{
check( stack, "JsonProperty::toData" );
DBo* dbo = stack.back_dbo();
Value value = get<string>(stack,"_value");
StandardPrivateProperty<Value,JsonState>* property
= StandardPrivateProperty<Value,JsonState>::create(value);
if (dbo) dbo->put( property );
update( stack, property );
}
template<typename Value, typename JsonState>
DBo* StandardPrivateProperty<Value,JsonState>::_owner = NULL;
template<typename Value, typename JsonState>
StandardPrivateProperty<Value,JsonState>* StandardPrivateProperty<Value,JsonState>::_cache = NULL;
template<typename Value, typename JsonState>
Name StandardPrivateProperty<Value,JsonState>::staticGetName ()
{ {
return _name; return _name;
} }
template<typename Value> template<typename Value, typename JsonState>
Value* StandardPrivateProperty<Value>::staticGetValue ( const DBo* object ) Value* StandardPrivateProperty<Value,JsonState>::staticGetValue ( const DBo* object )
{ {
if ( ( object == _owner ) || get(object) ) return _cache->getValue(); if ( ( object == _owner ) || get(object) ) return _cache->getValue();
return NULL; return NULL;
} }
template<typename Value> template<typename Value, typename JsonState>
StandardPrivateProperty<Value>* StandardPrivateProperty<Value>::create () StandardPrivateProperty<Value,JsonState>* StandardPrivateProperty<Value,JsonState>::create ()
{ {
_cache = new StandardPrivateProperty<Value>(); _cache = new StandardPrivateProperty<Value>();
_cache->_postCreate(); _cache->_postCreate();
@ -223,8 +273,8 @@ namespace Hurricane {
} }
template<typename Value> template<typename Value, typename JsonState>
StandardPrivateProperty<Value>* StandardPrivateProperty<Value>::create ( const Value& value ) StandardPrivateProperty<Value,JsonState>* StandardPrivateProperty<Value,JsonState>::create ( const Value& value )
{ {
_cache = new StandardPrivateProperty<Value>(value); _cache = new StandardPrivateProperty<Value>(value);
_cache->_postCreate(); _cache->_postCreate();
@ -232,8 +282,8 @@ namespace Hurricane {
} }
template<typename Value> template<typename Value, typename JsonState>
StandardPrivateProperty<Value>* StandardPrivateProperty<Value>::get ( const DBo* object, bool create ) StandardPrivateProperty<Value,JsonState>* StandardPrivateProperty<Value,JsonState>::get ( const DBo* object, bool create )
{ {
if ( object == _owner ) return _cache; if ( object == _owner ) return _cache;
@ -253,60 +303,79 @@ namespace Hurricane {
} }
template<typename Value> template<typename Value, typename JsonState>
StandardPrivateProperty<Value>::StandardPrivateProperty () StandardPrivateProperty<Value,JsonState>::StandardPrivateProperty ()
: PrivateProperty(), _value() : PrivateProperty(), _value()
{ } { }
template<typename Value> template<typename Value, typename JsonState>
StandardPrivateProperty<Value>::StandardPrivateProperty ( const Value& value ) StandardPrivateProperty<Value,JsonState>::StandardPrivateProperty ( const Value& value )
: PrivateProperty(), _value(value) : PrivateProperty(), _value(value)
{ } { }
template<typename Value> template<typename Value, typename JsonState>
Name StandardPrivateProperty<Value>::getName() const Name StandardPrivateProperty<Value,JsonState>::getName() const
{ {
return staticGetName(); return staticGetName();
} }
template<typename Value> template<typename Value, typename JsonState>
Value& StandardPrivateProperty<Value>::getValue () const Value& StandardPrivateProperty<Value,JsonState>::getValue () const
{ {
return _value; return _value;
} }
template<typename Value> template<typename Value, typename JsonState>
void StandardPrivateProperty<Value>::setValue ( const Value& value ) void StandardPrivateProperty<Value,JsonState>::setValue ( const Value& value )
{ {
_value = value; _value = value;
} }
template<typename Value> template<typename Value, typename JsonState>
string StandardPrivateProperty<Value>::_getTypeName () const bool StandardPrivateProperty<Value,JsonState>::hasJson () const
{
return JsonState::enabled;
}
template<typename Value, typename JsonState>
void StandardPrivateProperty<Value,JsonState>::toJson ( JsonWriter* w, const DBo* ) const
{
w->startObject();
std::string tname = getString(staticGetName());
jsonWrite( w, "@typename", tname );
jsonWrite( w, "_value", _value );
w->endObject();
}
template<typename Value, typename JsonState>
string StandardPrivateProperty<Value,JsonState>::_getTypeName () const
{ {
return _TName("StandardPrivateProperty"); return _TName("StandardPrivateProperty");
} }
template<typename Value> template<typename Value, typename JsonState>
string StandardPrivateProperty<Value>::_getString () const string StandardPrivateProperty<Value,JsonState>::_getString () const
{ {
string s = PrivateProperty::_getString(); string s = PrivateProperty::_getString();
s.insert(s.length() - 1, " " + getString(_value)); s.insert(s.length() - 1, " " + getString(_value));
return s; return s;
} }
template<typename Value> template<typename Value, typename JsonState>
Record* StandardPrivateProperty<Value>::_getRecord () const Record* StandardPrivateProperty<Value,JsonState>::_getRecord () const
{ {
Record* record = PrivateProperty::_getRecord(); Record* record = PrivateProperty::_getRecord();
if (record) { if (record) {
record->add ( getSlot("Name" , staticGetName()) ); record->add ( getSlot("_name" , staticGetName()) );
record->add ( getSlot("Value",&_value) ); record->add ( getSlot("_value" ,&_value) );
record->add ( getSlot("JSON support", JsonState::enabled) );
} }
return record; return record;
} }
@ -317,33 +386,51 @@ namespace Hurricane {
class SharedProperty : public Property { class SharedProperty : public Property {
public:
// Types.
typedef set<DBo*> DBoSet;
// Methods.
inline DBos getOwners () const;
virtual void onCapturedBy ( DBo* owner );
virtual void onReleasedBy ( DBo* owner );
virtual void onNotOwned ();
inline DBoSet& _getOwnerSet ();
virtual string _getString () const;
virtual Record* _getRecord () const;
private: private:
// Internal: Attributes. class Orphaned {
DBoSet _ownerSet; public:
inline Orphaned ( SharedProperty* );
public:
SharedProperty* _property;
unsigned int _refcount;
unsigned int _count;
};
public:
typedef set<DBo*> DBoSet;
typedef map<string,Orphaned> OrphanedMap;
public:
static const OrphanedMap& getOrphaneds ();
static SharedProperty* getOrphaned ( const string& );
static void addOrphaned ( const string&, SharedProperty* );
static void refOrphaned ( const string& );
static void countOrphaned ( const string&, unsigned int );
static void removeOrphaned ( const string& );
static void clearOrphaneds ();
public:
inline DBos getOwners () const;
virtual void onCapturedBy ( DBo* owner );
virtual void onReleasedBy ( DBo* owner );
virtual void onNotOwned ();
inline DBoSet& _getOwnerSet ();
virtual string _getString () const;
virtual Record* _getRecord () const;
private:
static OrphanedMap _orphaneds;
private:
DBoSet _ownerSet;
protected: protected:
// Internal: Constructor & Destructor.
SharedProperty (); SharedProperty ();
virtual void _preDestroy (); virtual void _preDestroy ();
}; };
// Inline Functions. // Inline Functions.
DBos SharedProperty::getOwners () const { return getCollection(_ownerSet); } inline SharedProperty::Orphaned::Orphaned ( SharedProperty* property )
SharedProperty::DBoSet& SharedProperty::_getOwnerSet () { return _ownerSet; } : _property(property), _refcount(0), _count(0)
{ }
inline DBos SharedProperty::getOwners () const { return getCollection(_ownerSet); }
inline SharedProperty::DBoSet& SharedProperty::_getOwnerSet () { return _ownerSet; }
// ------------------------------------------------------------------- // -------------------------------------------------------------------
@ -505,10 +592,10 @@ namespace Hurricane {
} }
} // End of Hurricane namespace. } // Hurricane namespace.
INSPECTOR_P_SUPPORT(Hurricane::Property); INSPECTOR_P_SUPPORT(Hurricane::Property);
#endif // __HURRICANE_PROPERTY__ #endif // HURRICANE_PROPERTY_H

View File

@ -62,6 +62,7 @@ class Relation : public SharedProperty {
// Others // Others
// ****** // ******
public: void _setMasterOwner(DBo* owner) {_masterOwner=owner; }
protected: virtual void _postCreate(); protected: virtual void _postCreate();
public: virtual string _getTypeName() const {return _TName("Relation");}; public: virtual string _getTypeName() const {return _TName("Relation");};

View File

@ -103,6 +103,7 @@ namespace Hurricane {
class JsonRoutingPad : public JsonComponent { class JsonRoutingPad : public JsonComponent {
public: public:
static void initialize ();
JsonRoutingPad ( unsigned long flags ); JsonRoutingPad ( unsigned long flags );
virtual std::string getTypeName () const; virtual std::string getTypeName () const;
virtual JsonRoutingPad* clone ( unsigned long flags ) const; virtual JsonRoutingPad* clone ( unsigned long flags ) const;

View File

@ -132,6 +132,7 @@ namespace Hurricane {
class JsonSignature : public JsonObject { class JsonSignature : public JsonObject {
public: public:
static void initialize ();
JsonSignature ( unsigned long flags ); JsonSignature ( unsigned long flags );
void setSubType ( const std::string& ); void setSubType ( const std::string& );
virtual std::string getTypeName () const; virtual std::string getTypeName () const;

View File

@ -142,6 +142,7 @@ class Transformation {
class JsonTransformation : public JsonObject { class JsonTransformation : public JsonObject {
// ******************************************* // *******************************************
public: static void initialize();
public: JsonTransformation(unsigned long); public: JsonTransformation(unsigned long);
public: virtual string getTypeName() const; public: virtual string getTypeName() const;
public: virtual JsonTransformation* clone(unsigned long) const; public: virtual JsonTransformation* clone(unsigned long) const;

View File

@ -117,6 +117,7 @@ class Vertical : public Segment {
class JsonVertical : public JsonSegment { class JsonVertical : public JsonSegment {
// ************************************** // **************************************
public: static void initialize();
public: JsonVertical(unsigned long flags); public: JsonVertical(unsigned long flags);
public: virtual string getTypeName() const; public: virtual string getTypeName() const;
public: virtual JsonVertical* clone(unsigned long) const; public: virtual JsonVertical* clone(unsigned long) const;

View File

@ -732,6 +732,7 @@ namespace Hurricane {
DebugSession::close(); DebugSession::close();
setCell ( topCell ); setCell ( topCell );
emit cellLoadedFromDisk( topCell );
} }
} }
@ -741,14 +742,14 @@ namespace Hurricane {
Cell* cell = getCell(); Cell* cell = getCell();
if (not cell) return; if (not cell) return;
string blobName = getString(cell->getName()) + ".blob.json"; string blobName = getString(cell->getName()) + ".blob.json.bz2";
DesignBlob blob ( cell ); DesignBlob blob ( cell );
DebugSession::open( 50 ); //DebugSession::open( 50 );
JsonWriter writer ( blobName ); JsonWriter writer ( blobName );
writer.setFlags( JsonWriter::DesignBlobMode ); writer.setFlags( JsonWriter::DesignBlobMode );
jsonWrite( &writer, &blob ); jsonWrite( &writer, &blob );
DebugSession::close(); //DebugSession::close();
} }

View File

@ -44,7 +44,7 @@ namespace Hurricane {
setWindowTitle( tr("Open Design Blob") ); setWindowTitle( tr("Open Design Blob") );
QLabel* label = new QLabel (); QLabel* label = new QLabel ();
label->setText( tr("Enter the Blob name (without extention \".blob.json\")") ); label->setText( tr("Enter the Blob name (without extention \".blob.json.bz2\")") );
label->setFont( Graphics::getNormalFont(true) ); label->setFont( Graphics::getNormalFont(true) );
_lineEdit = new QLineEdit (); _lineEdit = new QLineEdit ();

View File

@ -150,6 +150,7 @@ namespace Hurricane {
inline void emitCellPreModificated (); inline void emitCellPreModificated ();
inline void emitCellPostModificated (); inline void emitCellPostModificated ();
signals: signals:
void cellLoadedFromDisk ( Cell* );
void showSelectionToggled ( bool ); void showSelectionToggled ( bool );
void stateChanged ( shared_ptr<CellWidget::State>& ); void stateChanged ( shared_ptr<CellWidget::State>& );
void redrawCellWidget (); void redrawCellWidget ();

View File

@ -182,6 +182,7 @@ namespace Unicorn {
, QKeySequence(tr("CTRL+M")) , QKeySequence(tr("CTRL+M"))
); );
connect( action, SIGNAL(triggered()), _libraryManager, SLOT(toggleShow()) ); connect( action, SIGNAL(triggered()), _libraryManager, SLOT(toggleShow()) );
connect( this , SIGNAL(cellLoadedFromDisk(Cell*)), _libraryManager, SLOT(updateLibrary(Cell*)) );
} }
@ -238,6 +239,7 @@ namespace Unicorn {
viewer->show (); viewer->show ();
} }
viewer->setCell ( cell ); viewer->setCell ( cell );
emit cellLoadedFromDisk ( cell );
} else } else
cerr << "[ERROR] Cell not found: " << cellName.toStdString() << endl; cerr << "[ERROR] Cell not found: " << cellName.toStdString() << endl;
} }
@ -260,6 +262,7 @@ namespace Unicorn {
viewer->show(); viewer->show();
} }
viewer->setCell( cell ); viewer->setCell( cell );
emit cellLoadedFromDisk ( cell );
} }
} }
} }
@ -291,10 +294,10 @@ namespace Unicorn {
} }
break; break;
case ExportCellDialog::Json: case ExportCellDialog::Json:
{ DebugSession::open( 50 ); { //DebugSession::open( 50 );
JsonWriter writer ( cellName.toStdString()+".json" ); JsonWriter writer ( cellName.toStdString()+".json.bz2" );
jsonWrite( &writer, cell ); jsonWrite( &writer, cell );
DebugSession::close(); //DebugSession::close();
} }
break; break;
} }