From e064358e0d916c4eead6c630118b35037a2faeb1 Mon Sep 17 00:00:00 2001 From: Jean-Paul Chaput Date: Sat, 20 Feb 2016 21:24:44 +0100 Subject: [PATCH] Implementation of DataBase native save/restore in JSON (step 3). * New: In VLSISAPD, in Parameter, callback have now a tag, which the pointer to the caller. This allow for the callback removal when the caller is destroyed. * New: In VLSISAPD, in WidgetDescription, when associated to a parameter, the destructor must remove the associated callback function on the Parameter. * New: In Hurricane, added JSON support for Configuration, separated from vlsisapd, as the support is not available at this point. JSON support for Configuration, Parameter & LayoutDescription. * Change: In Hurricane, in JsonStack, the stack of JsonObjects has been displaced here from HurricaneHandler. This way, all JsonObject::toData() can access the JsonOjects in the context of the parser. * New: In Hurricane, in DBo::toJson() added support for Entity by reference (ids). * New: In Hurricane, added JSON support for all Layer sub-class types. * New: In Hurricane, in Technology, export the Layers, but must be sorted by increasing mask value. * New: In Hurricane, in Entity, added support for Entity by reference (ids). * New: In Hurricane, in DataBase, added technology full support. * New: In Hurricane, In JsonNet, move the ring rebuild management from JsonStack to JsonNet. * New: In Hurricane, added JSON support for NetAlias, NetExternalcomponents (not cleanly implemented as a Relation). * New: In Hurricane, new method Cell::fromJson() to load a cell from a JSON file. * New: In Hurricane, In Graphics, make it an observable, for when JSON fully reload the graphic state, it must be able to notify other objects (namely the Controller). * New: In Hurricane, in ControllerWidget, observe the Graphics to regenerate the palette as needed. New method ControllerTab::graphicsUpdated(). * New: In Hurricane, in RawDrawingStyle added a destructor to release the Qt pen/brush. Added JSON support for HSVr, DrawingStyle, DrawingGroup, & DisplayStyle. * New: In Hurricane, in GraphicsWidget, rewrite correctly the readGraphics() to erase the previous widgets and re-create the new ones. * New: In Hurricane, in PaletteWidget, correct re-creation of the layout/widgets in case of Graphics change. * New: In CRL Core, in System, register the parameters callbacks with the address of the object, for later deletion. * New: In CRL Core, in AllianceFramework, make it observable, to notify library changes. For the AllianceFramework creation, now allow to completly bypass the Python initialization system, when we expect to restore it from a full blob. Added methods to sets the default RoutingGauge & CellGauge. * New: In CRL Core, added JSON suppport for CellGauge, RoutingLayerGauge & RoutingGauge. * New: In CRL Core, in LibraryManager, oberver AllianceFramework, to update the list of libraries in case of change (for JSON full reload). --- crlcore/src/LibraryManager/LibrariesModel.cpp | 5 + .../src/LibraryManager/LibrariesWidget.cpp | 4 + crlcore/src/LibraryManager/LibraryManager.cpp | 38 +- .../LibraryManager/crlcore/LibrariesModel.h | 1 + .../LibraryManager/crlcore/LibrariesWidget.h | 2 +- .../LibraryManager/crlcore/LibraryManager.h | 52 +- crlcore/src/ccore/AllianceFramework.cpp | 121 +++- crlcore/src/ccore/AllianceLibrary.cpp | 14 +- crlcore/src/ccore/CellGauge.cpp | 112 +++- crlcore/src/ccore/Environment.cpp | 2 +- crlcore/src/ccore/GraphicToolEngine.cpp | 2 +- crlcore/src/ccore/RoutingGauge.cpp | 66 ++- crlcore/src/ccore/RoutingLayerGauge.cpp | 150 ++++- crlcore/src/ccore/Utilities.cpp | 34 +- crlcore/src/ccore/crlcore/AllianceFramework.h | 33 +- crlcore/src/ccore/crlcore/CellGauge.h | 21 +- crlcore/src/ccore/crlcore/RoutingGauge.h | 29 +- crlcore/src/ccore/crlcore/RoutingLayerGauge.h | 205 ++++--- crlcore/src/cyclop/CyclopMain.cpp | 2 +- crlcore/src/pyCRL/PyAllianceFramework.cpp | 53 +- crlcore/src/pyCRL/PyCRL.cpp | 1 + crlcore/src/pyCRL/PyRoutingLayerGauge.cpp | 4 +- .../src/pyCRL/crlcore/PyAllianceFramework.h | 5 +- crlcore/src/x2y/x2y.cpp | 2 +- hurricane/doc/hurricane/JsonObject.dox | 131 ++++- hurricane/doc/hurricane/JsonSupport.dox | 104 +++- hurricane/doc/hurricane/doxyfile | 1 + hurricane/src/hurricane/BasicLayer.cpp | 175 +++++- hurricane/src/hurricane/CMakeLists.txt | 4 +- hurricane/src/hurricane/Cell.cpp | 17 + hurricane/src/hurricane/Contact.cpp | 9 +- hurricane/src/hurricane/ContactLayer.cpp | 168 +++++- hurricane/src/hurricane/DBo.cpp | 21 +- hurricane/src/hurricane/DataBase.cpp | 15 +- hurricane/src/hurricane/DbU.cpp | 10 +- hurricane/src/hurricane/DeepNet.cpp | 2 - hurricane/src/hurricane/DiffusionLayer.cpp | 169 +++++- hurricane/src/hurricane/Entity.cpp | 52 ++ hurricane/src/hurricane/Horizontal.cpp | 11 +- hurricane/src/hurricane/JsonObject.cpp | 287 +++++++++ hurricane/src/hurricane/JsonReader.cpp | 553 ++---------------- hurricane/src/hurricane/JsonWriter.cpp | 4 + hurricane/src/hurricane/Layer.cpp | 67 ++- hurricane/src/hurricane/Net.cpp | 227 +++++-- hurricane/src/hurricane/NetAlias.cpp | 52 ++ .../src/hurricane/NetExternalComponents.cpp | 84 ++- hurricane/src/hurricane/Pad.cpp | 7 +- hurricane/src/hurricane/Plug.cpp | 10 +- hurricane/src/hurricane/RegularLayer.cpp | 120 ++++ hurricane/src/hurricane/RoutingPad.cpp | 9 +- hurricane/src/hurricane/Technology.cpp | 143 ++++- hurricane/src/hurricane/TransistorLayer.cpp | 179 +++++- hurricane/src/hurricane/Vertical.cpp | 13 +- hurricane/src/hurricane/ViaLayer.cpp | 152 ++++- .../src/hurricane/hurricane/BasicLayer.h | 18 + hurricane/src/hurricane/hurricane/Cell.h | 1 + hurricane/src/hurricane/hurricane/Commons.h | 2 +- .../src/hurricane/hurricane/ContactLayer.h | 37 +- hurricane/src/hurricane/hurricane/DataBase.h | 2 +- hurricane/src/hurricane/hurricane/DbU.h | 42 +- .../src/hurricane/hurricane/DiffusionLayer.h | 38 +- hurricane/src/hurricane/hurricane/Entity.h | 14 + .../src/hurricane/hurricane/JsonObject.h | 424 ++++++++++++++ .../src/hurricane/hurricane/JsonReader.h | 432 +------------- .../src/hurricane/hurricane/JsonWriter.h | 95 ++- hurricane/src/hurricane/hurricane/Layer.h | 39 +- hurricane/src/hurricane/hurricane/Mask.h | 107 +++- hurricane/src/hurricane/hurricane/Net.h | 104 +++- hurricane/src/hurricane/hurricane/NetAlias.h | 14 + .../hurricane/NetExternalComponents.h | 17 + .../src/hurricane/hurricane/RegularLayer.h | 19 + .../src/hurricane/hurricane/Technology.h | 41 +- .../src/hurricane/hurricane/TransistorLayer.h | 38 +- hurricane/src/hurricane/hurricane/ViaLayer.h | 36 +- .../src/isobar/PyNetExternalComponents.cpp | 5 +- .../src/isobar/hurricane/isobar/PyHurricane.h | 2 +- .../isobar/PyNetExternalComponents.h | 31 +- hurricane/src/viewer/CMakeLists.txt | 4 + hurricane/src/viewer/CellImage.cpp | 2 +- hurricane/src/viewer/CellPrinter.cpp | 2 +- hurricane/src/viewer/CellViewer.cpp | 14 +- hurricane/src/viewer/CellWidget.cpp | 61 +- hurricane/src/viewer/ControllerWidget.cpp | 56 +- .../src/{hurricane => viewer}/DesignBlob.cpp | 35 +- hurricane/src/viewer/DisplayStyle.cpp | 371 +++++++++++- hurricane/src/viewer/Graphics.cpp | 79 ++- hurricane/src/viewer/GraphicsWidget.cpp | 56 +- hurricane/src/viewer/JsonConfiguration.cpp | 523 +++++++++++++++++ hurricane/src/viewer/JsonParameter.cpp | 185 ++++++ hurricane/src/viewer/PaletteNamedItem.cpp | 15 +- hurricane/src/viewer/PaletteWidget.cpp | 71 ++- .../hurricane/viewer/ControllerWidget.h | 47 +- .../hurricane/viewer}/DesignBlob.h | 1 + .../viewer/hurricane/viewer/DisplayStyle.h | 129 +++- .../src/viewer/hurricane/viewer/Graphics.h | 30 +- .../viewer/hurricane/viewer/GraphicsWidget.h | 14 +- .../hurricane/viewer/JsonConfiguration.h | 130 ++++ .../viewer/hurricane/viewer/JsonParameter.h | 66 +++ .../hurricane/viewer/PaletteLayerItem.h | 26 +- .../viewer/hurricane/viewer/PaletteWidget.h | 64 +- unicorn/src/CgtMain.cpp | 4 +- unicorn/src/UnicornGui.cpp | 2 +- unicorn/src/cgt.py | 7 +- .../src/configuration/src/Configuration.cpp | 1 + .../configuration/src/LayoutDescription.cpp | 45 +- vlsisapd/src/configuration/src/Parameter.cpp | 50 +- .../src/configuration/src/ParameterWidget.cpp | 47 +- .../configuration/ConfigurationWidget.h | 34 +- .../configuration/LayoutDescription.h | 32 +- .../src/vlsisapd/configuration/Parameter.h | 66 ++- .../vlsisapd/configuration/ParameterWidget.h | 52 +- 111 files changed, 5791 insertions(+), 1842 deletions(-) create mode 100644 hurricane/src/hurricane/JsonObject.cpp create mode 100644 hurricane/src/hurricane/hurricane/JsonObject.h rename hurricane/src/{hurricane => viewer}/DesignBlob.cpp (64%) create mode 100644 hurricane/src/viewer/JsonConfiguration.cpp create mode 100644 hurricane/src/viewer/JsonParameter.cpp rename hurricane/src/{hurricane/hurricane => viewer/hurricane/viewer}/DesignBlob.h (96%) create mode 100644 hurricane/src/viewer/hurricane/viewer/JsonConfiguration.h create mode 100644 hurricane/src/viewer/hurricane/viewer/JsonParameter.h diff --git a/crlcore/src/LibraryManager/LibrariesModel.cpp b/crlcore/src/LibraryManager/LibrariesModel.cpp index c306751c..3f667de5 100644 --- a/crlcore/src/LibraryManager/LibrariesModel.cpp +++ b/crlcore/src/LibraryManager/LibrariesModel.cpp @@ -24,6 +24,7 @@ namespace CRL { + using namespace std; using Hurricane::Graphics; @@ -37,6 +38,10 @@ namespace CRL { { } + void LibrariesModel::update () + { emit layoutChanged(); } + + QVariant LibrariesModel::data ( const QModelIndex& index, int role ) const { static QFont nameFont = Graphics::getFixedFont( QFont::Bold ); diff --git a/crlcore/src/LibraryManager/LibrariesWidget.cpp b/crlcore/src/LibraryManager/LibrariesWidget.cpp index ca50e12f..331f984d 100644 --- a/crlcore/src/LibraryManager/LibrariesWidget.cpp +++ b/crlcore/src/LibraryManager/LibrariesWidget.cpp @@ -75,6 +75,10 @@ namespace CRL { } + void LibrariesWidget::update () + { _baseModel->update(); } + + void LibrariesWidget::initSelection () { _view->selectRow( 0 ); } diff --git a/crlcore/src/LibraryManager/LibraryManager.cpp b/crlcore/src/LibraryManager/LibraryManager.cpp index 83da8f63..2c0bced1 100644 --- a/crlcore/src/LibraryManager/LibraryManager.cpp +++ b/crlcore/src/LibraryManager/LibraryManager.cpp @@ -23,6 +23,7 @@ #include "hurricane/Error.h" #include "hurricane/viewer/Graphics.h" #include "hurricane/viewer/CellViewer.h" +#include "crlcore/AllianceFramework.h" #include "crlcore/LibraryManager.h" #include "crlcore/LibrariesWidget.h" #include "crlcore/CellsWidget.h" @@ -39,13 +40,30 @@ namespace CRL { using Hurricane::Graphics; +// ------------------------------------------------------------------- +// Class : "FrameworkObserver". + + void FrameworkObserver::notify ( unsigned int flags ) + { + LibraryManager* manager = getOwner(); + if (flags & (AllianceFramework::AddedLibrary + |AllianceFramework::RemovedLibrary)) { + manager->getLibrariesWidget()->update(); + } + } + + +// ------------------------------------------------------------------- +// Class : "LibraryManager". + LibraryManager::LibraryManager ( QWidget* parent ) - : QWidget (parent) - , _librariesWidget(new LibrariesWidget()) - , _cellsWidget (new CellsWidget()) - , _viewsWidget (new ViewsWidget()) - , _cellViewer (NULL) - , _libPath (NULL) + : QWidget (parent) + , _frameworkObserver(this) + , _librariesWidget (new LibrariesWidget()) + , _cellsWidget (new CellsWidget()) + , _viewsWidget (new ViewsWidget()) + , _cellViewer (NULL) + , _libPath (NULL) { setObjectName ( "libraryManager" ); setAttribute ( Qt::WA_QuitOnClose, false ); @@ -100,10 +118,18 @@ namespace CRL { _librariesWidget->initSelection(); + AllianceFramework::get()->addObserver( &_frameworkObserver ); + resize( Graphics::toHighDpi(750), Graphics::toHighDpi(550) ); } + LibraryManager::~LibraryManager () + { + AllianceFramework::get()->removeObserver( &_frameworkObserver ); + } + + void LibraryManager::toggleShow () { setVisible( not isVisible() ); } diff --git a/crlcore/src/LibraryManager/crlcore/LibrariesModel.h b/crlcore/src/LibraryManager/crlcore/LibrariesModel.h index adbc709d..35b519fb 100644 --- a/crlcore/src/LibraryManager/crlcore/LibrariesModel.h +++ b/crlcore/src/LibraryManager/crlcore/LibrariesModel.h @@ -39,6 +39,7 @@ namespace CRL { QVariant headerData ( int section, Qt::Orientation orientation, int role=Qt::DisplayRole ) const; const AllianceLibrary* getLibrary ( const QModelIndex& ); const AllianceLibrary* getLibrary ( size_t ); + void update (); private: const AllianceLibraries& _libraries; }; diff --git a/crlcore/src/LibraryManager/crlcore/LibrariesWidget.h b/crlcore/src/LibraryManager/crlcore/LibrariesWidget.h index 55301e40..4e94aee1 100644 --- a/crlcore/src/LibraryManager/crlcore/LibrariesWidget.h +++ b/crlcore/src/LibraryManager/crlcore/LibrariesWidget.h @@ -36,12 +36,12 @@ namespace CRL { // ------------------------------------------------------------------- // Class : "LibrariesWidget". - class LibrariesWidget : public QWidget { Q_OBJECT; public: LibrariesWidget ( QWidget* parent=NULL ); void initSelection (); + void update (); signals: void selectedLibrary ( const AllianceLibrary* ); public slots: diff --git a/crlcore/src/LibraryManager/crlcore/LibraryManager.h b/crlcore/src/LibraryManager/crlcore/LibraryManager.h index 57049f1c..cd5a9c34 100644 --- a/crlcore/src/LibraryManager/crlcore/LibraryManager.h +++ b/crlcore/src/LibraryManager/crlcore/LibraryManager.h @@ -18,6 +18,7 @@ #define CRL_LIBRARY_MANAGER_H #include +#include "hurricane/Observer.h" class QLabel; class QModelIndex; @@ -34,10 +35,29 @@ namespace CRL { using Hurricane::Cell; using Hurricane::CellViewer; + using Hurricane::Observer; class AllianceLibrary; class ViewsWidget; class CellsWidget; class LibrariesWidget; + class LibraryManager; + + +// ------------------------------------------------------------------- +// Class : "FrameworkObserver". + + class FrameworkObserver : public Observer { + public: + inline FrameworkObserver ( LibraryManager* ); + virtual void notify ( unsigned int flags ); + private: + FrameworkObserver ( const FrameworkObserver& ); + }; + + + inline FrameworkObserver::FrameworkObserver ( LibraryManager* owner ) + : Observer(owner) + { } // ------------------------------------------------------------------- @@ -47,25 +67,29 @@ namespace CRL { class LibraryManager : public QWidget { Q_OBJECT; public: - LibraryManager ( QWidget* parent=NULL ); - inline void setCellViewer ( CellViewer* ); - inline CellViewer* getCellViewer () const; + LibraryManager ( QWidget* parent=NULL ); + ~LibraryManager (); + inline void setCellViewer ( CellViewer* ); + inline CellViewer* getCellViewer () const; + inline LibrariesWidget* getLibrariesWidget () const; public slots: - void toggleShow (); - void setLibrary ( const AllianceLibrary* library ); - CellViewer* openCell ( Cell*, unsigned int flags ); - void updateLibrary ( Cell* ); + void toggleShow (); + void setLibrary ( const AllianceLibrary* library ); + CellViewer* openCell ( Cell*, unsigned int flags ); + void updateLibrary ( Cell* ); private: - LibrariesWidget* _librariesWidget; - CellsWidget* _cellsWidget; - ViewsWidget* _viewsWidget; - CellViewer* _cellViewer; - QLabel* _libPath; + FrameworkObserver _frameworkObserver; + LibrariesWidget* _librariesWidget; + CellsWidget* _cellsWidget; + ViewsWidget* _viewsWidget; + CellViewer* _cellViewer; + QLabel* _libPath; }; - inline void LibraryManager::setCellViewer ( CellViewer* cw ) { _cellViewer=cw; } - inline CellViewer* LibraryManager::getCellViewer () const { return _cellViewer; } + inline void LibraryManager::setCellViewer ( CellViewer* cw ) { _cellViewer=cw; } + inline CellViewer* LibraryManager::getCellViewer () const { return _cellViewer; } + inline LibrariesWidget* LibraryManager::getLibrariesWidget () const { return _librariesWidget; } } // CRL namespace. diff --git a/crlcore/src/ccore/AllianceFramework.cpp b/crlcore/src/ccore/AllianceFramework.cpp index 3e003b39..2b1f84e1 100644 --- a/crlcore/src/ccore/AllianceFramework.cpp +++ b/crlcore/src/ccore/AllianceFramework.cpp @@ -183,12 +183,16 @@ namespace CRL { AllianceFramework::AllianceFramework () - : _environment() - , _parsers() - , _drivers() - , _catalog() - , _parentLibrary(NULL) - , _routingGauges() + : _observers () + , _environment () + , _parsers () + , _drivers () + , _catalog () + , _parentLibrary (NULL) + , _routingGauges () + , _defaultRoutingGauge(NULL) + , _cellGauges () + , _defaultCellGauge (NULL) { DataBase* db = DataBase::getDB (); if ( not db ) @@ -255,7 +259,8 @@ namespace CRL { for ( unsigned i=0 ; i_bindLibraries(); } @@ -280,7 +286,7 @@ namespace CRL { AllianceFramework* AllianceFramework::get () { - return create (); + return create(); } @@ -296,6 +302,18 @@ namespace CRL { } + void AllianceFramework::addObserver ( BaseObserver* observer ) + { _observers.addObserver( observer ); } + + + void AllianceFramework::removeObserver ( BaseObserver* observer ) + { _observers.removeObserver( observer ); } + + + void AllianceFramework::notify ( unsigned flags ) + { _observers.notify( flags ); } + + AllianceLibrary* AllianceFramework::getAllianceLibrary ( unsigned index ) { if ( index >= _libraries.size() ) @@ -444,7 +462,10 @@ namespace CRL { ParserFormatSlot& parser = _parsers.getParserSlot ( path, Catalog::State::Physical, _environment ); - if ( not parser.loadByLib() ) return alibrary; + if ( not parser.loadByLib() ) { + notify ( AddedLibrary ); + return alibrary; + } // Load the whole library. if ( ! _readLocate(dupLibName,Catalog::State::State::Logical,true) ) return alibrary; @@ -452,6 +473,7 @@ namespace CRL { // Call the parser function. (parser.getParsLib())( _environment.getLIBRARIES().getSelected() , alibrary->getLibrary() , _catalog ); + notify ( AddedLibrary ); return alibrary; } @@ -643,6 +665,18 @@ namespace CRL { } + RoutingGauge* AllianceFramework::setRoutingGauge ( const Name& name ) + { + RoutingGauge* gauge = getRoutingGauge( name ); + if (gauge) _defaultRoutingGauge = gauge; + else + cerr << Error( "AllianceFramework::setRoutingGauge(): No gauge named \"%s\"." + , getString(name).c_str() ) << endl; + + return _defaultRoutingGauge; + } + + RoutingGauge* AllianceFramework::getRoutingGauge ( const Name& name ) { if ( name.isEmpty() ) return _defaultRoutingGauge; @@ -674,6 +708,18 @@ namespace CRL { } + CellGauge* AllianceFramework::setCellGauge ( const Name& name ) + { + CellGauge* gauge = getCellGauge( name ); + if (gauge) _defaultCellGauge = gauge; + else + cerr << Error( "AllianceFramework::setCellGauge(): No gauge named \"%s\"." + , getString(name).c_str() ) << endl; + + return _defaultCellGauge; + } + + CellGauge* AllianceFramework::getCellGauge ( const Name& name ) { if ( name.isEmpty() ) return _defaultCellGauge; @@ -735,13 +781,13 @@ namespace CRL { Record *AllianceFramework::_getRecord () const { Record* record = new Record ( "" ); - record->add ( getSlot ( "_environment" , &_environment ) ); - record->add ( getSlot ( "_libraries" , &_libraries ) ); - record->add ( getSlot ( "_catalog" , &_catalog ) ); - record->add ( getSlot ( "_defaultRroutingGauge", _defaultRoutingGauge ) ); - record->add ( getSlot ( "_routingGauges" , _routingGauges ) ); - record->add ( getSlot ( "_defaultCellGauge" , _defaultCellGauge ) ); - record->add ( getSlot ( "_cellGauges" , _cellGauges ) ); + record->add ( getSlot ( "_environment" , &_environment ) ); + record->add ( getSlot ( "_libraries" , &_libraries ) ); + record->add ( getSlot ( "_catalog" , &_catalog ) ); + record->add ( getSlot ( "_defaultRoutingGauge", _defaultRoutingGauge ) ); + record->add ( getSlot ( "_routingGauges" , _routingGauges ) ); + record->add ( getSlot ( "_defaultCellGauge" , _defaultCellGauge ) ); + record->add ( getSlot ( "_cellGauges" , _cellGauges ) ); return record; } @@ -749,10 +795,13 @@ 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... + jsonWrite( w, "@typename" , _getTypeName() ); + jsonWrite( w, "_environment" , &_environment ); + jsonWrite( w, "_defaultRoutingGauge", _defaultRoutingGauge->getName() ); + jsonWrite( w, "_defaultCellGauge" , _defaultCellGauge->getName() ); + jsonWrite( w, "+libraries" , getAllianceLibraries() ); + jsonWrite( w, "+routingGauges" , _routingGauges ); + jsonWrite( w, "+cellGauges" , _cellGauges ); w->endObject(); } @@ -763,12 +812,25 @@ namespace CRL { Initializer jsonFrameworkInit ( 20 ); - JsonAllianceFramework::JsonAllianceFramework (unsigned long flags ) - : JsonObject(flags) + JsonAllianceFramework::JsonAllianceFramework ( unsigned long flags ) + : JsonObject (flags) + , _defaultRoutingGauge() + , _defaultCellGauge () { - // Environement & Catalog... - add( "_environment", typeid(Environment*) ); - add( "+libraries" , typeid(JsonArray) ); + add( "_environment" , typeid(Environment*) ); + add( "_defaultRoutingGauge", typeid(string) ); + add( "_defaultCellGauge" , typeid(string) ); + add( "+libraries" , typeid(JsonArray) ); + add( "+routingGauges" , typeid(JsonArray) ); + add( "+cellGauges" , typeid(JsonArray) ); + } + + + JsonAllianceFramework::~JsonAllianceFramework () + { + AllianceFramework* framework = AllianceFramework::get(); + framework->setRoutingGauge( _defaultRoutingGauge ); + framework->setCellGauge ( _defaultCellGauge ); } @@ -791,6 +853,9 @@ namespace CRL { // It's a singleton. Do not create it... AllianceFramework* framework = AllianceFramework::get(); + string _defaultRoutingGauge = get( stack, "_defaultRoutingGauge" ); + string _defaultCellGauge = get( stack, "_defaultCellGauge" ); + update( stack, framework ); } diff --git a/crlcore/src/ccore/AllianceLibrary.cpp b/crlcore/src/ccore/AllianceLibrary.cpp index af0e7edc..6347e9ac 100644 --- a/crlcore/src/ccore/AllianceLibrary.cpp +++ b/crlcore/src/ccore/AllianceLibrary.cpp @@ -26,6 +26,8 @@ namespace CRL { using namespace std; + using Hurricane::tab; + using Hurricane::inltrace; using Hurricane::Initializer; using Hurricane::JsonTypes; using Hurricane::Warning; @@ -78,8 +80,8 @@ namespace CRL { Record* AllianceLibrary::_getRecord() const { Record* record = new Record ( getString(this) ); - record->add ( getSlot("Path" ,&_path ) ); - record->add ( getSlot("Library", _library) ); + record->add ( getSlot("_path" ,&_path ) ); + record->add ( getSlot("_library", _library) ); return ( record ); } @@ -123,14 +125,16 @@ namespace CRL { { check( stack, "JsonAllianceLibrary::toData" ); - string libDbPath = get( stack,"_library" ); - string libOsPath = get( stack,"_path" ); + string libDbPath = get( stack, "_library" ); + string libOsPath = get( stack, "_path" ); AllianceFramework* af = AllianceFramework::get(); Library* library = DataBase::getDB()->getLibrary( libDbPath , DataBase::CreateLib|DataBase::WarnCreateLib ); AllianceLibrary* aLibrary = NULL; + ltrace(51) << "| " << libDbPath << " : " << library << endl; + if (library) { aLibrary = af->getAllianceLibrary( library ); } @@ -148,6 +152,8 @@ namespace CRL { if (not library) library = aLibrary->getLibrary(); } + ltrace(51) << "| Associates to: " << aLibrary << endl; + 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)" diff --git a/crlcore/src/ccore/CellGauge.cpp b/crlcore/src/ccore/CellGauge.cpp index 7ffa6e56..7d64ccd9 100644 --- a/crlcore/src/ccore/CellGauge.cpp +++ b/crlcore/src/ccore/CellGauge.cpp @@ -1,16 +1,9 @@ - - // -*- C++ -*- // // This file is part of the Coriolis Software. -// Copyright (c) UPMC/LIP6 2008-2010, All Rights Reserved +// Copyright (c) UPMC 2008-2016, All Rights Reserved // -// =================================================================== -// -// $Id$ -// -// x-----------------------------------------------------------------x -// | | +// +-----------------------------------------------------------------+ // | C O R I O L I S | // | Alliance / Hurricane Interface | // | | @@ -18,24 +11,16 @@ // | E-mail : Jean-Paul.Chaput@asim.lip6.fr | // | =============================================================== | // | C++ Header : "./CellGauge.cpp" | -// | *************************************************************** | -// | U p d a t e s | -// | | -// x-----------------------------------------------------------------x - - +// +-----------------------------------------------------------------+ #include - #include "crlcore/CellGauge.h" - - +#include "crlcore/AllianceFramework.h" namespace { - // const char *missingMandatoryAttr = // "CRoutingGauge::createFromXml () :\n\n" // " Can't found mandatory attribute \"%s\".\n"; @@ -57,19 +42,18 @@ namespace { // "::createCellGaugeFromXml () :\n\n" // " cellgauge name tag attribute is empty.\n"; - -} // End of Anonymous namespace. - - +} // Anonymous namespace. namespace CRL { + using namespace std; + using Hurricane::JsonTypes; + // ------------------------------------------------------------------- // Class : "CRL::CellGauge". - CellGauge::CellGauge ( const char* name , const char* pinLayerName , const DbU::Unit pitch @@ -151,4 +135,84 @@ namespace CRL { } + void CellGauge::toJson ( JsonWriter* w ) const + { + w->startObject(); + jsonWrite( w, "@typename" , "CellGauge" ); + jsonWrite( w, "_name" , _name ); + jsonWrite( w, "_pinLayerName", _pinLayerName ); + jsonWrite( w, "_pitch" , _pitch ); + jsonWrite( w, "_sliceHeight" , _sliceHeight ); + jsonWrite( w, "_sliceStep" , _sliceStep ); + w->endObject(); + } + + +// ------------------------------------------------------------------- +// Class : "JsonCellGauge" + + Initializer jsonCellGaugeInit ( 0 ); + + + void JsonCellGauge::initialize () + { JsonTypes::registerType( new JsonCellGauge (JsonWriter::RegisterMode) ); } + + + JsonCellGauge::JsonCellGauge( unsigned long flags ) + : JsonObject(flags) + { + add( "_name" , typeid(string) ); + add( "_pinLayerName", typeid(string) ); + add( "_pitch" , typeid(int64_t) ); + add( "_sliceHeight" , typeid(int64_t) ); + add( "_sliceStep" , typeid(int64_t) ); + } + + + string JsonCellGauge::getTypeName () const + { return "CellGauge"; } + + + JsonCellGauge* JsonCellGauge::clone ( unsigned long flags ) const + { return new JsonCellGauge ( flags ); } + + + void JsonCellGauge::toData ( JsonStack& stack ) + { + check( stack, "JsonCellGauge::toData" ); + + AllianceFramework* af = get( stack, "_framework" ); + CellGauge* cg = NULL; + string name = get ( stack, "_name" ); + string pinLayerName = get ( stack, "_pinLayerName" ); + DbU::Unit pitch = get( stack, "_pitch" ); + DbU::Unit sliceHeight = get( stack, "_sliceHeight" ); + DbU::Unit sliceStep = get( stack, "_sliceStep" ); + + if (stack.issetFlags(JsonWriter::TechnoMode)) { + if (af) { + if (not name.empty()) { + cg = CellGauge::create( name.c_str() + , pinLayerName.c_str() + , pitch + , sliceHeight + , sliceStep + ); + af->addCellGauge( cg ); + } + } else { + cerr << Error( "JsonCellGauge::toData(): Missing \"_framework\" in stack context." ) << endl; + } + } else { + if (af) { + cg = af->getCellGauge( name ); + } + } + + update( stack, cg ); +} + + + + } // End of CRL namespace. diff --git a/crlcore/src/ccore/Environment.cpp b/crlcore/src/ccore/Environment.cpp index 20d3ae94..1e86b303 100644 --- a/crlcore/src/ccore/Environment.cpp +++ b/crlcore/src/ccore/Environment.cpp @@ -530,7 +530,7 @@ namespace CRL { setBLOCKAGE ( "^obs$" ); setPad ( "^.*_px$" ); - _LIBRARIES.append ( "." ); + _LIBRARIES.append ( ".", "working" ); _inConstructor = false; } diff --git a/crlcore/src/ccore/GraphicToolEngine.cpp b/crlcore/src/ccore/GraphicToolEngine.cpp index 0d1d62b3..68e4df95 100644 --- a/crlcore/src/ccore/GraphicToolEngine.cpp +++ b/crlcore/src/ccore/GraphicToolEngine.cpp @@ -1,7 +1,7 @@ // -*- C++ -*- // // This file is part of the Coriolis Software. -// Copyright (c) UPMC/LIP6 2008-2016, All Rights Reserved +// Copyright (c) UPMC 2008-2016, All Rights Reserved // // +-----------------------------------------------------------------+ // | C O R I O L I S | diff --git a/crlcore/src/ccore/RoutingGauge.cpp b/crlcore/src/ccore/RoutingGauge.cpp index 4139cc8d..81dd3415 100644 --- a/crlcore/src/ccore/RoutingGauge.cpp +++ b/crlcore/src/ccore/RoutingGauge.cpp @@ -24,6 +24,7 @@ #include "crlcore/XmlParser.h" #include "crlcore/RoutingLayerGauge.h" #include "crlcore/RoutingGauge.h" +#include "crlcore/AllianceFramework.h" namespace { @@ -40,9 +41,11 @@ namespace { namespace CRL { - + using Hurricane::JsonTypes; + using Hurricane::JsonArray; using Hurricane::DataBase; using Hurricane::ViaLayer; + using Hurricane::getCollection; // ------------------------------------------------------------------- @@ -264,4 +267,65 @@ namespace CRL { } + void RoutingGauge::toJson ( JsonWriter* w ) const + { + w->startObject(); + jsonWrite( w, "@typename", "RoutingGauge" ); + jsonWrite( w, "_name" , _name ); + jsonWrite( w, "+routingLayerGauges", getCollection(getLayerGauges()) ); + w->endObject(); + } + + +// ------------------------------------------------------------------- +// Class : "JsonRoutingGauge" + + Initializer jsonRoutingGaugeInit ( 0 ); + + + void JsonRoutingGauge::initialize () + { JsonTypes::registerType( new JsonRoutingGauge (JsonWriter::RegisterMode) ); } + + + JsonRoutingGauge::JsonRoutingGauge( unsigned long flags ) + : JsonObject(flags) + { + add( "_name" , typeid(string) ); + add( "+routingLayerGauges", typeid(JsonArray) ); + } + + + string JsonRoutingGauge::getTypeName () const + { return "RoutingGauge"; } + + + JsonRoutingGauge* JsonRoutingGauge::clone ( unsigned long flags ) const + { return new JsonRoutingGauge ( flags ); } + + + void JsonRoutingGauge::toData ( JsonStack& stack ) + { + check( stack, "JsonRoutingGauge::toData" ); + + AllianceFramework* af = get( stack, "_framework" ); + string name = get ( stack, "_name" ); + RoutingGauge* rg = NULL; + + if (stack.issetFlags(JsonWriter::TechnoMode)) { + if (af) { + if (not name.empty()) { + rg = RoutingGauge::create( name.c_str() ); + af->addRoutingGauge( rg ); + } + } else { + cerr << Error( "JsonRoutingGauge::toData(): Missing \"_framework\" in stack context." ) << endl; + } + } else { + rg = af->getRoutingGauge( name ); + } + + update( stack, rg ); + } + + } // End of CRL namespace. diff --git a/crlcore/src/ccore/RoutingLayerGauge.cpp b/crlcore/src/ccore/RoutingLayerGauge.cpp index bc4dddf2..52974d5a 100644 --- a/crlcore/src/ccore/RoutingLayerGauge.cpp +++ b/crlcore/src/ccore/RoutingLayerGauge.cpp @@ -18,9 +18,11 @@ #include -#include "hurricane/BasicLayer.h" - -#include "crlcore/RoutingLayerGauge.h" +#include "hurricane/BasicLayer.h" +#include "hurricane/DataBase.h" +#include "hurricane/Technology.h" +#include "crlcore/RoutingLayerGauge.h" +#include "crlcore/RoutingGauge.h" namespace { @@ -86,28 +88,29 @@ namespace CRL { using namespace std; - + using Hurricane::JsonTypes; using Hurricane::Tabulation; using Hurricane::BasicLayer; using Hurricane::trace_in; using Hurricane::trace_out; using Hurricane::in_trace; using Hurricane::tab; + using Hurricane::DataBase; + using Hurricane::Technology; // ------------------------------------------------------------------- // Class : "RoutingLayerGauge" - - RoutingLayerGauge::RoutingLayerGauge ( const Layer* layer - , unsigned int direction - , unsigned int type - , unsigned int depth - , double density - , DbU::Unit offset - , DbU::Unit pitch - , DbU::Unit wireWidth - , DbU::Unit viaWidth ) + RoutingLayerGauge::RoutingLayerGauge ( const Layer* layer + , Constant::Direction direction + , Constant::LayerGaugeType type + , unsigned int depth + , double density + , DbU::Unit offset + , DbU::Unit pitch + , DbU::Unit wireWidth + , DbU::Unit viaWidth ) : _layer (layer) , _blockageLayer(layer->getBlockageLayer()) , _direction (direction) @@ -121,15 +124,15 @@ namespace CRL { { } - RoutingLayerGauge* RoutingLayerGauge::create ( const Layer* layer - , unsigned int direction - , unsigned int type - , unsigned int depth - , double density - , DbU::Unit offset - , DbU::Unit pitch - , DbU::Unit wireWidth - , DbU::Unit viaWidth ) + RoutingLayerGauge* RoutingLayerGauge::create ( const Layer* layer + , Constant::Direction direction + , Constant::LayerGaugeType type + , unsigned int depth + , double density + , DbU::Unit offset + , DbU::Unit pitch + , DbU::Unit wireWidth + , DbU::Unit viaWidth ) { // Temporary: must write a more smart check. // BasicLayer* basicLayer = dynamic_cast(layer); @@ -302,4 +305,103 @@ namespace CRL { } -} // End of Coriolis namespace. + void RoutingLayerGauge::toJson ( JsonWriter* w ) const + { + w->startObject(); + jsonWrite( w, "@typename", "RoutingLayerGauge" ); + jsonWrite( w, "_layer" , _layer->getName() ); + jsonWrite( w, "_direction" , getString(&_direction) ); + jsonWrite( w, "_type" , getString(&_type ) ); + jsonWrite( w, "_depth" , _depth ); + jsonWrite( w, "_density" , _density ); + jsonWrite( w, "_offset" , _offset ); + jsonWrite( w, "_pitch" , _pitch ); + jsonWrite( w, "_wireWidth" , _wireWidth ); + jsonWrite( w, "_viaWidth" , _viaWidth ); + w->endObject(); + } + + +// ------------------------------------------------------------------- +// Class : "JsonRoutingLayerGauge" + + Initializer jsonRoutingLayerGaugeInit ( 0 ); + + + void JsonRoutingLayerGauge::initialize () + { JsonTypes::registerType( new JsonRoutingLayerGauge (JsonWriter::RegisterMode) ); } + + + JsonRoutingLayerGauge::JsonRoutingLayerGauge( unsigned long flags ) + : JsonObject(flags) + { + add( ".RoutingGauge" , typeid(RoutingGauge*) ); + add( "_layer" , typeid(string) ); + add( "_direction" , typeid(string) ); + add( "_type" , typeid(string) ); + add( "_depth" , typeid(unsigned int) ); + add( "_density" , typeid(double) ); + add( "_offset" , typeid(int64_t) ); + add( "_pitch" , typeid(int64_t) ); + add( "_wireWidth" , typeid(int64_t) ); + add( "_viaWidth" , typeid(int64_t) ); + } + + + string JsonRoutingLayerGauge::getTypeName () const + { return "RoutingLayerGauge"; } + + + JsonRoutingLayerGauge* JsonRoutingLayerGauge::clone ( unsigned long flags ) const + { return new JsonRoutingLayerGauge ( flags ); } + + + void JsonRoutingLayerGauge::toData ( JsonStack& stack ) + { + check( stack, "JsonRoutingLayerGauge::toData" ); + + Technology* techno = DataBase::getDB()->getTechnology(); + RoutingGauge* rg = get( stack, ".RoutingGauge" ); + RoutingLayerGauge* rlg = NULL; + string layer = get ( stack, "_layer" ); + unsigned int depth = get ( stack, "_depth" ); + double density = get ( stack, "_density" ); + DbU::Unit offset = get ( stack, "_offset" ); + DbU::Unit pitch = get ( stack, "_pitch" ); + DbU::Unit wireWidth = get ( stack, "_wireWidth" ); + DbU::Unit viaWidth = get ( stack, "_viaWidth" ); + + Constant::Direction direction; + Constant::LayerGaugeType type; + from( direction, get(stack,"_direction") ); + from( type , get(stack,"_type" ) ); + + if (stack.issetFlags(JsonWriter::TechnoMode)) { + if (rg) { + if (not layer.empty()) { + rlg = RoutingLayerGauge::create( techno->getLayer(layer) + , direction + , type + , depth + , density + , offset + , pitch + , wireWidth + , viaWidth + ); + rg->addLayerGauge( rlg ); + } + } else { + cerr << Error( "JsonRoutingLayerGauge::toData(): Missing \".RoutingGauge\" in stack context." ) << endl; + } + } else { + if (rg) { + rlg = rg->getLayerGauge( techno->getLayer(layer) ); + } + } + + update( stack, rlg ); +} + + +} // Coriolis namespace. diff --git a/crlcore/src/ccore/Utilities.cpp b/crlcore/src/ccore/Utilities.cpp index cb8ea2b0..852faa73 100644 --- a/crlcore/src/ccore/Utilities.cpp +++ b/crlcore/src/ccore/Utilities.cpp @@ -322,25 +322,25 @@ namespace CRL { // Triggers Configuration singleton creation. Cfg::Configuration::get (); - Cfg::getParamBool ("misc.catchCore" ,true )->registerCb ( catchCoreChanged ); - Cfg::getParamBool ("misc.verboseLevel1" ,true )->registerCb ( verboseLevel1Changed ); - Cfg::getParamBool ("misc.verboseLevel2" ,true )->registerCb ( verboseLevel2Changed ); - Cfg::getParamBool ("misc.info" ,false)->registerCb ( infoChanged ); - Cfg::getParamBool ("misc.paranoid" ,false)->registerCb ( paranoidChanged ); - Cfg::getParamBool ("misc.bug" ,false)->registerCb ( bugChanged ); - Cfg::getParamBool ("misc.logMode" ,false)->registerCb ( logModeChanged ); - Cfg::getParamInt ("misc.traceLevel" ,1000 )->registerCb ( traceLevelChanged ); - Cfg::getParamString("stratus1.mappingName","./stratus2sxlib.xml")->registerCb ( stratus1MappingNameChanged ); + Cfg::getParamBool ("misc.catchCore" ,false)->registerCb ( this, catchCoreChanged ); + Cfg::getParamBool ("misc.verboseLevel1" ,true )->registerCb ( this, verboseLevel1Changed ); + Cfg::getParamBool ("misc.verboseLevel2" ,true )->registerCb ( this, verboseLevel2Changed ); + Cfg::getParamBool ("misc.info" ,false)->registerCb ( this, infoChanged ); + Cfg::getParamBool ("misc.paranoid" ,false)->registerCb ( this, paranoidChanged ); + Cfg::getParamBool ("misc.bug" ,false)->registerCb ( this, bugChanged ); + Cfg::getParamBool ("misc.logMode" ,false)->registerCb ( this, logModeChanged ); + Cfg::getParamInt ("misc.traceLevel" ,1000 )->registerCb ( this, traceLevelChanged ); + Cfg::getParamString("stratus1.mappingName","./stratus2sxlib.xml")->registerCb ( this, stratus1MappingNameChanged ); // Immediate update from the configuration. - catchCoreChanged ( Cfg::getParamBool("misc.catchCore" ) ); - verboseLevel1Changed ( Cfg::getParamBool("misc.verboseLevel1") ); - verboseLevel2Changed ( Cfg::getParamBool("misc.verboseLevel2") ); - infoChanged ( Cfg::getParamBool("misc.info" ) ); - paranoidChanged ( Cfg::getParamBool("misc.paranoid" ) ); - bugChanged ( Cfg::getParamBool("misc.bug" ) ); - logModeChanged ( Cfg::getParamBool("misc.logMode" ) ); - traceLevelChanged ( Cfg::getParamInt ("misc.traceLevel" ) ); + //catchCoreChanged ( Cfg::getParamBool("misc.catchCore" ) ); + //verboseLevel1Changed ( Cfg::getParamBool("misc.verboseLevel1") ); + //verboseLevel2Changed ( Cfg::getParamBool("misc.verboseLevel2") ); + //infoChanged ( Cfg::getParamBool("misc.info" ) ); + //paranoidChanged ( Cfg::getParamBool("misc.paranoid" ) ); + //bugChanged ( Cfg::getParamBool("misc.bug" ) ); + //logModeChanged ( Cfg::getParamBool("misc.logMode" ) ); + //traceLevelChanged ( Cfg::getParamInt ("misc.traceLevel" ) ); Utilities::Path stratusMappingName; if ( arguments.count("stratus_mapping_name") ) { diff --git a/crlcore/src/ccore/crlcore/AllianceFramework.h b/crlcore/src/ccore/crlcore/AllianceFramework.h index f6122650..f36bf842 100644 --- a/crlcore/src/ccore/crlcore/AllianceFramework.h +++ b/crlcore/src/ccore/crlcore/AllianceFramework.h @@ -28,6 +28,8 @@ namespace CRL { + using Hurricane::Observable; + using Hurricane::BaseObserver; using Hurricane::JsonObject; using Hurricane::JsonStack; using Hurricane::Cell; @@ -38,16 +40,23 @@ namespace CRL { class AllianceFramework { public: - enum InstancesCountFlags { Recursive = (1<<0) - , IgnoreFeeds = (1<<1) + enum FunctionsFlags { NoFlags = 0 + , NoPythonInit = (1<<0) }; - enum LibraryFlags { CreateLibrary = (1<<0) - , AppendLibrary = (1<<1) - , HasCatalog = (1<<2) + enum InstancesCountFlags { Recursive = (1<<0) + , IgnoreFeeds = (1<<1) + }; + enum LibraryFlags { CreateLibrary = (1<<0) + , AppendLibrary = (1<<1) + , HasCatalog = (1<<2) + }; + enum NotifyFlags { AddedLibrary = (1<<0) + , RemovedLibrary = (1<<1) + , ConfigChanged = (1<<2) }; public: // Constructors. - static AllianceFramework* create (); + static AllianceFramework* create ( unsigned long flags=NoFlags ); // Destructors. void destroy (); // Accessors. @@ -88,8 +97,13 @@ namespace CRL { CellGauge* getCellGauge ( const Name& name="" ); inline const Name getDefaultCGPinLayerName () const; // Modifiers. + RoutingGauge* setRoutingGauge ( const Name& name="" ); + CellGauge* setCellGauge ( const Name& name="" ); void addRoutingGauge ( RoutingGauge* ); void addCellGauge ( CellGauge* ); + void addObserver ( BaseObserver* ); + void removeObserver ( BaseObserver* ); + void notify ( unsigned int flags ); // Cell Management. Cell* cellLoader ( const string& rpath ); Cell* getCell ( const string& name @@ -110,15 +124,16 @@ namespace CRL { protected: static const Name _parentLibraryName; static AllianceFramework* _singleton; + Observable _observers; Environment _environment; ParsersMap _parsers; DriversMap _drivers; Catalog _catalog; AllianceLibraries _libraries; Library* _parentLibrary; - RoutingGauge* _defaultRoutingGauge; map _routingGauges; + RoutingGauge* _defaultRoutingGauge; map _cellGauges; CellGauge* _defaultCellGauge; @@ -170,9 +185,13 @@ namespace CRL { public: static void initialize (); JsonAllianceFramework( unsigned long ); + virtual ~JsonAllianceFramework(); virtual string getTypeName () const; virtual JsonAllianceFramework* clone ( unsigned long ) const; virtual void toData ( JsonStack& ); + private: + std::string _defaultRoutingGauge; + std::string _defaultCellGauge; }; diff --git a/crlcore/src/ccore/crlcore/CellGauge.h b/crlcore/src/ccore/crlcore/CellGauge.h index 2fb6fd66..6bdd4358 100644 --- a/crlcore/src/ccore/crlcore/CellGauge.h +++ b/crlcore/src/ccore/crlcore/CellGauge.h @@ -1,7 +1,7 @@ // -*- C++ -*- // // This file is part of the Coriolis Software. -// Copyright (c) UPMC/LIP6 2008-2016, All Rights Reserved +// Copyright (c) UPMC 2008-2016, All Rights Reserved // // +-----------------------------------------------------------------+ // | C O R I O L I S | @@ -29,7 +29,9 @@ namespace CRL { using std::string; using std::map; - + using Hurricane::JsonObject; + using Hurricane::JsonStack; + using Hurricane::Initializer; using Hurricane::Record; using Hurricane::DbU; using Hurricane::Name; @@ -38,7 +40,6 @@ namespace CRL { // ------------------------------------------------------------------- // Class : "CRL::CellGauge". - class CellGauge { public: @@ -57,6 +58,7 @@ namespace CRL { inline const DbU::Unit getSliceStep () const; CellGauge* getClone () const; // Hurricane management. + void toJson ( JsonWriter* ) const; virtual string _getTypeName () const; virtual string _getString () const; virtual Record* _getRecord () const; @@ -96,6 +98,19 @@ namespace CRL { inline const DbU::Unit CellGauge::getSliceStep () const { return _sliceStep; } +// ------------------------------------------------------------------- +// Class : "JsonCellGauge". + + class JsonCellGauge : public JsonObject { + public: + static void initialize (); + JsonCellGauge ( unsigned long flags ); + virtual string getTypeName () const; + virtual JsonCellGauge* clone ( unsigned long flags ) const; + virtual void toData ( JsonStack& ); + }; + + } // namespace CRL. diff --git a/crlcore/src/ccore/crlcore/RoutingGauge.h b/crlcore/src/ccore/crlcore/RoutingGauge.h index 6bff33c4..80e3d1b9 100644 --- a/crlcore/src/ccore/crlcore/RoutingGauge.h +++ b/crlcore/src/ccore/crlcore/RoutingGauge.h @@ -34,12 +34,15 @@ namespace Hurricane { namespace CRL { - using std::string; - using std::vector; - using Hurricane::Name; - using Hurricane::Record; - using Hurricane::Layer; - using Hurricane::Technology; + using std::string; + using std::vector; + using Hurricane::JsonObject; + using Hurricane::JsonStack; + using Hurricane::Initializer; + using Hurricane::Name; + using Hurricane::Record; + using Hurricane::Layer; + using Hurricane::Technology; // ------------------------------------------------------------------- @@ -78,6 +81,7 @@ namespace CRL { void addLayerGauge ( RoutingLayerGauge* layerGauge ); void checkConnexity () const; // Hurricane Managment. + void toJson ( JsonWriter* ) const; virtual Record* _getRecord ( Record* record=NULL ) const; virtual string _getString () const; virtual string _getTypeName () const; @@ -109,6 +113,19 @@ namespace CRL { inline DbU::Unit RoutingGauge::getViaWidth ( size_t depth ) const { return getLayerGauge(depth)->getViaWidth(); } +// ------------------------------------------------------------------- +// Class : "JsonRoutingGauge". + + class JsonRoutingGauge : public JsonObject { + public: + static void initialize (); + JsonRoutingGauge ( unsigned long flags ); + virtual string getTypeName () const; + virtual JsonRoutingGauge* clone ( unsigned long flags ) const; + virtual void toData ( JsonStack& ); + }; + + } // CRL namespace. INSPECTOR_P_SUPPORT(CRL::RoutingGauge); diff --git a/crlcore/src/ccore/crlcore/RoutingLayerGauge.h b/crlcore/src/ccore/crlcore/RoutingLayerGauge.h index 53496595..51d256f1 100644 --- a/crlcore/src/ccore/crlcore/RoutingLayerGauge.h +++ b/crlcore/src/ccore/crlcore/RoutingLayerGauge.h @@ -1,7 +1,7 @@ // -*- C++ -*- // // This file is part of the Coriolis Software. -// Copyright (c) UPMC/LIP6 2008-2016, All Rights Reserved +// Copyright (c) UPMC 2008-2016, All Rights Reserved // // +-----------------------------------------------------------------+ // | C O R I O L I S | @@ -20,6 +20,7 @@ #include #include "hurricane/Commons.h" +#include "hurricane/Error.h" #include "hurricane/DbU.h" #include "hurricane/Collection.h" #include "hurricane/Slot.h" @@ -32,9 +33,9 @@ namespace Hurricane { namespace Constant { - enum Direction { Horizontal = (1<<0) - , Vertical = (1<<1) - }; + enum Direction { Horizontal = (1<<0) + , Vertical = (1<<1) + }; enum LayerGaugeType { Default = (1<<0) , PinOnly = (1<<1) @@ -54,9 +55,10 @@ namespace Constant { namespace CRL { - using std::map; - + using Hurricane::JsonObject; + using Hurricane::JsonStack; + using Hurricane::Initializer; using Hurricane::GenericCollection; using Hurricane::GenericLocator; using Hurricane::GenericFilter; @@ -76,62 +78,63 @@ namespace CRL { public: // Constructors & Destructors. - static RoutingLayerGauge* create ( const Layer* layer - , unsigned int direction - , unsigned int type - , unsigned int depth - , double density - , DbU::Unit offset - , DbU::Unit pitch - , DbU::Unit wireWidth - , DbU::Unit viaWidth ); - virtual void destroy (); - // Accessors. - inline const Layer* getLayer () const; - inline const Layer* getBlockageLayer () const; - inline unsigned int getDepth () const; - inline unsigned int getDirection () const; - inline unsigned int getType () const; - inline double getDensity () const; - inline DbU::Unit getOffset () const; - inline DbU::Unit getPitch () const; - inline DbU::Unit getHalfPitch () const; - inline DbU::Unit getWireWidth () const; - inline DbU::Unit getHalfWireWidth () const; - inline DbU::Unit getViaWidth () const; - inline DbU::Unit getHalfViaWidth () const; - void divide ( DbU::Unit dividend, long& quotient, long& modulo ) const; - unsigned int getTrackNumber ( DbU::Unit start, DbU::Unit stop ) const; - unsigned int getTrackIndex ( DbU::Unit start, DbU::Unit stop, DbU::Unit position, unsigned mode ) const; - DbU::Unit getTrackPosition ( DbU::Unit start, unsigned depth ) const; - // Hurricane Managment. - virtual string _getTypeName () const; - virtual string _getString () const; - virtual Record* _getRecord () const; + static RoutingLayerGauge* create ( const Layer* layer + , Constant::Direction direction + , Constant::LayerGaugeType type + , unsigned int depth + , double density + , DbU::Unit offset + , DbU::Unit pitch + , DbU::Unit wireWidth + , DbU::Unit viaWidth ); + virtual void destroy (); + // Accessors. + inline const Layer* getLayer () const; + inline const Layer* getBlockageLayer () const; + inline unsigned int getDepth () const; + inline Constant::Direction getDirection () const; + inline Constant::LayerGaugeType getType () const; + inline double getDensity () const; + inline DbU::Unit getOffset () const; + inline DbU::Unit getPitch () const; + inline DbU::Unit getHalfPitch () const; + inline DbU::Unit getWireWidth () const; + inline DbU::Unit getHalfWireWidth () const; + inline DbU::Unit getViaWidth () const; + inline DbU::Unit getHalfViaWidth () const; + void divide ( DbU::Unit dividend, long& quotient, long& modulo ) const; + unsigned int getTrackNumber ( DbU::Unit start, DbU::Unit stop ) const; + unsigned int getTrackIndex ( DbU::Unit start, DbU::Unit stop, DbU::Unit position, unsigned mode ) const; + DbU::Unit getTrackPosition ( DbU::Unit start, unsigned depth ) const; + // Hurricane Managment. + void toJson ( JsonWriter* ) const; + virtual string _getTypeName () const; + virtual string _getString () const; + virtual Record* _getRecord () const; protected: // Internal - Attributes. - const Layer* _layer; - const Layer* _blockageLayer; - unsigned int _direction; - unsigned int _type; - unsigned int _depth; - double _density; - DbU::Unit _offset; - DbU::Unit _pitch; - DbU::Unit _wireWidth; - DbU::Unit _viaWidth; + const Layer* _layer; + const Layer* _blockageLayer; + Constant::Direction _direction; + Constant::LayerGaugeType _type; + unsigned int _depth; + double _density; + DbU::Unit _offset; + DbU::Unit _pitch; + DbU::Unit _wireWidth; + DbU::Unit _viaWidth; // Internal - Constructors & Destructors. - RoutingLayerGauge ( const Layer* layer - , unsigned int direction - , unsigned int type - , unsigned int depth - , double density - , DbU::Unit offset - , DbU::Unit pitch - , DbU::Unit wireWidth - , DbU::Unit viaWidth ); + RoutingLayerGauge ( const Layer* layer + , Constant::Direction direction + , Constant::LayerGaugeType type + , unsigned int depth + , double density + , DbU::Unit offset + , DbU::Unit pitch + , DbU::Unit wireWidth + , DbU::Unit viaWidth ); virtual ~RoutingLayerGauge (); virtual void _preDestroy(); RoutingLayerGauge& operator= ( const RoutingLayerGauge& ); @@ -156,23 +159,35 @@ namespace CRL { // ------------------------------------------------------------------- // Inline Functions. - inline const Layer* RoutingLayerGauge::getLayer () const { return ( _layer ); } - inline const Layer* RoutingLayerGauge::getBlockageLayer () const { return ( _blockageLayer ); } - inline unsigned int RoutingLayerGauge::getDirection () const { return ( _direction ); } - inline unsigned int RoutingLayerGauge::getType () const { return ( _type ); } - inline unsigned int RoutingLayerGauge::getDepth () const { return ( _depth ); } - inline double RoutingLayerGauge::getDensity () const { return ( _density ); } - inline DbU::Unit RoutingLayerGauge::getOffset () const { return ( _offset ); } - inline DbU::Unit RoutingLayerGauge::getPitch () const { return ( _pitch ); } - inline DbU::Unit RoutingLayerGauge::getHalfPitch () const { return ( _pitch>>1 ); } - inline DbU::Unit RoutingLayerGauge::getWireWidth () const { return ( _wireWidth ); } - inline DbU::Unit RoutingLayerGauge::getHalfWireWidth () const { return ( _wireWidth>>1 ); } - inline DbU::Unit RoutingLayerGauge::getViaWidth () const { return ( _viaWidth ); } - inline DbU::Unit RoutingLayerGauge::getHalfViaWidth () const { return ( _viaWidth>>1 ); } + inline const Layer* RoutingLayerGauge::getLayer () const { return ( _layer ); } + inline const Layer* RoutingLayerGauge::getBlockageLayer () const { return ( _blockageLayer ); } + inline Constant::Direction RoutingLayerGauge::getDirection () const { return ( _direction ); } + inline Constant::LayerGaugeType RoutingLayerGauge::getType () const { return ( _type ); } + inline unsigned int RoutingLayerGauge::getDepth () const { return ( _depth ); } + inline double RoutingLayerGauge::getDensity () const { return ( _density ); } + inline DbU::Unit RoutingLayerGauge::getOffset () const { return ( _offset ); } + inline DbU::Unit RoutingLayerGauge::getPitch () const { return ( _pitch ); } + inline DbU::Unit RoutingLayerGauge::getHalfPitch () const { return ( _pitch>>1 ); } + inline DbU::Unit RoutingLayerGauge::getWireWidth () const { return ( _wireWidth ); } + inline DbU::Unit RoutingLayerGauge::getHalfWireWidth () const { return ( _wireWidth>>1 ); } + inline DbU::Unit RoutingLayerGauge::getViaWidth () const { return ( _viaWidth ); } + inline DbU::Unit RoutingLayerGauge::getHalfViaWidth () const { return ( _viaWidth>>1 ); } +// ------------------------------------------------------------------- +// Class : "JsonRoutingLayerGauge". -} // End of CRL namespace. + class JsonRoutingLayerGauge : public JsonObject { + public: + static void initialize (); + JsonRoutingLayerGauge ( unsigned long flags ); + virtual string getTypeName () const; + virtual JsonRoutingLayerGauge* clone ( unsigned long flags ) const; + virtual void toData ( JsonStack& ); + }; + + +} // CRL namespace. INSPECTOR_P_SUPPORT(CRL::RoutingLayerGauge); @@ -182,6 +197,18 @@ INSPECTOR_P_SUPPORT(CRL::RoutingLayerGauge); // Inspector Support for : "const ::Constant::Direction*". +inline void from ( Constant::Direction& direction, const std::string& s ) +{ + if (s == "Vertical") direction = Constant::Vertical; + else { + if (s != "Horizontal") + std::cerr << Hurricane::Error( "::from(Direction&,string&): Unknown value \"%s\"." + , s.c_str() ) << std::endl; + direction = Constant::Horizontal; + } +} + + template<> inline std::string getString ( const Constant::Direction* direction ) @@ -190,7 +217,7 @@ inline std::string getString case Constant::Horizontal: return "Horizontal"; case Constant::Vertical: return "Vertical"; } - return ( "Unknown Constant::Direction" ); + return "Unknown Constant::Direction"; } @@ -202,7 +229,7 @@ inline std::string getString case Constant::Horizontal: return "Horizontal"; case Constant::Vertical: return "Vertical"; } - return ( "Unknown Constant::Direction" ); + return "Unknown Constant::Direction"; } @@ -213,19 +240,43 @@ IOSTREAM_POINTER_SUPPORT(Constant::Direction); // Inspector Support for : "const Constant::LayerGaugeType*". +inline void from ( Constant::LayerGaugeType& type, const std::string& s ) +{ + if (s == "PinOnly") type = Constant::PinOnly; + else { + if (s != "Default") + std::cerr << Hurricane::Error( "::from(LayerGaugeType&,string&): Unknown value \"%s\"." + , s.c_str() ) << std::endl; + type = Constant::Default; + } +} + + template<> inline std::string getString ( const Constant::LayerGaugeType* layerGaugeType ) { switch ( *layerGaugeType ) { - case Constant::Horizontal: return "Horizontal"; - case Constant::Vertical: return "Vertical"; + case Constant::Default: return "Default"; + case Constant::PinOnly: return "PinOnly"; } - return ( "Unknown Constant::LayerGaugeType" ); + return "Unknown Constant::LayerGaugeType"; +} + + +template<> +inline std::string getString + ( const Constant::LayerGaugeType layerGaugeType ) +{ + switch ( layerGaugeType ) { + case Constant::Default: return "Default"; + case Constant::PinOnly: return "PinOnly"; + } + return "Unknown Constant::LayerGaugeType"; } IOSTREAM_POINTER_SUPPORT(Constant::LayerGaugeType); -# endif // __CRL_ROUTING_LAYER_GAUGE_H__ +#endif // CRL_ROUTING_LAYER_GAUGE_H diff --git a/crlcore/src/cyclop/CyclopMain.cpp b/crlcore/src/cyclop/CyclopMain.cpp index 13ea154f..940325ed 100644 --- a/crlcore/src/cyclop/CyclopMain.cpp +++ b/crlcore/src/cyclop/CyclopMain.cpp @@ -132,7 +132,7 @@ int main ( int argc, char *argv[] ) if (verbose1) mstream::enable ( mstream::Verbose0|mstream::Verbose1 ); if (verbose2) mstream::enable ( mstream::Verbose0|mstream::Verbose1|mstream::Verbose2 ); - dbo_ptr af ( AllianceFramework::create() ); + dbo_ptr af ( AllianceFramework::get() ); Technology* technology = DataBase::getDB()->getTechnology(); // technology->setWorkingLayer ( "cut0" ); diff --git a/crlcore/src/pyCRL/PyAllianceFramework.cpp b/crlcore/src/pyCRL/PyAllianceFramework.cpp index 537ef03e..7115f6cf 100644 --- a/crlcore/src/pyCRL/PyAllianceFramework.cpp +++ b/crlcore/src/pyCRL/PyAllianceFramework.cpp @@ -64,18 +64,44 @@ extern "C" { #if defined(__PYTHON_MODULE__) - static PyObject* PyAllianceFramework_get ( PyObject* ) + static PyObject* PyAllianceFramework_create ( PyObject*, PyObject* args ) + { + trace << "PyAllianceFramework_create()" << endl; + + AllianceFramework* af = NULL; + PyAllianceFramework* pyAf = NULL; + unsigned long flags = AllianceFramework::NoFlags; + + HTRY + PyObject* arg0; + if (ParseOneArg("AllianceFramework.create()", args, INT_ARG, &arg0)) { + flags = PyInt_AsUnsignedLongMask(arg0); + } + + af = AllianceFramework::create( flags ); + + pyAf = PyObject_NEW( PyAllianceFramework, &PyTypeAllianceFramework ); + if (pyAf == NULL) return NULL; + + pyAf->_object = af; + HCATCH + + return (PyObject*)pyAf; + } + + + static PyObject* PyAllianceFramework_get ( PyObject* args ) { trace << "PyAllianceFramework_get()" << endl; - AllianceFramework* af = NULL; - PyAllianceFramework* pyAf = NULL; + AllianceFramework* af = NULL; + PyAllianceFramework* pyAf = NULL; HTRY - af = AllianceFramework::get (); + af = AllianceFramework::get(); - pyAf = PyObject_NEW ( PyAllianceFramework, &PyTypeAllianceFramework ); - if ( pyAf == NULL ) return NULL; + pyAf = PyObject_NEW( PyAllianceFramework, &PyTypeAllianceFramework ); + if (pyAf == NULL) return NULL; pyAf->_object = af; HCATCH @@ -298,7 +324,9 @@ extern "C" { PyMethodDef PyAllianceFramework_Methods[] = - { { "get" , (PyCFunction)PyAllianceFramework_get , METH_NOARGS|METH_STATIC + { { "create" , (PyCFunction)PyAllianceFramework_create , METH_VARARGS|METH_STATIC + , "Gets the Alliance Framework." } + , { "get" , (PyCFunction)PyAllianceFramework_get , METH_NOARGS|METH_STATIC , "Gets the Alliance Framework." } , { "getEnvironment" , (PyCFunction)PyAllianceFramework_getEnvironment , METH_NOARGS , "Gets the Alliance Environment." } @@ -310,7 +338,7 @@ extern "C" { , "Saves an Alliance Cell." } , { "createCell" , (PyCFunction)PyAllianceFramework_createCell , METH_VARARGS , "Create a Cell in the Alliance framework." } - , { "isPad" , (PyCFunction)PyAllianceFramework_isPad , METH_VARARGS + , { "isPad" , (PyCFunction)PyAllianceFramework_isPad , METH_VARARGS , "Tells if a cell name is a Pad." } , { "addCellGauge" , (PyCFunction)PyAllianceFramework_addCellGauge , METH_VARARGS , "Add a new cell gauge." } @@ -338,11 +366,18 @@ extern "C" { // x=================================================================x - // Link/Creation Method. PyTypeObjectDefinitions(AllianceFramework) + extern void PyAllianceFramework_postModuleInit () + { + PyObject* constant; + + LoadObjectConstant(PyTypeAllianceFramework.tp_dict,AllianceFramework::NoPythonInit,"NoPythonInit"); + } + + #endif // End of Shared Library Code Part. diff --git a/crlcore/src/pyCRL/PyCRL.cpp b/crlcore/src/pyCRL/PyCRL.cpp index 7d9234e4..407e6306 100644 --- a/crlcore/src/pyCRL/PyCRL.cpp +++ b/crlcore/src/pyCRL/PyCRL.cpp @@ -185,6 +185,7 @@ extern "C" { PyCatalog_postModuleInit (); PyEnvironment_postModuleInit (); PyRoutingLayerGauge_postModuleInit (); + PyAllianceFramework_postModuleInit (); //PyObject* dictionnary = PyModule_GetDict ( module ); //DbULoadConstants ( dictionnary ); diff --git a/crlcore/src/pyCRL/PyRoutingLayerGauge.cpp b/crlcore/src/pyCRL/PyRoutingLayerGauge.cpp index 6fe34ea0..ccf2fe4e 100644 --- a/crlcore/src/pyCRL/PyRoutingLayerGauge.cpp +++ b/crlcore/src/pyCRL/PyRoutingLayerGauge.cpp @@ -107,8 +107,8 @@ extern "C" { } rlg = RoutingLayerGauge::create( PYLAYER_O(pyLayer) - , direction - , type + , (Constant::Direction)direction + , (Constant::LayerGaugeType)type , depth , density , offset diff --git a/crlcore/src/pyCRL/crlcore/PyAllianceFramework.h b/crlcore/src/pyCRL/crlcore/PyAllianceFramework.h index d868d7d2..2a77605d 100644 --- a/crlcore/src/pyCRL/crlcore/PyAllianceFramework.h +++ b/crlcore/src/pyCRL/crlcore/PyAllianceFramework.h @@ -42,8 +42,9 @@ extern "C" { extern PyTypeObject PyTypeAllianceFramework; extern PyMethodDef PyAllianceFramework_Methods[]; - extern PyObject* PyAllianceFramework_Link ( CRL::AllianceFramework* ); - extern void PyAllianceFramework_LinkPyType (); + extern PyObject* PyAllianceFramework_Link ( CRL::AllianceFramework* ); + extern void PyAllianceFramework_LinkPyType (); + extern void PyAllianceFramework_postModuleInit (); #define IsPyAllianceFramework(v) ( (v)->ob_type == &PyTypeAllianceFramework ) diff --git a/crlcore/src/x2y/x2y.cpp b/crlcore/src/x2y/x2y.cpp index 2df48370..1868845a 100644 --- a/crlcore/src/x2y/x2y.cpp +++ b/crlcore/src/x2y/x2y.cpp @@ -49,7 +49,7 @@ int main(int argc, char *argv[]) { if (verbose1) mstream::enable ( mstream::Verbose0|mstream::Verbose1 ); if (verbose2) mstream::enable ( mstream::Verbose0|mstream::Verbose1|mstream::Verbose2 ); - AllianceFramework* af = AllianceFramework::create (); + AllianceFramework* af = AllianceFramework::get (); Cell* cell = NULL; diff --git a/hurricane/doc/hurricane/JsonObject.dox b/hurricane/doc/hurricane/JsonObject.dox index 6d33cce9..cf1e3a1b 100644 --- a/hurricane/doc/hurricane/JsonObject.dox +++ b/hurricane/doc/hurricane/JsonObject.dox @@ -6,12 +6,13 @@ //! \addtogroup JsonSupport //! \{ - /*! \class JsonObject * \brief Support for JSON export. * */ + //! \} + //! \function JsonObject::JsonObject ( unsigned long flags ); //! \param flags Flags sets by derived classes. //! @@ -31,6 +32,9 @@ //! //! For adding a requirement/attribute, see JsonObject::add(). + //! \function bool JsonObject::isDummy () const; + //! \Return \true if the concrete object is of type \c JsonDummy, \false otherwise. + //! \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. @@ -109,6 +113,16 @@ //! - 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 T* JsonObject::jget ( JsonStack& stack ) const; + //! \param stack The parser stack. + //! \Return the first JsonObject that can be cast into type \c T*. + //! + //! Search the JsonObject stack, from the top, the first object that + //! can be cast into type \c T*. Base classes can be used here, as the + //! \c dynamic_cast<> operator is used to perform the casts. + //! + //! This function \b always return a pointer (never a value). + //! \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. @@ -173,7 +187,7 @@ //! is created from them and the result is then pushed back. //! \function unsigned int JsonObject::presetId ( JsonStack& stack ); - //! \param The parser object stack. + //! \param stack The parser object stack. //! \Return the next id that has been set. //! //! \Remark This is a helper for JsonStack::toData(). @@ -184,7 +198,7 @@ //! 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 stack parser object stack. //! \param hobject the newly created DataBase object. //! //! \Remark This is a helper for JsonStack::toData(). @@ -193,6 +207,117 @@ //! object and bind it to the JsonObject. + //! \addtogroup JsonSupport + //! \{ + + /*! \class JsonStack + * \brief JSON Parser Stack + * + * + * The JSON parser stack contains three separate stacks and a lookup + * table: + * -# The \c attribute stack. Objects that have been translated from + * JSON to the Hurricane database (or POD objects). + * -# The \c dbo stack, similar to the previous one, but contains + * \b only objects whose base class is DBo. + * -# The JsonObject stack. The stack of objects currently under + * parsing. + * -# A lookup table for the Entity, between the Hurricane \c id and + * the JSON \c id. + */ + //! \} + + //! \function size_t JsonStack::size () const; + //! \Return The size of the attribute stack. + + //! \function void JsonStack::push_back ( const std::string& key, T hobject ); + //! \param key Key associated to \c hobject + //! \param hobject The \e attribute object. + //! + //! Push back (on top) an element on the \e attribute stack. + + //! \function void JsonStack::pop_back ( size_t count=1 ); + //! \param count The number of element to pop. + //! + //! Remove \c count element(s) from the top of the stack. + + //! \function int JsonStack::rhas ( const string& key ); + //! \param key The key element's to look for. + //! \return the index of the element, from the top. + //! + //! The function name's stands for "Reverse HAS". + //! Search from the top of the \e attribute stack downward an + //! element with \c key. Return an index from the top of the stack, + //! that is, the end of the vector. The returned index is a negative + //! value, for exemple the element on top of the stack has an index + //! of \c -1. If no element with a matching key is found, returns 0. + + //! \function T JsonStack::as ( const std::string& key ) const; + //! \param key The key's element to search. + //! \return The element, casted as type T. + //! + //! Search an element with key matching \c key, from the top of the + //! stack. If found, returns the element casted as type \c T. + //! As the cast operation uses \c boost::any_cast<>, the exact type + //! \c T must be used (\b not a base class of \c T), otherwise the + //! cast will fail and an exception will be thrown. + + //! \function T JsonStack::as ( int index ) const; + //! \param index the position of the element to convert. + //! \return The element, casted as type T. + //! + //! Cast the element at \c index into type T. + //! As the cast operation uses \c boost::any_cast<>, the exact type + //! \c T must be used (\b not a base class of \c T), otherwise the + //! cast will fail and an exception will be thrown. + //! + //! A positive or null index means the element must be taken from the + //! bottom of the stack and a stictly negative one means from the top + //! of the stack. + + //! \function void JsonStack::push_back_dbo ( DBo* dbo ); + //! \param dbo The DataBase object to push back. + //! + //! Dedicated stack to push objects \e after they had been casted + //! into the DBo* base class. We need to create this separate stack + //! from the \e attribute stack due to the inability of \c boost::any_cast<> + //! to use a base class. + + //! \function void JsonStack::pop_back_dbo (); + //! Remove one element from the top of the DBo* stack. + + //! \function DBo* JsonStack::back_dbo () const; + //! \Return The elemet at the top of the DBo* stack. + + //! \function void JsonStack::addEntity ( unsigned int jsonId, Entity* entity ); + //! \param jsonId the \c id of the Entity, in the JSON file + //! \param entity the associated Entity. + //! + //! When parsing a DataBase object \b not in \e blob mode, we cannot + //! restore the ids of the Entities as they are in the file. + //! Thus when an Entity is re-created, it comes with a different id. + //! So we have to keep track of the association between this newbox + //! id (in the Hurricane database) and the one in the JSON file. + //! + //! This function adds such an association. + + //! \function T JsonStack::getEntity ( unsigned int jsonId ) const; + //! \Return The entity, casted as type \c T. + //! + //! Find an Entity with the JSON id \c jsonId and cast it into + //! type \c T. + //! + //! Obviously, this Entity must have been registered with a call + //! to addEntity() before. + + //! \function vector& JsonStack::jobjects (); + //! \Return the stack of JSON objects, for direct manipulation by the involded + //! parties. + + //! \function void JsonStack::print ( std::ostream& o ) const; + //! Dump the contents of the \e attribute stack int the stream \c o. + //! For debugging purposes. + } diff --git a/hurricane/doc/hurricane/JsonSupport.dox b/hurricane/doc/hurricane/JsonSupport.dox index fab4e470..a56c837d 100644 --- a/hurricane/doc/hurricane/JsonSupport.dox +++ b/hurricane/doc/hurricane/JsonSupport.dox @@ -58,7 +58,6 @@ "+netMap": [ ], } - \endcode * * \section secJsonDriver JSON Driver Support @@ -165,8 +164,8 @@ class JsonPoint : public JsonObject { public: static void initialize (); JsonPoint (unsigned long flags); - virtual string getTypeName(); - virtual JsonPoint* clone (unsigned long flags); + virtual string getTypeName() const; + virtual JsonPoint* clone (unsigned long flags) const; virtual void toData (JsonStack&); }; \endcode @@ -235,6 +234,105 @@ void JsonPoint::toData ( JsonStack& stack ) update( stack, point ); } \endcode + * + * + * \subsection secJsonArray JSON Array + * + * JSON array are not translated into containers of any kind. + * They are simply ignored (from the stack point of view). + * Objects in array comes from a great variety of containers + * including Hurricane::Collection, in almost all cases, their + * very constructors are responsibles for inserting the object + * in the relevant container/collection. So there is no need + * to build a mechanism to keep track of all the objects in an + * array through a temporary container. + * + * The corollary is that an object in an array must be able to + * extract the relevant context information from the stack. + * Say, if we are in an array of components, they must belong + * to a Net, which must be present in the stack with a key ".Net". + * + * + * \subsection secJsonStack Parser Stack + * + * While performing the parsing, the parser maintain a stack + * (JsonStack) containing: + * - The stack of attributes translateds, but not consumeds + * by the parser and the objects currently openeds (that is, + * which parsing is not completed). This stack contains POD + * or Hurricane objects (value or pointer). + * It is a vector of pair \c (key,value) where the \e key + * is either the attribute name (\c _boundingBox, \c _xMin, + * \c _masterCell, ...) or the class name (\c .Net, \c .Cell, ...). + * - The stack of JSON objects currently openeds, thoses objects + * are all derived classes of JsonObject. + * - A stack of currently opened DBo*. This stack is somewhat + * redundant with the first, but is needed because + * \c boost::any_cast<> is not able to perform dynamic conversions. + * You have to know the exact for the conversion to work. + * Here, everything is DBo*, so the problem do not arises. + * + * + * \subsection secJsonCycle JsonObject Life Cycle + * +\code{.json} +{ # JsonDummy() (1). + "_typename": "Net", # JsonNet() CTOR (2). + "_id": 14622, + "_name": "saccu(0)", + "_isGlobal": false, + "_isExternal": false, + "_isAutomatic": false, + "_type": "LOGICAL", + "_direction": "---- (UNDEFINED)", + "+aliases": [], # JsonNet::toData() (3). + "+componentSet": [ + { + "@typename": "RoutingPad", + "_id": 27410, + "_bodyHook": "Contact::AnchorHook.46566", + "_occurrence": { + "@typename": "Occurrence", + "_path": "14720.14976", + "_entity": 3888 + }, + "+propertySet": [] + }, + { + "@typename": "RoutingPad", + "_id": 27409, + "_bodyHook": "Contact::AnchorHook.46574", + "_occurrence": { + "@typename": "Occurrence", + "_path": "14654.18564", + "_entity": 4529 + }, + "+propertySet": [] + } + } +} # ~JsonNet() DTOR (4). +\endcode + * + * At \c (1) , before \c _typename is encountered, we know that a new + * object is about to be created, but do not know what is type will be. + * So we push on top of the stack a \c JsonDummy. + * + * At \c (2) , the \c _typename allows us to create the right kind of + * JsonObject, which will \e replace the \c JsonDummy on top of the + * stack. + * + * At \c (3) , a first non-POD attribute of JsonNet is encountered. + * This triggers the call to \c JsonObject::toData(), which creates + * the Hurricane object Net, and put it back on the attribute stack + * with the key \c ".Net" (because it is \e not an attribute). + * + * At \c (4) , the Json parser knows that the current JsonObject is + * finished, so it removes JsonNet from the stack and destroy it. + * + * So, if you need to perform specific post-processing that can only + * take place \c after the object and all it's sub-objects has been + * fully parsed, you may do it in the destructor of the JsonObject. + * For example, this technique is used to rebuild the rings of a Net. */ diff --git a/hurricane/doc/hurricane/doxyfile b/hurricane/doc/hurricane/doxyfile index 579ec8f5..35da700c 100644 --- a/hurricane/doc/hurricane/doxyfile +++ b/hurricane/doc/hurricane/doxyfile @@ -590,6 +590,7 @@ INPUT = Generalities.dox \ Initializer.dox \ ../../src/hurricane/hurricane/Initializer.h \ JsonObject.dox \ + ../../src/hurricane/hurricane/JsonObject.h \ ../../src/hurricane/hurricane/JsonReader.h \ Hurricane.dox \ ../../src/hurricane/hurricane/Commons.h \ diff --git a/hurricane/src/hurricane/BasicLayer.cpp b/hurricane/src/hurricane/BasicLayer.cpp index 9b3a225e..0534eb72 100644 --- a/hurricane/src/hurricane/BasicLayer.cpp +++ b/hurricane/src/hurricane/BasicLayer.cpp @@ -1,4 +1,3 @@ - // -*- C++ -*- // // Copyright (c) BULL S.A. 2000-2016, All Rights Reserved @@ -19,12 +18,7 @@ // License along with Hurricane. If not, see // . // -// =================================================================== -// -// $Id$ -// -// x-----------------------------------------------------------------x -// | | +// +-----------------------------------------------------------------+ // | 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 | // | | @@ -32,15 +26,13 @@ // | E-mail : Jean-Paul.Chaput@lip6.fr | // | =============================================================== | // | C++ Module : "./BasicLayer.cpp" | -// | *************************************************************** | -// | U p d a t e s | -// | | -// x-----------------------------------------------------------------x +// +-----------------------------------------------------------------+ -# include "hurricane/BasicLayer.h" -# include "hurricane/Technology.h" -# include "hurricane/Error.h" +#include "hurricane/Error.h" +#include "hurricane/DataBase.h" +#include "hurricane/Technology.h" +#include "hurricane/BasicLayer.h" namespace Hurricane { @@ -272,13 +264,29 @@ namespace Hurricane { { Record* record = Layer::_getRecord(); if (record) { - record->add(getSlot("Material", &_material)); - record->add(getSlot("RealName", &_realName)); + record->add(getSlot("_material" , &_material)); + record->add(getSlot("_realName" , &_realName)); + record->add(getSlot("_blockageLayer", _blockageLayer)); } return record; } + void BasicLayer::_toJson ( JsonWriter* writer ) const + { + Super::_toJson( writer ); + + jsonWrite( writer, "_material" , getString(&_material) ); + jsonWrite( writer, "_extractNumber", _extractNumber ); + jsonWrite( writer, "_realName" , _realName ); + if (_blockageLayer) { + jsonWrite( writer, "_blockageLayer", _blockageLayer->getName() ); + } else { + jsonWrite( writer, "_blockageLayer", "no_blockage_layer" ); + } + } + + // ------------------------------------------------------------------- // Class : "Hurricane::BasicLayer::Material". @@ -300,6 +308,23 @@ namespace Hurricane { } + BasicLayer::Material BasicLayer::Material::fromString ( const string& s ) + { + Code code = other; + if (s == "nWell" ) code = nWell; + else if (s == "pWell" ) code = pWell; + else if (s == "nImplant") code = nImplant; + else if (s == "pImplant") code = pImplant; + else if (s == "active" ) code = active; + else if (s == "poly" ) code = poly; + else if (s == "cut" ) code = cut; + else if (s == "metal" ) code = metal; + else if (s == "blockage") code = blockage; + + return Material(code); + } + + string BasicLayer::Material::_getString () const { return getString(&_code); } @@ -312,4 +337,120 @@ namespace Hurricane { } -} // End of Hurricane namespace. +// ------------------------------------------------------------------- +// Class : "Hurricane::JsonBasicLayer". + + Initializer jsonBasicLayerInit ( 0 ); + + + void JsonBasicLayer::initialize () + { JsonTypes::registerType( new JsonBasicLayer (JsonWriter::RegisterMode) ); } + + + JsonBasicLayer::JsonBasicLayer ( unsigned long flags ) + : JsonLayer(flags) + { + if (flags & JsonWriter::RegisterMode) return; + + ltrace(51) << "JsonBasicLayer::JsonBasicLayer()" << endl; + + add( "_material" , typeid(string) ); + add( "_extractNumber", typeid(string) ); + add( "_blockageLayer", typeid(string) ); + add( "_realName" , typeid(string) ); + } + + + JsonBasicLayer::~JsonBasicLayer () + { } + + + string JsonBasicLayer::getTypeName () const + { return "BasicLayer"; } + + + JsonBasicLayer* JsonBasicLayer::clone ( unsigned long flags ) const + { return new JsonBasicLayer ( flags ); } + + + void JsonBasicLayer::toData(JsonStack& stack) + { + ltracein(51); + + check( stack, "JsonBasicLayer::toData" ); + + Technology* techno = lookupTechnology( stack, "JsonBasicLayer::toData" ); + BasicLayer* basicLayer = NULL; + + if (techno) { + string name = get ( stack, "_name" ); + string smask = get ( stack, "_mask" ); + DbU::Unit minimalSize = get( stack, "_minimalSize" ); + DbU::Unit minimalSpacing = get( stack, "_minimalSpacing" ); + bool isWorking = get ( stack, "_working" ); + string materialName = get ( stack, "_material" ); + unsigned int extractNumber = get( stack, "_extractNumber" ); + string blockageLayer = get ( stack, "_blockageLayer" ); + string realName = get ( stack, "_realName" ); + + BasicLayer::Material material = BasicLayer::Material::fromString(materialName); + Layer::Mask mask = Layer::Mask::fromString(smask); + + if (stack.issetFlags(JsonWriter::TechnoMode)) { + // Actual creation. + basicLayer = BasicLayer::create( techno + , name + , material + , extractNumber + , minimalSize + , minimalSpacing + ); + basicLayer->setWorking( isWorking ); + + if (blockageLayer != "no_blockage_layer") { + JsonTechnology* jtechno = jget( stack ); + if (jtechno) { + jtechno->addBlockageRef( blockageLayer, basicLayer ); + } + } + + if (basicLayer->getMask() != mask) { + cerr << Error( "JsonBasicLayer::toData(): Layer mask re-creation discrepency on \"%s\":\n" + " Blob: %s\n" + " DataBase: %s" + , name.c_str() + , getString(mask).c_str() + , getString(basicLayer->getMask()).c_str() + ) << endl; + } + // Add here association with blockage layer... + } else { + // Check coherency with existing layer. + basicLayer = dynamic_cast( techno->getLayer(name) ); + if (basicLayer) { + if (basicLayer->getMask() != mask) { + cerr << Error( "JsonBasicLayer::toData(): Layer mask discrepency on \"%s\":\n" + " Blob: %s\n" + " DataBase: %s" + , name.c_str() + , getString(mask).c_str() + , getString(basicLayer->getMask()).c_str() + ) << endl; + } + } else { + cerr << Error( "JsonBasicLayer::toData(): No BasicLayer \"%s\" in the existing technology." + , name.c_str() + ) << endl; + } + } + } else { + cerr << Error( "JsonBasicLayer::toData(): Cannot find technology, aborting BasicLayer creation." ) << endl; + } + + update( stack, basicLayer ); + + ltraceout(51); + } + + +} // Hurricane namespace. diff --git a/hurricane/src/hurricane/CMakeLists.txt b/hurricane/src/hurricane/CMakeLists.txt index ba8e5501..e66a1acc 100644 --- a/hurricane/src/hurricane/CMakeLists.txt +++ b/hurricane/src/hurricane/CMakeLists.txt @@ -12,6 +12,7 @@ hurricane/FileReadGzStream.h hurricane/FileWriteGzStream.h hurricane/JsonWriter.h + hurricane/JsonObject.h hurricane/JsonReader.h hurricane/Signature.h hurricane/Observer.h @@ -98,7 +99,6 @@ hurricane/Views.h hurricane/Warning.h hurricane/TextTranslator.h - hurricane/DesignBlob.h ) set ( cpps Record.cpp Slot.cpp @@ -109,6 +109,7 @@ FileReadGzStream.cpp FileWriteGzStream.cpp JsonWriter.cpp + JsonObject.cpp JsonReader.cpp Signature.cpp Exception.cpp @@ -179,7 +180,6 @@ Marker.cpp Timer.cpp TextTranslator.cpp - DesignBlob.cpp ) add_library ( hurricane ${cpps} ) diff --git a/hurricane/src/hurricane/Cell.cpp b/hurricane/src/hurricane/Cell.cpp index 1eff1f3b..997d36d4 100644 --- a/hurricane/src/hurricane/Cell.cpp +++ b/hurricane/src/hurricane/Cell.cpp @@ -39,6 +39,7 @@ #include "hurricane/Component.h" #include "hurricane/UpdateSession.h" #include "hurricane/Error.h" +#include "hurricane/JsonReader.h" namespace Hurricane { @@ -365,6 +366,22 @@ Cell* Cell::create(Library* library, const Name& name) return cell; } +Cell* Cell::fromJson(const string& filename) +// ***************************************** +{ + UpdateSession::open(); + + JsonReader reader ( JsonWriter::CellMode ); + reader.parse( filename ); + + UpdateSession::close(); + + const JsonStack& stack = reader.getStack(); + if (stack.rhas(".Cell")) return stack.as(".Cell"); + + return NULL; +} + Box Cell::getBoundingBox() const // ***************************** { diff --git a/hurricane/src/hurricane/Contact.cpp b/hurricane/src/hurricane/Contact.cpp index c20f0f8a..70277350 100644 --- a/hurricane/src/hurricane/Contact.cpp +++ b/hurricane/src/hurricane/Contact.cpp @@ -583,8 +583,13 @@ void JsonContact::toData(JsonStack& stack) , DbU::fromDb( get(stack,"_height") ) ); - stack.addHookLink( contact->getBodyHook (), jsonId, get(stack,"_bodyHook" ) ); - stack.addHookLink( contact->getAnchorHook(), jsonId, get(stack,"_anchorHook") ); + JsonNet* jnet = jget( stack ); + if (jnet) { + jnet->addHookLink( contact->getBodyHook (), jsonId, get(stack,"_bodyHook" ) ); + jnet->addHookLink( contact->getAnchorHook(), jsonId, get(stack,"_anchorHook") ); + } else { + cerr << Error( "JsonContact::toData(): Missing (Json)Net in stack context." ) << endl; + } // Hook/Ring rebuild are done as a post-process. update( stack, contact ); diff --git a/hurricane/src/hurricane/ContactLayer.cpp b/hurricane/src/hurricane/ContactLayer.cpp index 51503dbb..dc4ae255 100644 --- a/hurricane/src/hurricane/ContactLayer.cpp +++ b/hurricane/src/hurricane/ContactLayer.cpp @@ -1,4 +1,3 @@ - // -*- C++ -*- // // Copyright (c) BULL S.A. 2000-2016, All Rights Reserved @@ -19,12 +18,7 @@ // License along with Hurricane. If not, see // . // -// =================================================================== -// -// $Id$ -// -// x-----------------------------------------------------------------x -// | | +// +-----------------------------------------------------------------+ // | 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 | // | | @@ -32,16 +26,14 @@ // | E-mail : Jean-Paul.Chaput@lip6.fr | // | =============================================================== | // | C++ Module : "./ContactLayer.cpp" | -// | *************************************************************** | -// | U p d a t e s | -// | | -// x-----------------------------------------------------------------x +// +-----------------------------------------------------------------+ -# include "hurricane/BasicLayer.h" -# include "hurricane/ContactLayer.h" -# include "hurricane/Technology.h" -# include "hurricane/Error.h" +#include "hurricane/DataBase.h" +#include "hurricane/Technology.h" +#include "hurricane/BasicLayer.h" +#include "hurricane/ContactLayer.h" +#include "hurricane/Error.h" namespace { @@ -199,4 +191,150 @@ namespace Hurricane { } + void ContactLayer::_toJson ( JsonWriter* w ) const + { + Super::_toJson( w ); + + jsonWrite( w, "_metal" , _basicLayers[0]->getName() ); + jsonWrite( w, "_cut" , _basicLayers[1]->getName() ); + jsonWrite( w, "_active" , _basicLayers[2]->getName() ); + jsonWrite( w, "_diffusion", _basicLayers[3]->getName() ); + if (_basicLayers.size() == 5) jsonWrite( w, "_well", _basicLayers[4]->getName() ); + else jsonWrite( w, "_well", "no_well_layer" ); + + jsonWrite( w, "_enclosure.metal" , _enclosures[0] ); + jsonWrite( w, "_enclosure.cut" , _enclosures[1] ); + jsonWrite( w, "_enclosure.active" , _enclosures[2] ); + jsonWrite( w, "_enclosure.diffusion", _enclosures[3] ); + jsonWrite( w, "_enclosure.well" , (_basicLayers.size() == 5) ? _enclosures[4] : 0 ); + } + + +// ------------------------------------------------------------------- +// Class : "Hurricane::JsonContactLayer". + + Initializer jsonContactLayerInit ( 0 ); + + + void JsonContactLayer::initialize () + { JsonTypes::registerType( new JsonContactLayer (JsonWriter::RegisterMode) ); } + + + JsonContactLayer::JsonContactLayer ( unsigned long flags ) + : JsonLayer(flags) + { + if (flags & JsonWriter::RegisterMode) return; + + ltrace(51) << "JsonContactLayer::JsonContactLayer()" << endl; + + add( "_metal" , typeid(string) ); + add( "_cut" , typeid(string) ); + add( "_active" , typeid(string) ); + add( "_diffusion" , typeid(string) ); + add( "_well" , typeid(string) ); + add( "_enclosure.metal" , typeid(int64_t) ); + add( "_enclosure.cut" , typeid(int64_t) ); + add( "_enclosure.active" , typeid(int64_t) ); + add( "_enclosure.diffusion", typeid(int64_t) ); + add( "_enclosure.well" , typeid(int64_t) ); + } + + + JsonContactLayer::~JsonContactLayer () + { } + + + string JsonContactLayer::getTypeName () const + { return "ContactLayer"; } + + + JsonContactLayer* JsonContactLayer::clone ( unsigned long flags ) const + { return new JsonContactLayer ( flags ); } + + + void JsonContactLayer::toData(JsonStack& stack) + { + ltracein(51); + + check( stack, "JsonContactLayer::toData" ); + + Technology* techno = lookupTechnology( stack, "JsonContactLayer::toData" ); + ContactLayer* layer = NULL; + + if (techno) { + string name = get ( stack, "_name" ); + string smask = get ( stack, "_mask" ); + //DbU::Unit minimalSize = get( stack, "_minimalSize" ); + //DbU::Unit minimalSpacing = get( stack, "_minimalSpacing" ); + bool isWorking = get ( stack, "_working" ); + + BasicLayer* metal = techno->getBasicLayer( get(stack,"_metal" ) ); + BasicLayer* cut = techno->getBasicLayer( get(stack,"_cut" ) ); + BasicLayer* active = techno->getBasicLayer( get(stack,"_active" ) ); + BasicLayer* diffusion = techno->getBasicLayer( get(stack,"_diffusion") ); + BasicLayer* well = techno->getBasicLayer( get(stack,"_well" ) ); + DbU::Unit metalEncl = get( stack, "_enclosure.metal" ); + DbU::Unit cutEncl = get( stack, "_enclosure.cut" ); + DbU::Unit activeEncl = get( stack, "_enclosure.active" ); + DbU::Unit diffusionEncl = get( stack, "_enclosure.diffusion" ); + DbU::Unit wellEncl = get( stack, "_enclosure.well" ); + + Layer::Mask mask = Layer::Mask::fromString( smask ); + + if (stack.issetFlags(JsonWriter::TechnoMode)) { + // Actual creation. + layer = ContactLayer::create( techno + , name + , metal + , cut + , active + , diffusion + , well + ); + layer->setWorking ( isWorking ); + layer->setEnclosure( metal , metalEncl ); + layer->setEnclosure( cut , cutEncl ); + layer->setEnclosure( active , activeEncl ); + layer->setEnclosure( diffusion, diffusionEncl ); + if (well) layer->setEnclosure( well, wellEncl ); + + if (layer->getMask() != mask) { + cerr << Error( "JsonContactLayer::toData(): Layer mask re-creation discrepency on \"%s\":\n" + " Blob: %s\n" + " DataBase: %s" + , name.c_str() + , getString(mask).c_str() + , getString(layer->getMask()).c_str() + ) << endl; + } + // Add here association with blockage layer... + } else { + // Check coherency with existing layer. + layer = dynamic_cast( techno->getLayer(name) ); + if (layer) { + if (layer->getMask() != mask) { + cerr << Error( "JsonContactLayer::toData(): Layer mask discrepency on \"%s\":\n" + " Blob: %s\n" + " DataBase: %s" + , name.c_str() + , getString(mask).c_str() + , getString(layer->getMask()).c_str() + ) << endl; + } + } else { + cerr << Error( "JsonContactLayer::toData(): No ContactLayer \"%s\" in the existing technology." + , name.c_str() + ) << endl; + } + } + } else { + cerr << Error( "JsonContactLayer::toData(): Cannot find technology, aborting ContactLayer creation." ) << endl; + } + + update( stack, layer ); + + ltraceout(51); + } + + } // End of Hurricane namespace. diff --git a/hurricane/src/hurricane/DBo.cpp b/hurricane/src/hurricane/DBo.cpp index cb91843e..88045cf0 100644 --- a/hurricane/src/hurricane/DBo.cpp +++ b/hurricane/src/hurricane/DBo.cpp @@ -29,8 +29,9 @@ // +-----------------------------------------------------------------+ -#include "hurricane/DBo.h" #include "hurricane/Initializer.h" +#include "hurricane/DBo.h" +#include "hurricane/Entity.h" #include "hurricane/Property.h" #include "hurricane/Quark.h" #include "hurricane/Error.h" @@ -201,13 +202,19 @@ namespace Hurricane { void DBo::toJson ( JsonWriter* w ) const { w->startObject(); - std::string tname = _getTypeName(); - if (w->issetFlags(JsonWriter::UsePlugReference) and (tname == "Plug")) { - tname.insert( 0, "&" ); + const Entity* entity = dynamic_cast( this ); + if (w->issetFlags(JsonWriter::UseEntityReference) and entity) { + jsonWrite( w, "@typename", "&Entity" ); + jsonWrite( w, "_id" , entity->getId() ); + } else { + std::string tname = _getTypeName(); + if (w->issetFlags(JsonWriter::UsePlugReference) and (tname == "Plug")) { + tname.insert( 0, "&" ); + } + jsonWrite( w, "@typename", tname ); + _toJson( w ); + _toJsonCollections( w ); } - jsonWrite( w, "@typename", tname ); - _toJson( w ); - _toJsonCollections( w ); w->endObject(); } diff --git a/hurricane/src/hurricane/DataBase.cpp b/hurricane/src/hurricane/DataBase.cpp index f160966d..0b4d5fbc 100644 --- a/hurricane/src/hurricane/DataBase.cpp +++ b/hurricane/src/hurricane/DataBase.cpp @@ -258,7 +258,11 @@ void DataBase::_toJson(JsonWriter* w) const { Inherit::_toJson( w ); - jsonWrite( w, "_rootLibrary" , _rootLibrary ); + jsonWrite( w, "_precision" , DbU::getPrecision() ); + jsonWrite( w, "_gridsPerLambda" , DbU::getGridsPerLambda() ); + jsonWrite( w, "_physicalsPerGrid", DbU::getPhysicalsPerGrid() ); + jsonWrite( w, "_technology" , _technology ); + jsonWrite( w, "_rootLibrary" , _rootLibrary ); w->key( "+cellsOrderedByDepth" ); w->startArray(); @@ -282,7 +286,11 @@ JsonDataBase::JsonDataBase(unsigned long flags) // ******************************************** : JsonDBo(flags) { - add( "_rootLibrary", typeid(Library*) ); + add( "_precision" , typeid(int64_t ) ); + add( "_gridsPerLambda" , typeid(double ) ); + add( "_physicalsPerGrid", typeid(double ) ); + add( "_technology" , typeid(Technology*) ); + add( "_rootLibrary" , typeid(Library* ) ); } string JsonDataBase::getTypeName() const @@ -303,6 +311,9 @@ void JsonDataBase::toData(JsonStack& stack) check( stack, "JsonDataBase::toData" ); DataBase* db = DataBase::getDB(); + DbU::setPrecision ( get(stack,"_precision" ), DbU::NoTechnoUpdate ); + DbU::setGridsPerLambda ( get(stack,"_gridsPerLambda" ), DbU::NoTechnoUpdate ); + DbU::setPhysicalsPerGrid( get(stack,"_physicalsPerGrid"), DbU::Unity ); update( stack, db ); } diff --git a/hurricane/src/hurricane/DbU.cpp b/hurricane/src/hurricane/DbU.cpp index 935019a1..81f7227f 100644 --- a/hurricane/src/hurricane/DbU.cpp +++ b/hurricane/src/hurricane/DbU.cpp @@ -144,7 +144,7 @@ namespace Hurricane { { return _resolution; } - void DbU::setPrecision ( unsigned int precision ) + void DbU::setPrecision ( unsigned int precision, unsigned int flags ) { if ( _maximalPrecision < precision) throw Error ( "DbU::Unit::setPrecision(): Precision %ud exceed maximal precision %ud." @@ -159,7 +159,8 @@ namespace Hurricane { _resolution = 1; while ( precision-- ) _resolution /= 10; - DataBase::getDB()->getTechnology()->_onDbuChange ( scale ); + if (not (flags & NoTechnoUpdate)) + DataBase::getDB()->getTechnology()->_onDbuChange ( scale ); setSymbolicSnapGridStep ( DbU::lambda( 1.0) ); setRealSnapGridStep ( DbU::grid (10.0) ); @@ -197,7 +198,7 @@ namespace Hurricane { { return ( physical * getUnitPower(p) ) / _physicalsPerGrid; } - void DbU::setGridsPerLambda ( double gridsPerLambda ) + void DbU::setGridsPerLambda ( double gridsPerLambda, unsigned int flags ) { if ( ( rint(gridsPerLambda) != gridsPerLambda ) || ( remainder(gridsPerLambda,2.0) != 0.0 ) ) @@ -209,7 +210,8 @@ namespace Hurricane { _gridsPerLambda = gridsPerLambda; - DataBase::getDB()->getTechnology()->_onDbuChange ( scale ); + if (not (flags & NoTechnoUpdate)) + DataBase::getDB()->getTechnology()->_onDbuChange ( scale ); setSymbolicSnapGridStep ( DbU::lambda(1) ); diff --git a/hurricane/src/hurricane/DeepNet.cpp b/hurricane/src/hurricane/DeepNet.cpp index b88a021a..b9adea89 100644 --- a/hurricane/src/hurricane/DeepNet.cpp +++ b/hurricane/src/hurricane/DeepNet.cpp @@ -163,8 +163,6 @@ namespace Hurricane { { ltracein(51); - _stack = &stack; - check( stack, "JsonDeepNet::toData" ); presetId( stack ); diff --git a/hurricane/src/hurricane/DiffusionLayer.cpp b/hurricane/src/hurricane/DiffusionLayer.cpp index f53f7de1..f7fa165e 100644 --- a/hurricane/src/hurricane/DiffusionLayer.cpp +++ b/hurricane/src/hurricane/DiffusionLayer.cpp @@ -1,4 +1,3 @@ - // -*- C++ -*- // // Copyright (c) BULL S.A. 2000-2016, All Rights Reserved @@ -19,12 +18,7 @@ // License along with Hurricane. If not, see // . // -// =================================================================== -// -// $Id$ -// -// x-----------------------------------------------------------------x -// | | +// +-----------------------------------------------------------------+ // | 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 | // | | @@ -32,16 +26,14 @@ // | E-mail : Jean-Paul.Chaput@lip6.fr | // | =============================================================== | // | C++ Module : "./DiffusionLayer.cpp" | -// | *************************************************************** | -// | U p d a t e s | -// | | -// x-----------------------------------------------------------------x +// +-----------------------------------------------------------------+ -#include "hurricane/BasicLayer.h" -#include "hurricane/DiffusionLayer.h" -#include "hurricane/Technology.h" -#include "hurricane/Error.h" +#include "hurricane/DataBase.h" +#include "hurricane/Technology.h" +#include "hurricane/BasicLayer.h" +#include "hurricane/DiffusionLayer.h" +#include "hurricane/Error.h" namespace { @@ -95,7 +87,7 @@ namespace Hurricane { _setMask ( activeLayer->getMask() | diffusionLayer->getMask() ); _setExtractMask ( activeLayer->getExtractMask() | diffusionLayer->getExtractMask() ); - + if ( wellLayer ) { _basicLayers .push_back ( wellLayer ); _extentionCaps .push_back ( 0 ); @@ -227,4 +219,149 @@ namespace Hurricane { } + void DiffusionLayer::_toJson ( JsonWriter* w ) const + { + Super::_toJson( w ); + + jsonWrite( w, "_active" , _basicLayers[0]->getName() ); + jsonWrite( w, "_diffusion", _basicLayers[1]->getName() ); + if (_basicLayers.size() == 3) jsonWrite( w, "_well", _basicLayers[2]->getName() ); + else jsonWrite( w, "_well", "no_well_layer" ); + + jsonWrite( w, "_extentionCap.active" , _extentionCaps[0] ); + jsonWrite( w, "_extentionCap.diffusion", _extentionCaps[1] ); + jsonWrite( w, "_extentionCap.well" , (_basicLayers.size() == 3) ? _extentionCaps[2] : 0 ); + + jsonWrite( w, "_extentionWidth.active" , _extentionWidths[0] ); + jsonWrite( w, "_extentionWidth.diffusion", _extentionWidths[1] ); + jsonWrite( w, "_extentionWidth.well" , (_basicLayers.size() == 3) ? _extentionWidths[2] : 0 ); + } + + +// ------------------------------------------------------------------- +// Class : "Hurricane::JsonDiffusionLayer". + + Initializer jsonDiffusionLayerInit ( 0 ); + + + void JsonDiffusionLayer::initialize () + { JsonTypes::registerType( new JsonDiffusionLayer (JsonWriter::RegisterMode) ); } + + + JsonDiffusionLayer::JsonDiffusionLayer ( unsigned long flags ) + : JsonLayer(flags) + { + if (flags & JsonWriter::RegisterMode) return; + + ltrace(51) << "JsonDiffusionLayer::JsonDiffusionLayer()" << endl; + + add( "_active" , typeid(string) ); + add( "_diffusion" , typeid(string) ); + add( "_well" , typeid(string) ); + add( "_extentionCap.active" , typeid(int64_t) ); + add( "_extentionCap.diffusion" , typeid(int64_t) ); + add( "_extentionCap.well" , typeid(int64_t) ); + add( "_extentionWidth.active" , typeid(int64_t) ); + add( "_extentionWidth.diffusion", typeid(int64_t) ); + add( "_extentionWidth.well" , typeid(int64_t) ); + } + + + JsonDiffusionLayer::~JsonDiffusionLayer () + { } + + + string JsonDiffusionLayer::getTypeName () const + { return "DiffusionLayer"; } + + + JsonDiffusionLayer* JsonDiffusionLayer::clone ( unsigned long flags ) const + { return new JsonDiffusionLayer ( flags ); } + + + void JsonDiffusionLayer::toData(JsonStack& stack) + { + ltracein(51); + + check( stack, "JsonDiffusionLayer::toData" ); + + Technology* techno = lookupTechnology( stack, "JsonDiffusionLayer::toData" ); + DiffusionLayer* layer = NULL; + + if (techno) { + string name = get ( stack, "_name" ); + string smask = get ( stack, "_mask" ); + //DbU::Unit minimalSize = get( stack, "_minimalSize" ); + //DbU::Unit minimalSpacing = get( stack, "_minimalSpacing" ); + bool isWorking = get ( stack, "_working" ); + + BasicLayer* active = techno->getBasicLayer( get(stack,"_active" ) ); + BasicLayer* diffusion = techno->getBasicLayer( get(stack,"_diffusion" ) ); + BasicLayer* well = techno->getBasicLayer( get(stack,"_well" ) ); + DbU::Unit eCapActive = get( stack, "_extentionCap.active" ); + DbU::Unit eCapDiffusion = get( stack, "_extentionCap.diffusion" ); + DbU::Unit eCapWell = get( stack, "_extentionCap.well" ); + DbU::Unit eWidthActive = get( stack, "_extentionWidth.active" ); + DbU::Unit eWidthDiffusion = get( stack, "_extentionWidth.diffusion" ); + DbU::Unit eWidthWell = get( stack, "_extentionWidth.well" ); + + Layer::Mask mask = Layer::Mask::fromString( smask ); + + if (stack.issetFlags(JsonWriter::TechnoMode)) { + // Actual creation. + layer = DiffusionLayer::create( techno + , name + , active + , diffusion + , well + ); + layer->setWorking ( isWorking ); + layer->setExtentionCap ( active , eCapActive ); + layer->setExtentionCap ( diffusion, eCapDiffusion ); + layer->setExtentionWidth( active , eWidthActive ); + layer->setExtentionWidth( diffusion, eWidthDiffusion ); + if (well) { + layer->setExtentionCap ( well, eCapWell ); + layer->setExtentionWidth( well, eWidthWell ); + } + + if (layer->getMask() != mask) { + cerr << Error( "JsonDiffusionLayer::toData(): Layer mask re-creation discrepency on \"%s\":\n" + " Blob: %s\n" + " DataBase: %s" + , name.c_str() + , getString(mask).c_str() + , getString(layer->getMask()).c_str() + ) << endl; + } + // Add here association with blockage layer... + } else { + // Check coherency with existing layer. + layer = dynamic_cast( techno->getLayer(name) ); + if (layer) { + if (layer->getMask() != mask) { + cerr << Error( "JsonDiffusionLayer::toData(): Layer mask discrepency on \"%s\":\n" + " Blob: %s\n" + " DataBase: %s" + , name.c_str() + , getString(mask).c_str() + , getString(layer->getMask()).c_str() + ) << endl; + } + } else { + cerr << Error( "JsonDiffusionLayer::toData(): No DiffusionLayer \"%s\" in the existing technology." + , name.c_str() + ) << endl; + } + } + } else { + cerr << Error( "JsonDiffusionLayer::toData(): Cannot find technology, aborting DiffusionLayer creation." ) << endl; + } + + update( stack, layer ); + + ltraceout(51); + } + + } // End of Hurricane namespace. diff --git a/hurricane/src/hurricane/Entity.cpp b/hurricane/src/hurricane/Entity.cpp index 8fb64f37..e679f752 100644 --- a/hurricane/src/hurricane/Entity.cpp +++ b/hurricane/src/hurricane/Entity.cpp @@ -195,6 +195,58 @@ namespace Hurricane { } +// ------------------------------------------------------------------- +// Class : "JsonEntityRef". + + Initializer jsonEntityRefInit ( 0 ); + + + void JsonEntityRef::initialize () + { JsonTypes::registerType( new JsonEntityRef (JsonWriter::RegisterMode) ); } + + + JsonEntityRef::JsonEntityRef ( unsigned long flags ) + : JsonObject(flags) + { + if (flags & JsonWriter::RegisterMode) return; + + add( "_id", typeid(int64_t) ); + } + + + string JsonEntityRef::getTypeName () const + { return "&Entity"; } + + + JsonEntityRef* JsonEntityRef::clone( unsigned long flags ) const + { return new JsonEntityRef ( flags ); } + + + void JsonEntityRef::toData ( JsonStack& stack ) + { + ltracein(51); + + check( stack, "JsonEntityRef::toData" ); + + unsigned int jsonId = get( stack, "_id" ); + Entity* entity = stack.getEntity( jsonId ); + + ltrace(51) << "jsonId:" << jsonId << " entity:" << entity << endl; + + if (entity) { + JsonBaseArray* array = jget< JsonBaseArray >( stack ); + if (array) array->push_back( entity ); + else + cerr << Error( "JsonEntityRef::toData(): Missing JsonBaseArray in stack context." ) << endl; + } else { + cerr << Error( "JsonEntityRef::toData(): No Entity id:%u in stack LUT.", jsonId ) << endl; + } + + update( stack, NULL ); + + ltraceout(51); + } + } // End of Hurricane namespace. diff --git a/hurricane/src/hurricane/Horizontal.cpp b/hurricane/src/hurricane/Horizontal.cpp index 4f432c3a..cef2f90c 100644 --- a/hurricane/src/hurricane/Horizontal.cpp +++ b/hurricane/src/hurricane/Horizontal.cpp @@ -247,9 +247,14 @@ void JsonHorizontal::toData(JsonStack& stack) , DbU::fromDb( get(stack,"_dxTarget") ) ); - stack.addHookLink( horizontal->getBodyHook (), jsonId, get(stack,"_bodyHook" ) ); - stack.addHookLink( horizontal->getSourceHook(), jsonId, get(stack,"_sourceHook") ); - stack.addHookLink( horizontal->getTargetHook(), jsonId, get(stack,"_targetHook") ); + JsonNet* jnet = jget( stack ); + if (jnet) { + jnet->addHookLink( horizontal->getBodyHook (), jsonId, get(stack,"_bodyHook" ) ); + jnet->addHookLink( horizontal->getSourceHook(), jsonId, get(stack,"_sourceHook") ); + jnet->addHookLink( horizontal->getTargetHook(), jsonId, get(stack,"_targetHook") ); + } else { + cerr << Error( "JsonHorizontal::toData(): Missing (Json)Net in stack context." ) << endl; + } // Hook/Ring rebuild are done as a post-process. update( stack, horizontal ); diff --git a/hurricane/src/hurricane/JsonObject.cpp b/hurricane/src/hurricane/JsonObject.cpp new file mode 100644 index 00000000..5467c64d --- /dev/null +++ b/hurricane/src/hurricane/JsonObject.cpp @@ -0,0 +1,287 @@ +// -*- C++ -*- +// +// Copyright (c) BULL S.A. 2015-2016, 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 +// . +// +// +-----------------------------------------------------------------+ +// | 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 | +// | | +// | Author : Jean-Paul Chaput | +// | E-mail : Jean-Paul.Chaput@lip6.fr | +// | =============================================================== | +// | C++ Module : "./JsonObject.cpp" | +// +-----------------------------------------------------------------+ + + +// Needed for registering. May be deleted later. +#include "hurricane/Initializer.h" +#include "hurricane/DebugSession.h" +#include "hurricane/Warning.h" +#include "hurricane/Library.h" +#include "hurricane/Cell.h" + + +namespace Hurricane { + + using namespace std; + + +// ------------------------------------------------------------------- +// Class : "JsonObject". + + JsonObject::JsonObject ( unsigned long flags ) + : _flags (flags) + , _name () + , _stackeds () + , _attributes () + , _collections() + , _object () + { } + + + JsonObject::~JsonObject () + { } + + + bool JsonObject::isDummy () const + { return false; } + + + void JsonObject::add ( const string& key, type_index tid ) + { + if (key.empty()) { + cerr << "[ERROR] JsonObject::add(): Attempt to add attribute with an empty name, ignored." + << endl; + return; + } + if (has(key)) { + cerr << "[ERROR] JsonObject::add(): Attempt to add attribute \"" << key << "\" twice, cancelled." + << endl; + return; + } + + switch ( key[0] ) { + case '.': _stackeds .push_back( JsonAttribute(key,tid) ); return; + case '_': _attributes .push_back( JsonAttribute(key,tid) ); return; + case '+': _collections.push_back( JsonAttribute(key,tid) ); return; + default: break; + } + + cerr << "[ERROR] JsonObject::add(): Key name \"" << key + << "\" do not follow naming convention, cancelled." << endl; + } + + + void JsonObject::remove ( const std::string& key ) + { + if (key.empty()) { + cerr << Error( "JsonObject::remove(): Attempt to remove attribute with an empty name, ignored." ) << endl; + return; + } + + switch ( key[0] ) { + case '.': + for ( auto it = _stackeds.begin() ; it != _stackeds.end() ; ++it ) + if (key == (*it).key()) { _stackeds.erase(it); break; } + break; + case '_': + for ( auto it = _attributes.begin() ; it != _attributes.end() ; ++it ) + if (key == (*it).key()) { _attributes.erase(it); break; } + break; + case '+': + for ( auto it = _collections.begin() ; it != _collections.end() ; ++it ) + if (key == (*it).key()) { _collections.erase(it); break; } + break; + } + } + + + bool JsonObject::has ( const std::string& key ) const + { + if (key.empty()) return false; + switch ( key[0] ) { + case '.': + for ( size_t i=0 ; i<_stackeds.size() ; ++i ) + if (key == _stackeds[i].key()) return true; + break; + case '_': + for ( size_t i=0 ; i<_attributes.size() ; ++i ) + if (key == _attributes[i].key()) return true; + break; + case '+': + for ( size_t i=0 ; i<_collections.size() ; ++i ) + if (key == _collections[i].key()) return true; + break; + } + return false; + } + + + bool JsonObject::check ( JsonStack& stack, string fname ) const + { + for ( size_t i=0 ; i<_stackeds.size() ; ++i ) { + if (not stack.rhas(_stackeds[i].key())) { + cerr << Error( "%s(): Stack is missing context element with key \"%s\"" + , fname.c_str(), _stackeds[i].key().c_str() ) << endl; + return false; + } + } + for ( size_t i=0 ; i<_attributes.size() ; ++i ) { + if (not stack.rhas(_attributes[i].key())) { + cerr << Error( "%s(): Stack is missing attribute element with key \"%s\"" + , fname.c_str(), _attributes[i].key().c_str() ) << endl; + return false; + } + } + return true; + } + + + void JsonObject::toData ( JsonStack& ) + { } + + + unsigned int JsonObject::presetId ( JsonStack& stack ) + { + unsigned int jsonId = get( stack, "_id" ); + if (issetFlags(JsonWriter::DesignBlobMode)) { + Entity::setNextId( jsonId ); + } + return jsonId; + } + + + void JsonObject::print ( ostream& o ) const + { + o << tab << "JsonObject for type: " << getTypeName() << endl; + for ( size_t i=0 ; i<_stackeds.size() ; ++i ) + o << tab << "key:" << left << setw(20) << _stackeds[i].key() + << " type:" << _stackeds[i].tid().name() << endl; + + for ( size_t i=0 ; i<_attributes.size() ; ++i ) + o << tab << "key:" << left << setw(20) << _attributes[i].key() + << " type:" << _attributes[i].tid().name() << endl; + + for ( size_t i=0 ; i<_collections.size() ; ++i ) + o << tab << "key:" << left << setw(20) << _collections[i].key() + << " type:" << _collections[i].tid().name() << endl; + } + + +// ------------------------------------------------------------------- +// Class : "JsonKey". + + JsonKey::JsonKey ( const string& key ) + : JsonObject(0) + , _key (key) + { } + + + string JsonKey::getTypeName () const { return _key; } + JsonKey* JsonKey::clone ( unsigned long ) const { return new JsonKey ( *this ); } + + +// ------------------------------------------------------------------- +// Class : "JsonDummy". + + JsonDummy::JsonDummy () + : JsonObject(0) + , _typename ("dummy") + { } + + + bool JsonDummy::isDummy () const { return true; } + string JsonDummy::getTypeName () const { return _typename; } + void JsonDummy::setTypeName ( const string& name ) { _typename=name; } + JsonDummy* JsonDummy::clone ( unsigned long ) const { return new JsonDummy ( *this ); } + + +// ------------------------------------------------------------------- +// Class : "JsonTypes". + + Initializer jsonTypesInitialize ( 10 ); + + JsonTypes* JsonTypes::_jsonTypes = NULL; + + + JsonTypes::JsonTypes () + : _jsonObjects() + { } + + + JsonTypes::~JsonTypes () + { + for ( JsonObject* object : _jsonObjects ) delete object; + } + + + void JsonTypes::_registerType ( JsonObject* object ) + { + if (_find(object->getTypeName())) { + throw Error( "JsonTypes::_registerType(): Attempt to register <%s> twice.", object->getTypeName().c_str() ); + } + _jsonObjects.insert( object ); + } + + + JsonObject* JsonTypes::_find ( const string& tname ) + { + JsonKey key( tname ); + set::iterator it = _jsonObjects.find( &key ); + if (it != _jsonObjects.end()) return (*it); + return NULL; + } + + + void JsonTypes::registerType ( JsonObject* object ) + { + if (not _jsonTypes) initialize(); + _jsonTypes->_registerType( object ); + } + + + JsonObject* JsonTypes::find ( const string& tname ) + { + if (not _jsonTypes) initialize(); + return _jsonTypes->_find( tname ); + } + + + void JsonTypes::initialize () + { if (not _jsonTypes) _jsonTypes = new JsonTypes (); } + + +// ------------------------------------------------------------------- +// Class : "JsonStack". + + void JsonStack::addEntity ( unsigned int jsonId, Entity* entity ) + { _entities.insert( std::make_pair(jsonId,entity) ); } + + + void JsonStack::print ( ostream& o ) const + { + o << tab << "JsonStack::print() Stack contains " << _stack.size() << " elements." << endl; + for ( size_t i=0 ; i<_stack.size() ; ++i ) { + o << "[" << right << setw(2) << i << "] key: \"" << left << setw(20) << _stack[i].first + << "\", type: \"" << demangle(_stack[i].second.type()) << "\"." << endl; + } + } + + +} // Hurricane namespace. diff --git a/hurricane/src/hurricane/JsonReader.cpp b/hurricane/src/hurricane/JsonReader.cpp index 124e159d..4e345010 100644 --- a/hurricane/src/hurricane/JsonReader.cpp +++ b/hurricane/src/hurricane/JsonReader.cpp @@ -29,35 +29,19 @@ // +-----------------------------------------------------------------+ -#include "rapidjson/filereadstream.h" -#include "rapidjson/reader.h" -// Needed for registering. May be deleted later. -#include "hurricane/Initializer.h" -#include "hurricane/FileReadGzStream.h" #include "hurricane/DebugSession.h" +#include "hurricane/Error.h" #include "hurricane/Warning.h" +#include "hurricane/Signature.h" #include "hurricane/JsonReader.h" -#include "hurricane/Library.h" -#include "hurricane/Cell.h" -#include "hurricane/Net.h" -#include "hurricane/DeepNet.h" -#include "hurricane/Instance.h" -#include "hurricane/RoutingPad.h" -#include "hurricane/Contact.h" -#include "hurricane/Vertical.h" -#include "hurricane/Horizontal.h" -#include "hurricane/Pad.h" -#include "hurricane/UpdateSession.h" -#include "hurricane/DesignBlob.h" +#include "hurricane/Entity.h" +#include "hurricane/Property.h" -namespace { +namespace Hurricane { using namespace std; using namespace rapidjson; - using namespace Hurricane; - - class JsonReader; // ------------------------------------------------------------------- @@ -65,25 +49,27 @@ namespace { class HurricaneHandler { public: - HurricaneHandler ( JsonReader& ); - public: - bool Null (); - bool Bool ( bool ); - bool Int ( int ); - bool Int64 ( int64_t ); - bool Uint ( unsigned int ); - bool Uint64 ( uint64_t ); - bool Double ( double ); - bool String ( const char*, SizeType, bool copy ); - bool Key ( const char*, SizeType, bool copy ); - bool StartObject (); - bool EndObject ( SizeType ); - bool StartArray (); - bool EndArray ( SizeType ); - inline bool isDummy () const; - inline bool doCallToData () const; - inline JsonStack& stack (); - inline unsigned long flags (); + HurricaneHandler ( JsonReader& ); + public: + bool Null (); + bool Bool ( bool ); + bool Int ( int ); + bool Int64 ( int64_t ); + bool Uint ( unsigned int ); + bool Uint64 ( uint64_t ); + bool Double ( double ); + bool String ( const char*, SizeType, bool copy ); + bool Key ( const char*, SizeType, bool copy ); + bool StartObject (); + bool EndObject ( SizeType ); + bool StartArray (); + bool EndArray ( SizeType ); + inline bool isDummy () const; + inline bool doCallToData () const; + inline JsonStack& stack (); + inline vector& objects (); + inline vector& objects () const; + inline unsigned long flags (); private: enum Flags { TypenameKey = (1<<0) }; @@ -91,40 +77,10 @@ namespace { unsigned long _state; string _key; string _objectName; - vector _objects; JsonReader& _reader; }; -// ------------------------------------------------------------------- -// Class : "JsonReader" (declaration). - - class JsonReader { - public: - JsonReader ( unsigned long flags ); - ~JsonReader (); - inline JsonReader* setFlags ( unsigned long mask ); - inline JsonReader* resetFlags ( unsigned long mask ); - inline bool issetFlags ( unsigned long mask ) const; - inline unsigned long getFlags () const; - inline JsonStack& getStack (); - void parse ( std::string fileName ); - void close (); - private: - JsonReader ( const JsonReader& ); - JsonReader& operator= ( const JsonReader& ) const; - private: - unsigned long _flags; - size_t _bufferSize; - char* _buffer; - FILE* _file; - FileReadGzStream* _stream; - JsonStack _stack; - Reader _reader; - HurricaneHandler _handler; - }; - - // ------------------------------------------------------------------- // Class : "HurricaneHandler" (definition). @@ -132,21 +88,22 @@ namespace { : _state (0) , _key () , _objectName() - , _objects () , _reader (reader) { } - inline JsonStack& HurricaneHandler::stack () { return _reader.getStack(); } - inline unsigned long HurricaneHandler::flags () { return _reader.getFlags(); } + inline JsonStack& HurricaneHandler::stack () { return _reader.getStack(); } + inline vector& HurricaneHandler::objects () { return _reader.getStack().jobjects(); } + inline vector& HurricaneHandler::objects () const { return _reader.getStack().jobjects(); } + inline unsigned long HurricaneHandler::flags () { return _reader.getStack().getFlags(); } inline bool HurricaneHandler::isDummy () const - { return _objects.empty() or _objects.back()->isDummy(); } + { return objects().empty() or objects().back()->isDummy(); } inline bool HurricaneHandler::doCallToData () const - { return not _objects.empty() and _objects.back() and not _objects.back()->isBound(); } + { return not objects().empty() and objects().back() and not objects().back()->isBound(); } bool HurricaneHandler::Null () @@ -234,14 +191,14 @@ namespace { // Keep the dummy object on top of the stack. cerr << Warning( "JsonReader::parse(): Do not know how to parse type \"%s\" (ignored)." , value ) << endl; - dynamic_cast(_objects.back())->setTypeName( value ); + dynamic_cast(objects().back())->setTypeName( value ); } else { // Replace the dummy object on top of the stack. - delete _objects.back(); - _objects[_objects.size()-1] = object->clone( flags() ); - _objects.back()->setName( _objectName ); + delete objects().back(); + objects()[objects().size()-1] = object->clone( flags() ); + objects().back()->setName( _objectName ); - signature = dynamic_cast( _objects.back() ); + signature = dynamic_cast( objects().back() ); if (signature) { size_t dot = svalue.find('.'); signature->setSubType( svalue.substr(dot+1) ); @@ -266,15 +223,15 @@ namespace { _key = key; if (_state & TypenameKey) return true; - //ltrace(51) << "HurricaneHandler::Key() key:" << _key << " _objects.size():" << _objects.size() << endl; + //ltrace(51) << "HurricaneHandler::Key() key:" << _key << " objects().size():" << objects().size() << endl; - if (_objects.back()) { + if (objects().back()) { if ( doCallToData() and not _key.empty() and (_key[0] != '_') ) { // The key is no longer a simple attribute of the object. // Triggers it's creation in the Json stack. ltrace(51) << "HurricaneHandler::key() Calling " - << _objects.back()->getTypeName() << "::toData(JsonStack&)." << endl; - _objects.back()->toData( stack() ); + << objects().back()->getTypeName() << "::toData(JsonStack&)." << endl; + objects().back()->toData( stack() ); } } @@ -289,9 +246,9 @@ namespace { _state |= TypenameKey; _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); return true; @@ -307,20 +264,20 @@ namespace { _objectName.clear(); if (not isDummy()) { if (doCallToData()) { - ltrace(51) << "Calling " << _objects.back()->getTypeName() << "::toData(JsonStack&)." << endl; - _objects.back()->toData( stack() ); + ltrace(51) << "Calling " << objects().back()->getTypeName() << "::toData(JsonStack&)." << endl; + objects().back()->toData( stack() ); } if (stack().size() > 1) { if (stack()[-1].first[0] != '_') stack().pop_back(); } } - ltrace(51) << "_objects.pop_back(), size():" << _objects.size() << "." << endl; - if (_objects.back()->issetFlags(JsonWriter::DBoObject)) + ltrace(51) << "objects().pop_back(), size():" << objects().size() << "." << endl; + if (objects().back()->issetFlags(JsonWriter::DBoObject)) stack().pop_back_dbo(); - delete _objects.back(); - _objects.pop_back(); + delete objects().back(); + objects().pop_back(); ltraceout(50); return true; @@ -355,15 +312,15 @@ namespace { // Class : "JsonReader" (definition). JsonReader::JsonReader ( unsigned long flags ) - : _flags (flags) - , _bufferSize(65536) + : _bufferSize(65536) , _buffer (new char [_bufferSize]) , _file (NULL) , _stream (NULL) , _stack () , _reader () - , _handler (*this) + , _handler (new HurricaneHandler(*this)) { + _stack.setFlags( flags ); } @@ -371,6 +328,7 @@ namespace { { close(); delete _buffer; + delete _handler; } @@ -381,13 +339,6 @@ namespace { } - inline JsonReader* JsonReader::setFlags ( unsigned long mask ) { _flags |= mask; return this; } - inline JsonReader* JsonReader::resetFlags ( unsigned long mask ) { _flags &= ~mask; return this; } - inline bool JsonReader::issetFlags ( unsigned long mask ) const { return _flags & mask; } - inline unsigned long JsonReader::getFlags () const { return _flags; } - inline JsonStack& JsonReader::getStack () { return _stack; } - - void JsonReader::parse ( string fileName ) { close(); @@ -407,8 +358,11 @@ namespace { if (issetFlags(JsonWriter::DesignBlobMode)) Entity::enableForcedIdMode(); - _reader.Parse( *_stream, _handler ); - _stack.print( cerr ); + _reader.Parse( *_stream, *_handler ); + if (_stack.size() != 1) { + cerr << Error( "JsonReader::parse(): Stack must contain exatly one element upon completion." ) << endl; + _stack.print( cerr ); + } if (issetFlags(JsonWriter::DesignBlobMode)) Entity::disableForcedIdMode(); @@ -419,395 +373,4 @@ namespace { } -} // local namespace. - - -namespace Hurricane { - - using namespace std; - - -// ------------------------------------------------------------------- -// Class : "JsonObject". - - JsonObject::JsonObject ( unsigned long flags ) - : _flags (flags) - , _name () - , _stackeds () - , _attributes () - , _collections() - , _object () - { } - - - JsonObject::~JsonObject () - { } - - - bool JsonObject::isDummy () const - { return false; } - - - void JsonObject::add ( const string& key, type_index tid ) - { - if (key.empty()) { - cerr << "[ERROR] JsonObject::add(): Attempt to add attribute with an empty name, ignored." - << endl; - return; - } - if (has(key)) { - cerr << "[ERROR] JsonObject::add(): Attempt to add attribute \"" << key << "\" twice, cancelled." - << endl; - return; - } - - switch ( key[0] ) { - case '.': _stackeds .push_back( JsonAttribute(key,tid) ); return; - case '_': _attributes .push_back( JsonAttribute(key,tid) ); return; - case '+': _collections.push_back( JsonAttribute(key,tid) ); return; - default: break; - } - - cerr << "[ERROR] JsonObject::add(): Key name \"" << key - << "\" do not follow naming convention, cancelled." << endl; - } - - - void JsonObject::remove ( const std::string& key ) - { - if (key.empty()) { - cerr << Error( "JsonObject::remove(): Attempt to remove attribute with an empty name, ignored." ) << endl; - return; - } - - switch ( key[0] ) { - case '.': - for ( auto it = _stackeds.begin() ; it != _stackeds.end() ; ++it ) - if (key == (*it).key()) { _stackeds.erase(it); break; } - break; - case '_': - for ( auto it = _attributes.begin() ; it != _attributes.end() ; ++it ) - if (key == (*it).key()) { _attributes.erase(it); break; } - break; - case '+': - for ( auto it = _collections.begin() ; it != _collections.end() ; ++it ) - if (key == (*it).key()) { _collections.erase(it); break; } - break; - } - } - - - bool JsonObject::has ( const std::string& key ) const - { - if (key.empty()) return false; - switch ( key[0] ) { - case '.': - for ( size_t i=0 ; i<_stackeds.size() ; ++i ) - if (key == _stackeds[i].key()) return true; - break; - case '_': - for ( size_t i=0 ; i<_attributes.size() ; ++i ) - if (key == _attributes[i].key()) return true; - break; - case '+': - for ( size_t i=0 ; i<_collections.size() ; ++i ) - if (key == _collections[i].key()) return true; - break; - } - return false; - } - - - bool JsonObject::check ( JsonStack& stack, string fname ) const - { - for ( size_t i=0 ; i<_stackeds.size() ; ++i ) { - if (not stack.rhas(_stackeds[i].key())) { - cerr << Error( "%s(): Stack is missing context element with key \"%s\"" - , fname.c_str(), _stackeds[i].key().c_str() ) << endl; - return false; - } - } - for ( size_t i=0 ; i<_attributes.size() ; ++i ) { - if (not stack.rhas(_attributes[i].key())) { - cerr << Error( "%s(): Stack is missing attribute element with key \"%s\"" - , fname.c_str(), _attributes[i].key().c_str() ) << endl; - return false; - } - } - return true; - } - - - void JsonObject::toData ( JsonStack& ) - { } - - - unsigned int JsonObject::presetId ( JsonStack& stack ) - { - unsigned int jsonId = get( stack, "_id" ); - if (issetFlags(JsonWriter::DesignBlobMode)) { - Entity::setNextId( jsonId ); - } - return jsonId; - } - - - void JsonObject::print ( ostream& o ) const - { - o << tab << "JsonObject for type: " << getTypeName() << endl; - for ( size_t i=0 ; i<_stackeds.size() ; ++i ) - o << tab << "key:" << left << setw(20) << _stackeds[i].key() - << " type:" << _stackeds[i].tid().name() << endl; - - for ( size_t i=0 ; i<_attributes.size() ; ++i ) - o << tab << "key:" << left << setw(20) << _attributes[i].key() - << " type:" << _attributes[i].tid().name() << endl; - - for ( size_t i=0 ; i<_collections.size() ; ++i ) - o << tab << "key:" << left << setw(20) << _collections[i].key() - << " type:" << _collections[i].tid().name() << endl; - } - - -// ------------------------------------------------------------------- -// Class : "JsonKey". - - JsonKey::JsonKey ( const string& key ) - : JsonObject(0) - , _key (key) - { } - - - string JsonKey::getTypeName () const { return _key; } - JsonKey* JsonKey::clone ( unsigned long ) const { return new JsonKey ( *this ); } - - -// ------------------------------------------------------------------- -// Class : "JsonDummy". - - JsonDummy::JsonDummy () - : JsonObject(0) - , _typename ("dummy") - { } - - - bool JsonDummy::isDummy () const { return true; } - string JsonDummy::getTypeName () const { return _typename; } - void JsonDummy::setTypeName ( const string& name ) { _typename=name; } - JsonDummy* JsonDummy::clone ( unsigned long ) const { return new JsonDummy ( *this ); } - - -// ------------------------------------------------------------------- -// Class : "JsonTypes". - - Initializer jsonTypesInitialize ( 10 ); - - JsonTypes* JsonTypes::_jsonTypes = NULL; - - - JsonTypes::JsonTypes () - : _jsonObjects() - { } - - - JsonTypes::~JsonTypes () - { - for ( JsonObject* object : _jsonObjects ) delete object; - } - - - void JsonTypes::_registerType ( JsonObject* object ) - { - if (_find(object->getTypeName())) { - throw Error( "JsonTypes::_registerType(): Attempt to register <%s> twice.", object->getTypeName().c_str() ); - } - _jsonObjects.insert( object ); - } - - - JsonObject* JsonTypes::_find ( const string& tname ) - { - JsonKey key( tname ); - set::iterator it = _jsonObjects.find( &key ); - if (it != _jsonObjects.end()) return (*it); - return NULL; - } - - - void JsonTypes::registerType ( JsonObject* object ) - { - if (not _jsonTypes) initialize(); - _jsonTypes->_registerType( object ); - } - - - JsonObject* JsonTypes::find ( const string& tname ) - { - if (not _jsonTypes) initialize(); - return _jsonTypes->_find( tname ); - } - - - void JsonTypes::initialize () - { if (not _jsonTypes) _jsonTypes = new JsonTypes (); } - - -// ------------------------------------------------------------------- -// Class : "JsonStack". - - void JsonStack::addEntity ( unsigned int jsonId, Entity* entity ) - { _entities.insert( std::make_pair(jsonId,entity) ); } - - - void JsonStack::addHookLink ( Hook* hook, unsigned int jsonId, const string& jsonNext ) - { - if (jsonNext.empty()) return; - - unsigned int id = jsonId; - string tname = hook->_getTypeName(); - - auto ielement = _hooks.find( HookKey(id,tname) ); - if (ielement == _hooks.end()) { - auto r = _hooks.insert( make_pair( HookKey(id,tname), HookElement(hook) ) ); - ielement = r.first; - (*ielement).second.setFlags( HookElement::OpenRingStart ); - } - HookElement* current = &((*ielement).second); - if (not current->hook()) current->setHook( hook ); - - hookFromString( jsonNext, id, tname ); - ielement = _hooks.find( HookKey(id,tname) ); - if (ielement == _hooks.end()) { - auto r = _hooks.insert( make_pair( HookKey(id,tname), HookElement(NULL) ) ); - ielement = r.first; - } else { - (*ielement).second.resetFlags( HookElement::OpenRingStart ); - } - current->setNext( &((*ielement).second) ); - } - - - Hook* JsonStack::getHook ( unsigned int jsonId, const std::string& tname ) const - { - auto ihook = _hooks.find( HookKey(jsonId,tname) ); - if (ihook == _hooks.end()) return NULL; - - return (*ihook).second.hook(); - } - - - bool JsonStack::hookFromString ( std::string s, unsigned int& id, std::string& tname ) - { - size_t dot = s.rfind('.'); - if (dot == string::npos) return false; - - tname = s.substr( 0, dot ); - id = stoul( s.substr(dot+1) ); - return true; - } - - - bool JsonStack::checkRings () const - { - bool status = true; - - for ( auto kv : _hooks ) { - HookElement* ringStart = &(kv.second); - if (ringStart->issetFlags(HookElement::ClosedRing)) continue; - - if (ringStart->issetFlags(HookElement::OpenRingStart)) { - cerr << Error( "JsonStack::checkRing(): Open ring found, starting with %s.\n" - " Closing the ring..." - , getString(ringStart->hook()).c_str() ) << endl; - - status = false; - HookElement* element = ringStart; - while ( true ) { - if (not element->next()) { - // The ring is open: close it (loop on ringStart). - element->setNext( ringStart ); - element->setFlags( HookElement::ClosedRing ); - - cerr << Error( "Simple open ring." ) << endl; - break; - } - if (element->next()->issetFlags(HookElement::ClosedRing)) { - // The ring is half merged with itself, or another ring. - // (i.e. *multiple* hooks pointing the *same* next element) - element->setNext( ringStart ); - element->setFlags( HookElement::ClosedRing ); - - cerr << Error( "Complex fault: ring partially merged (convergent)." ) << endl; - break; - } - element = element->next(); - } - } - } - - return status; - } - - - void JsonStack::buildRings () const - { - for ( auto kv : _hooks ) { - kv.second.hook()->_setNextHook( kv.second.next()->hook() ); - } - } - - - void JsonStack::print ( ostream& o ) const - { - o << tab << "JsonStack::print() Stack contains " << _stack.size() << " elements." << endl; - for ( size_t i=0 ; i<_stack.size() ; ++i ) { - o << "[" << right << setw(2) << i << "] key: \"" << left << setw(20) << _stack[i].first - << "\", type: \"" << demangle(_stack[i].second.type()) << "\"." << endl; - } - } - - -// ------------------------------------------------------------------- -// Function : Json Cell parser. - - Cell* jsonCellParse ( string filename ) - { - UpdateSession::open(); - - JsonReader reader ( JsonWriter::CellMode ); - reader.parse( filename ); - - UpdateSession::close(); - - const JsonStack& stack = reader.getStack(); - if (stack.rhas(".Cell")) return stack.as(".Cell"); - - return NULL; - } - - -// ------------------------------------------------------------------- -// Function : Json Blob parser. - - Cell* jsonBlobParse ( string filename ) - { - UpdateSession::open(); - - JsonReader reader ( JsonWriter::DesignBlobMode ); - reader.parse( filename ); - - UpdateSession::close(); - - const JsonStack& stack = reader.getStack(); - if (stack.rhas(".DesignBlob")) { - DesignBlob* blob = stack.as(".DesignBlob"); - Cell* cell = blob->getTopCell(); - delete blob; - return cell; - } - - return NULL; - } - - } // Hurricane namespace. diff --git a/hurricane/src/hurricane/JsonWriter.cpp b/hurricane/src/hurricane/JsonWriter.cpp index 574a5afa..15b7724e 100644 --- a/hurricane/src/hurricane/JsonWriter.cpp +++ b/hurricane/src/hurricane/JsonWriter.cpp @@ -94,6 +94,10 @@ void JsonWriter::write ( unsigned int v ) { _WRITER->Uint ( v); } void JsonWriter::write ( const unsigned long* v ) { _WRITER->Uint64(*v); } void JsonWriter::write ( unsigned long v ) { _WRITER->Uint64( v); } + void JsonWriter::write ( const float* v ) { _WRITER->Double((double)*v); } + void JsonWriter::write ( float v ) { _WRITER->Double((double) v); } + void JsonWriter::write ( const double* v ) { _WRITER->Double(*v); } + void JsonWriter::write ( double v ) { _WRITER->Double( v); } JsonWriter* JsonWriter::setFlags ( unsigned long mask ) { _flags |= mask; return this; } JsonWriter* JsonWriter::resetFlags ( unsigned long mask ) { _flags &= ~mask; return this; } bool JsonWriter::issetFlags ( unsigned long mask ) const { return _flags & mask; } diff --git a/hurricane/src/hurricane/Layer.cpp b/hurricane/src/hurricane/Layer.cpp index a6b3b71e..c646f49b 100644 --- a/hurricane/src/hurricane/Layer.cpp +++ b/hurricane/src/hurricane/Layer.cpp @@ -1,4 +1,3 @@ - // -*- C++ -*- // // Copyright (c) BULL S.A. 2000-2016, All Rights Reserved @@ -19,12 +18,7 @@ // License along with Hurricane. If not, see // . // -// =================================================================== -// -// $Id$ -// -// x-----------------------------------------------------------------x -// | | +// +-----------------------------------------------------------------+ // | 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 | // | | @@ -32,16 +26,14 @@ // | E-mail : Jean-Paul.Chaput@lip6.fr | // | =============================================================== | // | C++ Module : "./Layer.cpp" | -// | *************************************************************** | -// | U p d a t e s | -// | | -// x-----------------------------------------------------------------x +// +-----------------------------------------------------------------+ -# include "hurricane/Layer.h" -# include "hurricane/BasicLayer.h" -# include "hurricane/Technology.h" -# include "hurricane/Error.h" +#include "hurricane/DataBase.h" +#include "hurricane/Technology.h" +#include "hurricane/Layer.h" +#include "hurricane/BasicLayer.h" +#include "hurricane/Error.h" namespace Hurricane { @@ -50,7 +42,6 @@ namespace Hurricane { // ------------------------------------------------------------------- // Class : "Hurricane::Layer". - Layer::Layer ( Technology* technology , const Name& name , const DbU::Unit& minimalSize @@ -245,4 +236,46 @@ namespace Hurricane { const Name& Layer::_sgetName ( const Layer* layer ) { return layer->getName(); } -} // End of Hurricane namespace. + + void Layer::_toJson ( JsonWriter* writer ) const + { + Super::_toJson( writer ); + + jsonWrite( writer, "_name" , getName() ); + jsonWrite( writer, "_mask" , getString(_mask) ); + jsonWrite( writer, "_extractMask" , getString(_extractMask) ); + jsonWrite( writer, "_minimalSize" , _minimalSize ); + jsonWrite( writer, "_minimalSpacing", _minimalSpacing ); + jsonWrite( writer, "_working" , _working ); + } + + +// ------------------------------------------------------------------- +// Class : "Hurricane::JsonLayer". + + JsonLayer::JsonLayer ( unsigned long flags ) + : JsonDBo(flags) + { + add( "_name" , typeid(string) ); + add( "_mask" , typeid(string) ); + add( "_extractMask" , typeid(string) ); + add( "_minimalSize" , typeid(uint64_t) ); + add( "_minimalSpacing", typeid(uint64_t) ); + add( "_working" , typeid(uint64_t) ); + } + + + Technology* JsonLayer::lookupTechnology ( JsonStack& stack, const string& fname ) const + { + Technology* techno = get( stack, ".Technology" ); + if (not techno) { + techno = get( stack, "_technology" ); + } + if (not techno) { + cerr << Error( "%s(): .Technology/_technology missing in the stack.", fname.c_str() ) << endl; + techno = DataBase::getDB()->getTechnology(); + } + return techno; + } + +} // Hurricane namespace. diff --git a/hurricane/src/hurricane/Net.cpp b/hurricane/src/hurricane/Net.cpp index 008a0bfc..8411571c 100644 --- a/hurricane/src/hurricane/Net.cpp +++ b/hurricane/src/hurricane/Net.cpp @@ -18,6 +18,7 @@ // **************************************************************************************************** #include "hurricane/Warning.h" +#include "hurricane/Error.h" #include "hurricane/Net.h" #include "hurricane/Cell.h" #include "hurricane/Instance.h" @@ -30,7 +31,7 @@ #include "hurricane/Horizontal.h" #include "hurricane/Pad.h" #include "hurricane/UpdateSession.h" -#include "hurricane/Error.h" +#include "hurricane/NetExternalComponents.h" namespace Hurricane { @@ -765,6 +766,9 @@ void Net::_toJsonCollections(JsonWriter* writer) const jsonWrite( writer, "+componentSet", getComponents() ); writer->resetFlags( JsonWriter::UsePlugReference ); + writer->key( "+externalComponents" ); + NetExternalComponents::toJson( writer, this ); + Inherit::_toJsonCollections( writer ); } @@ -1059,87 +1063,184 @@ string Net_SlavePlugs::Locator::_getString() const } +// ------------------------------------------------------------------- +// Class : "JsonNet". -// **************************************************************************************************** -// JsonNet implementation -// **************************************************************************************************** -Initializer jsonNetInit ( 0 ); + Initializer jsonNetInit ( 0 ); -void JsonNet::initialize() -// ************************** -{ JsonTypes::registerType( new JsonNet (JsonWriter::RegisterMode) ); } -JsonNet::JsonNet(unsigned long flags) -// ********************************** - : JsonEntity (flags) - , _autoMaterialize(not Go::autoMaterializationIsDisabled()) - , _net (NULL) - , _stack (NULL) -{ - if (flags & JsonWriter::RegisterMode) return; + void JsonNet::initialize () + { JsonTypes::registerType( new JsonNet (JsonWriter::RegisterMode) ); } - ltrace(51) << "JsonNet::JsonNet()" << endl; - add( "_name" , typeid(string) ); - add( "_isGlobal" , typeid(bool) ); - add( "_isExternal" , typeid(bool) ); - add( "_isAutomatic" , typeid(bool) ); - add( "_type" , typeid(string) ); - add( "_direction" , typeid(string) ); - add( "+aliases" , typeid(JsonArray) ); - add( "+componentSet", typeid(JsonArray) ); + JsonNet::JsonNet ( unsigned long flags ) + : JsonEntity (flags) + , _autoMaterialize(not Go::autoMaterializationIsDisabled()) + , _net (NULL) + , _hooks () + { + if (flags & JsonWriter::RegisterMode) return; - ltrace(51) << "Disabling auto-materialization (" << _autoMaterialize << ")." << endl; - Go::disableAutoMaterialization(); -} + ltrace(51) << "JsonNet::JsonNet()" << endl; -JsonNet::~JsonNet() -// **************** -{ - _stack->checkRings(); - _stack->buildRings(); - _stack->clearHookLinks(); + add( "_name" , typeid(string) ); + add( "_isGlobal" , typeid(bool) ); + add( "_isExternal" , typeid(bool) ); + add( "_isAutomatic" , typeid(bool) ); + add( "_type" , typeid(string) ); + add( "_direction" , typeid(string) ); + add( "+aliases" , typeid(JsonArray) ); + add( "+componentSet" , typeid(JsonArray) ); + add( "+externalComponents", typeid(JsonArray) ); - _net->materialize(); - - if (_autoMaterialize) { - Go::enableAutoMaterialization(); - ltrace(51) << "Enabling auto-materialization." << endl; + ltrace(51) << "Disabling auto-materialization (" << _autoMaterialize << ")." << endl; + Go::disableAutoMaterialization(); } -} -string JsonNet::getTypeName() const -// ********************************* -{ return "Net"; } -JsonNet* JsonNet::clone(unsigned long flags) const -// *********************************************** -{ return new JsonNet ( flags ); } + JsonNet::~JsonNet () + { + checkRings(); + buildRings(); + clearHookLinks(); + + _net->materialize(); -void JsonNet::toData(JsonStack& stack) -// *********************************** -{ - ltracein(51); + if (_autoMaterialize) { + Go::enableAutoMaterialization(); + ltrace(51) << "Enabling auto-materialization." << endl; + } + } - _stack = &stack; - check( stack, "JsonNet::toData" ); - presetId( stack ); + string JsonNet::getTypeName () const + { return "Net"; } - _net = Net::create( get(stack,".Cell") , get(stack,"_name") ); - _net->setGlobal ( get(stack,"_isGlobal" ) ); - _net->setExternal ( get(stack,"_isExternal" ) ); - _net->setAutomatic( get(stack,"_isAutomatic") ); - _net->setType ( Net::Type (get(stack,"_type")) ); - _net->setDirection( Net::Direction(get(stack,"_direction")) ); - update( stack, _net ); + JsonNet* JsonNet::clone( unsigned long flags ) const + { return new JsonNet ( flags ); } - ltraceout(51); -} -} // End of Hurricane namespace. + void JsonNet::toData ( JsonStack& stack ) + { + ltracein(51); + + check( stack, "JsonNet::toData" ); + presetId( stack ); + + _net = Net::create( get(stack,".Cell") , get(stack,"_name") ); + _net->setGlobal ( get(stack,"_isGlobal" ) ); + _net->setExternal ( get(stack,"_isExternal" ) ); + _net->setAutomatic( get(stack,"_isAutomatic") ); + _net->setType ( Net::Type (get(stack,"_type")) ); + _net->setDirection( Net::Direction(get(stack,"_direction")) ); + + update( stack, _net ); + + ltraceout(51); + } + + + void JsonNet::addHookLink ( Hook* hook, unsigned int jsonId, const string& jsonNext ) + { + if (jsonNext.empty()) return; + + unsigned int id = jsonId; + string tname = hook->_getTypeName(); + + auto ielement = _hooks.find( HookKey(id,tname) ); + if (ielement == _hooks.end()) { + auto r = _hooks.insert( make_pair( HookKey(id,tname), HookElement(hook) ) ); + ielement = r.first; + (*ielement).second.setFlags( HookElement::OpenRingStart ); + } + HookElement* current = &((*ielement).second); + if (not current->hook()) current->setHook( hook ); + + hookFromString( jsonNext, id, tname ); + ielement = _hooks.find( HookKey(id,tname) ); + if (ielement == _hooks.end()) { + auto r = _hooks.insert( make_pair( HookKey(id,tname), HookElement(NULL) ) ); + ielement = r.first; + } else { + (*ielement).second.resetFlags( HookElement::OpenRingStart ); + } + current->setNext( &((*ielement).second) ); + } + + + Hook* JsonNet::getHook ( unsigned int jsonId, const std::string& tname ) const + { + auto ihook = _hooks.find( HookKey(jsonId,tname) ); + if (ihook == _hooks.end()) return NULL; + + return (*ihook).second.hook(); + } + + + bool JsonNet::hookFromString ( std::string s, unsigned int& id, std::string& tname ) + { + size_t dot = s.rfind('.'); + if (dot == string::npos) return false; + + tname = s.substr( 0, dot ); + id = stoul( s.substr(dot+1) ); + return true; + } + + + bool JsonNet::checkRings () const + { + bool status = true; + + for ( auto kv : _hooks ) { + HookElement* ringStart = &(kv.second); + if (ringStart->issetFlags(HookElement::ClosedRing)) continue; + + if (ringStart->issetFlags(HookElement::OpenRingStart)) { + cerr << Error( "JsonNet::checkRing(): Open ring found, starting with %s.\n" + " Closing the ring..." + , getString(ringStart->hook()).c_str() ) << endl; + + status = false; + HookElement* element = ringStart; + while ( true ) { + if (not element->next()) { + // The ring is open: close it (loop on ringStart). + element->setNext( ringStart ); + element->setFlags( HookElement::ClosedRing ); + + cerr << Error( "Simple open ring." ) << endl; + break; + } + if (element->next()->issetFlags(HookElement::ClosedRing)) { + // The ring is half merged with itself, or another ring. + // (i.e. *multiple* hooks pointing the *same* next element) + element->setNext( ringStart ); + element->setFlags( HookElement::ClosedRing ); + + cerr << Error( "Complex fault: ring partially merged (convergent)." ) << endl; + break; + } + element = element->next(); + } + } + } + + return status; + } + + + void JsonNet::buildRings () const + { + for ( auto kv : _hooks ) { + kv.second.hook()->_setNextHook( kv.second.next()->hook() ); + } + } + + +} // Hurricane namespace. // **************************************************************************************************** diff --git a/hurricane/src/hurricane/NetAlias.cpp b/hurricane/src/hurricane/NetAlias.cpp index f1b68555..864bda66 100644 --- a/hurricane/src/hurricane/NetAlias.cpp +++ b/hurricane/src/hurricane/NetAlias.cpp @@ -212,6 +212,15 @@ namespace Hurricane { } + void NetAliasName::toJson ( JsonWriter* w ) const + { + w->startObject(); + jsonWrite( w, "@typename", "NetAlias" ); + jsonWrite( w, "_name" , _name ); + w->endObject(); + } + + // ------------------------------------------------------------------- // Class : "Hurricane::AliasList" (Collection). @@ -263,4 +272,47 @@ namespace Hurricane { } +// ------------------------------------------------------------------- +// Class : "Hurricane::JsonNetAlias". + + Initializer jsonNetAliasInit ( 0 ); + + + void JsonNetAlias::initialize () + { JsonTypes::registerType( new JsonNetAlias (JsonWriter::RegisterMode) ); } + + + JsonNetAlias::JsonNetAlias( unsigned long flags ) + : JsonObject(flags) + { + add( ".Net" , typeid(Net*) ); + add( "_name", typeid(string) ); + } + + + string JsonNetAlias::getTypeName () const + { return "NetAlias"; } + + + JsonNetAlias* JsonNetAlias::clone ( unsigned long flags ) const + { return new JsonNetAlias ( flags ); } + + + void JsonNetAlias::toData ( JsonStack& stack ) + { + check( stack, "JsonNetAlias::toData" ); + + Net* net = get( stack, ".Net" ); + if (net) { + string name = get( stack, "_name" ); + if (not name.empty()) { + net->addAlias( name ); + } + } else { + cerr << Error( "JsonNetAlias::toData(): Missing \".Net\" in stack context." ) << endl; + } + + update( stack, NULL ); +} + } // Hurricane namespace. diff --git a/hurricane/src/hurricane/NetExternalComponents.cpp b/hurricane/src/hurricane/NetExternalComponents.cpp index 474da406..28d84668 100644 --- a/hurricane/src/hurricane/NetExternalComponents.cpp +++ b/hurricane/src/hurricane/NetExternalComponents.cpp @@ -1,4 +1,3 @@ - // -*- C++ -*- // // Copyright (c) BULL S.A. 2000-2016, All Rights Reserved @@ -19,12 +18,7 @@ // License along with Hurricane. If not, see // . // -// =================================================================== -// -// $Id$ -// -// x-----------------------------------------------------------------x -// | | +// +-----------------------------------------------------------------+ // | 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 | // | | @@ -32,10 +26,7 @@ // | E-mail : Jean-Paul.Chaput@lip6.fr | // | =============================================================== | // | C++ Module : "./NetExternalComponents.cpp" | -// | *************************************************************** | -// | U p d a t e s | -// | | -// x-----------------------------------------------------------------x +// +-----------------------------------------------------------------+ #include "hurricane/Error.h" @@ -45,6 +36,8 @@ namespace Hurricane { +// ------------------------------------------------------------------- +// Class : "NetExternalComponents". const Name NetExternalComponents::_name = "ExternalComponentsRelation"; @@ -96,4 +89,73 @@ namespace Hurricane { } + void NetExternalComponents::toJson ( JsonWriter* w, const Net* net ) + { + w->startObject(); + jsonWrite( w, "@typename", "NetExternalComponents" ); + + w->setFlags( JsonWriter::UseEntityReference ); + if (net->isExternal()) { + jsonWrite( w, "+entities", get(net) ); + } else { + w->key( "+entities" ); + w->startArray(); + w->endArray(); + } + w->resetFlags( JsonWriter::UseEntityReference ); + w->endObject(); + } + + +// ------------------------------------------------------------------- +// Class : "JsonNetExternalComponents". + + Initializer jsonNetExternalComponentsInit ( 0 ); + + + void JsonNetExternalComponents::initialize () + { JsonTypes::registerType( new JsonNetExternalComponents (JsonWriter::RegisterMode) ); } + + + JsonNetExternalComponents::JsonNetExternalComponents ( unsigned long flags ) + : JsonBaseArray(flags) + { + if (flags & JsonWriter::RegisterMode) return; + + add( "+entities", typeid(JsonArray) ); + } + + + JsonNetExternalComponents::~JsonNetExternalComponents () + { + for ( Entity* entity : array() ) { + Component* component = dynamic_cast( entity ); + if (component) NetExternalComponents::setExternal( component ); + else { + cerr << Error( "JsonNetExternalComponents(): %s in not a Component." + , getString(entity).c_str() ) << endl; + } + } + } + + + string JsonNetExternalComponents::getTypeName () const + { return "NetExternalComponents"; } + + + JsonNetExternalComponents* JsonNetExternalComponents::clone( unsigned long flags ) const + { return new JsonNetExternalComponents ( flags ); } + + + void JsonNetExternalComponents::toData ( JsonStack& stack ) + { + ltracein(51); + + check ( stack, "JsonNetExternalComponents::toData" ); + update( stack, NULL ); + + ltraceout(51); + } + + } // End of Hurricane namespace. diff --git a/hurricane/src/hurricane/Pad.cpp b/hurricane/src/hurricane/Pad.cpp index 87acfd7e..da0e0b30 100644 --- a/hurricane/src/hurricane/Pad.cpp +++ b/hurricane/src/hurricane/Pad.cpp @@ -188,7 +188,12 @@ void JsonPad::toData(JsonStack& stack) , get(stack,".Box") ); - stack.addHookLink( pad->getBodyHook (), jsonId, get(stack,"_bodyHook" ) ); + JsonNet* jnet = jget( stack ); + if (jnet) { + jnet->addHookLink( pad->getBodyHook (), jsonId, get(stack,"_bodyHook" ) ); + } else { + cerr << Error( "JsonPad::toData(): Missing (Json)Net in stack context." ) << endl; + } // Hook/Ring rebuild are done as a post-process. update( stack, pad ); diff --git a/hurricane/src/hurricane/Plug.cpp b/hurricane/src/hurricane/Plug.cpp index 4433d372..1324e9f1 100644 --- a/hurricane/src/hurricane/Plug.cpp +++ b/hurricane/src/hurricane/Plug.cpp @@ -197,6 +197,7 @@ void Plug::_toJson(JsonWriter* writer) const if (writer->issetFlags(JsonWriter::UsePlugReference)) { jsonWrite( writer, "_id" , getId() ); jsonWrite( writer, "_instance", getInstance()->getName() ); + jsonWrite( writer, "_bodyHook", (const_cast(this)->getBodyHook())->getNextHook()->toJson() ); } else { Inherit::_toJson( writer ); jsonWrite( writer, "_masterNet", getMasterNet()->getName() ); @@ -285,7 +286,6 @@ void JsonPlug::toData(JsonStack& stack) plug = instance->getPlug( masterNet ); if (issetFlags(JsonWriter::DesignBlobMode)) plug->forceId( jsonId ); - stack.addHookLink( plug->getBodyHook (), jsonId, get(stack,"_bodyHook" ) ); } } else { cerr << Error( "JsonPlug::toData(): Cannot find \".Instance\" in stack, skipping." ) << endl; @@ -314,6 +314,7 @@ JsonPlugRef::JsonPlugRef(unsigned long flags) add( ".Net" , typeid(Net*) ); add( "_id" , typeid(uint64_t) ); add( "_instance", typeid(string) ); + add( "_bodyHook", typeid(string) ); } string JsonPlugRef::getTypeName() const @@ -337,6 +338,13 @@ void JsonPlugRef::toData(JsonStack& stack) Plug* plug = stack.getEntity(id); if (plug) { plug->setNet( net ); + + JsonNet* jnet = jget( stack ); + if (jnet) { + jnet->addHookLink( plug->getBodyHook (), id, get(stack,"_bodyHook" ) ); + } else { + cerr << Error( "JsonPlug::toData(): Missing (Json)Net in stack context." ) << endl; + } } else { cerr << Error( "JsonPlugRef::toData(): No Plug id:%u in instance %s, while building net %s." , id, getString(instance->getName()).c_str(), getString(net->getName()).c_str() diff --git a/hurricane/src/hurricane/RegularLayer.cpp b/hurricane/src/hurricane/RegularLayer.cpp index e06992a9..454b1f8e 100644 --- a/hurricane/src/hurricane/RegularLayer.cpp +++ b/hurricane/src/hurricane/RegularLayer.cpp @@ -29,6 +29,7 @@ // +-----------------------------------------------------------------+ +#include "hurricane/DataBase.h" #include "hurricane/BasicLayer.h" #include "hurricane/RegularLayer.h" #include "hurricane/Technology.h" @@ -323,4 +324,123 @@ namespace Hurricane { } + void RegularLayer::_toJson ( JsonWriter* writer ) const + { + Super::_toJson( writer ); + + jsonWrite( writer, "_basicLayer" , _basicLayer->getName() ); + jsonWrite( writer, "_enclosure" , _enclosure ); + jsonWrite( writer, "_extentionCap" , _extentionCap ); + jsonWrite( writer, "_extentionWidth" , _extentionWidth ); + } + + +// ------------------------------------------------------------------- +// Class : "Hurricane::JsonRegularLayer". + + Initializer jsonRegularLayerInit ( 0 ); + + + void JsonRegularLayer::initialize () + { JsonTypes::registerType( new JsonRegularLayer (JsonWriter::RegisterMode) ); } + + + JsonRegularLayer::JsonRegularLayer ( unsigned long flags ) + : JsonLayer(flags) + { + if (flags & JsonWriter::RegisterMode) return; + + ltrace(51) << "JsonRegularLayer::JsonRegularLayer()" << endl; + + add( "_basicLayer" , typeid(string) ); + add( "_enclosure" , typeid(int64_t) ); + add( "_extentionCap" , typeid(int64_t) ); + add( "_extentionWidth", typeid(int64_t) ); + } + + + JsonRegularLayer::~JsonRegularLayer () + { } + + + string JsonRegularLayer::getTypeName () const + { return "RegularLayer"; } + + + JsonRegularLayer* JsonRegularLayer::clone ( unsigned long flags ) const + { return new JsonRegularLayer ( flags ); } + + + void JsonRegularLayer::toData( JsonStack& stack ) + { + ltracein(51); + + check( stack, "JsonRegularLayer::toData" ); + + Technology* techno = lookupTechnology( stack, "JsonRegularLayer::toData" ); + RegularLayer* layer = NULL; + + if (techno) { + string name = get ( stack, "_name" ); + string smask = get ( stack, "_mask" ); + DbU::Unit minimalSize = get( stack, "_minimalSize" ); + DbU::Unit minimalSpacing = get( stack, "_minimalSpacing" ); + bool isWorking = get ( stack, "_working" ); + + BasicLayer* basicLayer = techno->getBasicLayer( get(stack,"_basicLayer" ) ); + DbU::Unit enclosure = get( stack, "_enclosure" ); + DbU::Unit extensionCap = get( stack, "_extentionCap" ); + DbU::Unit extensionWidth = get( stack, "_extentionWidth" ); + + Layer::Mask mask = Layer::Mask::fromString( smask ); + + if (stack.issetFlags(JsonWriter::TechnoMode)) { + // Actual creation. + layer = RegularLayer::create( techno, name ); + layer->setBasicLayer ( basicLayer ); + layer->setWorking ( isWorking ); + layer->setMinimalSize ( minimalSize ); + layer->setMinimalSpacing( minimalSpacing ); + layer->setEnclosure ( basicLayer, enclosure ); + layer->setExtentionCap ( basicLayer, extensionCap ); + layer->setExtentionWidth( basicLayer, extensionWidth ); + + if (layer->getMask() != mask) { + cerr << Error( "JsonRegularLayer::toData(): Layer mask re-creation discrepency on \"%s\":\n" + " Blob: %s\n" + " DataBase: %s" + , name.c_str() + , getString(mask).c_str() + , getString(layer->getMask()).c_str() + ) << endl; + } + // Add here association with blockage layer... + } else { + // Check coherency with existing layer. + layer = dynamic_cast( techno->getLayer(name) ); + if (layer) { + if (layer->getMask() != mask) { + cerr << Error( "JsonRegularLayer::toData(): Layer mask discrepency on \"%s\":\n" + " Blob: %s\n" + " DataBase: %s" + , name.c_str() + , getString(mask).c_str() + , getString(layer->getMask()).c_str() + ) << endl; + } + } else { + cerr << Error( "JsonRegularLayer::toData(): No RegularLayer \"%s\" in the existing technology." + , name.c_str() + ) << endl; + } + } + } else { + cerr << Error( "JsonRegularLayer::toData(): Cannot find technology, aborting RegularLayer creation." ) << endl; + } + + update( stack, layer ); + + ltraceout(51); + } + } // Hurricane namespace. diff --git a/hurricane/src/hurricane/RoutingPad.cpp b/hurricane/src/hurricane/RoutingPad.cpp index 706e7c5d..f609ce53 100644 --- a/hurricane/src/hurricane/RoutingPad.cpp +++ b/hurricane/src/hurricane/RoutingPad.cpp @@ -433,8 +433,13 @@ namespace Hurricane { ( get (stack,".Net") , get(stack,"_occurrence") ); - - stack.addHookLink( rp->getBodyHook (), jsonId, get(stack,"_bodyHook" ) ); + + JsonNet* jnet = jget( stack ); + if (jnet) { + jnet->addHookLink( rp->getBodyHook (), jsonId, get(stack,"_bodyHook" ) ); + } else { + cerr << Error( "JsonRoutingPad::toData(): Missing (Json)Net in stack context." ) << endl; + } update( stack, rp ); } diff --git a/hurricane/src/hurricane/Technology.cpp b/hurricane/src/hurricane/Technology.cpp index 1bcc9ab1..ff8cb56e 100644 --- a/hurricane/src/hurricane/Technology.cpp +++ b/hurricane/src/hurricane/Technology.cpp @@ -17,6 +17,8 @@ // not, see . // **************************************************************************************************** +#include "hurricane/Warning.h" +#include "hurricane/Error.h" #include "hurricane/SharedName.h" #include "hurricane/Technology.h" #include "hurricane/DataBase.h" @@ -27,6 +29,21 @@ #include "hurricane/Error.h" +namespace { + + class CompareByMask { + public: + bool operator() ( const Hurricane::Layer* lhs, const Hurricane::Layer* rhs ) + { + if (not lhs) return rhs; + if (not rhs) return false; + + return lhs->getMask() < rhs->getMask(); + } + }; + +} // Anonymous namespace. + namespace Hurricane { @@ -363,14 +380,12 @@ void Technology::_removeFromLayerMaskMap ( Layer* layer ) } } - string Technology::_getTypeName () const +// ************************************** { return _TName("Technology"); } - - string Technology::_getString() const // ********************************** { @@ -393,6 +408,38 @@ Record* Technology::_getRecord() const return record; } +void Technology::_toJson(JsonWriter* writer) const +// *********************************************** +{ + Inherit::_toJson( writer ); + + jsonWrite( writer, "_name", getName() ); +} + +void Technology::_toJsonCollections(JsonWriter* writer) const +// *********************************************************** +{ + writer->key( "+layers" ); + writer->startArray(); + + vector basicLayers; + vector layers; + for ( Layer* layer : getLayers() ) { + BasicLayer* basicLayer = dynamic_cast( layer ); + if (basicLayer) basicLayers.push_back( basicLayer ); + else layers .push_back( layer ); + } + + sort( basicLayers.begin(), basicLayers.end(), CompareByMask() ); + sort( layers .begin(), layers .end(), CompareByMask() ); + + for ( BasicLayer* basicLayer : basicLayers ) jsonWrite( writer, basicLayer ); + for ( Layer* layer : layers ) jsonWrite( writer, layer ); + + writer->endArray(); +} + + // **************************************************************************************************** // Technology::LayerMap implementation // **************************************************************************************************** @@ -575,6 +622,96 @@ string Technology_BasicLayers::Locator::_getString() const return s; } + + +// **************************************************************************************************** +// JsonTechnology implementation +// **************************************************************************************************** + +Initializer jsonTechnologyInit ( 0 ); + +void JsonTechnology::initialize() +// ******************************* +{ JsonTypes::registerType( new JsonTechnology (JsonWriter::RegisterMode) ); } + +JsonTechnology::JsonTechnology(unsigned long flags) +// ************************************************ + : JsonDBo (flags) + , _blockagesMap() +{ + if (flags & JsonWriter::RegisterMode) return; + + ltrace(51) << "JsonTechnology::JsonTechnology()" << endl; + + add( "_name" , typeid(string) ); + add( "+layers", typeid(JsonArray) ); +} + +JsonTechnology::~JsonTechnology() +// ****************************** +{ + const Technology* techno = getObject(); + + for ( auto element : _blockagesMap ) { + BasicLayer* blockage = techno->getBasicLayer( element.first ); + if (blockage) { + for ( BasicLayer* layer : element.second ) { + layer->setBlockageLayer( blockage ); + } + } + } +} + +string JsonTechnology::getTypeName() const +// **************************************** +{ return "Technology"; } + +JsonTechnology* JsonTechnology::clone(unsigned long flags) const +// ************************************************************* +{ return new JsonTechnology ( flags ); } + +void JsonTechnology::addBlockageRef(const string& blockageLayer, BasicLayer* layer ) +// ********************************************************************************* +{ + map< string, vector >::iterator im = _blockagesMap.find( blockageLayer ); + if (im != _blockagesMap.end()) { + (*im).second.push_back( layer ); + } else { + _blockagesMap.insert( make_pair( blockageLayer, vector(1,layer) ) ); + } +} + +void JsonTechnology::toData(JsonStack& stack) +// ****************************************** +{ + ltracein(51); + + check( stack, "JsonTechnology::toData" ); + + string technoName = get( stack, "_name" ); + Technology* techno = DataBase::getDB()->getTechnology(); + + if (techno) { + if (techno->getName() == technoName) { + cerr << Warning( "JsonTechnology::toData(): A technology with the same name (%s) is already loaded." + , technoName.c_str() + ) << endl; + } else { + cerr << Error( "JsonTechnology::toData(): Try to load \"%s\", but \"%s\" is already loaded." + , technoName.c_str() + , getString(techno->getName()).c_str() + ) << endl; + } + } else { + techno = Technology::create( DataBase::getDB(), technoName ); + stack.setFlags( JsonWriter::TechnoMode ); + } + + update( stack, techno ); + + ltraceout(51); +} + } // End of Hurricane namespace. diff --git a/hurricane/src/hurricane/TransistorLayer.cpp b/hurricane/src/hurricane/TransistorLayer.cpp index 23e7bc46..812a041d 100644 --- a/hurricane/src/hurricane/TransistorLayer.cpp +++ b/hurricane/src/hurricane/TransistorLayer.cpp @@ -1,4 +1,3 @@ - // -*- C++ -*- // // Copyright (c) BULL S.A. 2000-2016, All Rights Reserved @@ -19,12 +18,7 @@ // License along with Hurricane. If not, see // . // -// =================================================================== -// -// $Id$ -// -// x-----------------------------------------------------------------x -// | | +// +-----------------------------------------------------------------+ // | 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 | // | | @@ -32,16 +26,14 @@ // | E-mail : Jean-Paul.Chaput@lip6.fr | // | =============================================================== | // | C++ Module : "./TransistorLayer.cpp" | -// | *************************************************************** | -// | U p d a t e s | -// | | -// x-----------------------------------------------------------------x +// +-----------------------------------------------------------------+ -#include "hurricane/BasicLayer.h" -#include "hurricane/TransistorLayer.h" -#include "hurricane/Technology.h" -#include "hurricane/Error.h" +#include "hurricane/DataBase.h" +#include "hurricane/Technology.h" +#include "hurricane/BasicLayer.h" +#include "hurricane/TransistorLayer.h" +#include "hurricane/Error.h" namespace { @@ -229,4 +221,161 @@ namespace Hurricane { } + void TransistorLayer::_toJson ( JsonWriter* w ) const + { + Super::_toJson( w ); + + jsonWrite( w, "_gate" , _basicLayers[0]->getName() ); + jsonWrite( w, "_active" , _basicLayers[1]->getName() ); + jsonWrite( w, "_diffusion", _basicLayers[2]->getName() ); + if (_basicLayers.size() == 4) jsonWrite( w, "_well" , _basicLayers[3]->getName() ); + else jsonWrite( w, "_well", "no_well_layer" ); + + jsonWrite( w, "_extentionCap.gate" , _extentionCaps[0] ); + jsonWrite( w, "_extentionCap.active" , _extentionCaps[1] ); + jsonWrite( w, "_extentionCap.diffusion", _extentionCaps[2] ); + jsonWrite( w, "_extentionCap.well" , (_basicLayers.size() == 4) ? _extentionCaps[3] : 0 ); + + jsonWrite( w, "_extentionWidth.gate" , _extentionWidths[0] ); + jsonWrite( w, "_extentionWidth.active" , _extentionWidths[1] ); + jsonWrite( w, "_extentionWidth.diffusion", _extentionWidths[2] ); + jsonWrite( w, "_extentionWidth.well" , (_basicLayers.size() == 4) ? _extentionWidths[3] : 0 ); + } + + +// ------------------------------------------------------------------- +// Class : "Hurricane::JsonTransistorLayer". + + Initializer jsonTransistorLayerInit ( 0 ); + + + void JsonTransistorLayer::initialize () + { JsonTypes::registerType( new JsonTransistorLayer (JsonWriter::RegisterMode) ); } + + + JsonTransistorLayer::JsonTransistorLayer ( unsigned long flags ) + : JsonLayer(flags) + { + if (flags & JsonWriter::RegisterMode) return; + + ltrace(51) << "JsonTransistorLayer::JsonTransistorLayer()" << endl; + + add( "_gate" , typeid(string) ); + add( "_active" , typeid(string) ); + add( "_diffusion" , typeid(string) ); + add( "_well" , typeid(string) ); + add( "_extentionCap.gate" , typeid(int64_t) ); + add( "_extentionCap.active" , typeid(int64_t) ); + add( "_extentionCap.diffusion" , typeid(int64_t) ); + add( "_extentionCap.well" , typeid(int64_t) ); + add( "_extentionWidth.gate" , typeid(int64_t) ); + add( "_extentionWidth.active" , typeid(int64_t) ); + add( "_extentionWidth.diffusion", typeid(int64_t) ); + add( "_extentionWidth.well" , typeid(int64_t) ); + } + + + JsonTransistorLayer::~JsonTransistorLayer () + { } + + + string JsonTransistorLayer::getTypeName () const + { return "TransistorLayer"; } + + + JsonTransistorLayer* JsonTransistorLayer::clone ( unsigned long flags ) const + { return new JsonTransistorLayer ( flags ); } + + + void JsonTransistorLayer::toData ( JsonStack& stack ) + { + ltracein(51); + + check( stack, "JsonTransistorLayer::toData" ); + + Technology* techno = lookupTechnology( stack, "JsonTransistorLayer::toData" ); + TransistorLayer* layer = NULL; + + if (techno) { + string name = get ( stack, "_name" ); + string smask = get ( stack, "_mask" ); + //DbU::Unit minimalSize = get( stack, "_minimalSize" ); + //DbU::Unit minimalSpacing = get( stack, "_minimalSpacing" ); + bool isWorking = get ( stack, "_working" ); + + BasicLayer* gate = techno->getBasicLayer( get(stack,"_gate" ) ); + BasicLayer* active = techno->getBasicLayer( get(stack,"_active" ) ); + BasicLayer* diffusion = techno->getBasicLayer( get(stack,"_diffusion" ) ); + BasicLayer* well = techno->getBasicLayer( get(stack,"_well" ) ); + DbU::Unit eCapGate = get( stack, "_extentionCap.gate" ); + DbU::Unit eCapActive = get( stack, "_extentionCap.active" ); + DbU::Unit eCapDiffusion = get( stack, "_extentionCap.diffusion" ); + DbU::Unit eCapWell = get( stack, "_extentionCap.well" ); + DbU::Unit eWidthGate = get( stack, "_extentionWidth.gate" ); + DbU::Unit eWidthActive = get( stack, "_extentionWidth.active" ); + DbU::Unit eWidthDiffusion = get( stack, "_extentionWidth.diffusion" ); + DbU::Unit eWidthWell = get( stack, "_extentionWidth.well" ); + + Layer::Mask mask = Layer::Mask::fromString( smask ); + + if (stack.issetFlags(JsonWriter::TechnoMode)) { + // Actual creation. + layer = TransistorLayer::create( techno + , name + , gate + , active + , diffusion + , well + ); + layer->setWorking ( isWorking ); + layer->setExtentionCap ( gate , eCapGate ); + layer->setExtentionCap ( active , eCapActive ); + layer->setExtentionCap ( diffusion, eCapDiffusion ); + layer->setExtentionWidth( gate , eWidthGate ); + layer->setExtentionWidth( active , eWidthActive ); + layer->setExtentionWidth( diffusion, eWidthDiffusion ); + if (well) { + layer->setExtentionCap ( well, eCapWell ); + layer->setExtentionWidth( well, eWidthWell ); + } + + if (layer->getMask() != mask) { + cerr << Error( "JsonTransistorLayer::toData(): Layer mask re-creation discrepency on \"%s\":\n" + " Blob: %s\n" + " DataBase: %s" + , name.c_str() + , getString(mask).c_str() + , getString(layer->getMask()).c_str() + ) << endl; + } + // Add here association with blockage layer... + } else { + // Check coherency with existing layer. + layer = dynamic_cast( techno->getLayer(name) ); + if (layer) { + if (layer->getMask() != mask) { + cerr << Error( "JsonTransistorLayer::toData(): Layer mask discrepency on \"%s\":\n" + " Blob: %s\n" + " DataBase: %s" + , name.c_str() + , getString(mask).c_str() + , getString(layer->getMask()).c_str() + ) << endl; + } + } else { + cerr << Error( "JsonTransistorLayer::toData(): No TransistorLayer \"%s\" in the existing technology." + , name.c_str() + ) << endl; + } + } + } else { + cerr << Error( "JsonTransistorLayer::toData(): Cannot find technology, aborting TransistorLayer creation." ) << endl; + } + + update( stack, layer ); + + ltraceout(51); + } + + } // End of Hurricane namespace. diff --git a/hurricane/src/hurricane/Vertical.cpp b/hurricane/src/hurricane/Vertical.cpp index 8d62a160..822b443f 100644 --- a/hurricane/src/hurricane/Vertical.cpp +++ b/hurricane/src/hurricane/Vertical.cpp @@ -249,10 +249,15 @@ void JsonVertical::toData(JsonStack& stack) , DbU::fromDb( get(stack,"_dySource") ) , DbU::fromDb( get(stack,"_dyTarget") ) ); - - stack.addHookLink( vertical->getBodyHook (), jsonId, get(stack,"_bodyHook" ) ); - stack.addHookLink( vertical->getSourceHook(), jsonId, get(stack,"_sourceHook") ); - stack.addHookLink( vertical->getTargetHook(), jsonId, get(stack,"_targetHook") ); + + JsonNet* jnet = jget( stack ); + if (jnet) { + jnet->addHookLink( vertical->getBodyHook (), jsonId, get(stack,"_bodyHook" ) ); + jnet->addHookLink( vertical->getSourceHook(), jsonId, get(stack,"_sourceHook") ); + jnet->addHookLink( vertical->getTargetHook(), jsonId, get(stack,"_targetHook") ); + } else { + cerr << Error( "JsonVertical::toData(): Missing (Json)Net in stack context." ) << endl; + } // Hook/Ring rebuild are done as a post-process. update( stack, vertical ); diff --git a/hurricane/src/hurricane/ViaLayer.cpp b/hurricane/src/hurricane/ViaLayer.cpp index 4a0600ea..9b038650 100644 --- a/hurricane/src/hurricane/ViaLayer.cpp +++ b/hurricane/src/hurricane/ViaLayer.cpp @@ -1,4 +1,3 @@ - // -*- C++ -*- // // Copyright (c) BULL S.A. 2000-2016, All Rights Reserved @@ -19,12 +18,7 @@ // License along with Hurricane. If not, see // . // -// =================================================================== -// -// $Id$ -// -// x-----------------------------------------------------------------x -// | | +// +-----------------------------------------------------------------+ // | 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 | // | | @@ -32,16 +26,14 @@ // | E-mail : Jean-Paul.Chaput@lip6.fr | // | =============================================================== | // | C++ Module : "./ViaLayer.cpp" | -// | *************************************************************** | -// | U p d a t e s | -// | | -// x-----------------------------------------------------------------x +// +-----------------------------------------------------------------+ -# include "hurricane/BasicLayer.h" -# include "hurricane/ViaLayer.h" -# include "hurricane/Technology.h" -# include "hurricane/Error.h" +#include "hurricane/DataBase.h" +#include "hurricane/Technology.h" +#include "hurricane/BasicLayer.h" +#include "hurricane/ViaLayer.h" +#include "hurricane/Error.h" namespace { @@ -65,7 +57,6 @@ namespace Hurricane { // ------------------------------------------------------------------- // Class : "Hurricane::ViaLayer". - ViaLayer::ViaLayer ( Technology* technology , const Name& name , BasicLayer* bottomLayer @@ -210,4 +201,133 @@ namespace Hurricane { } + void ViaLayer::_toJson ( JsonWriter* w ) const + { + Super::_toJson( w ); + + jsonWrite( w, "_bottom", _basicLayers[0]->getName() ); + jsonWrite( w, "_cut" , _basicLayers[1]->getName() ); + jsonWrite( w, "_top" , _basicLayers[2]->getName() ); + + jsonWrite( w, "_enclosure.bottom", _enclosures[0] ); + jsonWrite( w, "_enclosure.cut" , _enclosures[1] ); + jsonWrite( w, "_enclosure.top" , _enclosures[2] ); + } + + +// ------------------------------------------------------------------- +// Class : "Hurricane::JsonViaLayer". + + Initializer jsonViaLayerInit ( 0 ); + + + void JsonViaLayer::initialize () + { JsonTypes::registerType( new JsonViaLayer (JsonWriter::RegisterMode) ); } + + + JsonViaLayer::JsonViaLayer ( unsigned long flags ) + : JsonLayer(flags) + { + if (flags & JsonWriter::RegisterMode) return; + + ltrace(51) << "JsonViaLayer::JsonViaLayer()" << endl; + + add( "_bottom" , typeid(string) ); + add( "_cut" , typeid(string) ); + add( "_top" , typeid(string) ); + add( "_enclosure.bottom", typeid(int64_t) ); + add( "_enclosure.cut" , typeid(int64_t) ); + add( "_enclosure.top" , typeid(int64_t) ); + } + + + JsonViaLayer::~JsonViaLayer () + { } + + + string JsonViaLayer::getTypeName () const + { return "ViaLayer"; } + + + JsonViaLayer* JsonViaLayer::clone ( unsigned long flags ) const + { return new JsonViaLayer ( flags ); } + + + void JsonViaLayer::toData(JsonStack& stack) + { + ltracein(51); + + check( stack, "JsonViaLayer::toData" ); + + Technology* techno = lookupTechnology( stack, "JsonViaLayer::toData" ); + ViaLayer* layer = NULL; + + if (techno) { + string name = get ( stack, "_name" ); + string smask = get ( stack, "_mask" ); + //DbU::Unit minimalSize = get( stack, "_minimalSize" ); + //DbU::Unit minimalSpacing = get( stack, "_minimalSpacing" ); + bool isWorking = get ( stack, "_working" ); + + BasicLayer* bottom = techno->getBasicLayer( get(stack,"_bottom" ) ); + BasicLayer* cut = techno->getBasicLayer( get(stack,"_cut" ) ); + BasicLayer* top = techno->getBasicLayer( get(stack,"_top" ) ); + DbU::Unit bottomEncl = get( stack, "_enclosure.bottom" ); + DbU::Unit cutEncl = get( stack, "_enclosure.cut" ); + DbU::Unit topEncl = get( stack, "_enclosure.top" ); + + Layer::Mask mask = Layer::Mask::fromString( smask ); + + if (stack.issetFlags(JsonWriter::TechnoMode)) { + // Actual creation. + layer = ViaLayer::create( techno + , name + , bottom + , cut + , top + ); + layer->setWorking ( isWorking ); + layer->setEnclosure( bottom, bottomEncl ); + layer->setEnclosure( cut , cutEncl ); + layer->setEnclosure( top , topEncl ); + + if (layer->getMask() != mask) { + cerr << Error( "JsonViaLayer::toData(): Layer mask re-creation discrepency on \"%s\":\n" + " Blob: %s\n" + " DataBase: %s" + , name.c_str() + , getString(mask).c_str() + , getString(layer->getMask()).c_str() + ) << endl; + } + // Add here association with blockage layer... + } else { + // Check coherency with existing layer. + layer = dynamic_cast( techno->getLayer(name) ); + if (layer) { + if (layer->getMask() != mask) { + cerr << Error( "JsonViaLayer::toData(): Layer mask discrepency on \"%s\":\n" + " Blob: %s\n" + " DataBase: %s" + , name.c_str() + , getString(mask).c_str() + , getString(layer->getMask()).c_str() + ) << endl; + } + } else { + cerr << Error( "JsonViaLayer::toData(): No ViaLayer \"%s\" in the existing technology." + , name.c_str() + ) << endl; + } + } + } else { + cerr << Error( "JsonViaLayer::toData(): Cannot find technology, aborting ViaLayer creation." ) << endl; + } + + update( stack, layer ); + + ltraceout(51); + } + + } // End of Hurricane namespace. diff --git a/hurricane/src/hurricane/hurricane/BasicLayer.h b/hurricane/src/hurricane/hurricane/BasicLayer.h index d5c0c6cf..9b5ff5da 100644 --- a/hurricane/src/hurricane/hurricane/BasicLayer.h +++ b/hurricane/src/hurricane/hurricane/BasicLayer.h @@ -42,6 +42,8 @@ namespace Hurricane { class BasicLayer : public Layer { + public: + typedef Layer Super; public: // Subclass: Material. @@ -66,6 +68,7 @@ namespace Hurricane { Material& operator= ( const Material& material ); inline operator const Code& () const; inline const Code& getCode () const; + static Material fromString ( const string& ); inline string _getTypeName () const; string _getString () const; Record* _getRecord () const; @@ -95,6 +98,7 @@ namespace Hurricane { inline void setExtractNumber ( unsigned int ); inline void setRealName ( const char* realName); // Hurricane Managment. + virtual void _toJson ( JsonWriter* writer ) const; virtual BasicLayer* _getSymbolicBasicLayer (); virtual string _getTypeName () const; virtual string _getString () const; @@ -135,6 +139,20 @@ namespace Hurricane { inline void BasicLayer::setRealName ( const char* realName) { _realName = realName; } +// ------------------------------------------------------------------- +// Class : "Hurricane::JsonBasicLayer". + + class JsonBasicLayer : public JsonLayer { + public: + static void initialize (); + JsonBasicLayer ( unsigned long flags ); + ~JsonBasicLayer (); + virtual string getTypeName () const; + virtual JsonBasicLayer* clone ( unsigned long ) const; + virtual void toData ( JsonStack& ); + }; + + } // End of Hurricane namespace. diff --git a/hurricane/src/hurricane/hurricane/Cell.h b/hurricane/src/hurricane/hurricane/Cell.h index cccbf1fc..b7390ba9 100644 --- a/hurricane/src/hurricane/hurricane/Cell.h +++ b/hurricane/src/hurricane/hurricane/Cell.h @@ -333,6 +333,7 @@ class Cell : public Entity { // ************ public: static Cell* create(Library* library, const Name& name); + public: static Cell* fromJson(const string& filename); // Accessors // ********* diff --git a/hurricane/src/hurricane/hurricane/Commons.h b/hurricane/src/hurricane/hurricane/Commons.h index cbb69d6c..15f26bea 100644 --- a/hurricane/src/hurricane/hurricane/Commons.h +++ b/hurricane/src/hurricane/hurricane/Commons.h @@ -742,7 +742,7 @@ inline Hurricane::Record* getRecord ( const std::multiset* s ) #include "hurricane/Initializer.h" #include "hurricane/Tabulation.h" #include "hurricane/JsonWriter.h" -#include "hurricane/JsonReader.h" +#include "hurricane/JsonObject.h" #endif // HURRICANE_COMMONS_H diff --git a/hurricane/src/hurricane/hurricane/ContactLayer.h b/hurricane/src/hurricane/hurricane/ContactLayer.h index e1e212e2..f97e841a 100644 --- a/hurricane/src/hurricane/hurricane/ContactLayer.h +++ b/hurricane/src/hurricane/hurricane/ContactLayer.h @@ -1,4 +1,3 @@ - // -*- C++ -*- // // Copyright (c) BULL S.A. 2000-2016, All Rights Reserved @@ -19,12 +18,7 @@ // License along with Hurricane. If not, see // . // -// =================================================================== -// -// $Id$ -// -// x-----------------------------------------------------------------x -// | | +// +-----------------------------------------------------------------+ // | 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 | // | | @@ -32,14 +26,11 @@ // | E-mail : Jean-Paul.Chaput@lip6.fr | // | =============================================================== | // | C++ Header : "./hurricane/ContactLayer.h" | -// | *************************************************************** | -// | U p d a t e s | -// | | -// x-----------------------------------------------------------------x +// +-----------------------------------------------------------------+ -#ifndef __HURRICANE_CONTACT_LAYER__ -#define __HURRICANE_CONTACT_LAYER__ +#ifndef HURRICANE_CONTACT_LAYER_H +#define HURRICANE_CONTACT_LAYER_H #include @@ -49,7 +40,12 @@ namespace Hurricane { +// ------------------------------------------------------------------- +// Class : "Hurricane::ContactLayer". + class ContactLayer : public Layer { + public: + typedef Layer Super; public: // Constructor. @@ -68,6 +64,7 @@ namespace Hurricane { // Updators. virtual void setEnclosure ( const BasicLayer* layer, DbU::Unit enclosure ); // Hurricane Managment. + virtual void _toJson ( JsonWriter* ) const; virtual void _onDbuChange ( float scale ); virtual string _getTypeName () const; virtual string _getString () const; @@ -91,6 +88,20 @@ namespace Hurricane { }; +// ------------------------------------------------------------------- +// Class : "Hurricane::JsonContactLayer". + + class JsonContactLayer : public JsonLayer { + public: + static void initialize (); + JsonContactLayer ( unsigned long flags ); + ~JsonContactLayer (); + virtual string getTypeName () const; + virtual JsonContactLayer* clone ( unsigned long ) const; + virtual void toData ( JsonStack& ); + }; + + } // End of Hurricane namespace. diff --git a/hurricane/src/hurricane/hurricane/DataBase.h b/hurricane/src/hurricane/hurricane/DataBase.h index 77cf0cf0..bbdf9337 100644 --- a/hurricane/src/hurricane/hurricane/DataBase.h +++ b/hurricane/src/hurricane/hurricane/DataBase.h @@ -43,7 +43,7 @@ class DataBase : public DBo { // Types // ***** - public: typedef DBo Inherit; + public: typedef DBo Inherit; public: enum Flags { NoFlags = 0 , CreateLib =(1<<0) , WarnCreateLib=(1<<2) }; diff --git a/hurricane/src/hurricane/hurricane/DbU.h b/hurricane/src/hurricane/hurricane/DbU.h index 21b1b1d6..a209f341 100644 --- a/hurricane/src/hurricane/hurricane/DbU.h +++ b/hurricane/src/hurricane/hurricane/DbU.h @@ -42,26 +42,28 @@ namespace Hurricane { class DbU { public: - enum UnitPower { Pico = 1 - , Nano - , Micro - , Milli - , Unity - , Kilo - }; + enum FunctionFlags { NoFlags = 0 + , NoTechnoUpdate = (1<<0) + }; + enum UnitPower { Pico = 1 + , Nano + , Micro + , Milli + , Unity + , Kilo + }; + enum StringMode { Db = (1<<0) + , Grid = (1<<1) + , Symbolic = (1<<2) + , Physical = (1<<3) + , SmartTruncate = (1<<4) + }; + enum SnapMode { Inferior = 1 + , Superior = 2 + , Nearest = 4 + }; public: typedef long Unit; - public: - enum StringMode { Db = (1<<0) - , Grid = (1<<1) - , Symbolic = (1<<2) - , Physical = (1<<3) - , SmartTruncate = (1<<4) - }; - enum SnapMode { Inferior = 1 - , Superior = 2 - , Nearest = 4 - }; public: static void checkGridBound ( double value ); @@ -81,14 +83,14 @@ namespace Hurricane { static unsigned int getPrecision (); static unsigned int getMaximalPrecision (); static double getResolution (); - static void setPrecision ( unsigned int precision ); + static void setPrecision ( unsigned int precision, unsigned int flags=NoFlags ); // Founder Grid Managment. static double getUnitPower ( UnitPower p ); static void setPhysicalsPerGrid ( double gridsPerLambda, UnitPower p ); static double getPhysicalsPerGrid (); static double physicalToGrid ( double physical, UnitPower p ); // Lamba Managment. - static void setGridsPerLambda ( double gridsPerLambda ); + static void setGridsPerLambda ( double gridsPerLambda, unsigned int flags=NoFlags ); static double getGridsPerLambda (); // Snap Grid Managment. static DbU::Unit getRealSnapGridStep (); diff --git a/hurricane/src/hurricane/hurricane/DiffusionLayer.h b/hurricane/src/hurricane/hurricane/DiffusionLayer.h index e097871f..b0c3e1b6 100644 --- a/hurricane/src/hurricane/hurricane/DiffusionLayer.h +++ b/hurricane/src/hurricane/hurricane/DiffusionLayer.h @@ -1,4 +1,3 @@ - // -*- C++ -*- // // Copyright (c) BULL S.A. 2000-2016, All Rights Reserved @@ -19,12 +18,7 @@ // License along with Hurricane. If not, see // . // -// =================================================================== -// -// $Id$ -// -// x-----------------------------------------------------------------x -// | | +// +-----------------------------------------------------------------+ // | 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 | // | | @@ -32,14 +26,11 @@ // | E-mail : Jean-Paul.Chaput@lip6.fr | // | =============================================================== | // | C++ Header : "./hurricane/DiffusionLayer.h" | -// | *************************************************************** | -// | U p d a t e s | -// | | -// x-----------------------------------------------------------------x +// +-----------------------------------------------------------------+ -#ifndef __HURRICANE_DIFFUSION_LAYER__ -#define __HURRICANE_DIFFUSION_LAYER__ +#ifndef HURRICANE_DIFFUSION_LAYER_H +#define HURRICANE_DIFFUSION_LAYER_H #include @@ -48,8 +39,12 @@ namespace Hurricane { +// ------------------------------------------------------------------- +// Class : "Hurricane::DiffusionLayer". class DiffusionLayer : public Layer { + public: + typedef Layer Super; public: // Constructor. @@ -69,6 +64,7 @@ namespace Hurricane { virtual void setExtentionCap ( const BasicLayer* layer, DbU::Unit cap ); virtual void setExtentionWidth ( const BasicLayer* layer, DbU::Unit width ); // Hurricane Managment. + virtual void _toJson ( JsonWriter* ) const; virtual void _onDbuChange ( float scale ); virtual string _getTypeName () const; virtual string _getString () const; @@ -93,10 +89,24 @@ namespace Hurricane { }; +// ------------------------------------------------------------------- +// Class : "Hurricane::JsonDiffusionLayer". + + class JsonDiffusionLayer : public JsonLayer { + public: + static void initialize (); + JsonDiffusionLayer ( unsigned long flags ); + ~JsonDiffusionLayer (); + virtual string getTypeName () const; + virtual JsonDiffusionLayer* clone ( unsigned long ) const; + virtual void toData ( JsonStack& ); + }; + + } // End of Hurricane namespace. INSPECTOR_P_SUPPORT(Hurricane::DiffusionLayer); -# endif +#endif diff --git a/hurricane/src/hurricane/hurricane/Entity.h b/hurricane/src/hurricane/hurricane/Entity.h index 36e4ab35..8840cebf 100644 --- a/hurricane/src/hurricane/hurricane/Entity.h +++ b/hurricane/src/hurricane/hurricane/Entity.h @@ -98,6 +98,20 @@ namespace Hurricane { stack.addEntity( jsonId, hobject ); } + +// ------------------------------------------------------------------- +// Class : "JsonEntityRef". + + class JsonEntityRef : public JsonObject { + public: + static void initialize (); + JsonEntityRef ( unsigned long flags ); + virtual string getTypeName () const; + virtual JsonEntityRef* clone ( unsigned long ) const; + virtual void toData ( JsonStack& ); + }; + + } // Hurricane namespace. diff --git a/hurricane/src/hurricane/hurricane/JsonObject.h b/hurricane/src/hurricane/hurricane/JsonObject.h new file mode 100644 index 00000000..bf35ab86 --- /dev/null +++ b/hurricane/src/hurricane/hurricane/JsonObject.h @@ -0,0 +1,424 @@ +// -*- C++ -*- +// +// Copyright (c) BULL S.A. 2015-2016, 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 +// . +// +// +-----------------------------------------------------------------+ +// | 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 | +// | | +// | Author : Jean-Paul Chaput | +// | E-mail : Jean-Paul.Chaput@lip6.fr | +// | =============================================================== | +// | C++ Header : "./hurricane/JsonObject.h" | +// +-----------------------------------------------------------------+ + + +#ifndef HURRICANE_JSON_OBJECT_H +#define HURRICANE_JSON_OBJECT_H + +#ifndef HURRICANE_SLOT_H +#error "JsonObject.h must be included through Commons.h" +#endif + +#include +#include +#include +#include +#include +#include +#include +#include +#include + + +namespace Hurricane { + + class DBo; + class Hook; + class Entity; + class Cell; + class Component; + class JsonStack; + + class JsonArray { }; + + +// ------------------------------------------------------------------- +// Class : "JsonAttribute". + + class JsonAttribute { + public: + inline JsonAttribute ( const std::string& key, std::type_index tid ); + inline std::string key () const; + inline std::type_index tid () const; + private: + std::string _key; + std::type_index _tid; + }; + + inline JsonAttribute::JsonAttribute ( const std::string& key, std::type_index tid ) : _key(key), _tid(tid) { } + inline std::string JsonAttribute::key () const { return _key; } + inline std::type_index JsonAttribute::tid () const { return _tid; } + + +// ------------------------------------------------------------------- +// Class : "JsonObject". + + class JsonObject { + public: + JsonObject ( unsigned long flags ); + virtual ~JsonObject (); + virtual bool isDummy () const; + virtual std::string getTypeName () const = 0; + inline std::string getStackName () const; + bool check ( JsonStack&, std::string fname ) const; + void print ( std::ostream& ) const; + bool has ( const std::string& key ) const; + void add ( const std::string& key, std::type_index tid ); + void remove ( const std::string& key ); + template inline T get ( JsonStack&, const std::string& key ) const; + template inline T* jget ( JsonStack& ) const; + inline void copyAttrs ( const JsonObject*, bool reset=false ); + inline void clear (); + inline std::string getName () const; + inline void setName ( const std::string& ); + template inline T getObject () const; + template inline void setObject ( T ) ; + inline bool isBound () const; + virtual JsonObject* clone ( unsigned long flags ) const = 0; + virtual void toData ( JsonStack& ); + unsigned int presetId ( JsonStack& ); + template inline void update ( JsonStack&, T ); + inline JsonObject* setFlags ( unsigned long mask ); + inline JsonObject* resetFlags ( unsigned long mask ); + inline bool issetFlags ( unsigned long mask ) const; + protected: + unsigned long _flags; + std::string _name; + std::vector _stackeds; + std::vector _attributes; + std::vector _collections; + boost::any _object; + }; + + + inline bool JsonObject::isBound () const { return not _object.empty(); } + inline std::string JsonObject::getName () const { return _name; } + inline void JsonObject::setName ( const string& name ) { _name=name; } + inline JsonObject* JsonObject::setFlags ( unsigned long mask ) { _flags |= mask; return this; } + inline JsonObject* JsonObject::resetFlags ( unsigned long mask ) { _flags &= ~mask; return this; } + inline bool JsonObject::issetFlags ( unsigned long mask ) const { return _flags & mask; } + + inline std::string JsonObject::getStackName () const + { return (_name.empty()) ? std::string(".")+getTypeName(): _name; } + + template inline T JsonObject::getObject () const + { return boost::any_cast(_object); } + + template inline void JsonObject::setObject ( T t ) + { _object = t; } + + inline void JsonObject::copyAttrs ( const JsonObject* other, bool reset ) + { + if (reset) _attributes.clear(); + for ( size_t i=0 ; i_attributes.size() ; ++i ) + _attributes.push_back( other->_attributes[i] ); + } + + void JsonObject::clear () + { + _stackeds.clear(); + _attributes.clear(); + _collections.clear(); + boost::any emptyAny; + _object.swap( emptyAny ); + } + + +// ------------------------------------------------------------------- +// Class : "JsonKey". + + class JsonKey : public JsonObject { + public: + inline JsonKey ( const std::string& ); + virtual std::string getTypeName () const; + virtual JsonKey* clone ( unsigned long ) const; + private: + std::string _key; + }; + + +// ------------------------------------------------------------------- +// Class : "JsonDummy". + + class JsonDummy : public JsonObject { + public: + JsonDummy (); + virtual bool isDummy () const; + virtual std::string getTypeName () const; + void setTypeName ( const std::string& name ); + virtual JsonDummy* clone ( unsigned long ) const; + private: + std::string _typename; + }; + + +// ------------------------------------------------------------------- +// Class : "JsonBaseArray". + + template + class JsonBaseArray : public JsonObject { + public: + inline JsonBaseArray ( unsigned long flags ); + inline const std::vector& array () const; + inline void push_back ( T ); + private: + std::vector _array; + }; + + + template + inline JsonBaseArray::JsonBaseArray ( unsigned long flags ) + : JsonObject(flags) + , _array() + { } + + template + inline const std::vector& JsonBaseArray::array () const { return _array; } + + template + inline void JsonBaseArray::push_back ( T element ) + { _array.push_back(element); } + + +} // Hurricane namespace. + + +namespace std { + + template<> + struct less { + inline bool operator() ( const Hurricane::JsonObject* lhs, const Hurricane::JsonObject* rhs ) + { return lhs->getTypeName() < rhs->getTypeName(); } + }; + +} // std namespace. + + +namespace Hurricane { + +// ------------------------------------------------------------------- +// Class : "JsonTypes". + + class JsonTypes { + public: + static void initialize (); + static void registerType ( JsonObject* ); + static JsonObject* find ( const std::string& tname ); + private: + JsonTypes (); + ~JsonTypes (); + JsonTypes ( const JsonTypes& ); + void _registerType ( JsonObject* ); + JsonObject* _find ( const std::string& tname ); + private: + static JsonTypes* _jsonTypes; + std::set _jsonObjects; + }; + + +// ------------------------------------------------------------------- +// Class : "JsonStack". + + class JsonStack { + public: + typedef std::pair Element; + public: + inline JsonStack (); + inline size_t size () const; + template inline void push_back ( const std::string&, T ); + inline void pop_back ( size_t count=1 ); + inline int rhas ( const std::string& ) const; + template inline T as ( const std::string& ) const; + template inline T as ( int ) const; + inline void push_back_dbo ( DBo* ); + inline void pop_back_dbo (); + inline DBo* back_dbo () const; + inline vector& jobjects (); + template inline T getEntity ( unsigned int ) const; + void addEntity ( unsigned int jsonId, Entity* ); + void print ( std::ostream& ) const; + inline unsigned long getFlags () const; + inline JsonStack* setFlags ( unsigned long mask ); + inline JsonStack* resetFlags ( unsigned long mask ); + inline bool issetFlags ( unsigned long mask ) const; + inline const Element& operator[] ( int index ) const; + private: + unsigned long _flags; + vector _stack; + vector _jstack; + vector _dbos; + std::map _entities; + }; + + + inline JsonStack::JsonStack () + : _flags(0), _stack(), _jstack(), _dbos(), _entities() + { } + + template inline void JsonStack::push_back ( const std::string& key, T t ) + { + ltrace(51) << "JsonStack::push_back(T) key:" << key << " value:" << t + << " (" << demangle(typeid(T)) << ")." << endl; + _stack.push_back(std::make_pair(key,boost::any(t))); + } + + inline void JsonStack::pop_back ( size_t count ) + { + while (count--) { + if (_stack.empty()) { + std::cerr << "[ERROR] JsonStack::pop_back(): Stack is empty, but " + << (count+1) << " elements remains to pop." << std::endl; + break; + } + ltrace(51) << "| _stack.pop_back() \"" << _stack.back().first + << "\", size:" << _stack.size() << ", dbos:" << _dbos.size() << endl; + _stack.pop_back(); + } + } + + inline const JsonStack::Element& JsonStack::operator[] ( int index ) const + { + if (index < 0) return _stack[_stack.size()+index]; + return _stack[index]; + } + + inline int JsonStack::rhas ( const std::string& key ) const + { + if (_stack.empty()) return 0; + + int i = _stack.size()-1; + do { + if (_stack[i].first == key) { + ltrace(51) << "JsonStack::rhas(): key \"" << key << "\" found at index:" + << (i-(int)_stack.size()) << " (i:" << i << ") " + << "(" << demangle(_stack[i].second.type().name()) << ")." + << endl; + return i-(int)_stack.size(); + } + if (i == 0) break; + --i; + } while ( true ); + + ltrace(51) << "JsonStack::rhas(): key \"" << key << "\" not found (returning index: 0)." << endl; + return 0; + } + + template inline T JsonStack::as ( const std::string& key ) const + { + if (not _stack.empty()) { + int i = _stack.size()-1; + do { + if (_stack[i].first == key) { + ltrace(51) << "JsonStack::as() k:" << key + << " value:" << demangle(_stack[i].second.type().name()) << std::endl; + return boost::any_cast( _stack[i].second ); + } + if (i == 0) break; + --i; + } while ( true ); + + std::cerr << "[ERROR] JsonStack::as(key): No element with key \"" + << key << "\" in stack." << std::endl; + } else { + std::cerr << "[ERROR] JsonStack::as(key): Stack is empty while searching for key \"" + << key << "\"." << std::endl; + } + + return T(); + } + + template inline T JsonStack::as ( int index ) const + { + size_t i = (index >= 0) ? index : (_stack.size()+index); + return boost::any_cast( _stack[i].second ); + } + + + template inline T JsonStack::getEntity ( unsigned int id ) const + { + std::map::const_iterator it = _entities.find(id); + if (it == _entities.end()) return NULL; + return dynamic_cast((*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 vector& JsonStack::jobjects () { return _jstack; } + inline size_t JsonStack::size () const { return _stack.size(); } + inline unsigned long JsonStack::getFlags () const { return _flags; } + inline JsonStack* JsonStack::setFlags ( unsigned long mask ) { _flags |= mask; return this; } + inline JsonStack* JsonStack::resetFlags ( unsigned long mask ) { _flags &= ~mask; return this; } + inline bool JsonStack::issetFlags ( unsigned long mask ) const { return _flags & mask; } + + template + T JsonObject::get ( JsonStack& stack, const std::string& key ) const + { + int index = stack.rhas(key); + if (index == 0) return T();; + if (stack[index].second.type() == typeid(void*)) return T(); + + return stack.as( index ); + } + + template + T* JsonObject::jget ( JsonStack& stack ) const + { + vector& jobjects = stack.jobjects(); + vector::reverse_iterator rit = jobjects.rbegin(); + + for ( ; rit != jobjects.rend() ; ++rit ) { + T* jobject = dynamic_cast( *rit ); + if (jobject) return jobject; + } + + return NULL; + } + + template + inline void JsonObject::update ( JsonStack& stack, T hobject ) + { + ltrace(51) << "JsonObject::update()" << endl; + stack.pop_back( _attributes.size() ); + stack.push_back( getStackName(), hobject ); + setObject( hobject ); + } + + +// ------------------------------------------------------------------- +// Function : Json Parsers. + + Cell* jsonCellParse ( std::string filename ); + Cell* jsonBlobParse ( std::string filename ); + + +} // Hurricane namespace. + +#endif // HURRICANE_JSON_OBJECT_H diff --git a/hurricane/src/hurricane/hurricane/JsonReader.h b/hurricane/src/hurricane/hurricane/JsonReader.h index 587b371d..fc28a9d8 100644 --- a/hurricane/src/hurricane/hurricane/JsonReader.h +++ b/hurricane/src/hurricane/hurricane/JsonReader.h @@ -32,421 +32,53 @@ #ifndef HURRICANE_JSON_READER_H #define HURRICANE_JSON_READER_H -#ifndef HURRICANE_SLOT_H -#error "JsonWriter.h must be included through Commons.h" -#endif - -#include -#include -#include -#include -#include -#include +#include #include -#include -#include +#include "rapidjson/filereadstream.h" +#include "rapidjson/reader.h" +#include "hurricane/Commons.h" +#include "hurricane/FileReadGzStream.h" namespace Hurricane { - class DBo; - class Hook; - class Entity; - class Cell; - class Component; + using rapidjson::Reader; + class HurricaneHandler; // ------------------------------------------------------------------- -// Class : "JsonObject". +// Class : "JsonReader". - class JsonStack; - class JsonArray { }; - - -// ------------------------------------------------------------------- -// Class : "JsonAttribute". - - class JsonAttribute { + class JsonReader { public: - inline JsonAttribute ( const std::string& key, std::type_index tid ); - inline std::string key () const; - inline std::type_index tid () const; - private: - std::string _key; - std::type_index _tid; - }; - - inline JsonAttribute::JsonAttribute ( const std::string& key, std::type_index tid ) : _key(key), _tid(tid) { } - inline std::string JsonAttribute::key () const { return _key; } - inline std::type_index JsonAttribute::tid () const { return _tid; } - - -// ------------------------------------------------------------------- -// Class : "JsonObject". - - class JsonObject { - public: - JsonObject ( unsigned long flags ); - virtual ~JsonObject (); - virtual bool isDummy () const; - virtual std::string getTypeName () const = 0; - inline std::string getStackName () const; - bool check ( JsonStack&, std::string fname ) const; - void print ( std::ostream& ) const; - bool has ( const std::string& key ) const; - void add ( const std::string& key, std::type_index tid ); - void remove ( const std::string& key ); - template inline T get ( JsonStack&, const std::string& key ) const; - inline void copyAttrs ( const JsonObject*, bool reset=false ); - inline void clear (); - inline std::string getName () const; - inline void setName ( const std::string& ); - template inline T& getObject () const; - template inline void setObject ( T ) ; - inline bool isBound () const; - virtual JsonObject* clone ( unsigned long flags ) const = 0; - virtual void toData ( JsonStack& ); - unsigned int presetId ( JsonStack& ); - template inline void update ( JsonStack&, T ); - inline JsonObject* setFlags ( unsigned long mask ); - inline JsonObject* resetFlags ( unsigned long mask ); - inline bool issetFlags ( unsigned long mask ) const; - protected: - unsigned long _flags; - std::string _name; - std::vector _stackeds; - std::vector _attributes; - std::vector _collections; - boost::any _object; - }; - - - inline bool JsonObject::isBound () const { return not _object.empty(); } - inline std::string JsonObject::getName () const { return _name; } - inline void JsonObject::setName ( const string& name ) { _name=name; } - inline JsonObject* JsonObject::setFlags ( unsigned long mask ) { _flags |= mask; return this; } - inline JsonObject* JsonObject::resetFlags ( unsigned long mask ) { _flags &= ~mask; return this; } - inline bool JsonObject::issetFlags ( unsigned long mask ) const { return _flags & mask; } - - inline std::string JsonObject::getStackName () const - { return (_name.empty()) ? std::string(".")+getTypeName(): _name; } - - template inline T& JsonObject::getObject () const - { return boost::any_cast(_object); } - - template inline void JsonObject::setObject ( T t ) - { _object = t; } - - inline void JsonObject::copyAttrs ( const JsonObject* other, bool reset ) - { - if (reset) _attributes.clear(); - for ( size_t i=0 ; i_attributes.size() ; ++i ) - _attributes.push_back( other->_attributes[i] ); - } - - void JsonObject::clear () - { - _stackeds.clear(); - _attributes.clear(); - _collections.clear(); - boost::any emptyAny; - _object.swap( emptyAny ); - } - - -// ------------------------------------------------------------------- -// Class : "JsonKey". - - class JsonKey : public JsonObject { - public: - inline JsonKey ( const std::string& ); - virtual std::string getTypeName () const; - virtual JsonKey* clone ( unsigned long ) const; - private: - std::string _key; - }; - - -// ------------------------------------------------------------------- -// Class : "JsonDummy". - - class JsonDummy : public JsonObject { - public: - inline JsonDummy (); - virtual bool isDummy () const; - virtual std::string getTypeName () const; - void setTypeName ( const std::string& name ); - virtual JsonDummy* clone ( unsigned long ) const; - private: - std::string _typename; - }; - - -} // Hurricane namespace. - - -namespace std { - - template<> - struct less { - inline bool operator() ( const Hurricane::JsonObject* lhs, const Hurricane::JsonObject* rhs ) - { return lhs->getTypeName() < rhs->getTypeName(); } - }; - -} // std namespace. - - -namespace Hurricane { - -// ------------------------------------------------------------------- -// Class : "JsonTypes". - - class JsonTypes { - public: - static void initialize (); - static void registerType ( JsonObject* ); - static JsonObject* find ( const std::string& tname ); - private: - JsonTypes (); - ~JsonTypes (); - JsonTypes ( const JsonTypes& ); - void _registerType ( JsonObject* ); - JsonObject* _find ( const std::string& tname ); - private: - static JsonTypes* _jsonTypes; - std::set _jsonObjects; - }; - - -// ------------------------------------------------------------------- -// Class : "HookKey". - - class HookKey { - public: - inline HookKey ( unsigned int id, const std::string& tname ); - inline unsigned int id () const; - inline std::string tname () const; - private: - unsigned int _id; - std::string _tname; - }; - - - inline HookKey::HookKey ( unsigned int id, const std::string& tname ) : _id(id), _tname(tname) { } - inline unsigned int HookKey::id () const { return _id; } - inline std::string HookKey::tname () const { return _tname; } - - inline bool operator< ( const HookKey& lhs, const HookKey& rhs ) - { - if (lhs.id() != rhs.id()) return lhs.id() < rhs.id(); - return lhs.tname() < rhs.tname(); - } - - -// ------------------------------------------------------------------- -// Class : "HookElement". - - class HookElement { - public: - enum Flags { OpenRingStart = (1<<0) - , ClosedRing = (1<<1) - }; - public: - inline HookElement ( Hook*, unsigned long flags=0 ); - inline Hook* hook () const; - inline HookElement* next () const; - inline void setHook ( Hook* ); - inline void setNext ( HookElement* ); - inline unsigned long flags () const; - inline HookElement& setFlags ( unsigned long mask ); - inline HookElement& resetFlags ( unsigned long mask ); + JsonReader ( unsigned long flags ); + ~JsonReader (); + inline JsonReader* setFlags ( unsigned long mask ); + inline JsonReader* resetFlags ( unsigned long mask ); inline bool issetFlags ( unsigned long mask ) const; + inline unsigned long getFlags () const; + inline JsonStack& getStack (); + void parse ( std::string fileName ); + void close (); + private: + JsonReader ( const JsonReader& ); + JsonReader& operator= ( const JsonReader& ) const; private: - Hook* _hook; - HookElement* _next; - unsigned long _flags; + size_t _bufferSize; + char* _buffer; + FILE* _file; + FileReadGzStream* _stream; + JsonStack _stack; + Reader _reader; + HurricaneHandler* _handler; }; - inline HookElement::HookElement ( Hook* hook, unsigned long flags ) : _hook(hook), _next(NULL), _flags(flags) { } - inline Hook* HookElement::hook () const { return _hook; } - inline HookElement* HookElement::next () const { return _next; } - inline void HookElement::setHook ( Hook* hook ) { _hook = hook; } - inline void HookElement::setNext ( HookElement* element ) { _next = element; } - inline unsigned long HookElement::flags () const { return _flags; } - inline HookElement& HookElement::setFlags ( unsigned long mask ) { _flags |= mask; return *this; } - inline HookElement& HookElement::resetFlags ( unsigned long mask ) { _flags &= ~mask; return *this; } - inline bool HookElement::issetFlags ( unsigned long mask ) const { return _flags & mask; } - - - typedef map HookLut; - - -// ------------------------------------------------------------------- -// Class : "JsonStack". - - class JsonStack { - public: - typedef std::pair Element; - public: - static bool hookFromString ( std::string s, unsigned int& id, std::string& tname ); - public: - inline JsonStack (); - inline size_t size () const; - template inline void push_back ( const std::string&, T ); - inline void pop_back ( size_t count=1 ); - inline int rhas ( const std::string& ) const; - template inline T as ( const std::string& ) const; - template inline T as ( int ) const; - inline void push_back_dbo ( DBo* ); - inline void pop_back_dbo (); - inline DBo* back_dbo () const; - template inline T getEntity ( unsigned int ) const; - void addEntity ( unsigned int jsonId, Entity* ); - void addHookLink ( Hook*, unsigned int jsonId, const std::string& jsonNext ); - Hook* getHook ( unsigned int jsonId, const std::string& tname ) const; - bool checkRings () const; - void buildRings () const; - inline void clearHookLinks (); - void print ( std::ostream& ) const; - inline JsonStack* setFlags ( unsigned long mask ); - inline JsonStack* resetFlags ( unsigned long mask ); - inline bool issetFlags ( unsigned long mask ) const; - inline const Element& operator[] ( int index ) const; - private: - unsigned long _flags; - vector _stack; - vector _dbos; - std::map _entities; - HookLut _hooks; - }; - - - inline JsonStack::JsonStack () - : _flags(0), _stack(), _dbos(), _entities(), _hooks() - { } - - template inline void JsonStack::push_back ( const std::string& key, T t ) - { - ltrace(51) << "JsonStack::push_back(T) key:" << key << " value:" << t - << " (" << demangle(typeid(T)) << ")." << endl; - _stack.push_back(std::make_pair(key,boost::any(t))); - } - - inline void JsonStack::pop_back ( size_t count ) - { - while (count--) { - if (_stack.empty()) { - std::cerr << "[ERROR] JsonStack::pop_back(): Stack is empty, but " - << (count+1) << " elements remains to pop." << std::endl; - break; - } - ltrace(51) << "| _stack.pop_back() \"" << _stack.back().first - << "\", size:" << _stack.size() << ", dbos:" << _dbos.size() << endl; - _stack.pop_back(); - } - } - - inline const JsonStack::Element& JsonStack::operator[] ( int index ) const - { - if (index < 0) return _stack[_stack.size()+index]; - return _stack[index]; - } - - inline int JsonStack::rhas ( const std::string& key ) const - { - if (_stack.empty()) return 0; - - int i = _stack.size()-1; - do { - if (_stack[i].first == key) { - ltrace(51) << "JsonStack::rhas(): key \"" << key << "\" found at index:" - << (i-(int)_stack.size()) << " (i:" << i << ") " - << "(" << demangle(_stack[i].second.type().name()) << ")." - << endl; - return i-(int)_stack.size(); - } - if (i == 0) break; - --i; - } while ( true ); - - ltrace(51) << "JsonStack::rhas(): key \"" << key << "\" not found (returning index: 0)." << endl; - return 0; - } - - template inline T JsonStack::as ( const std::string& key ) const - { - if (not _stack.empty()) { - int i = _stack.size()-1; - do { - if (_stack[i].first == key) { - ltrace(51) << "JsonStack::as() k:" << key - << " value:" << demangle(_stack[i].second.type().name()) << std::endl; - return boost::any_cast( _stack[i].second ); - } - if (i == 0) break; - --i; - } while ( true ); - - std::cerr << "[ERROR] JsonStack::as(key): No element with key \"" - << key << "\" in stack." << std::endl; - } else { - std::cerr << "[ERROR] JsonStack::as(key): Stack is empty while searching for key \"" - << key << "\"." << std::endl; - } - - return T(); - } - - template inline T JsonStack::as ( int index ) const - { - size_t i = (index >= 0) ? index : (_stack.size()+index); - return boost::any_cast( _stack[i].second ); - } - - - template inline T JsonStack::getEntity ( unsigned int id ) const - { - std::map::const_iterator it = _entities.find(id); - if (it == _entities.end()) return NULL; - return dynamic_cast((*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 size_t JsonStack::size () const { return _stack.size(); } - inline JsonStack* JsonStack::setFlags ( unsigned long mask ) { _flags |= mask; return this; } - inline JsonStack* JsonStack::resetFlags ( unsigned long mask ) { _flags &= ~mask; return this; } - inline bool JsonStack::issetFlags ( unsigned long mask ) const { return _flags & mask; } - - - template - T JsonObject::get ( JsonStack& stack, const std::string& key ) const - { - int index = stack.rhas(key); - if (index == 0) return T();; - if (stack[index].second.type() == typeid(void*)) return T(); - - return stack.as( index ); - } - - template - inline void JsonObject::update ( JsonStack& stack, T hobject ) - { - ltrace(51) << "JsonObject::update()" << endl; - stack.pop_back( _attributes.size() ); - stack.push_back( getStackName(), hobject ); - setObject( hobject ); - } - - -// ------------------------------------------------------------------- -// Function : Json Parsers. - - Cell* jsonCellParse ( std::string filename ); - Cell* jsonBlobParse ( std::string filename ); + inline JsonReader* JsonReader::setFlags ( unsigned long mask ) { _stack.setFlags(mask); return this; } + inline JsonReader* JsonReader::resetFlags ( unsigned long mask ) { _stack.resetFlags(mask); return this; } + inline bool JsonReader::issetFlags ( unsigned long mask ) const { return _stack.issetFlags(mask); } + inline unsigned long JsonReader::getFlags () const { return _stack.getFlags(); } + inline JsonStack& JsonReader::getStack () { return _stack; } } // Hurricane namespace. diff --git a/hurricane/src/hurricane/hurricane/JsonWriter.h b/hurricane/src/hurricane/hurricane/JsonWriter.h index 52a20327..453d2a69 100644 --- a/hurricane/src/hurricane/hurricane/JsonWriter.h +++ b/hurricane/src/hurricane/hurricane/JsonWriter.h @@ -38,6 +38,8 @@ #include #include +#include +#include namespace rapidjson { class FileWriteStream; @@ -54,15 +56,17 @@ namespace Hurricane { class JsonWriter { public: - enum Mode { UsePlugReference = (1<<0) - , DesignBlobMode = (1<<1) - , CellMode = (1<<2) - , RegisterMode = (1<<3) - , RegisterStatus = (1<<4) - , RegisterType = (1<<5) - , UnregisterType = (1<<6) - , CellObject = (1<<7) - , DBoObject = (1<<8) + enum Mode { UsePlugReference = (1<< 0) + , UseEntityReference = (1<< 1) + , DesignBlobMode = (1<< 2) + , CellMode = (1<< 3) + , TechnoMode = (1<< 4) + , RegisterMode = (1<< 5) + , RegisterStatus = (1<< 6) + , RegisterType = (1<< 7) + , UnregisterType = (1<< 8) + , CellObject = (1<< 9) + , DBoObject = (1<<10) }; public: JsonWriter ( std::string fileName ); @@ -87,14 +91,18 @@ namespace Hurricane { void write ( const unsigned int* ); void write ( unsigned long ); void write ( const unsigned long* ); + void write ( float ); + void write ( const float* ); + void write ( double ); + void write ( const double* ); void close (); JsonWriter* setFlags ( unsigned long mask ); JsonWriter* resetFlags ( unsigned long mask ); bool issetFlags ( unsigned long mask ) const; unsigned long getFlags () const; private: - JsonWriter ( const JsonWriter& ); - JsonWriter& operator= ( const JsonWriter& ) const; + JsonWriter ( const JsonWriter& ); + JsonWriter& operator= ( const JsonWriter& ) const; private: unsigned long _flags; size_t _bufferSize; @@ -126,6 +134,10 @@ inline void jsonWrite ( JsonWriter* w, const unsigned int* v ) { w->write(v); inline void jsonWrite ( JsonWriter* w, unsigned int v ) { w->write(v); } inline void jsonWrite ( JsonWriter* w, const unsigned long* v ) { w->write(v); } inline void jsonWrite ( JsonWriter* w, unsigned long v ) { w->write(v); } +inline void jsonWrite ( JsonWriter* w, const float* v ) { w->write(v); } +inline void jsonWrite ( JsonWriter* w, float v ) { w->write(v); } +inline void jsonWrite ( JsonWriter* w, const double* v ) { w->write(v); } +inline void jsonWrite ( JsonWriter* w, double v ) { w->write(v); } //template @@ -181,11 +193,27 @@ inline void jsonWrite ( JsonWriter* w, const std::string& key, const std::strin { w->key( key ); w->write( value ); } +inline void jsonWrite ( JsonWriter* w, const std::string& key, const float* value ) +{ w->key( key ); w->write( value ); } + + +inline void jsonWrite ( JsonWriter* w, const std::string& key, float value ) +{ w->key( key ); w->write( value ); } + + +inline void jsonWrite ( JsonWriter* w, const std::string& key, const double* value ) +{ w->key( key ); w->write( value ); } + + +inline void jsonWrite ( JsonWriter* w, const std::string& key, double value ) +{ w->key( key ); w->write( value ); } + + template inline void jsonWrite ( JsonWriter* w, const std::string& key, const C& ) { w->key( key ); - std::string message = "Unsupported type " + Hurricane::demangle(typeid(C).name()); + std::string message = "JSON unsupported type " + Hurricane::demangle(typeid(C).name()); w->write( message.c_str() ); } @@ -222,11 +250,52 @@ inline void jsonWrite ( JsonWriter* w, const std::string& key, const C* object Hurricane::ltracein(50); w->key( key ); - if (object) object->toJson( w ); + if (object) jsonWrite( w, object ); else jsonWrite(w); Hurricane::ltraceout(50); } +template +inline void jsonWrite ( JsonWriter* w, const std::string& key, const std::vector& v ) +{ + if (Hurricane::inltrace(50)) + std::cerr << Hurricane::tab + << "jsonWrite< vector<" << Hurricane::demangle(typeid(Element).name()) + << "> >(w,key,v)" << " key:\"" << key << "\"" << std::endl; + Hurricane::ltracein(50); + + w->key( key ); + w->startArray(); + for ( Element element : v ) jsonWrite( w, element ); + w->endArray(); + + Hurricane::ltraceout(50); +} + + +template +inline void jsonWrite ( JsonWriter* w + , const std::string& key + , const std::map& m ) +{ + if (Hurricane::inltrace(50)) + std::cerr << Hurricane::tab + << "jsonWrite< map<" + << Hurricane::demangle(typeid(Key ).name()) << "," + << Hurricane::demangle(typeid(Element).name()) << "," + << Hurricane::demangle(typeid(Compare).name()) + << "> >(w,key,m)" << " key:\"" << key << "\"" << std::endl; + Hurricane::ltracein(50); + + w->key( key ); + w->startArray(); + for ( auto mapElement : m ) jsonWrite( w, mapElement.second ); + w->endArray(); + + Hurricane::ltraceout(50); +} + + #endif // HURRICANE_JSON_WRITER_H diff --git a/hurricane/src/hurricane/hurricane/Layer.h b/hurricane/src/hurricane/hurricane/Layer.h index 0ee2ef98..5fa0fdca 100644 --- a/hurricane/src/hurricane/hurricane/Layer.h +++ b/hurricane/src/hurricane/hurricane/Layer.h @@ -30,8 +30,8 @@ // +-----------------------------------------------------------------+ -#ifndef __HURRICANE_LAYER__ -#define __HURRICANE_LAYER__ +#ifndef HURRICANE_LAYER_H +#define HURRICANE_LAYER_H #include "hurricane/Mask.h" #include "hurricane/DBo.h" @@ -46,7 +46,12 @@ namespace Hurricane { class Technology; +// ------------------------------------------------------------------- +// Class : "Hurricane::Layer". + class Layer : public DBo { + public: + typedef DBo Super; public: // Types. @@ -88,6 +93,7 @@ namespace Hurricane { virtual void setExtentionCap ( const BasicLayer* layer, DbU::Unit ); virtual void setExtentionWidth ( const BasicLayer* layer, DbU::Unit ); // Hurricane Managment. + virtual void _toJson ( JsonWriter* ) const; virtual string _getString () const; virtual Record* _getRecord () const; inline Layer* _getNextOfTechnologyLayerMap () const; @@ -110,14 +116,14 @@ namespace Hurricane { protected: // Internal: Constructors & Destructors. - Layer ( Technology* technology - , const Name& name - , const DbU::Unit& minimalSize = 0 - , const DbU::Unit& minimalSpacing = 0 - , const DbU::Unit& pitch = 0 - ); - virtual void _postCreate (); - virtual void _preDestroy (); + Layer ( Technology* technology + , const Name& name + , const DbU::Unit& minimalSize = 0 + , const DbU::Unit& minimalSpacing = 0 + , const DbU::Unit& pitch = 0 + ); + virtual void _postCreate (); + virtual void _preDestroy (); public: struct CompareByMask : public binary_function { @@ -146,12 +152,21 @@ namespace Hurricane { { return (lhs?lhs->getMask():Layer::Mask()) < (rhs?rhs->getMask():Layer::Mask()); } +// ------------------------------------------------------------------- +// Class : "Hurricane::JsonLayer". -} // End of Hurricane namespace. + class JsonLayer : public JsonDBo { + public: + JsonLayer ( unsigned long flags ); + Technology* lookupTechnology ( JsonStack&, const string& fname ) const; + }; + + +} // Hurricane namespace. INSPECTOR_P_SUPPORT(Hurricane::Layer); INSPECTOR_PV_SUPPORT(Hurricane::Layer::Mask); -# endif +#endif // HURRICANE_LAYER_H diff --git a/hurricane/src/hurricane/hurricane/Mask.h b/hurricane/src/hurricane/hurricane/Mask.h index c86b5c33..1401d6a3 100644 --- a/hurricane/src/hurricane/hurricane/Mask.h +++ b/hurricane/src/hurricane/hurricane/Mask.h @@ -33,6 +33,7 @@ #define HURRICANE_MASK_H #include +#include #include "hurricane/Commons.h" @@ -43,31 +44,33 @@ namespace Hurricane { class Mask { public: // Methods. - inline Mask ( IntType mask=0 ); - inline bool zero () const; - inline Mask& set ( const Mask mask ); - inline Mask& unset ( const Mask mask ); - inline bool isSet ( const Mask mask ) const; - inline bool contains ( const Mask mask ) const; - inline bool intersect ( const Mask mask ) const; - inline Mask nthbit ( unsigned int ) const; - inline Mask operator compl () const; - inline Mask operator bitand ( const Mask mask ) const; - inline Mask operator bitor ( const Mask mask ) const; - inline Mask operator xor ( const Mask mask ) const; - inline Mask lshift ( unsigned int ) const; - inline Mask rshift ( unsigned int ) const; - inline Mask& operator |= ( const Mask mask ); - inline Mask& operator &= ( const Mask mask ); - inline bool operator == ( const Mask mask ) const; - inline bool operator != ( const Mask mask ) const; - inline bool operator < ( const Mask mask ) const; - inline bool operator > ( const Mask mask ) const; - inline operator IntType () const; + inline Mask ( IntType mask=0 ); + inline bool zero () const; + inline Mask& set ( const Mask mask ); + inline Mask& unset ( const Mask mask ); + inline bool isSet ( const Mask mask ) const; + inline bool contains ( const Mask mask ) const; + inline bool intersect ( const Mask mask ) const; + inline Mask nthbit ( unsigned int ) const; + inline Mask operator compl () const; + inline Mask operator bitand ( const Mask mask ) const; + inline Mask operator bitor ( const Mask mask ) const; + inline Mask operator xor ( const Mask mask ) const; + inline Mask lshift ( unsigned int ) const; + inline Mask rshift ( unsigned int ) const; + inline Mask& operator += ( unsigned int ); + inline Mask& operator |= ( const Mask mask ); + inline Mask& operator &= ( const Mask mask ); + inline bool operator == ( const Mask mask ) const; + inline bool operator != ( const Mask mask ) const; + inline bool operator < ( const Mask mask ) const; + inline bool operator > ( const Mask mask ) const; + inline operator IntType () const; + static inline Mask fromString ( const string& ); // Hurricane Managment. - inline string _getTypeName () const; - inline string _getString () const; - inline Record* _getRecord () const; + inline string _getTypeName () const; + inline string _getString () const; + inline Record* _getRecord () const; protected: // Internal: Attributes. static size_t _width; @@ -138,6 +141,10 @@ namespace Hurricane { inline Mask Mask::rshift ( unsigned int s ) const { return _mask >> s; } + template + inline Mask& Mask::operator += ( unsigned int v ) + { _mask += v; return *this; } + template inline Mask& Mask::operator |= ( const Mask mask ) { _mask |= mask._mask; return *this; } @@ -189,6 +196,58 @@ namespace Hurricane { size_t Mask::_width = sizeof(IntType)<<2; + template + inline Mask Mask::fromString ( const string& s ) + { + IntType value; + istringstream iss ( s ); + + iss >> hex >> value; + Mask mask ( value ); + + +#if NO_ISTRINGSTREAM + if ( (s.size() > 2) and (s.size() <= _width+2) and (s.substr(0,2) == "0x") ) { + for ( size_t i=2 ; i HookLut; + + +// ------------------------------------------------------------------- +// Class : "JsonNet". + + class JsonNet : public JsonEntity { + public: + static bool hookFromString ( std::string s, unsigned int& id, std::string& tname ); + static void initialize (); + JsonNet ( unsigned long flags ); + virtual ~JsonNet (); + virtual string getTypeName () const; + virtual JsonNet* clone ( unsigned long ) const; + virtual void toData ( JsonStack& ); + void addHookLink ( Hook*, unsigned int jsonId, const std::string& jsonNext ); + Hook* getHook ( unsigned int jsonId, const std::string& tname ) const; + bool checkRings () const; + void buildRings () const; + inline void clearHookLinks (); + protected: + bool _autoMaterialize; + Net* _net; + HookLut _hooks; + }; + + + inline void JsonNet::clearHookLinks () { _hooks.clear(); } + + +} // Hurricane namespace. // ------------------------------------------------------------------- diff --git a/hurricane/src/hurricane/hurricane/NetAlias.h b/hurricane/src/hurricane/hurricane/NetAlias.h index 6fbafbbe..c8989f89 100644 --- a/hurricane/src/hurricane/hurricane/NetAlias.h +++ b/hurricane/src/hurricane/hurricane/NetAlias.h @@ -110,6 +110,7 @@ namespace Hurricane { virtual bool isSlave () const; virtual Name getName () const; virtual Net* getNet () const; + virtual void toJson ( JsonWriter* ) const; virtual std::string _getString () const; virtual Record* _getRecord () const; public: @@ -182,6 +183,19 @@ namespace Hurricane { { } +// ------------------------------------------------------------------- +// Class : "JsonNetAlias". + + class JsonNetAlias : public JsonObject { + public: + static void initialize (); + JsonNetAlias ( unsigned long flags ); + virtual string getTypeName () const; + virtual JsonNetAlias* clone ( unsigned long ) const; + virtual void toData ( JsonStack& ); + }; + + } // Namespace Hurricane. diff --git a/hurricane/src/hurricane/hurricane/NetExternalComponents.h b/hurricane/src/hurricane/hurricane/NetExternalComponents.h index 76e237e9..c876bea6 100644 --- a/hurricane/src/hurricane/hurricane/NetExternalComponents.h +++ b/hurricane/src/hurricane/hurricane/NetExternalComponents.h @@ -38,12 +38,15 @@ namespace Hurricane { +// ------------------------------------------------------------------- +// Class : "NetExternalComponents". class NetExternalComponents { public: static Components get ( const Net* ); static void setExternal ( Component* ); static bool isExternal ( Component* ); + static void toJson ( JsonWriter*, const Net* ); protected: static StandardRelation* getRelation ( const Net* ); private: @@ -51,6 +54,20 @@ namespace Hurricane { }; +// ------------------------------------------------------------------- +// Class : "JsonNetExternalComponents". + + class JsonNetExternalComponents : public JsonBaseArray { + public: + static void initialize (); + JsonNetExternalComponents ( unsigned long flags ); + virtual ~JsonNetExternalComponents (); + virtual string getTypeName () const; + virtual JsonNetExternalComponents* clone ( unsigned long ) const; + virtual void toData ( JsonStack& ); + }; + + } // Hurricane namespace. #endif // HURRICANE_NET_EXTERNAL_COMPONENTS_H diff --git a/hurricane/src/hurricane/hurricane/RegularLayer.h b/hurricane/src/hurricane/hurricane/RegularLayer.h index 4129dc17..cea1a2d1 100644 --- a/hurricane/src/hurricane/hurricane/RegularLayer.h +++ b/hurricane/src/hurricane/hurricane/RegularLayer.h @@ -39,8 +39,12 @@ namespace Hurricane { +// ------------------------------------------------------------------- +// Class : "Hurricane::RegularLayer". class RegularLayer : public Layer { + public: + typedef Layer Super; public: // Constructor. @@ -66,6 +70,7 @@ namespace Hurricane { virtual void setExtentionCap ( const BasicLayer* layer, DbU::Unit cap ); virtual void setExtentionWidth ( const BasicLayer* layer, DbU::Unit width ); // Hurricane Managment. + virtual void _toJson ( JsonWriter* ) const; virtual void _onDbuChange ( float scale ); virtual string _getTypeName () const; virtual string _getString () const; @@ -90,6 +95,20 @@ namespace Hurricane { inline BasicLayer* RegularLayer::getBasicLayer () const { return _basicLayer; } +// ------------------------------------------------------------------- +// Class : "Hurricane::JsonRegularLayer". + + class JsonRegularLayer : public JsonLayer { + public: + static void initialize (); + JsonRegularLayer ( unsigned long flags ); + ~JsonRegularLayer (); + virtual string getTypeName () const; + virtual JsonRegularLayer* clone ( unsigned long ) const; + virtual void toData ( JsonStack& ); + }; + + } // Hurricane namespace. INSPECTOR_P_SUPPORT(Hurricane::RegularLayer); diff --git a/hurricane/src/hurricane/hurricane/Technology.h b/hurricane/src/hurricane/hurricane/Technology.h index 58d357df..53313504 100644 --- a/hurricane/src/hurricane/hurricane/Technology.h +++ b/hurricane/src/hurricane/hurricane/Technology.h @@ -1,4 +1,3 @@ - // -*- C++ -*- // // Copyright (c) BULL S.A. 2000-2016, All Rights Reserved @@ -19,12 +18,7 @@ // License along with Hurricane. If not, see // . // -// =================================================================== -// -// $Id$ -// -// x-----------------------------------------------------------------x -// | | +// +-----------------------------------------------------------------+ // | 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 | // | | @@ -32,14 +26,11 @@ // | E-mail : Jean-Paul.Chaput@lip6.fr | // | =============================================================== | // | C++ Header : "./hurricane/Technology.h" | -// | *************************************************************** | -// | U p d a t e s | -// | | -// x-----------------------------------------------------------------x +// +-----------------------------------------------------------------+ -#ifndef __HURRICANE_TECHNOLOGY__ -#define __HURRICANE_TECHNOLOGY__ +#ifndef HURRICANE_TECHNOLOGY_H +#define HURRICANE_TECHNOLOGY_H #include #include "hurricane/Mask.h" @@ -64,7 +55,6 @@ namespace Hurricane { // ------------------------------------------------------------------- // Class : "Hurricane::Technology". - class Technology : public DBo { public: @@ -120,6 +110,8 @@ namespace Hurricane { inline Layer::Mask& _getMetalMask (); void _onDbuChange ( float scale ); // Hurricane Managment. + virtual void _toJson ( JsonWriter* ) const; + virtual void _toJsonCollections ( JsonWriter* ) const; virtual string _getTypeName () const; virtual string _getString () const; virtual Record* _getRecord () const; @@ -153,10 +145,27 @@ namespace Hurricane { inline Layer::Mask& Technology::_getMetalMask () { return _metalMask; } -} // End of Hurricane namespace. +// ------------------------------------------------------------------- +// Class : "Hurricane::JsonTechnology". + + class JsonTechnology : public JsonDBo { + public: + static void initialize (); + JsonTechnology ( unsigned long flags ); + virtual ~JsonTechnology (); + virtual string getTypeName () const; + virtual JsonTechnology* clone ( unsigned long ) const; + virtual void toData ( JsonStack& ); + void addBlockageRef ( const std::string&, BasicLayer* ); + private: + std::map< string, vector > _blockagesMap; + }; + + +} // Hurricane namespace. INSPECTOR_P_SUPPORT(Hurricane::Technology); -#endif // __HURRICANE_TECHNOLOGY__ +#endif // HURRICANE_TECHNOLOGY_H diff --git a/hurricane/src/hurricane/hurricane/TransistorLayer.h b/hurricane/src/hurricane/hurricane/TransistorLayer.h index 3e619da8..6b8361ef 100644 --- a/hurricane/src/hurricane/hurricane/TransistorLayer.h +++ b/hurricane/src/hurricane/hurricane/TransistorLayer.h @@ -1,4 +1,3 @@ - // -*- C++ -*- // // Copyright (c) BULL S.A. 2000-2016, All Rights Reserved @@ -19,27 +18,19 @@ // License along with Hurricane. If not, see // . // -// =================================================================== -// -// $Id$ -// -// x-----------------------------------------------------------------x -// | | +// +-----------------------------------------------------------------+ // | 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 | // | | // | Author : Jean-Paul Chaput | // | E-mail : Jean-Paul.Chaput@lip6.fr | // | =============================================================== | -// | C++ Header : "./hurricane/TransistorLayer.h" | -// | *************************************************************** | -// | U p d a t e s | -// | | -// x-----------------------------------------------------------------x +// | C++ Header : "./hurricane/TransistorLayer.h" | +// +-----------------------------------------------------------------+ -#ifndef __HURRICANE_TRANSISTOR_LAYER__ -#define __HURRICANE_TRANSISTOR_LAYER__ +#ifndef HURRICANE_TRANSISTOR_LAYER_H +#define HURRICANE_TRANSISTOR_LAYER_H #include @@ -49,8 +40,12 @@ namespace Hurricane { +// ------------------------------------------------------------------- +// Class : "Hurricane::TransistorLayer". class TransistorLayer : public Layer { + public: + typedef Layer Super; public: // Constructor. @@ -71,6 +66,7 @@ namespace Hurricane { virtual void setExtentionCap ( const BasicLayer* layer, DbU::Unit cap ); virtual void setExtentionWidth ( const BasicLayer* layer, DbU::Unit width ); // Hurricane Managment. + virtual void _toJson ( JsonWriter* ) const; virtual void _onDbuChange ( float scale ); virtual string _getTypeName () const; virtual string _getString () const; @@ -96,6 +92,20 @@ namespace Hurricane { }; +// ------------------------------------------------------------------- +// Class : "Hurricane::JsonTransistorLayer". + + class JsonTransistorLayer : public JsonLayer { + public: + static void initialize (); + JsonTransistorLayer ( unsigned long flags ); + ~JsonTransistorLayer (); + virtual string getTypeName () const; + virtual JsonTransistorLayer* clone ( unsigned long ) const; + virtual void toData ( JsonStack& ); + }; + + } // End of Hurricane namespace. diff --git a/hurricane/src/hurricane/hurricane/ViaLayer.h b/hurricane/src/hurricane/hurricane/ViaLayer.h index 7b1264ad..bc643afb 100644 --- a/hurricane/src/hurricane/hurricane/ViaLayer.h +++ b/hurricane/src/hurricane/hurricane/ViaLayer.h @@ -1,4 +1,3 @@ - // -*- C++ -*- // // Copyright (c) BULL S.A. 2000-2016, All Rights Reserved @@ -19,12 +18,7 @@ // License along with Hurricane. If not, see // . // -// =================================================================== -// -// $Id$ -// -// x-----------------------------------------------------------------x -// | | +// +-----------------------------------------------------------------+ // | 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 | // | | @@ -32,14 +26,11 @@ // | E-mail : Jean-Paul.Chaput@lip6.fr | // | =============================================================== | // | C++ Header : "./hurricane/ViaLayer.h" | -// | *************************************************************** | -// | U p d a t e s | -// | | -// x-----------------------------------------------------------------x +// +-----------------------------------------------------------------+ -#ifndef __HURRICANE_VIA_LAYER__ -#define __HURRICANE_VIA_LAYER__ +#ifndef HURRICANE_VIA_LAYER_H +#define HURRICANE_VIA_LAYER_H #include @@ -49,8 +40,12 @@ namespace Hurricane { +// ------------------------------------------------------------------- +// Class : "Hurricane::ViaLayer". class ViaLayer : public Layer { + public: + typedef Layer Super; public: // Constructor. @@ -70,6 +65,7 @@ namespace Hurricane { // Updators. virtual void setEnclosure ( const BasicLayer* layer, DbU::Unit enclosure ); // Hurricane Managment. + virtual void _toJson ( JsonWriter* ) const; virtual void _onDbuChange ( float scale ); virtual string _getTypeName () const; virtual string _getString () const; @@ -92,6 +88,20 @@ namespace Hurricane { }; +// ------------------------------------------------------------------- +// Class : "Hurricane::JsonViaLayer". + + class JsonViaLayer : public JsonLayer { + public: + static void initialize (); + JsonViaLayer ( unsigned long flags ); + ~JsonViaLayer (); + virtual string getTypeName () const; + virtual JsonViaLayer* clone ( unsigned long ) const; + virtual void toData ( JsonStack& ); + }; + + } // End of Hurricane namespace. diff --git a/hurricane/src/isobar/PyNetExternalComponents.cpp b/hurricane/src/isobar/PyNetExternalComponents.cpp index ce160931..7363b42e 100644 --- a/hurricane/src/isobar/PyNetExternalComponents.cpp +++ b/hurricane/src/isobar/PyNetExternalComponents.cpp @@ -1,8 +1,7 @@ - // -*- C++ -*- // // This file is part of the Coriolis Software. -// Copyright (c) UPMC/LIP6 2008-2013, All Rights Reserved +// Copyright (c) UPMC 2008-2016, All Rights Reserved // // +-----------------------------------------------------------------+ // | C O R I O L I S | @@ -149,5 +148,5 @@ extern "C" { } // End of extern "C". -} // End of Isobar namespace. +} // Isobar namespace. diff --git a/hurricane/src/isobar/hurricane/isobar/PyHurricane.h b/hurricane/src/isobar/hurricane/isobar/PyHurricane.h index 9c92c116..51d590a0 100644 --- a/hurricane/src/isobar/hurricane/isobar/PyHurricane.h +++ b/hurricane/src/isobar/hurricane/isobar/PyHurricane.h @@ -1,7 +1,7 @@ // -*- C++ -*- // // This file is part of the Coriolis Software. -// Copyright (c) UPMC/LIP6 2008-2016, All Rights Reserved +// Copyright (c) UPMC 2008-2016, All Rights Reserved // // +-----------------------------------------------------------------+ // | C O R I O L I S | diff --git a/hurricane/src/isobar/hurricane/isobar/PyNetExternalComponents.h b/hurricane/src/isobar/hurricane/isobar/PyNetExternalComponents.h index d00a8205..046d53a4 100644 --- a/hurricane/src/isobar/hurricane/isobar/PyNetExternalComponents.h +++ b/hurricane/src/isobar/hurricane/isobar/PyNetExternalComponents.h @@ -1,11 +1,9 @@ - // -*- C++ -*- // // This file is part of the Coriolis Software. -// Copyright (c) UPMC/LIP6 2010-2010, All Rights Reserved +// Copyright (c) UPMC 2010-2016, All Rights Reserved // -// x-----------------------------------------------------------------x -// | | +// +-----------------------------------------------------------------+ // | C O R I O L I S | // | I s o b a r - Hurricane / Python Interface | // | | @@ -13,18 +11,11 @@ // | E-mail : Jean-Paul.Chaput@asim.lip6.fr | // | =============================================================== | // | C++ Header : "./PyNetExternalComponents.h" | -// | *************************************************************** | -// | U p d a t e s | -// | | -// x-----------------------------------------------------------------x +// +-----------------------------------------------------------------+ - - - -# ifndef __PY_NET_EXTERNAL_COMPONENTS__ -# define __PY_NET_EXTERNAL_COMPONENTS__ - +#ifndef PY_NET_EXTERNAL_COMPONENTS_H +#define PY_NET_EXTERNAL_COMPONENTS_H #include "hurricane/isobar/PyHurricane.h" #include "hurricane/NetExternalComponents.h" @@ -43,8 +34,6 @@ extern "C" { } PyNetExternalComponents; - - // ------------------------------------------------------------------- // Functions & Types exported to "PyHurricane.cpp". @@ -59,13 +48,9 @@ extern "C" { #define PYNETEXTERNALCOMPONENTS_O(v) ( PY_NET_EXTERNAL_COMPONENTS(v)->_object ) -} // End of extern "C". +} // extern "C". +} // Isobar namespace. -} // End of Isobar namespace. - - - - -# endif +#endif // PY_NET_EXTERNAL_COMPONENTS_H diff --git a/hurricane/src/viewer/CMakeLists.txt b/hurricane/src/viewer/CMakeLists.txt index 067890cd..79b996d6 100644 --- a/hurricane/src/viewer/CMakeLists.txt +++ b/hurricane/src/viewer/CMakeLists.txt @@ -58,6 +58,8 @@ hurricane/viewer/HierarchyCommand.h hurricane/viewer/SelectorCriterion.h hurricane/viewer/CellWidgets.h + hurricane/viewer/DesignBlob.h + hurricane/viewer/JsonConfiguration.h ) set( pyIncludes hurricane/viewer/PyHSVr.h hurricane/viewer/PyDrawingStyle.h @@ -114,6 +116,8 @@ DisplayFilterWidget.cpp ControllerWidget.cpp ScriptWidget.cpp + DesignBlob.cpp + JsonConfiguration.cpp ) set( pyCpps PyHSVr.cpp PyDrawingStyle.cpp diff --git a/hurricane/src/viewer/CellImage.cpp b/hurricane/src/viewer/CellImage.cpp index f2cdd794..5c037d57 100644 --- a/hurricane/src/viewer/CellImage.cpp +++ b/hurricane/src/viewer/CellImage.cpp @@ -69,7 +69,7 @@ namespace Hurricane { setCorner( Qt::BottomRightCorner, Qt::RightDockWidgetArea ); setCentralWidget( _cellWidget ); - _palette->build (); + _palette->readGraphics (); _cellWidget->bindToPalette( _palette ); _cellWidget->refresh(); diff --git a/hurricane/src/viewer/CellPrinter.cpp b/hurricane/src/viewer/CellPrinter.cpp index 40acd879..ba2e78aa 100644 --- a/hurricane/src/viewer/CellPrinter.cpp +++ b/hurricane/src/viewer/CellPrinter.cpp @@ -76,7 +76,7 @@ namespace Hurricane { setCorner( Qt::BottomRightCorner, Qt::RightDockWidgetArea ); setCentralWidget( _cellWidget ); - _palette->build (); + _palette->readGraphics (); _cellWidget->bindToPalette( _palette ); _cellWidget->refresh(); diff --git a/hurricane/src/viewer/CellViewer.cpp b/hurricane/src/viewer/CellViewer.cpp index 12d78b48..5d904650 100644 --- a/hurricane/src/viewer/CellViewer.cpp +++ b/hurricane/src/viewer/CellViewer.cpp @@ -36,7 +36,6 @@ #include "hurricane/DataBase.h" #include "hurricane/Library.h" #include "hurricane/Cell.h" -#include "hurricane/DesignBlob.h" //#include "MapView.h" #include "hurricane/isobar/PyCell.h" #include "hurricane/viewer/Script.h" @@ -49,6 +48,7 @@ #include "hurricane/viewer/ScriptWidget.h" #include "hurricane/viewer/ExceptionWidget.h" #include "hurricane/viewer/GotoWidget.h" +#include "hurricane/viewer/DesignBlob.h" #include "hurricane/viewer/OpenBlobDialog.h" #include "hurricane/viewer/SelectCommand.h" #include "hurricane/viewer/PyCellViewer.h" @@ -727,9 +727,15 @@ namespace Hurricane { QString blobName; if (OpenBlobDialog::runDialog(this,blobName)) { string fileName = blobName.toStdString() + ".blob"; - DebugSession::open( 50 ); - Cell* topCell = jsonBlobParse( fileName ); - DebugSession::close(); + //DebugSession::open( 50 ); + + Cell* topCell = NULL; + DesignBlob* blob = DesignBlob::fromJson( fileName ); + + if (blob) topCell = blob->getTopCell(); + delete blob; + + //DebugSession::close(); setCell ( topCell ); emit cellLoadedFromDisk( topCell ); diff --git a/hurricane/src/viewer/CellWidget.cpp b/hurricane/src/viewer/CellWidget.cpp index fc3b5fd7..ab186e52 100644 --- a/hurricane/src/viewer/CellWidget.cpp +++ b/hurricane/src/viewer/CellWidget.cpp @@ -1080,9 +1080,6 @@ namespace Hurricane { setMouseTracking ( true ); //_mapView = new MapView ( this ); - DataBase* database = DataBase::getDB(); - if ( database ) - _technology = database->getTechnology (); QFont font = Graphics::getNormalFont(); _textFontHeight = QFontMetrics(font).ascent(); @@ -1270,17 +1267,21 @@ namespace Hurricane { void CellWidget::_redraw ( QRect redrawArea ) { - // cerr << "CellWidget::redraw() - start " - // << _selectionHasChanged << " filter:" - // << _state->getQueryFilter() << endl; + //cerr << "CellWidget::redraw() - start " + // << _selectionHasChanged << " filter:" + // << _state->getQueryFilter() << endl; -// static bool timedout; -// static Timer timer; + //static bool timedout; + //static Timer timer; if ( not isVisible() ) return; -// timer.start (); -// timedout = false; + DataBase* database = DataBase::getDB(); + if ( database ) _technology = database->getTechnology (); + + //timer.start (); + //timedout = false; + _cellChanged = false; _redrawRectCount = 0; @@ -1409,26 +1410,26 @@ namespace Hurricane { popCursor (); repaint (); -// timer.stop (); -// cerr << "CellWidget::redraw() - " << _redrawRectCount -// << " in " << timer.getCombTime() << "s (" -// << setprecision(3) << (timer.getCombTime()/_redrawRectCount) << " s/r)"; -// if ( _drawingQuery.getGoCount() ) -// cerr << " " << _drawingQuery.getGoCount() -// << " (" << setprecision(3) << (timer.getCombTime()/_drawingQuery.getGoCount()) << " s/go)"; -// else -// cerr << " 0 Gos"; -// if ( _drawingQuery.getExtensionGoCount() ) -// cerr << " " << _drawingQuery.getExtensionGoCount() -// << " (" << setprecision(3) << (timer.getCombTime()/_drawingQuery.getExtensionGoCount()) << " s/ego)"; -// else -// cerr << " 0 eGos"; -// if ( _drawingQuery.getInstanceCount() ) -// cerr << " " << _drawingQuery.getInstanceCount() -// << " (" << setprecision(3) << (timer.getCombTime()/_drawingQuery.getInstanceCount()) << " s/inst)"; -// else -// cerr << " 0 Instances"; -// cerr << endl; + //timer.stop (); + //cerr << "CellWidget::redraw() - " << _redrawRectCount + // << " in " << timer.getCombTime() << "s (" + // << setprecision(3) << (timer.getCombTime()/_redrawRectCount) << " s/r)"; + //if ( _drawingQuery.getGoCount() ) + // cerr << " " << _drawingQuery.getGoCount() + // << " (" << setprecision(3) << (timer.getCombTime()/_drawingQuery.getGoCount()) << " s/go)"; + //else + // cerr << " 0 Gos"; + //if ( _drawingQuery.getExtensionGoCount() ) + // cerr << " " << _drawingQuery.getExtensionGoCount() + // << " (" << setprecision(3) << (timer.getCombTime()/_drawingQuery.getExtensionGoCount()) << " s/ego)"; + //else + // cerr << " 0 eGos"; + //if ( _drawingQuery.getInstanceCount() ) + // cerr << " " << _drawingQuery.getInstanceCount() + // << " (" << setprecision(3) << (timer.getCombTime()/_drawingQuery.getInstanceCount()) << " s/inst)"; + //else + // cerr << " 0 Instances"; + //cerr << endl; } diff --git a/hurricane/src/viewer/ControllerWidget.cpp b/hurricane/src/viewer/ControllerWidget.cpp index eedc305f..203d0d2a 100644 --- a/hurricane/src/viewer/ControllerWidget.cpp +++ b/hurricane/src/viewer/ControllerWidget.cpp @@ -73,6 +73,10 @@ namespace Hurricane { { } + void ControllerTab::graphicsUpdated () + { } + + // ------------------------------------------------------------------- // Class : "Hurricane::TabGraphics". @@ -99,6 +103,10 @@ namespace Hurricane { } + void TabGraphics::graphicsUpdated () + { _graphics->rereadGraphics(); } + + // ------------------------------------------------------------------- // Class : "Hurricane::TabDisplayFilter". @@ -135,7 +143,6 @@ namespace Hurricane { { //_palette->setOneColumn (); _palette->setObjectName ( "controller.tabPalette.palette" ); - _palette->build (); //_palette->setSectionVisible ( "Viewer", false ); QVBoxLayout* wLayout = new QVBoxLayout (); @@ -159,6 +166,10 @@ namespace Hurricane { } + void TabPalette::graphicsUpdated () + { _palette->rereadGraphics(); } + + // ------------------------------------------------------------------- // Class : "Hurricane::TabNetlist". @@ -489,8 +500,9 @@ namespace Hurricane { TabSettings::TabSettings ( QWidget* parent ) : ControllerTab (parent) + , _timestamp (0) , _configuration(Configuration::get()->buildWidget(ConfigurationWidget::Embedded)) - { + { setContentsMargins ( 5, 0, 5, 5 ); _configuration->setObjectName ( "controller.tabSettings.settings" ); @@ -506,6 +518,25 @@ namespace Hurricane { { } + void TabSettings::showEvent ( QShowEvent* ) + { + Configuration* conf = Configuration::get(); + + if (_timestamp < conf->getLayout().getTimestamp()) { + _timestamp = conf->getLayout().getTimestamp(); + + QLayoutItem* child = NULL; + while ( (child = layout()->takeAt(0)) != 0 ) { + layout()->removeWidget( child->widget() ); + delete child->widget(); + } + + _configuration = conf->buildWidget( ConfigurationWidget::Embedded ); + layout()->addWidget ( _configuration ); + } + } + + // TabSettings::TabSettings ( QWidget* parent ) // : ControllerTab(parent) // , _settings(new QTabWidget()) @@ -527,6 +558,7 @@ namespace Hurricane { ControllerWidget::ControllerWidget ( QWidget* parent ) : QTabWidget (parent) + , _observer (this) , _cellWidget (NULL) , _tabGraphics (new TabGraphics()) , _tabPalette (new TabPalette()) @@ -570,6 +602,8 @@ namespace Hurricane { connect( this , SIGNAL(currentChanged(int)), this, SLOT(updateTab(int)) ); connect( _tabSelection->getSelection(), SIGNAL(inspect(Occurrence&)) , _tabInspector , SLOT (setSelectionOccurrence(Occurrence&)) ); + + Graphics::getGraphics()->addObserver( &_observer ); resize( Graphics::toHighDpi(600), Graphics::toHighDpi(500) ); } @@ -617,4 +651,22 @@ namespace Hurricane { } + void ControllerWidget::graphicsUpdated () + { + for ( int i=0 ; i(widget(i)))->graphicsUpdated (); + } + + +// ------------------------------------------------------------------- +// Class : "ControllerWidget::GraphicsObserver". + + void ControllerWidget::GraphicsObserver::notify ( unsigned int flags ) + { + ControllerWidget* controller = getOwner(); + if (flags & Graphics::ChangedDisplayStyles) { + controller->graphicsUpdated(); + } + } + } // End of Hurricane namespace. diff --git a/hurricane/src/hurricane/DesignBlob.cpp b/hurricane/src/viewer/DesignBlob.cpp similarity index 64% rename from hurricane/src/hurricane/DesignBlob.cpp rename to hurricane/src/viewer/DesignBlob.cpp index c3ae5590..d6e4e2ce 100644 --- a/hurricane/src/hurricane/DesignBlob.cpp +++ b/hurricane/src/viewer/DesignBlob.cpp @@ -15,9 +15,13 @@ #include +#include "hurricane/JsonReader.h" +#include "hurricane/UpdateSession.h" #include "hurricane/DataBase.h" #include "hurricane/Cell.h" -#include "hurricane/DesignBlob.h" +#include "hurricane/viewer/Graphics.h" +#include "hurricane/viewer/DesignBlob.h" +#include "hurricane/viewer/JsonParameter.h" namespace Hurricane { @@ -32,13 +36,30 @@ namespace Hurricane { void DesignBlob::toJson( JsonWriter* w ) const { w->startObject(); - jsonWrite( w, "@typename", _getTypeName() ); - jsonWrite( w, "_topCell" , getTopCell()->getHierarchicalName() ); - jsonWrite( w, "_database", DataBase::getDB() ); + jsonWrite( w, "@typename" , _getTypeName() ); + jsonWrite( w, "_topCell" , getTopCell()->getHierarchicalName() ); + jsonWrite( w, "_database" , DataBase::getDB() ); + jsonWrite( w, "_graphics" , Graphics::getGraphics() ); + jsonWrite( w, "_configuration", Cfg::Configuration::get() ); w->endObject(); } + DesignBlob* DesignBlob::fromJson ( const string& filename ) + { + UpdateSession::open(); + + JsonReader reader ( JsonWriter::DesignBlobMode ); + reader.parse( filename ); + + UpdateSession::close(); + + const JsonStack& stack = reader.getStack(); + if (stack.rhas(".DesignBlob")) return stack.as(".DesignBlob"); + + return NULL; + } + // ------------------------------------------------------------------- // Class : "JsonDesignBlob". @@ -54,8 +75,10 @@ namespace Hurricane { { ltrace(51) << "JsonDesignblob::JsonDesignblob()" << endl; - add( "_topCell" , typeid(string) ); - add( "_database", typeid(DataBase*) ); + add( "_topCell" , typeid(string) ); + add( "_database" , typeid(DataBase*) ); + add( "_graphics" , typeid(Graphics*) ); + add( "_configuration", typeid(Cfg::Configuration*) ); } diff --git a/hurricane/src/viewer/DisplayStyle.cpp b/hurricane/src/viewer/DisplayStyle.cpp index 012366aa..2fe5be8a 100644 --- a/hurricane/src/viewer/DisplayStyle.cpp +++ b/hurricane/src/viewer/DisplayStyle.cpp @@ -1,8 +1,7 @@ - // -*- C++ -*- // // This file is part of the Coriolis Software. -// Copyright (c) UPMC/LIP6 2008-2012, All Rights Reserved +// Copyright (c) UPMC 2008-2016, All Rights Reserved // // +-----------------------------------------------------------------+ // | H U R R I C A N E | @@ -49,6 +48,8 @@ namespace Hurricane { const Name DisplayStyle::Undef = "undef"; +// ------------------------------------------------------------------- +// Class : "RawDrawingStyle". RawDrawingStyle::RawDrawingStyle ( const Name& name , const string& pattern @@ -73,6 +74,15 @@ namespace Hurricane { { } + RawDrawingStyle::~RawDrawingStyle () + { + if ( _color ) { + delete _color; + delete _pen; + delete _brush; + } + } + DrawingStyle RawDrawingStyle::create ( const Name& name , const string& pattern @@ -149,16 +159,114 @@ namespace Hurricane { } - RawDrawingStyle::~RawDrawingStyle () + void RawDrawingStyle::toJson ( JsonWriter* w ) const { - if ( _color ) { - delete _color; - delete _pen; - delete _brush; - } + w->startObject(); + jsonWrite( w, "@typename", "DrawingStyle" ); + jsonWrite( w, "_name" , _name ); + jsonWrite( w, "_red" , _red ); + jsonWrite( w, "_green" , _green ); + jsonWrite( w, "_blue" , _blue ); + jsonWrite( w, "_borderWidth", _borderWidth ); + jsonWrite( w, "_pattern" , _pattern ); + jsonWrite( w, "_threshold" , _threshold ); + jsonWrite( w, "_goMatched" , _goMatched ); + w->endObject(); } +// ------------------------------------------------------------------- +// Class : "JsonDrawingStyle". + + Initializer jsonDrawingStyleInit ( 0 ); + + + void JsonDrawingStyle::initialize () + { JsonTypes::registerType( new JsonDrawingStyle (JsonWriter::RegisterMode) ); } + + + JsonDrawingStyle::JsonDrawingStyle ( unsigned long flags ) + : JsonObject(flags) + { + if (flags & JsonWriter::RegisterMode) return; + + add( ".DrawingGroup", typeid(DrawingGroup) ); + add( "_name" , typeid(string) ); + add( "_red" , typeid(int64_t) ); + add( "_green" , typeid(int64_t) ); + add( "_blue" , typeid(int64_t) ); + add( "_borderWidth" , typeid(int64_t) ); + add( "_pattern" , typeid(string) ); + add( "_threshold" , typeid(double) ); + add( "_goMatched" , typeid(bool) ); + } + + + JsonDrawingStyle::~JsonDrawingStyle () + { } + + + string JsonDrawingStyle::getTypeName () const + { return "DrawingStyle"; } + + + JsonDrawingStyle* JsonDrawingStyle::clone ( unsigned long flags ) const + { return new JsonDrawingStyle ( flags ); } + + + void JsonDrawingStyle::toData(JsonStack& stack) + { + ltracein(51); + + check( stack, "JsonDrawingStyle::toData" ); + + DrawingGroup* dg = get( stack, ".DrawingGroup" ); + DrawingStyle ds; + + if (not dg) return; + + string name = get ( stack, "_name" ); + int red = get( stack, "_red" ); + int green = get( stack, "_green" ); + int blue = get( stack, "_blue" ); + int borderWidth = get( stack, "_borderWidth" ); + string pattern = get ( stack, "_pattern" ); + float threshold = get ( stack, "_threshold" ); + bool goMatched = get ( stack, "_goMatched" ); + + if (stack.issetFlags(JsonWriter::TechnoMode)) { + // Actual creation. + ds = RawDrawingStyle::create( name + , pattern + , red + , green + , blue + , borderWidth + , threshold + , goMatched + ); + dg->addDrawingStyle( ds ); + + if (Graphics::isEnabled()) dg->qtAllocate(); + } else { + // Check coherency with existing DrawingStyle. + ds = dg->find( name ); + if (ds == nullptr) { + cerr << Error( "JsonDrawingStyle::toData(): No DrawingStyle \"%s\" in the existing DisplayStyle." + , name.c_str() + ) << endl; + } + } + + update( stack, NULL ); + + ltraceout(51); + } + + +// ------------------------------------------------------------------- +// Class : "DrawingGroup". + DrawingGroup::DrawingGroup ( const Name& name ) : _name (name) , _drawingStyles() @@ -208,6 +316,17 @@ namespace Hurricane { } + void DrawingGroup::addDrawingStyle ( DrawingStyle ds ) + { + size_t i = findIndex ( ds->getName() ); + if ( i != InvalidIndex ) { + _drawingStyles[i] = ds; + } else { + _drawingStyles.push_back ( ds ); + } + } + + DrawingStyle DrawingGroup::addDrawingStyle ( const Name& key , const string& pattern , int red @@ -230,6 +349,91 @@ namespace Hurricane { } + void DrawingGroup::toJson ( JsonWriter* w ) const + { + w->startObject(); + jsonWrite( w, "@typename", "DrawingGroup" ); + jsonWrite( w, "_name", _name ); + + w->key( "+drawingStyles" ); + w->startArray(); + for ( DrawingStyle ds : _drawingStyles ) ds->toJson( w ); + w->endArray(); + + w->endObject(); + } + + +// ------------------------------------------------------------------- +// Class : "JsonDrawingGroup". + + Initializer jsonDrawingGroupInit ( 0 ); + + + void JsonDrawingGroup::initialize () + { JsonTypes::registerType( new JsonDrawingGroup (JsonWriter::RegisterMode) ); } + + + JsonDrawingGroup::JsonDrawingGroup ( unsigned long flags ) + : JsonObject(flags) + { + if (flags & JsonWriter::RegisterMode) return; + + add( ".DisplayStyle" , typeid(DisplayStyle*) ); + add( "_name" , typeid(string) ); + add( "+drawingStyles", typeid(JsonArray) ); + } + + + JsonDrawingGroup::~JsonDrawingGroup () + { } + + + string JsonDrawingGroup::getTypeName () const + { return "DrawingGroup"; } + + + JsonDrawingGroup* JsonDrawingGroup::clone ( unsigned long flags ) const + { return new JsonDrawingGroup ( flags ); } + + + void JsonDrawingGroup::toData(JsonStack& stack) + { + ltracein(51); + + check( stack, "JsonDrawingGroup::toData" ); + + DisplayStyle* ds = get( stack, ".DisplayStyle" ); + DrawingGroup* dg = NULL; + + if (not ds) return; + + string name = get( stack, "_name" ); + + if (stack.issetFlags(JsonWriter::TechnoMode)) { + // Actual creation. + size_t gi = 0; + ds->findOrCreate( name, gi ); + dg = ds->findGroup( name ); + } else { + // Check coherency with existing DrawingGroup. + dg = ds->findGroup( name ); + if (dg == NULL) { + cerr << Error( "JsonDrawingGroup::toData(): No DrawingGroup \"%s\" in the existing DisplayStyle." + , name.c_str() + ) << endl; + } + } + + update( stack, dg ); + + ltraceout(51); + } + + +// ------------------------------------------------------------------- +// Class : "DisplayStyle". + QColor DisplayStyle::darken ( const QColor& color, const DisplayStyle::HSVr& darkening ) { QColor hsvColor = color.toHsv(); @@ -332,6 +536,16 @@ namespace Hurricane { } + DrawingGroup* DisplayStyle::findGroup ( const Name& groupKey ) + { + for ( size_t gi=0 ; gi < _groups.size() ; gi++ ) { + if ( _groups[gi]->getName() == groupKey ) + return _groups[gi]; + } + return NULL; + } + + void DisplayStyle::findOrCreate ( const Name& groupKey, size_t& gi ) { for ( gi=0 ; gi < _groups.size() ; gi++ ) { @@ -428,4 +642,143 @@ namespace Hurricane { } -} + void DisplayStyle::toJson ( JsonWriter* w ) const + { + w->startObject(); + jsonWrite( w, "@typename", "DisplayStyle" ); + jsonWrite( w, "_name" , _name ); + jsonWrite( w, "_description", _description ); + jsonWrite( w, "_darkening" , &_darkening ); + + w->key( "+groups" ); + w->startArray(); + for ( DrawingGroup* dg : _groups ) dg->toJson( w ); + w->endArray(); + + w->endObject(); + } + + +// ------------------------------------------------------------------- +// Class : "JsonDisplayStyle". + + Initializer jsonDisplayStyleInit ( 0 ); + + + void JsonDisplayStyle::initialize () + { JsonTypes::registerType( new JsonDisplayStyle (JsonWriter::RegisterMode) ); } + + + JsonDisplayStyle::JsonDisplayStyle ( unsigned long flags ) + : JsonObject(flags) + { + if (flags & JsonWriter::RegisterMode) return; + + add( "_name" , typeid(string) ); + add( "_description", typeid(string) ); + add( "_darkening" , typeid(DisplayStyle::HSVr) ); + add( "+groups" , typeid(JsonArray) ); + } + + + JsonDisplayStyle::~JsonDisplayStyle () + { } + + + string JsonDisplayStyle::getTypeName () const + { return "DisplayStyle"; } + + + JsonDisplayStyle* JsonDisplayStyle::clone ( unsigned long flags ) const + { return new JsonDisplayStyle ( flags ); } + + + void JsonDisplayStyle::toData(JsonStack& stack) + { + ltracein(51); + + check( stack, "JsonDisplayStyle::toData" ); + + Graphics* graphics = get( stack, "_graphics" ); + DisplayStyle* ds = NULL; + + if (not graphics) return; + + string name = get ( stack, "_name" ); + string description = get ( stack, "_description" ); + DisplayStyle::HSVr* darkening = get( stack, "_darkening" ); + + if (stack.issetFlags(JsonWriter::TechnoMode)) { + // Actual creation. + ds = new DisplayStyle ( name ); + ds->setDescription( description ); + ds->setDarkening ( *darkening ); + graphics->addStyle( ds ); + } else { + // Check coherency with existing DisplayStyle. + ds = Graphics::getStyle( name ); + if (ds == NULL) { + cerr << Error( "JsonDisplayStyle::toData(): No DisplayStyle \"%s\" in the existing DisplayStyle." + , name.c_str() + ) << endl; + } + } + + update( stack, ds ); + + ltraceout(51); + } + + +// ------------------------------------------------------------------- +// Class : "JsonHSVr". + + Initializer jsonHSVrInit ( 0 ); + + + void JsonHSVr::initialize () + { JsonTypes::registerType( new JsonHSVr (JsonWriter::RegisterMode) ); } + + + JsonHSVr::JsonHSVr ( unsigned long flags ) + : JsonObject(flags) + { + if (flags & JsonWriter::RegisterMode) return; + + add( "_hue" , typeid(double) ); + add( "_saturation", typeid(double) ); + add( "_value" , typeid(double) ); + } + + + JsonHSVr::~JsonHSVr () + { } + + + string JsonHSVr::getTypeName () const + { return "HSVr"; } + + + JsonHSVr* JsonHSVr::clone ( unsigned long flags ) const + { return new JsonHSVr ( flags ); } + + + void JsonHSVr::toData(JsonStack& stack) + { + ltracein(51); + + check( stack, "JsonHSVr::toData" ); + + double hue = get( stack, "_hue" ); + double saturation = get( stack, "_saturation" ); + double value = get( stack, "_value" ); + + DisplayStyle::HSVr* hsvr = new DisplayStyle::HSVr(hue,saturation,value); + + update( stack, hsvr ); + + ltraceout(51); + } + + +} // Hurricane namespace. diff --git a/hurricane/src/viewer/Graphics.cpp b/hurricane/src/viewer/Graphics.cpp index 30cd18db..7ff0f59a 100644 --- a/hurricane/src/viewer/Graphics.cpp +++ b/hurricane/src/viewer/Graphics.cpp @@ -34,7 +34,8 @@ namespace Hurricane { Graphics::Graphics () - : _htmlTranslator () + : _observers () + , _htmlTranslator () , _styles () , _active (NULL) , _fireColorScale () @@ -70,6 +71,18 @@ namespace Hurricane { } + void Graphics::addObserver ( BaseObserver* observer ) + { getGraphics()->_observers.addObserver( observer ); } + + + void Graphics::removeObserver ( BaseObserver* observer ) + { getGraphics()->_observers.removeObserver( observer ); } + + + void Graphics::notify ( unsigned flags ) + { getGraphics()->_observers.notify( flags ); } + + Graphics* Graphics::getGraphics () { if (not _singleton) { @@ -351,6 +364,70 @@ namespace Hurricane { } + void Graphics::toJson ( JsonWriter* w ) const + { + w->startObject(); + jsonWrite( w, "@typename", "Graphics" ); + jsonWrite( w, "_active" , _active->getName() ); + + w->key( "+styles" ); + w->startArray(); + for ( DisplayStyle* ds : _styles ) ds->toJson( w ); + w->endArray(); + + w->endObject(); + } + + +// ------------------------------------------------------------------- +// Class : "JsonGraphics". + + Initializer jsonGraphicsInit ( 0 ); + + + void JsonGraphics::initialize () + { JsonTypes::registerType( new JsonGraphics (JsonWriter::RegisterMode) ); } + + + JsonGraphics::JsonGraphics ( unsigned long flags ) + : JsonObject(flags) + , _active () + { + if (flags & JsonWriter::RegisterMode) return; + + add( "_active", typeid(string) ); + add( "+groups", typeid(JsonArray) ); + } + + + JsonGraphics::~JsonGraphics () + { + Graphics* graphics = Graphics::getGraphics(); + graphics->setStyle( _active ); + graphics->notify ( Graphics::ChangedDisplayStyles ); + } + + + string JsonGraphics::getTypeName () const + { return "Graphics"; } + + + JsonGraphics* JsonGraphics::clone ( unsigned long flags ) const + { return new JsonGraphics ( flags ); } + + + void JsonGraphics::toData(JsonStack& stack) + { + ltracein(51); + + check( stack, "JsonGraphics::toData" ); + + _active = get( stack, "_active" ); + + update( stack, Graphics::getGraphics() ); + + ltraceout(51); + } } // End of Hurricane namespace. diff --git a/hurricane/src/viewer/GraphicsWidget.cpp b/hurricane/src/viewer/GraphicsWidget.cpp index dc88e877..6f58f58c 100644 --- a/hurricane/src/viewer/GraphicsWidget.cpp +++ b/hurricane/src/viewer/GraphicsWidget.cpp @@ -35,19 +35,34 @@ namespace Hurricane { GraphicsWidget::GraphicsWidget ( QWidget* parent ) : QWidget (parent) , _cellWidget (NULL) + , _stylesGrid (new QGridLayout()) + , _stylesGroup(new QButtonGroup()) , _updateState(ExternalEmit) { setAttribute ( Qt::WA_QuitOnClose, false ); setWindowTitle ( tr("Display Styles") ); setFont ( Graphics::getNormalFont(true) ); - QButtonGroup* group = new QButtonGroup (); QGroupBox* groupBox = new QGroupBox ( tr("Display Styles") ); - QGridLayout* gLayout = new QGridLayout (); QVBoxLayout* wLayout = new QVBoxLayout (); - const vector& styles = Graphics::getStyles (); - DisplayStyle* activeStyle = Graphics::getStyle (); + if (Graphics::isHighDpi()) _stylesGrid->setContentsMargins( 30, 30, 30, 30 ); + + groupBox->setLayout ( _stylesGrid ); + wLayout->addWidget ( groupBox ); + wLayout->addStretch (); + setLayout ( wLayout ); + + connect ( _stylesGroup, SIGNAL(buttonClicked(int)), this, SLOT(setStyle(int)) ); + + readGraphics (); + } + + + void GraphicsWidget::readGraphics () + { + const vector& styles = Graphics::getStyles (); + DisplayStyle* activeStyle = Graphics::getStyle (); size_t hideFallback = (styles.size() > 1) ? 1 : 0; for ( size_t istyle=hideFallback ; istyle < styles.size() ; istyle++ ) { @@ -59,18 +74,10 @@ namespace Hurricane { label->setText ( styles[istyle]->getDescription().c_str() ); label->setFont ( Graphics::getNormalFont() ); - gLayout->addWidget ( button, istyle-hideFallback, 0 ); - gLayout->addWidget ( label , istyle-hideFallback, 1 ); - group->addButton ( button, istyle ); + _stylesGrid ->addWidget ( button, istyle-hideFallback, 0 ); + _stylesGrid ->addWidget ( label , istyle-hideFallback, 1 ); + _stylesGroup->addButton ( button, istyle ); } - if (Graphics::isHighDpi()) gLayout->setContentsMargins( 30, 30, 30, 30 ); - - groupBox->setLayout ( gLayout ); - wLayout->addWidget ( groupBox ); - wLayout->addStretch (); - setLayout ( wLayout ); - - connect ( group, SIGNAL(buttonClicked(int)), this, SLOT(setStyle(int)) ); } @@ -109,5 +116,22 @@ namespace Hurricane { } + void GraphicsWidget::resetGraphics () + { + QLayoutItem* child = NULL; + while ( (child = _stylesGrid->takeAt(0)) != 0 ) { + _stylesGrid->removeWidget( child->widget() ); + delete child->widget(); + } + } -} + + void GraphicsWidget::rereadGraphics () + { + resetGraphics(); + readGraphics(); + //setStyle( 0 ); + } + + +} // Hurricane namespace. diff --git a/hurricane/src/viewer/JsonConfiguration.cpp b/hurricane/src/viewer/JsonConfiguration.cpp new file mode 100644 index 00000000..092c8cf0 --- /dev/null +++ b/hurricane/src/viewer/JsonConfiguration.cpp @@ -0,0 +1,523 @@ +// -*- C++ -*- +// +// This file is part of the Coriolis Software. +// Copyright (c) UPMC 2016-2016, 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 : "./JsonConfiguration.cpp" | +// +-----------------------------------------------------------------+ + + +#include "vlsisapd/configuration/LayoutDescription.h" +#include "hurricane/Error.h" +#include "hurricane/viewer/JsonConfiguration.h" + + +void jsonWrite ( JsonWriter* w, const Cfg::Parameter* p ) +{ + w->startObject(); + jsonWrite( w, "@typename", "Cfg::Parameter" ); + jsonWrite( w, "_id" , p->getId() ); + jsonWrite( w, "_type" , Cfg::Parameter::typeToString(p->getType()) ); + jsonWrite( w, "_priority", Cfg::Parameter::priorityToString(p->getPriority()) ); + jsonWrite( w, "_value" , p->asString() ); + jsonWrite( w, "_flags" , p->getFlags() ); + + if (p->getType() == Cfg::Parameter::Int) { + if (p->hasMin()) jsonWrite( w, "_minInt", p->getMinInt() ); + if (p->hasMax()) jsonWrite( w, "_maxInt", p->getMaxInt() ); + } + if (p->getType() == Cfg::Parameter::Double) { + if (p->hasMin()) jsonWrite( w, "_minDouble", p->getMinDouble() ); + if (p->hasMax()) jsonWrite( w, "_maxDouble", p->getMaxDouble() ); + } + + jsonWrite( w, "+values", p->getValues() ); + + w->key( "+slaves" ); + w->startArray(); + for ( std::string slave : p->getSlaves() ) { + w->startObject(); + jsonWrite( w, "@typename", "Cfg::Parameter::Slave" ); + jsonWrite( w, "_id" , slave ); + w->endObject(); + } + w->endArray(); + + w->endObject(); +} + + +void jsonWrite ( JsonWriter* w, const Cfg::Parameter::EnumValue v ) +{ + w->startObject(); + jsonWrite( w, "@typename", "Cfg::Parameter::EnumValue" ); + jsonWrite( w, "_label" , v._label ); + jsonWrite( w, "_value" , v._value ); + w->endObject(); +} + + +void jsonWrite ( JsonWriter* w, const Cfg::Configuration* cfg ) +{ + w->startObject(); + jsonWrite( w, "@typename" , "Cfg::Configuration" ); + jsonWrite( w, "+parameters", cfg->getParameters() ); + jsonWrite( w, "+layout" , &cfg->getLayout () ); + w->endObject(); +} + + +void jsonWrite ( JsonWriter* w, const Cfg::WidgetDescription* widget ) +{ + w->startObject(); + jsonWrite( w, "@typename", "Cfg::WidgetDescription" ); + jsonWrite( w, "_type" , Cfg::WidgetDescription::typeToString(widget->getType()) ); + jsonWrite( w, "_id" , widget->getId () ); + jsonWrite( w, "_label" , widget->getLabel () ); + jsonWrite( w, "_column" , widget->getColumn() ); + jsonWrite( w, "_span" , widget->getSpan () ); + jsonWrite( w, "_flags" , widget->getFlags () ); + w->endObject(); +} + + +void jsonWrite ( JsonWriter* w, const Cfg::TabDescription* tab ) +{ + w->startObject(); + jsonWrite( w, "@typename", "Cfg::TabDescription" ); + jsonWrite( w, "_name" , tab->getName() ); + jsonWrite( w, "_id" , tab->getId() ); + jsonWrite( w, "+widgets" , tab->getWidgets() ); + w->endObject(); +} + + +void jsonWrite ( JsonWriter* w, const Cfg::LayoutDescription* layout ) +{ + w->startObject(); + jsonWrite( w, "@typename", "Cfg::LayoutDescription" ); + jsonWrite( w, "+tabs" , layout->getTabs() ); + w->endObject(); +} + + +namespace Hurricane { + + using Cfg::Parameter; + using Cfg::Configuration; + using Cfg::LayoutDescription; + using Cfg::TabDescription; + using Cfg::WidgetDescription; + + +// ------------------------------------------------------------------- +// Class : "JsonConfiguration" + + Initializer jsonConfigurationInit ( 0 ); + + + void JsonConfiguration::initialize () + { JsonTypes::registerType( new JsonConfiguration (JsonWriter::RegisterMode) ); } + + + JsonConfiguration::JsonConfiguration( unsigned long flags ) + : JsonObject(flags) + { + add( "+parameters", typeid(JsonArray) ); + } + + + string JsonConfiguration::getTypeName () const + { return "Cfg::Configuration"; } + + + JsonConfiguration* JsonConfiguration::clone ( unsigned long flags ) const + { return new JsonConfiguration ( flags ); } + + + void JsonConfiguration::toData ( JsonStack& stack ) + { + check( stack, "JsonConfiguration::toData" ); + + Configuration* cfg = Configuration::get(); + + update( stack, cfg ); + } + + +// ------------------------------------------------------------------- +// Class : "JsonParameter" + + Initializer jsonParameterInit ( 0 ); + + + void JsonParameter::initialize () + { JsonTypes::registerType( new JsonParameter (JsonWriter::RegisterMode) ); } + + + JsonParameter::JsonParameter ( unsigned long flags ) + : JsonObject(flags) + { + add( "_id" , typeid(string) ); + add( "_type" , typeid(string) ); + add( "_priority", typeid(string) ); + add( "_value" , typeid(string) ); + add( "_flags" , typeid(int64_t) ); + add( "+values" , typeid(JsonArray) ); + add( "+slaves" , typeid(JsonArray) ); + } + + + string JsonParameter::getTypeName () const + { return "Cfg::Parameter"; } + + + JsonParameter* JsonParameter::clone ( unsigned long flags ) const + { return new JsonParameter ( flags ); } + + + void JsonParameter::toData ( JsonStack& stack ) + { + check( stack, "JsonParameter::toData" ); + + Configuration* cfg = get( stack, "_configuration" ); + + Parameter* param = NULL; + string id = get ( stack, "_id" ); + string stype = get ( stack, "_type" ); + string spriority = get ( stack, "_priority" ); + string value = get ( stack, "_value" ); + int flags = get( stack, "_flags" ); + + Parameter::Type type = Parameter::stringToType (stype); + Parameter::Priority priority = Parameter::stringToPriority(spriority); + + param = cfg->getParameter( id ); + if (not param) { + param = cfg->addParameter( id, type, value, priority ); + } else { + if (param->getType() != type) { + cerr << Error( "JsonParameter::toData(): Type incoherency on parameter \"%s\", not restored." + , id.c_str() ) << endl; + } + param->setRawString( value, Parameter::Interactive ); + param->setPriority( priority ); + } + + if (type == Parameter::Int) { + if (flags & Parameter::HasMin) { + add( "_minInt", typeid(int64_t) ); + param->setMin( (int)get( stack, "_minInt" ), Parameter::Interactive ); + } + if (flags & Parameter::HasMax) { + add( "_maxInt", typeid(int64_t) ); + param->setMax( (int)get( stack, "_maxInt" ), Parameter::Interactive ); + } + } + + if (type == Parameter::Double) { + if (flags & Parameter::HasMin) { + add( "_minDouble", typeid(int64_t) ); + param->setMin( (double)get( stack, "_minDouble" ), Parameter::Interactive ); + } + if (flags & Parameter::HasMax) { + add( "_maxDouble", typeid(int64_t) ); + param->setMax( (double)get( stack, "_maxDouble" ), Parameter::Interactive ); + } + } + + if (param) param->valueChanged(); + + update( stack, param ); + } + + +// ------------------------------------------------------------------- +// Class : "JsonParamEnumValue" + + Initializer jsonParamEnumValueInit ( 0 ); + + + void JsonParamEnumValue::initialize () + { JsonTypes::registerType( new JsonParamEnumValue (JsonWriter::RegisterMode) ); } + + + JsonParamEnumValue::JsonParamEnumValue ( unsigned long flags ) + : JsonObject(flags) + { + add( "_label", typeid(string) ); + add( "_value", typeid(int64_t) ); + } + + + string JsonParamEnumValue::getTypeName () const + { return "Cfg::Parameter::EnumValue"; } + + + JsonParamEnumValue* JsonParamEnumValue::clone ( unsigned long flags ) const + { return new JsonParamEnumValue ( flags ); } + + + void JsonParamEnumValue::toData ( JsonStack& stack ) + { + check( stack, "JsonParamEnumValue::toData" ); + + Parameter* param = get( stack, ".Cfg::Parameter" ); + string label = get ( stack, "_label" ); + int value = get ( stack, "_value" ); + + if (not param) { + cerr << Error( "JsonParamEnumValue::toData(): Missing \".Cfg::Parameter\" in stack context.\n" + " (while reading Cfg::Parameter::EnumValue \"%s\")" + , label.c_str() + ) << endl; + } else { + if (stack.issetFlags(JsonWriter::TechnoMode)) { + param->addValue( label, value ); + } + } + + update( stack, NULL ); + } + + +// ------------------------------------------------------------------- +// Class : "JsonParamSlave" + + Initializer jsonParamSlaveInit ( 0 ); + + + void JsonParamSlave::initialize () + { JsonTypes::registerType( new JsonParamSlave (JsonWriter::RegisterMode) ); } + + + JsonParamSlave::JsonParamSlave ( unsigned long flags ) + : JsonObject(flags) + { + add( "_id", typeid(string) ); + } + + + string JsonParamSlave::getTypeName () const + { return "Cfg::Parameter::Slave"; } + + + JsonParamSlave* JsonParamSlave::clone ( unsigned long flags ) const + { return new JsonParamSlave ( flags ); } + + + void JsonParamSlave::toData ( JsonStack& stack ) + { + check( stack, "JsonParamSlave::toData" ); + + Parameter* param = get( stack, ".Cfg::Parameter" ); + string id = get ( stack, "_id " ); + + if (not param) { + cerr << Error( "JsonParamSlave::toData(): Missing \".Cfg::Parameter\" in stack context.\n" + " (while reading Cfg::Parameter::Slave \"%s\")" + , id.c_str() + ) << endl; + } else { + if (stack.issetFlags(JsonWriter::TechnoMode)) { + param->addSlave( id ); + } + } + + update( stack, NULL ); + } + + +// ------------------------------------------------------------------- +// Class : "JsonWidgetDescription" + + Initializer jsonWidgetDescriptionInit ( 0 ); + + + void JsonWidgetDescription::initialize () + { JsonTypes::registerType( new JsonWidgetDescription (JsonWriter::RegisterMode) ); } + + + JsonWidgetDescription::JsonWidgetDescription ( unsigned long flags ) + : JsonObject(flags) + { + add( ".Cfg::TabDescription", typeid(Cfg::TabDescription*) ); + add( "_type" , typeid(string) ); + add( "_id" , typeid(string) ); + add( "_label" , typeid(string) ); + add( "_column" , typeid(int64_t) ); + add( "_span" , typeid(int64_t) ); + add( "_flags" , typeid(int64_t) ); + } + + + string JsonWidgetDescription::getTypeName () const + { return "Cfg::WidgetDescription"; } + + + JsonWidgetDescription* JsonWidgetDescription::clone ( unsigned long flags ) const + { return new JsonWidgetDescription ( flags ); } + + + void JsonWidgetDescription::toData ( JsonStack& stack ) + { + check( stack, "JsonWidgetDescription::toData" ); + + LayoutDescription* layout = get( stack, "+layout" ); + TabDescription* tab = get ( stack, ".Cfg::TabDescription" ); + + WidgetDescription* widget = NULL; + string stype = get ( stack, "_type" ); + string id = get ( stack, "_id" ); + string label = get ( stack, "_label" ); + int column = get( stack, "_column" ); + int span = get( stack, "_span" ); + int flags = get( stack, "_flags" ); + + WidgetDescription::Type type = WidgetDescription::stringToType(stype); + + if (not layout) { + cerr << Error( "JsonWidgetDescription::toData(): Missing \"+layout\" in stack context.\n" + " (while reading \"%s\")" + , id.c_str() + ) << endl; + } else if (not tab) { + cerr << Error( "JsonWidgetDescription::toData(): Missing \".Cfg::TabDescription\" in stack context.\n" + " (while reading \"%s\")" + , id.c_str() + ) << endl; + } else { + if (stack.issetFlags(JsonWriter::TechnoMode)) { + switch ( type ) { + case WidgetDescription::Rule: layout->addRule ( tab->getName() ); break; + case WidgetDescription::Title: layout->addTitle ( tab->getName(), label ); break; + case WidgetDescription::Section: layout->addSection( tab->getName(), label, column ); break; + case WidgetDescription::Parameter: + layout->addParameter( tab->getName(), id, label, column, span, flags ); + widget = layout->getWidget( id ); + break; + } + } else { + // Coherency checking only. + if (type == WidgetDescription::Parameter) { + widget = layout->getWidget( id ); + if (not widget) { + cerr << Error( "JsonWidgetDescription::toData(): Parameter id=\"%s\" has no layout." + , id.c_str() ) << endl; + } + } + } + } + + update( stack, widget ); + } + + +// ------------------------------------------------------------------- +// Class : "JsonTabDescription" + + Initializer jsonTabDescriptionInit ( 0 ); + + + void JsonTabDescription::initialize () + { JsonTypes::registerType( new JsonTabDescription (JsonWriter::RegisterMode) ); } + + + JsonTabDescription::JsonTabDescription ( unsigned long flags ) + : JsonObject(flags) + { + add( "_name" , typeid(string) ); + add( "_id" , typeid(string) ); + add( "+widgets", typeid(JsonArray) ); + } + + + string JsonTabDescription::getTypeName () const + { return "Cfg::TabDescription"; } + + + JsonTabDescription* JsonTabDescription::clone ( unsigned long flags ) const + { return new JsonTabDescription ( flags ); } + + + void JsonTabDescription::toData ( JsonStack& stack ) + { + check( stack, "JsonTabDescription::toData" ); + + LayoutDescription* layout = get( stack, "+layout" ); + + TabDescription* tab = NULL; + string id = get( stack, "_id" ); + string name = get( stack, "_name" ); + + if (not layout) { + cerr << Error( "JsonTabDescription::toData(): Missing \"+layout\" in stack context.\n" + " (while reading TabDescription \"%s\")" + , id.c_str() + ) << endl; + } else { + if (stack.issetFlags(JsonWriter::TechnoMode)) { + layout->addTab( name, id ); + tab = layout->getTab( name, id ); + } else { + // Coherency checking only. + tab = layout->getTab( name, id ); + if (not tab) { + cerr << Error( "JsonTabDescription::toData(): Tab name=\"%s\", id=\"%s\" has no layout." + , name.c_str(), id.c_str() ) << endl; + } + } + } + + update( stack, tab ); + } + + +// ------------------------------------------------------------------- +// Class : "JsonLayoutDescription" + + Initializer jsonLayoutDescriptionInit ( 0 ); + + + void JsonLayoutDescription::initialize () + { JsonTypes::registerType( new JsonLayoutDescription (JsonWriter::RegisterMode) ); } + + + JsonLayoutDescription::JsonLayoutDescription ( unsigned long flags ) + : JsonObject(flags) + { + add( "+tabs", typeid(JsonArray) ); + } + + + JsonLayoutDescription::~JsonLayoutDescription () + { + } + + + string JsonLayoutDescription::getTypeName () const + { return "Cfg::LayoutDescription"; } + + + JsonLayoutDescription* JsonLayoutDescription::clone ( unsigned long flags ) const + { return new JsonLayoutDescription ( flags ); } + + + void JsonLayoutDescription::toData ( JsonStack& stack ) + { + check( stack, "JsonLayoutDescription::toData" ); + + LayoutDescription* layout = &Configuration::get()->getLayout(); + + update( stack, layout ); + } + + +} // Hurricane namespace. diff --git a/hurricane/src/viewer/JsonParameter.cpp b/hurricane/src/viewer/JsonParameter.cpp new file mode 100644 index 00000000..32f2f00e --- /dev/null +++ b/hurricane/src/viewer/JsonParameter.cpp @@ -0,0 +1,185 @@ +// -*- C++ -*- +// +// This file is part of the Coriolis Software. +// Copyright (c) UPMC 2016-2016, 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 : "./JsonParameter.cpp" | +// +-----------------------------------------------------------------+ + + +#include "hurricane/Error.h" +#include "hurricane/viewer/JsonParameter.h" + + +void jsonWrite ( JsonWriter* w, const Cfg::Configuration* cfg ) +{ + w->startObject(); + jsonWrite( w, "@typename" , "Cfg::Configuration" ); + jsonWrite( w, "+parameters", cfg->getParameters() ); + + // w->key( "+parameters" ); + // w->startArray(); + // for ( auto mapElement : cfg->getParameters() ) jsonWrite( w, mapElement.second ); + // w->endArray(); + + w->endObject(); +} + + +void jsonWrite ( JsonWriter* w, const Cfg::Parameter* p ) +{ + w->startObject(); + jsonWrite( w, "@typename", "Cfg::Parameter" ); + jsonWrite( w, "_id" , p->getId() ); + jsonWrite( w, "_type" , Cfg::Parameter::typeToString(p->getType()) ); + jsonWrite( w, "_priority", Cfg::Parameter::priorityToString(p->getPriority()) ); + jsonWrite( w, "_value" , p->asString() ); + jsonWrite( w, "_flags" , p->getFlags() ); + + if (p->getType() == Cfg::Parameter::Int) { + if (p->hasMin()) jsonWrite( w, "_minInt", p->getMinInt() ); + if (p->hasMax()) jsonWrite( w, "_maxInt", p->getMaxInt() ); + } + if (p->getType() == Cfg::Parameter::Double) { + if (p->hasMin()) jsonWrite( w, "_minDouble", p->getMinDouble() ); + if (p->hasMax()) jsonWrite( w, "_maxDouble", p->getMaxDouble() ); + } + + w->endObject(); +} + + + +namespace Hurricane { + + using Cfg::Parameter; + using Cfg::Configuration; + + +// ------------------------------------------------------------------- +// Class : "JsonConfiguration" + + Initializer jsonConfigurationInit ( 0 ); + + + void JsonConfiguration::initialize () + { JsonTypes::registerType( new JsonConfiguration (JsonWriter::RegisterMode) ); } + + + JsonConfiguration::JsonConfiguration( unsigned long flags ) + : JsonObject(flags) + { + add( "+parameters", typeid(JsonArray) ); + } + + + string JsonConfiguration::getTypeName () const + { return "Cfg::Configuration"; } + + + JsonConfiguration* JsonConfiguration::clone ( unsigned long flags ) const + { return new JsonConfiguration ( flags ); } + + + void JsonConfiguration::toData ( JsonStack& stack ) + { + check( stack, "JsonConfiguration::toData" ); + + Configuration* cfg = Configuration::get(); + + update( stack, cfg ); + } + + +// ------------------------------------------------------------------- +// Class : "JsonParameter" + + Initializer jsonParameterInit ( 0 ); + + + void JsonParameter::initialize () + { JsonTypes::registerType( new JsonParameter (JsonWriter::RegisterMode) ); } + + + JsonParameter::JsonParameter( unsigned long flags ) + : JsonObject(flags) + { + add( "_id" , typeid(string) ); + add( "_type" , typeid(string) ); + add( "_priority", typeid(string) ); + add( "_value" , typeid(string) ); + add( "_flags" , typeid(int64_t) ); + } + + + string JsonParameter::getTypeName () const + { return "Cfg::Parameter"; } + + + JsonParameter* JsonParameter::clone ( unsigned long flags ) const + { return new JsonParameter ( flags ); } + + + void JsonParameter::toData ( JsonStack& stack ) + { + check( stack, "JsonParameter::toData" ); + + Configuration* cfg = get( stack, "_configuration" ); + + Parameter* param = NULL; + string id = get ( stack, "_id" ); + string stype = get ( stack, "_type" ); + string spriority = get ( stack, "_priority" ); + string value = get ( stack, "_value" ); + int flags = get( stack, "_flags" ); + + Parameter::Type type = Parameter::stringToType (stype); + Parameter::Priority priority = Parameter::stringToPriority(spriority); + + param = cfg->getParameter( id ); + if (not param) { + param = cfg->addParameter( id, type, value, priority ); + } else { + if (param->getType() != type) { + cerr << Error( "JsonParameter::toData(): Type incoherency on parameter \"%s\", not restored." + , id.c_str() ) << endl; + } + param->setRawString( value, Parameter::Interactive ); + param->setPriority( priority ); + } + + if (type == Parameter::Int) { + if (flags & Parameter::HasMin) { + add( "_minInt", typeid(int64_t) ); + param->setMin( (int)get( stack, "_minInt" ), Parameter::Interactive ); + } + if (flags & Parameter::HasMax) { + add( "_maxInt", typeid(int64_t) ); + param->setMax( (int)get( stack, "_maxInt" ), Parameter::Interactive ); + } + } + + if (type == Parameter::Double) { + if (flags & Parameter::HasMin) { + add( "_minDouble", typeid(int64_t) ); + param->setMin( (double)get( stack, "_minDouble" ), Parameter::Interactive ); + } + if (flags & Parameter::HasMax) { + add( "_maxDouble", typeid(int64_t) ); + param->setMax( (double)get( stack, "_maxDouble" ), Parameter::Interactive ); + } + } + + update( stack, param ); + } + + + +} // Hurricane namespace. diff --git a/hurricane/src/viewer/PaletteNamedItem.cpp b/hurricane/src/viewer/PaletteNamedItem.cpp index d2a63e81..d7bde314 100644 --- a/hurricane/src/viewer/PaletteNamedItem.cpp +++ b/hurricane/src/viewer/PaletteNamedItem.cpp @@ -1,15 +1,9 @@ - // -*- C++ -*- // // This file is part of the Coriolis Software. -// Copyright (c) UPMC/LIP6 2008-2016, All Rights Reserved +// Copyright (c) UPMC 2008-2016, All Rights Reserved // -// =================================================================== -// -// $Id$ -// -// x-----------------------------------------------------------------x -// | | +// +-----------------------------------------------------------------+ // | 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 | // | | @@ -17,10 +11,7 @@ // | E-mail : Jean-Paul.Chaput@asim.lip6.fr | // | =============================================================== | // | C++ Module : "./PaletteNamedItem.cpp" | -// | *************************************************************** | -// | U p d a t e s | -// | | -// x-----------------------------------------------------------------x +// +-----------------------------------------------------------------+ #include diff --git a/hurricane/src/viewer/PaletteWidget.cpp b/hurricane/src/viewer/PaletteWidget.cpp index 1cc5b1e4..2091161f 100644 --- a/hurricane/src/viewer/PaletteWidget.cpp +++ b/hurricane/src/viewer/PaletteWidget.cpp @@ -1,7 +1,7 @@ // -*- C++ -*- // // This file is part of the Coriolis Software. -// Copyright (c) UPMC/LIP6 2008-2016, All Rights Reserved +// Copyright (c) UPMC 2008-2016, All Rights Reserved // // +-----------------------------------------------------------------+ // | H U R R I C A N E | @@ -62,13 +62,16 @@ namespace { }; - GridBuffer::GridBuffer ( QGridLayout* grid, size_t maxRow, size_t startRow, size_t startColumn ) - : _grid (grid) - , _rowMax (maxRow) - , _row (startRow) - , _column (startColumn) - , _widgets() - , _aligns () + GridBuffer::GridBuffer ( QGridLayout* grid + , size_t maxRow + , size_t startRow + , size_t startColumn ) + : _grid (grid) + , _rowMax (maxRow) + , _row (startRow) + , _column (startColumn) + , _widgets () + , _aligns () { } @@ -123,6 +126,9 @@ namespace { namespace Hurricane { +// ------------------------------------------------------------------- +// Class : "PaletteWidget". + QWidget* PaletteWidget::_createGroupItem ( const Name& name ) { QLabel* groupLabel = new QLabel (); @@ -218,10 +224,12 @@ namespace Hurricane { vLayout->addWidget ( _scrollArea ); setLayout ( vLayout ); + + readGraphics (); } - void PaletteWidget::build () + void PaletteWidget::readGraphics () { GridBuffer gridBuffer ( _grid, _columnHeight ); @@ -299,19 +307,20 @@ namespace Hurricane { void PaletteWidget::updateExtensions ( Cell* cell ) { - _grid->removeWidget ( _extensionGroup ); - //_extensionGroup->deleteLater (); - delete _extensionGroup; - _extensionGroup = NULL; + if (_extensionGroup) { + _grid->removeWidget ( _extensionGroup ); + //_extensionGroup->deleteLater (); + delete _extensionGroup; + _extensionGroup = NULL; - PaletteItems::iterator iextension = _extensionGoItems.begin(); - for ( ; iextension != _extensionGoItems.end() ; ++iextension ) { - _grid->removeWidget ( iextension->second ); - //iextension->second->deleteLater (); - delete iextension->second; + PaletteItems::iterator iextension = _extensionGoItems.begin(); + for ( ; iextension != _extensionGoItems.end() ; ++iextension ) { + _grid->removeWidget ( iextension->second ); + //iextension->second->deleteLater (); + delete iextension->second; + } + _extensionGoItems.clear (); } - _extensionGoItems.clear (); - GridBuffer gridBuffer ( _grid, _columnHeight, _extensionRow, _extensionColumn ); _extensionGroup = _createGroupItem ( "Extensions" ); @@ -328,6 +337,28 @@ namespace Hurricane { } + void PaletteWidget::resetGraphics () + { + QLayoutItem* child = NULL; + while ( (child = _grid->takeAt(0)) != 0 ) { + _grid->removeWidget( child->widget() ); + delete child->widget(); + } + + _layerItems.clear(); + _extensionGroup = NULL; + _extensionGoItems.clear(); + + } + + + void PaletteWidget::rereadGraphics () + { + resetGraphics(); + readGraphics(); + } + + void PaletteWidget::_getSection ( const QString section, QLabel*& label, vector& items ) const { label = NULL; diff --git a/hurricane/src/viewer/hurricane/viewer/ControllerWidget.h b/hurricane/src/viewer/hurricane/viewer/ControllerWidget.h index 389cf806..c611055d 100644 --- a/hurricane/src/viewer/hurricane/viewer/ControllerWidget.h +++ b/hurricane/src/viewer/hurricane/viewer/ControllerWidget.h @@ -1,4 +1,3 @@ - // -*- C++ -*- // // This file is part of the Coriolis Software. @@ -19,7 +18,7 @@ #define HURRICANE_CONTROLLER_WIDGET_H -#include +#include class QCheckBox; class QComboBox; @@ -27,7 +26,8 @@ namespace Cfg { class ConfigurationWidget; } -#include "hurricane/Occurrence.h" +#include "hurricane/Observer.h" +#include "hurricane/Occurrence.h" namespace Hurricane { @@ -63,6 +63,7 @@ namespace Hurricane { virtual void updateTab (); virtual void cellPreModificate (); virtual void cellPostModificate (); + virtual void graphicsUpdated (); protected: CellWidget* _cellWidget; @@ -80,10 +81,11 @@ namespace Hurricane { Q_OBJECT; public: - TabGraphics ( QWidget* parent=NULL ); - inline GraphicsWidget* getGraphics (); + TabGraphics ( QWidget* parent=NULL ); + inline GraphicsWidget* getGraphics (); public slots: - void setCellWidget ( CellWidget* ); + void setCellWidget ( CellWidget* ); + virtual void graphicsUpdated (); protected: GraphicsWidget* _graphics; @@ -122,10 +124,11 @@ namespace Hurricane { Q_OBJECT; public: - TabPalette ( QWidget* parent=NULL ); - inline PaletteWidget* getPalette (); + TabPalette ( QWidget* parent=NULL ); + inline PaletteWidget* getPalette (); public slots: - virtual void setCellWidget ( CellWidget* ); + virtual void setCellWidget ( CellWidget* ); + virtual void graphicsUpdated (); protected: PaletteWidget* _palette; @@ -256,13 +259,15 @@ namespace Hurricane { class TabSettings : public ControllerTab { Q_OBJECT; public: - TabSettings ( QWidget* parent=NULL ); - inline ConfigurationWidget* getSettings (); + TabSettings ( QWidget* parent=NULL ); + inline ConfigurationWidget* getSettings (); public slots: - void setCellWidget ( CellWidget* ); + void setCellWidget ( CellWidget* ); + protected: + virtual void showEvent ( QShowEvent* ); private: + size_t _timestamp; ConfigurationWidget* _configuration; - }; @@ -291,6 +296,15 @@ namespace Hurricane { class ControllerWidget : public QTabWidget { Q_OBJECT; + + public: + class GraphicsObserver : public Observer { + public: + inline GraphicsObserver ( ControllerWidget* ); + virtual void notify ( unsigned int flags ); + private: + GraphicsObserver ( const GraphicsObserver& ); + }; public: ControllerWidget ( QWidget* parent=NULL ); @@ -306,6 +320,7 @@ namespace Hurricane { void setCellWidget ( CellWidget* ); //inline int addSetting ( QWidget* page, const QString& label ); public slots: + void graphicsUpdated (); void cellPreModificate (); void cellPostModificate (); void cellChanged ( Cell* ); @@ -313,6 +328,7 @@ namespace Hurricane { void toggleShow (); protected: + GraphicsObserver _observer; CellWidget* _cellWidget; TabGraphics* _tabGraphics; TabPalette* _tabPalette; @@ -335,6 +351,11 @@ namespace Hurricane { inline InspectorWidget* ControllerWidget::getInspectorWidget () { return _tabInspector->getInspectorWidget(); } inline TabSettings* ControllerWidget::getSettings () { return _tabSettings; } //inline int ControllerWidget::addSetting ( QWidget* page, const QString& label ) { return _tabSettings->addSetting(page,label); } + + + inline ControllerWidget::GraphicsObserver::GraphicsObserver ( ControllerWidget* owner ) + : Observer(owner) + { } } // End of Hurricane namespace. diff --git a/hurricane/src/hurricane/hurricane/DesignBlob.h b/hurricane/src/viewer/hurricane/viewer/DesignBlob.h similarity index 96% rename from hurricane/src/hurricane/hurricane/DesignBlob.h rename to hurricane/src/viewer/hurricane/viewer/DesignBlob.h index d033b3de..bc90a400 100644 --- a/hurricane/src/hurricane/hurricane/DesignBlob.h +++ b/hurricane/src/viewer/hurricane/viewer/DesignBlob.h @@ -32,6 +32,7 @@ namespace Hurricane { inline DesignBlob ( Cell* ); inline Cell* getTopCell () const; void toJson ( JsonWriter* ) const; + static DesignBlob* fromJson ( const std::string& filename ); inline std::string _getTypeName () const; private: Cell* _topCell; diff --git a/hurricane/src/viewer/hurricane/viewer/DisplayStyle.h b/hurricane/src/viewer/hurricane/viewer/DisplayStyle.h index b838d7e8..766c6735 100644 --- a/hurricane/src/viewer/hurricane/viewer/DisplayStyle.h +++ b/hurricane/src/viewer/hurricane/viewer/DisplayStyle.h @@ -1,8 +1,7 @@ - // -*- C++ -*- // // This file is part of the Coriolis Software. -// Copyright (c) UPMC/LIP6 2008-2012, All Rights Reserved +// Copyright (c) UPMC 2008-2016, All Rights Reserved // // +-----------------------------------------------------------------+ // | H U R R I C A N E | @@ -15,9 +14,8 @@ // +-----------------------------------------------------------------+ -#ifndef __HURRICANE_DISPLAYSTYLE_H__ -#define __HURRICANE_DISPLAYSTYLE_H__ - +#ifndef HURRICANE_DISPLAYSTYLE_H +#define HURRICANE_DISPLAYSTYLE_H #include #include @@ -36,10 +34,13 @@ namespace Hurricane { typedef std::vector DrawingStyles; +// ------------------------------------------------------------------- +// Class : "DrawingGroup". + class DrawingGroup { public: // Constructors & Destructors. - DrawingGroup ( const Name& name ); + DrawingGroup ( const Name& name ); ~DrawingGroup (); DrawingGroup* getClone (); void qtAllocate (); @@ -57,6 +58,8 @@ namespace Hurricane { , float threshold , bool goMatched ); + void addDrawingStyle ( DrawingStyle ); + void toJson ( JsonWriter* ) const; protected: const Name _name; DrawingStyles _drawingStyles; @@ -67,18 +70,37 @@ namespace Hurricane { }; +// ------------------------------------------------------------------- +// Class : "JsonDrawingGroup". + + class JsonDrawingGroup : public JsonObject { + public: + static void initialize (); + JsonDrawingGroup ( unsigned long flags ); + ~JsonDrawingGroup (); + virtual string getTypeName () const; + virtual JsonDrawingGroup* clone ( unsigned long ) const; + virtual void toData ( JsonStack& ); + }; + + +// ------------------------------------------------------------------- +// Class : "DisplayStyle". + class DisplayStyle { public: class HSVr { public: - inline HSVr ( float hue=1.0, float saturation=1.0, float value=1.0 ); - inline bool isId () const; - inline float getHue () const; - inline float getSaturation () const; - inline float getValue () const; - inline void setHue ( float ); - inline void setSaturation ( float ); - inline void setValue ( float ); + inline HSVr ( float hue=1.0, float saturation=1.0, float value=1.0 ); + inline bool isId () const; + inline float getHue () const; + inline float getSaturation () const; + inline float getValue () const; + inline void setHue ( float ); + inline void setSaturation ( float ); + inline void setValue ( float ); + inline void toJson ( JsonWriter* ) const; + inline std::string _getString () const; private: float _hue; float _saturation; @@ -142,6 +164,9 @@ namespace Hurricane { , float threshold , bool goMatched =true ); + DrawingGroup* findGroup ( const Name& groupKey ); + void findOrCreate ( const Name& groupKey, size_t& gi ); + void toJson ( JsonWriter* ) const; protected: // Internals - Attributes. @@ -151,8 +176,6 @@ namespace Hurricane { HSVr _darkening; // Internals - Methods. - void findOrCreate ( const Name& groupKey - , size_t& gi ); void find ( const Name& groupKey , const Name& key , size_t& gi @@ -161,6 +184,37 @@ namespace Hurricane { }; +// ------------------------------------------------------------------- +// Class : "JsonDisplayStyle". + + class JsonDisplayStyle : public JsonObject { + public: + static void initialize (); + JsonDisplayStyle ( unsigned long flags ); + ~JsonDisplayStyle (); + virtual string getTypeName () const; + virtual JsonDisplayStyle* clone ( unsigned long ) const; + virtual void toData ( JsonStack& ); + }; + + +// ------------------------------------------------------------------- +// Class : "JsonHSVr". + + class JsonHSVr : public JsonObject { + public: + static void initialize (); + JsonHSVr ( unsigned long flags ); + ~JsonHSVr (); + virtual string getTypeName () const; + virtual JsonHSVr* clone ( unsigned long ) const; + virtual void toData ( JsonStack& ); + }; + + +// ------------------------------------------------------------------- +// Class : "RawDrawingStyle". + class RawDrawingStyle { public: // Constructors & Destructors. @@ -183,6 +237,7 @@ namespace Hurricane { QPen getPen ( const DisplayStyle::HSVr& ) const; QBrush getBrush ( const DisplayStyle::HSVr& ) const; inline float getThreshold () const; + void toJson ( JsonWriter* ) const; private: // Internal - Attributes. const Name _name; @@ -214,7 +269,23 @@ namespace Hurricane { }; - // Functions. +// ------------------------------------------------------------------- +// Class : "JsonDrawingStyle". + + class JsonDrawingStyle : public JsonObject { + public: + static void initialize (); + JsonDrawingStyle ( unsigned long flags ); + ~JsonDrawingStyle (); + virtual string getTypeName () const; + virtual JsonDrawingStyle* clone ( unsigned long ) const; + virtual void toData ( JsonStack& ); + }; + + +// ------------------------------------------------------------------- +// Inline Functions. + inline bool RawDrawingStyle::isGoMatched () const { return _goMatched; } inline const Name& RawDrawingStyle::getName () const { return _name; } inline const std::string& RawDrawingStyle::getPattern () const { return _pattern; } @@ -241,8 +312,28 @@ namespace Hurricane { inline void DisplayStyle::HSVr::setSaturation ( float saturation ) { _saturation=saturation; } inline void DisplayStyle::HSVr::setValue ( float value ) { _value=value; } + inline std::string DisplayStyle::HSVr::_getString () const + { + std::string s = ""; + return s; + } -} // End of Hurricane namespace. + inline void DisplayStyle::HSVr::toJson ( JsonWriter* w ) const + { + w->startObject(); + jsonWrite( w, "@typename", "HSVr" ); + jsonWrite( w, "_hue" , _hue ); + jsonWrite( w, "_saturation", _saturation ); + jsonWrite( w, "_value" , _value ); + w->endObject(); + } + +} // Hurricane namespace. -#endif // __HURRICANE_DISPLAYSTYLE__ +GETSTRING_VALUE_SUPPORT(Hurricane::DisplayStyle::HSVr); + + +#endif // HURRICANE_DISPLAYSTYLE_H diff --git a/hurricane/src/viewer/hurricane/viewer/Graphics.h b/hurricane/src/viewer/hurricane/viewer/Graphics.h index 1446d32a..e2f0addf 100644 --- a/hurricane/src/viewer/hurricane/viewer/Graphics.h +++ b/hurricane/src/viewer/hurricane/viewer/Graphics.h @@ -21,6 +21,7 @@ #include #include #include +#include "hurricane/Observer.h" #include "hurricane/Breakpoint.h" #include "hurricane/TextTranslator.h" #include "hurricane/viewer/DisplayStyle.h" @@ -37,11 +38,18 @@ namespace Hurricane { class Name; - class Graphics { +// ------------------------------------------------------------------- +// Class : "Graphics". + class Graphics { + public: + enum NotifyFlags { ChangedDisplayStyles = (1<<0) }; public: // Accessors. static Graphics* getGraphics (); + static void addObserver ( BaseObserver* ); + static void removeObserver ( BaseObserver* ); + static void notify ( unsigned int flags ); static bool isEnabled (); static bool isHighDpi (); static const QFont getFixedFont ( int weight=QFont::Normal, bool italic=false, bool underline=false, int scale=0 ); @@ -59,7 +67,6 @@ namespace Hurricane { static string toHtml ( const string& ); static int toHighDpi ( int ); static bool breakpointStopCb ( const string& message ); - // Modifiers. static void addStyle ( DisplayStyle* displayStyle ); static void setStyle ( const Name& key ); @@ -68,10 +75,11 @@ namespace Hurricane { static DisplayStyle* getStyle (); static const vector& getStyles (); static void enable (); - + void toJson ( JsonWriter* ) const; // Internals - Attributes. protected: static Graphics* _singleton; + Observable _observers; TextTranslator _htmlTranslator; vector _styles; DisplayStyle* _active; @@ -86,7 +94,6 @@ namespace Hurricane { Graphics ( const Graphics& ); Graphics& operator= ( const Graphics& ); ~Graphics (); - // Internals - Methods. size_t _findStyle ( const Name& key ) const; void _addStyle ( DisplayStyle* displayStyle ); @@ -105,7 +112,6 @@ namespace Hurricane { inline const ColorScale& _getColorScale ( ColorScale::ScaleType ) const; inline void _enable (); inline const TextTranslator& _getHtmlTranslator () const; - }; @@ -157,6 +163,20 @@ namespace Hurricane { { return _htmlTranslator; } +// ------------------------------------------------------------------- +// Class : "JsonGraphics". + + class JsonGraphics : public JsonObject { + public: + static void initialize (); + JsonGraphics ( unsigned long flags ); + ~JsonGraphics (); + virtual string getTypeName () const; + virtual JsonGraphics* clone ( unsigned long ) const; + virtual void toData ( JsonStack& ); + private: + std::string _active; + }; } // End of Hurricane namespace. diff --git a/hurricane/src/viewer/hurricane/viewer/GraphicsWidget.h b/hurricane/src/viewer/hurricane/viewer/GraphicsWidget.h index b20f9b90..5de2d491 100644 --- a/hurricane/src/viewer/hurricane/viewer/GraphicsWidget.h +++ b/hurricane/src/viewer/hurricane/viewer/GraphicsWidget.h @@ -19,6 +19,8 @@ #include +class QGridLayout; +class QButtonGroup; #include "hurricane/viewer/CellWidget.h" @@ -32,17 +34,21 @@ namespace Hurricane { public: GraphicsWidget ( QWidget* parent=NULL ); void setCellWidget ( CellWidget* ); + void readGraphics (); + void resetGraphics (); + void rereadGraphics (); public slots: void changeStyle (); void setStyle ( int id ); protected: - CellWidget* _cellWidget; - UpdateState _updateState; + CellWidget* _cellWidget; + QGridLayout* _stylesGrid; + QButtonGroup* _stylesGroup; + UpdateState _updateState; }; -} // End of Hurricane namespace. - +} // Hurricane namespace. #endif diff --git a/hurricane/src/viewer/hurricane/viewer/JsonConfiguration.h b/hurricane/src/viewer/hurricane/viewer/JsonConfiguration.h new file mode 100644 index 00000000..2e9357a8 --- /dev/null +++ b/hurricane/src/viewer/hurricane/viewer/JsonConfiguration.h @@ -0,0 +1,130 @@ +// -*- C++ -*- +// +// This file is part of the Coriolis Software. +// Copyright (c) UPMC 2016-2016, 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/viewer/JsonConfiguration.h" | +// +-----------------------------------------------------------------+ + + +#ifndef HURRICANE_JSON_CONFIGURATION_H +#define HURRICANE_JSON_CONFIGURATION_H + +#include "vlsisapd/configuration/Parameter.h" +#include "vlsisapd/configuration/Configuration.h" +#include "hurricane/Commons.h" + + +void jsonWrite ( JsonWriter*, const Cfg::Parameter* ); +void jsonWrite ( JsonWriter*, const Cfg::Parameter::EnumValue ); +void jsonWrite ( JsonWriter*, const Cfg::Configuration* ); +void jsonWrite ( JsonWriter*, const Cfg::WidgetDescription* ); +void jsonWrite ( JsonWriter*, const Cfg::TabDescription* ); +void jsonWrite ( JsonWriter*, const Cfg::LayoutDescription* ); + + +namespace Hurricane { + + +// ------------------------------------------------------------------- +// Class : "JsonParameter". + + class JsonParameter : public JsonObject { + public: + static void initialize (); + JsonParameter ( unsigned long ); + virtual string getTypeName () const; + virtual JsonParameter* clone ( unsigned long ) const; + virtual void toData ( JsonStack& ); + }; + + +// ------------------------------------------------------------------- +// Class : "JsonParamEnumValue". + + class JsonParamEnumValue : public JsonObject { + public: + static void initialize (); + JsonParamEnumValue ( unsigned long ); + virtual string getTypeName () const; + virtual JsonParamEnumValue* clone ( unsigned long ) const; + virtual void toData ( JsonStack& ); + }; + + +// ------------------------------------------------------------------- +// Class : "JsonParamSlave". + + class JsonParamSlave : public JsonObject { + public: + static void initialize (); + JsonParamSlave ( unsigned long ); + virtual string getTypeName () const; + virtual JsonParamSlave* clone ( unsigned long ) const; + virtual void toData ( JsonStack& ); + }; + + +// ------------------------------------------------------------------- +// Class : "JsonConfiguration". + + class JsonConfiguration : public JsonObject { + public: + static void initialize (); + JsonConfiguration ( unsigned long ); + virtual string getTypeName () const; + virtual JsonConfiguration* clone ( unsigned long ) const; + virtual void toData ( JsonStack& ); + }; + + +// ------------------------------------------------------------------- +// Class : "JsonWidgetDescription". + + class JsonWidgetDescription : public JsonObject { + public: + static void initialize (); + JsonWidgetDescription ( unsigned long ); + virtual string getTypeName () const; + virtual JsonWidgetDescription* clone ( unsigned long ) const; + virtual void toData ( JsonStack& ); + }; + + +// ------------------------------------------------------------------- +// Class : "JsonTabDescription". + + class JsonTabDescription : public JsonObject { + public: + static void initialize (); + JsonTabDescription ( unsigned long ); + virtual string getTypeName () const; + virtual JsonTabDescription* clone ( unsigned long ) const; + virtual void toData ( JsonStack& ); + }; + + +// ------------------------------------------------------------------- +// Class : "JsonLayoutDescription". + + class JsonLayoutDescription : public JsonObject { + public: + static void initialize (); + JsonLayoutDescription ( unsigned long ); + virtual ~JsonLayoutDescription (); + virtual string getTypeName () const; + virtual JsonLayoutDescription* clone ( unsigned long ) const; + virtual void toData ( JsonStack& ); + }; + + +} // Hurricane namespace. + +#endif // HURRICANE_JSON_CONFIGURATION_H diff --git a/hurricane/src/viewer/hurricane/viewer/JsonParameter.h b/hurricane/src/viewer/hurricane/viewer/JsonParameter.h new file mode 100644 index 00000000..23d6d8f2 --- /dev/null +++ b/hurricane/src/viewer/hurricane/viewer/JsonParameter.h @@ -0,0 +1,66 @@ +// -*- C++ -*- +// +// This file is part of the Coriolis Software. +// Copyright (c) UPMC 2016-2016, 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/viewer/JsonParameter.h" | +// +-----------------------------------------------------------------+ + + +#ifndef HURRICANE_JSON_PARAMETER_H +#define HURRICANE_JSON_PARAMETER_H + +#include "vlsisapd/configuration/Parameter.h" +#include "vlsisapd/configuration/Configuration.h" +#include "hurricane/Commons.h" + + +void jsonWrite ( JsonWriter*, const Cfg::Parameter* ); +void jsonWrite ( JsonWriter*, const Cfg::Configuration* ); + +inline void jsonWrite ( JsonWriter* w, const std::string& key, const Cfg::Parameter* p ) +{ w->key(key); jsonWrite( w, p ); } + +inline void jsonWrite ( JsonWriter* w, const std::string& key, const Cfg::Configuration* cfg ) +{ w->key(key); jsonWrite( w, cfg ); } + + +namespace Hurricane { + + +// ------------------------------------------------------------------- +// Class : "JsonParameter". + + class JsonParameter : public JsonObject { + public: + static void initialize (); + JsonParameter ( unsigned long ); + virtual string getTypeName () const; + virtual JsonParameter* clone ( unsigned long ) const; + virtual void toData ( JsonStack& ); + }; + + +// ------------------------------------------------------------------- +// Class : "JsonConfiguration". + + class JsonConfiguration : public JsonObject { + public: + static void initialize (); + JsonConfiguration ( unsigned long ); + virtual string getTypeName () const; + virtual JsonConfiguration* clone ( unsigned long ) const; + virtual void toData ( JsonStack& ); + }; + + +} // Hurricane namespace. + +#endif // HURRICANE_JSON_PARAMETER_H diff --git a/hurricane/src/viewer/hurricane/viewer/PaletteLayerItem.h b/hurricane/src/viewer/hurricane/viewer/PaletteLayerItem.h index b1e56fb2..807a9e07 100644 --- a/hurricane/src/viewer/hurricane/viewer/PaletteLayerItem.h +++ b/hurricane/src/viewer/hurricane/viewer/PaletteLayerItem.h @@ -1,30 +1,21 @@ - // -*- C++ -*- // // This file is part of the Coriolis Software. -// Copyright (c) UPMC/LIP6 2008-2016, All Rights Reserved +// Copyright (c) UPMC 2008-2016, All Rights Reserved // -// =================================================================== -// -// $Id$ -// -// x-----------------------------------------------------------------x -// | | +// +-----------------------------------------------------------------+ // | 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 | // | | // | Author : Jean-Paul CHAPUT | // | E-mail : Jean-Paul.Chaput@asim.lip6.fr | // | =============================================================== | -// | C++ Header : "./PaletteLayerItem.h" | -// | *************************************************************** | -// | U p d a t e s | -// | | -// x-----------------------------------------------------------------x +// | C++ Header : "./hurricane/viewer/PaletteLayerItem.h" | +// +-----------------------------------------------------------------+ -#ifndef __HURRICANE_PALETTE_LAYER_ITEM__ -#define __HURRICANE_PALETTE_LAYER_ITEM__ +#ifndef HURRICANE_PALETTE_LAYER_ITEM_H +#define HURRICANE_PALETTE_LAYER_ITEM_H class QCheckBox; @@ -64,7 +55,6 @@ namespace Hurricane { }; -} // End of Hurricane namespace. +} // Hurricane namespace. - -#endif // __HURRICANE_PALETTE_LAYER_ITEM__ +#endif // HURRICANE_PALETTE_LAYER_ITEM_H diff --git a/hurricane/src/viewer/hurricane/viewer/PaletteWidget.h b/hurricane/src/viewer/hurricane/viewer/PaletteWidget.h index 4ec64e1a..24cbfc03 100644 --- a/hurricane/src/viewer/hurricane/viewer/PaletteWidget.h +++ b/hurricane/src/viewer/hurricane/viewer/PaletteWidget.h @@ -1,37 +1,28 @@ - // -*- C++ -*- // // This file is part of the Coriolis Software. -// Copyright (c) UPMC/LIP6 2008-2010, All Rights Reserved +// Copyright (c) UPMC 2008-2016, All Rights Reserved // -// =================================================================== -// -// $Id$ -// -// x-----------------------------------------------------------------x -// | | +// +-----------------------------------------------------------------+ // | 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 | // | | // | Author : Jean-Paul CHAPUT | // | E-mail : Jean-Paul.Chaput@asim.lip6.fr | // | =============================================================== | -// | C++ Header : "./PaletteWidget.h" | -// | *************************************************************** | -// | U p d a t e s | -// | | -// x-----------------------------------------------------------------x +// | C++ Header : "./hurricane/viewer/PaletteWidget.h" | +// +-----------------------------------------------------------------+ -#ifndef __HURRICANE_PALETTE_WIDGET__ -#define __HURRICANE_PALETTE_WIDGET__ +#ifndef HURRICANE_PALETTE_WIDGET_H +#define HURRICANE_PALETTE_WIDGET_H -#include -#include -#include +#include +#include +#include -#include "hurricane/Commons.h" -#include "hurricane/Name.h" +#include "hurricane/Commons.h" +#include "hurricane/Name.h" class QLabel; @@ -52,8 +43,12 @@ namespace Hurricane { class PaletteNamedItem; class PaletteLayerItem; class PaletteExtensionGoItem; + class PaletteWidget; +// ------------------------------------------------------------------- +// Class : "PaletteWidget". + class PaletteWidget : public QWidget { Q_OBJECT; @@ -66,7 +61,9 @@ namespace Hurricane { bool isSelectable ( const Name& name ) const; inline void setOneColumn (); inline void setColumnHeight ( size_t height=std::numeric_limits::max() ); - void build (); + void readGraphics (); + void resetGraphics (); + void rereadGraphics (); signals: void paletteChanged (); public slots: @@ -80,16 +77,16 @@ namespace Hurricane { void setItemVisible ( const Name& name, bool visible ); protected: - QScrollArea* _scrollArea; - PaletteItems _layerItems; - PaletteItems _extensionGoItems; - QPushButton* _showAll; - QPushButton* _hideAll; - QGridLayout* _grid; - size_t _columnHeight; - int _extensionRow; - int _extensionColumn; - QWidget* _extensionGroup; + QScrollArea* _scrollArea; + PaletteItems _layerItems; + PaletteItems _extensionGoItems; + QPushButton* _showAll; + QPushButton* _hideAll; + QGridLayout* _grid; + size_t _columnHeight; + int _extensionRow; + int _extensionColumn; + QWidget* _extensionGroup; private: PaletteWidget ( const PaletteWidget& ); @@ -108,7 +105,6 @@ namespace Hurricane { inline void PaletteWidget::setColumnHeight ( size_t height ) { _columnHeight = height; } -} // End of Hurricane namespace. +} // Hurricane namespace. - -#endif // __HURRICANE_PALETTE_WIDGET__ +#endif // HURRICANE_PALETTE_WIDGET_H diff --git a/unicorn/src/CgtMain.cpp b/unicorn/src/CgtMain.cpp index b73fef58..b4dbecd6 100644 --- a/unicorn/src/CgtMain.cpp +++ b/unicorn/src/CgtMain.cpp @@ -204,8 +204,8 @@ int main ( int argc, char *argv[] ) bool showConf = Cfg::getParamBool("misc.showConf")->asBool(); - dbo_ptr db ( DataBase::create() ); - dbo_ptr af ( AllianceFramework::create() ); + dbo_ptr db ( DataBase::getDB() ); + dbo_ptr af ( AllianceFramework::get() ); Cell* cell = NULL; Utilities::Path path = Utilities::Path::cwd(); diff --git a/unicorn/src/UnicornGui.cpp b/unicorn/src/UnicornGui.cpp index 3dc2b549..7eedb782 100644 --- a/unicorn/src/UnicornGui.cpp +++ b/unicorn/src/UnicornGui.cpp @@ -92,7 +92,7 @@ namespace Unicorn { _runUnicornInit(); _importCell.setDialog( _importDialog ); - _importCell.addImporter( "JSON (experimental)" , std::bind( &jsonCellParse , placeholders::_1 ) ); + _importCell.addImporter( "JSON (experimental)" , std::bind( &Cell::fromJson , placeholders::_1 ) ); _importCell.addImporter( "BLIF (Yosys/ABC)" , std::bind( &Blif::load , placeholders::_1 ) ); _importCell.addImporter( "ACM/SIGDA (aka MCNC, .bench)", std::bind( &AcmSigda::load , placeholders::_1 ) ); _importCell.addImporter( "ISPD'04 (Bookshelf)" , std::bind( &Ispd04::load , placeholders::_1 ) ); diff --git a/unicorn/src/cgt.py b/unicorn/src/cgt.py index 191976f0..ef66aa9c 100755 --- a/unicorn/src/cgt.py +++ b/unicorn/src/cgt.py @@ -94,6 +94,7 @@ if __name__ == '__main__': usage += '\ncgt [options]' parser = optparse.OptionParser(usage) + parser.add_option( '--no-init' , action='store_true', dest='noInit' , help='Do not load any initialization.') parser.add_option( '-c', '--cell' , type='string' , dest='cell' , help='The name of the cell to load, whithout extension.') parser.add_option( '--acm-sigda-89' , type='string' , dest='acmSigdaName' , help='An ACM/SIGDA 89 bench name to load, whithout extension.') parser.add_option( '--blif' , type='string' , dest='blifName' , help='A Blif (Yosys) design name to load, whithout extension.') @@ -123,7 +124,11 @@ if __name__ == '__main__': (options, args) = parser.parse_args() args.insert(0, 'cgt') - af = CRL.AllianceFramework.get() + flags = 0 + if options.noInit: + flags |= CRL.AllianceFramework.NoPythonInit + + af = CRL.AllianceFramework.create( flags ) print af.getEnvironment().getPrint() #Hurricane.trace(True) diff --git a/vlsisapd/src/configuration/src/Configuration.cpp b/vlsisapd/src/configuration/src/Configuration.cpp index 40463176..0370b7ce 100644 --- a/vlsisapd/src/configuration/src/Configuration.cpp +++ b/vlsisapd/src/configuration/src/Configuration.cpp @@ -407,6 +407,7 @@ namespace Cfg { ConfigurationWidget* Configuration::buildWidget ( unsigned int flags ) { return _layout.buildWidget(flags); } + ConfigurationDialog* Configuration::buildDialog() { return new ConfigurationDialog(); } diff --git a/vlsisapd/src/configuration/src/LayoutDescription.cpp b/vlsisapd/src/configuration/src/LayoutDescription.cpp index 3b679359..b52eea51 100644 --- a/vlsisapd/src/configuration/src/LayoutDescription.cpp +++ b/vlsisapd/src/configuration/src/LayoutDescription.cpp @@ -14,10 +14,10 @@ // +-----------------------------------------------------------------+ -#include "vlsisapd/configuration/LayoutDescription.h" -#include "vlsisapd/configuration/Configuration.h" -#include "vlsisapd/configuration/ParameterWidget.h" -#include "vlsisapd/configuration/ConfigurationWidget.h" +#include "vlsisapd/configuration/LayoutDescription.h" +#include "vlsisapd/configuration/Configuration.h" +#include "vlsisapd/configuration/ParameterWidget.h" +#include "vlsisapd/configuration/ConfigurationWidget.h" namespace Cfg { @@ -32,6 +32,33 @@ namespace Cfg { using std::ostream; +// ------------------------------------------------------------------- +// Class : "Cfg::WidgetDescription". + + string WidgetDescription::typeToString ( WidgetDescription::Type type ) + { + switch ( type ) { + case Title: return "Title"; + case Section: return "Section"; + case Rule: return "Rule"; + case Parameter: return "Parameter"; + } + return "Rule"; + } + + + WidgetDescription::Type WidgetDescription::stringToType ( const string& s ) + { + if (s == "Title" ) return Title; + if (s == "Section" ) return Section; + if (s == "Parameter") return Parameter; + return Rule; + } + + +// ------------------------------------------------------------------- +// Class : "Cfg::TabDescription". + void TabDescription::addWidget ( WidgetDescription* widget ) { _widgets.push_back(widget); @@ -39,6 +66,12 @@ namespace Cfg { } +// ------------------------------------------------------------------- +// Class : "Cfg::LayoutDescription". + + size_t LayoutDescription::_timestamp = 0; + + WidgetDescription* LayoutDescription::getWidget ( const string& id ) { map::iterator iwid = _widgets.find(id); @@ -69,6 +102,7 @@ namespace Cfg { { TabDescription* tab = getTab ( tabName ); tab->addWidget ( WidgetDescription::rule() ); + ++_timestamp; } @@ -76,6 +110,7 @@ namespace Cfg { { TabDescription* tab = getTab ( tabName ); tab->addWidget ( WidgetDescription::title(title) ); + ++_timestamp; } @@ -83,6 +118,7 @@ namespace Cfg { { TabDescription* tab = getTab ( tabName ); tab->addWidget ( WidgetDescription::section(section,column) ); + ++_timestamp; } @@ -97,6 +133,7 @@ namespace Cfg { WidgetDescription* widget = WidgetDescription::parameter(id,label,column,span,flags); tab->addWidget ( widget ); + ++_timestamp; } diff --git a/vlsisapd/src/configuration/src/Parameter.cpp b/vlsisapd/src/configuration/src/Parameter.cpp index 253b6e97..738df86f 100644 --- a/vlsisapd/src/configuration/src/Parameter.cpp +++ b/vlsisapd/src/configuration/src/Parameter.cpp @@ -1,8 +1,7 @@ - // -*- C++ -*- // // This file is part of the VSLSI Stand-Alone Software. -// Copyright (c) UPMC 2008-2013, All Rights Reserved +// Copyright (c) UPMC 2008-2016, All Rights Reserved // // +-----------------------------------------------------------------+ // | C O R I O L I S | @@ -71,6 +70,46 @@ namespace Cfg { } + Parameter::Type Parameter::stringToType ( const std::string& stype ) + { + if (stype == "string" ) return String; + else if (stype == "int" ) return Int; + else if (stype == "double" ) return Double; + else if (stype == "bool" ) return Bool; + else if (stype == "percentage") return Percentage; + else if (stype == "enumerate" ) return Enumerate; + + return Unknown; + } + + + string Parameter::priorityToString ( Parameter::Priority priority ) + { + switch ( priority ) { + case UseDefault: return "UseDefault"; + case ApplicationBuiltin: return "ApplicationBuiltin"; + case ConfigurationFile: return "ConfigurationFile"; + case UserFile: return "UserFile"; + case CommandLine: return "CommandLine"; + case Interactive: return "Interactive"; + } + return "UseDefault"; + } + + + Parameter::Priority Parameter::stringToPriority ( const std::string& spriority ) + { + if (spriority == "UseDefault" ) return UseDefault; + else if (spriority == "ApplicationBuiltin") return ApplicationBuiltin; + else if (spriority == "ConfigurationFile" ) return ConfigurationFile; + else if (spriority == "UserFile" ) return UserFile; + else if (spriority == "CommandLine" ) return CommandLine; + else if (spriority == "Interactive" ) return Interactive; + + return UseDefault; + } + + Parameter::Parameter ( const std::string& id , Type type , const std::string& value @@ -156,6 +195,13 @@ namespace Cfg { } + bool Parameter::setRawString ( const string& s, Priority priority ) + { + if ( not _updatePriority(priority) ) return false; + return _doChange ( _flags|FromString, s, false, 0, 0.0 ); + } + + bool Parameter::setString ( const std::string& s, Priority priority, unsigned int flags ) { if ( not _updatePriority(priority) ) return false; diff --git a/vlsisapd/src/configuration/src/ParameterWidget.cpp b/vlsisapd/src/configuration/src/ParameterWidget.cpp index 44b5f66c..0f00ac95 100644 --- a/vlsisapd/src/configuration/src/ParameterWidget.cpp +++ b/vlsisapd/src/configuration/src/ParameterWidget.cpp @@ -1,15 +1,9 @@ - // -*- C++ -*- // // This file is part of the VSLSI Stand-Alone Software. -// Copyright (c) UPMC/LIP6 2010-2010, All Rights Reserved +// Copyright (c) UPMC 2010-2016, All Rights Reserved // -// =================================================================== -// -// $Id$ -// -// x-----------------------------------------------------------------x -// | | +// +-----------------------------------------------------------------+ // | C O R I O L I S | // | C o n f i g u r a t i o n D a t a - B a s e | // | | @@ -17,25 +11,22 @@ // | E-mail : Jean-Paul.Chaput@lip6.fr | // | =============================================================== | // | C++ Module : "./ParameterWidget.cpp" | -// | *************************************************************** | -// | U p d a t e s | -// | | -// x-----------------------------------------------------------------x +// +-----------------------------------------------------------------+ -#include "boost/bind.hpp" -#include -#include -#include -#include -#include -#include -#include -#include "vlsisapd/configuration/Parameter.h" -#include "vlsisapd/configuration/FilePathEdit.h" -#include "vlsisapd/configuration/ParameterWidget.h" -#include "vlsisapd/configuration/ConfTabWidget.h" -#include "vlsisapd/configuration/ConfigurationWidget.h" +#include "boost/bind.hpp" +#include +#include +#include +#include +#include +#include +#include +#include "vlsisapd/configuration/Parameter.h" +#include "vlsisapd/configuration/FilePathEdit.h" +#include "vlsisapd/configuration/ParameterWidget.h" +#include "vlsisapd/configuration/ConfTabWidget.h" +#include "vlsisapd/configuration/ConfigurationWidget.h" namespace Cfg { @@ -175,10 +166,14 @@ namespace Cfg { string valueId = _parameter->getId() + ".edit"; _valueWidget->setObjectName ( valueId.c_str() ); - _parameter->registerCb ( boost::bind(&ParameterWidget::onUpdateValueCb,this,_1) ); + _parameter->registerCb ( this, boost::bind(&ParameterWidget::onUpdateValueCb,this,_1) ); } + ParameterWidget::~ParameterWidget () + { _parameter->unregisterCb ( this ); } + + void ParameterWidget::updateValue () { if ( _parameter->getType() == Parameter::String ) diff --git a/vlsisapd/src/configuration/src/vlsisapd/configuration/ConfigurationWidget.h b/vlsisapd/src/configuration/src/vlsisapd/configuration/ConfigurationWidget.h index fbb218a6..6fb187b1 100644 --- a/vlsisapd/src/configuration/src/vlsisapd/configuration/ConfigurationWidget.h +++ b/vlsisapd/src/configuration/src/vlsisapd/configuration/ConfigurationWidget.h @@ -1,35 +1,25 @@ - // -*- C++ -*- // // This file is part of the VSLSI Stand-Alone Software. -// Copyright (c) UPMC/LIP6 2010-2010, All Rights Reserved +// Copyright (c) UPMC 2010-2016, All Rights Reserved // -// =================================================================== -// -// $Id$ -// -// x-----------------------------------------------------------------x -// | | +// +-----------------------------------------------------------------+ // | C O R I O L I S | // | C o n f i g u r a t i o n D a t a - B a s e | // | | // | Author : Jean-Paul Chaput | // | E-mail : Jean-Paul.Chaput@lip6.fr | // | =============================================================== | -// | C++ Header : "./ConfigurationWidget.h" | -// | *************************************************************** | -// | U p d a t e s | -// | | -// x-----------------------------------------------------------------x +// | C++ Header : "./vlsisapd/configuration/ConfigurationWidget.h" | +// +-----------------------------------------------------------------+ +#ifndef CFG_CONFIGURATION_WIDGET_H +#define CFG_CONFIGURATION_WIDGET_H -#ifndef __CFG_CONFIGURATION_WIDGET__ -#define __CFG_CONFIGURATION_WIDGET__ - -#include -#include -#include +#include +#include +#include class QPushButton; class QTabWidget; @@ -46,7 +36,6 @@ namespace Cfg { // ------------------------------------------------------------------- // Class : "Cfg::ConfigurationWidget". - class ConfigurationWidget : public QWidget { Q_OBJECT; public: @@ -127,7 +116,6 @@ namespace Cfg { std::string toXml ( const std::string& ); -} // End of Cfg namespace. +} // Cfg namespace. - -#endif // __CFG_CONFIGURATION_WIDGET__ +#endif // CFG_CONFIGURATION_WIDGET_H diff --git a/vlsisapd/src/configuration/src/vlsisapd/configuration/LayoutDescription.h b/vlsisapd/src/configuration/src/vlsisapd/configuration/LayoutDescription.h index 08448f30..3cd7f2fd 100644 --- a/vlsisapd/src/configuration/src/vlsisapd/configuration/LayoutDescription.h +++ b/vlsisapd/src/configuration/src/vlsisapd/configuration/LayoutDescription.h @@ -1,12 +1,7 @@ - // -*- C++ -*- // // This file is part of the VSLSI Stand-Alone Software. -// Copyright (c) UPMC/LIP6 2010-2011, All Rights Reserved -// -// =================================================================== -// -// $Id$ +// Copyright (c) UPMC 2010-2016, All Rights Reserved // // +-----------------------------------------------------------------+ // | C O R I O L I S | @@ -15,13 +10,12 @@ // | Author : Jean-Paul Chaput | // | E-mail : Jean-Paul.Chaput@lip6.fr | // | =============================================================== | -// | C++ Header : "./LayoutDescription.h" | +// | C++ Header : "./vlsisapd/configuration/LayoutDescription.h" | // +-----------------------------------------------------------------+ - -#ifndef __CFG_LAYOUT_DESCRIPTION__ -#define __CFG_LAYOUT_DESCRIPTION__ +#ifndef CFG_LAYOUT_DESCRIPTION_H +#define CFG_LAYOUT_DESCRIPTION_H #include #include @@ -39,10 +33,12 @@ namespace Cfg { // ------------------------------------------------------------------- // Class : "Cfg::WidgetDescription". - class WidgetDescription { public: enum Type { Title=1, Section=2, Rule=3, Parameter=4 }; + public: + static std::string typeToString ( Type ); + static Type stringToType ( const std::string& ); public: inline static WidgetDescription* rule (); inline static WidgetDescription* title ( const std::string& title ); @@ -115,7 +111,6 @@ namespace Cfg { // ------------------------------------------------------------------- // Class : "Cfg::TabDescription". - class TabDescription { public: inline TabDescription ( LayoutDescription*, const std::string& name, const std::string& id ); @@ -151,6 +146,8 @@ namespace Cfg { class LayoutDescription { + public: + inline static size_t getTimestamp (); public: inline LayoutDescription ( Configuration* ); WidgetDescription* getWidget ( const std::string& id ); @@ -175,14 +172,17 @@ namespace Cfg { ConfigurationWidget* buildWidget ( unsigned int flags ); void writeToStream ( std::ostream&, const std::string& ) const; private: - Configuration* _configuration; - std::vector _tabs; - std::map _widgets; + static size_t _timestamp; + Configuration* _configuration; + std::vector _tabs; + std::map _widgets; }; // Inline Methods. - inline LayoutDescription::LayoutDescription ( Configuration* cfg ) + inline size_t LayoutDescription::getTimestamp () { return _timestamp; } + + inline LayoutDescription::LayoutDescription ( Configuration* cfg ) : _configuration(cfg), _tabs(), _widgets() { } diff --git a/vlsisapd/src/configuration/src/vlsisapd/configuration/Parameter.h b/vlsisapd/src/configuration/src/vlsisapd/configuration/Parameter.h index 0aabeb8d..34f512af 100644 --- a/vlsisapd/src/configuration/src/vlsisapd/configuration/Parameter.h +++ b/vlsisapd/src/configuration/src/vlsisapd/configuration/Parameter.h @@ -1,8 +1,7 @@ - // -*- C++ -*- // // This file is part of the VSLSI Stand-Alone Software. -// Copyright (c) UPMC/LIP6 2008-2012, All Rights Reserved +// Copyright (c) UPMC 2008-2016, All Rights Reserved // // +-----------------------------------------------------------------+ // | C O R I O L I S | @@ -15,8 +14,8 @@ // +-----------------------------------------------------------------+ -#ifndef __CFG_CONFIGURATION_PARAMETER__ -#define __CFG_CONFIGURATION_PARAMETER__ +#ifndef CFG_CONFIGURATION_PARAMETER_H +#define CFG_CONFIGURATION_PARAMETER_H #include #include @@ -66,6 +65,9 @@ namespace Cfg { }; public: static std::string typeToString ( Type ); + static std::string priorityToString ( Priority ); + static Type stringToType ( const std::string& ); + static Priority stringToPriority ( const std::string& ); static Priority pushDefaultPriority ( Priority ); static Priority popDefaultPriority (); static Priority getDefaultPriority (); @@ -82,7 +84,8 @@ namespace Cfg { inline bool hasMustExist () const; inline bool hasFlags ( int mask ) const; inline const std::string& getId () const; - inline const Type getType () const; + inline Type getType () const; + inline Priority getPriority () const; inline const std::vector& getValues () const; inline const std::vector& @@ -105,6 +108,7 @@ namespace Cfg { inline void setPriority ( Priority ); inline void setFlags ( int mask ); inline void unsetFlags ( int mask ); + bool setRawString ( const std::string& , Priority priority=UseDefault ); bool setString ( const std::string& , Priority priority=UseDefault , unsigned int flags =AllRequirements @@ -117,26 +121,28 @@ namespace Cfg { void setMax ( int , Priority priority=UseDefault ); void setMin ( double, Priority priority=UseDefault ); void setMax ( double, Priority priority=UseDefault ); - inline void registerCb ( ParameterChangedCb_t ); + inline void registerCb ( void* tag, ParameterChangedCb_t ); + inline void unregisterCb ( void* tag ); + inline void valueChanged (); private: inline void _onValueChanged (); inline bool _updatePriority ( Priority ); bool _doChange ( unsigned int flags, const std::string&, bool, int, double ); private: // Attributes. - static std::vector _defaultPriorities; - std::string _id; - Type _type; - std::string _value; - std::vector _values; - int _priority; - int _flags; - int _minInt; - int _maxInt; - double _minDouble; - double _maxDouble; - std::vector _slaves; - std::vector _callbacks; + static std::vector _defaultPriorities; + std::string _id; + Type _type; + std::string _value; + std::vector _values; + Priority _priority; + int _flags; + int _minInt; + int _maxInt; + double _minDouble; + double _maxDouble; + std::vector _slaves; + std::vector< std::pair > _callbacks; }; @@ -148,7 +154,8 @@ namespace Cfg { inline bool Parameter::hasNeedRestart () const { return hasFlags(NeedRestart); }; inline bool Parameter::hasMustExist () const { return hasFlags(MustExist); }; inline const std::string& Parameter::getId () const { return _id; } - inline const Parameter::Type Parameter::getType () const { return _type; } + inline Parameter::Type Parameter::getType () const { return _type; } + inline Parameter::Priority Parameter::getPriority () const { return _priority; } inline int Parameter::getFlags () const { return _flags; } inline bool Parameter::hasFlags ( int mask ) const { return (_flags & mask); } inline int Parameter::getMinInt () const { return _minInt; } @@ -159,6 +166,7 @@ namespace Cfg { inline void Parameter::setFlags ( int mask ) { _flags |= mask; } inline void Parameter::unsetFlags ( int mask ) { _flags &= ~mask; } inline void Parameter::setPriority ( Priority priority ) { _priority = priority; } + inline void Parameter::valueChanged () { _onValueChanged(); } inline bool Parameter::checkValue ( int value ) const { bool ok = not ( ( (_flags&HasMin) and (value < _minInt) ) @@ -194,8 +202,17 @@ namespace Cfg { inline Parameter::EnumValue::EnumValue ( const std::string& label, int value ) : _label(label), _value(value) { } - inline void Parameter::registerCb ( ParameterChangedCb_t cb ) { _callbacks.push_back(cb); } + inline void Parameter::registerCb ( void* tag, ParameterChangedCb_t cb ) + { + _callbacks.push_back(make_pair(tag,cb)); cb(this); + } + inline void Parameter::unregisterCb ( void* tag ) + { + for ( auto icb = _callbacks.begin() ; icb != _callbacks.end() ; ++icb ) { + if ( (*icb).first == tag ) { _callbacks.erase( icb ); break; } + } + } inline bool Parameter::_updatePriority ( Priority priority ) { @@ -206,10 +223,9 @@ namespace Cfg { } inline void Parameter::_onValueChanged () - { for ( size_t icb=0 ; icb<_callbacks.size() ; ++icb ) _callbacks[icb]( this ); } + { for ( size_t icb=0 ; icb<_callbacks.size() ; ++icb ) _callbacks[icb].second( this ); } -} // End of Cfg namespace. +} // Cfg namespace. - -#endif // __CFG_CONFIGURATION_PARAMETER__ +#endif // CFG_CONFIGURATION_PARAMETER_H diff --git a/vlsisapd/src/configuration/src/vlsisapd/configuration/ParameterWidget.h b/vlsisapd/src/configuration/src/vlsisapd/configuration/ParameterWidget.h index 3fd47269..084a1425 100644 --- a/vlsisapd/src/configuration/src/vlsisapd/configuration/ParameterWidget.h +++ b/vlsisapd/src/configuration/src/vlsisapd/configuration/ParameterWidget.h @@ -1,15 +1,9 @@ - // -*- C++ -*- // // This file is part of the VSLSI Stand-Alone Software. -// Copyright (c) UPMC/LIP6 2010-2010, All Rights Reserved +// Copyright (c) UPMC 2010-2016, All Rights Reserved // -// =================================================================== -// -// $Id$ -// -// x-----------------------------------------------------------------x -// | | +// +-----------------------------------------------------------------+ // | C O R I O L I S | // | C o n f i g u r a t i o n D a t a - B a s e | // | | @@ -17,15 +11,11 @@ // | E-mail : Jean-Paul.Chaput@lip6.fr | // | =============================================================== | // | C++ Header : "./ParameterWidget.h" | -// | *************************************************************** | -// | U p d a t e s | -// | | -// x-----------------------------------------------------------------x +// +-----------------------------------------------------------------+ - -#ifndef __CFG_PARAMETER_WIDGET__ -#define __CFG_PARAMETER_WIDGET__ +#ifndef CFG_PARAMETER_WIDGET_H +#define CFG_PARAMETER_WIDGET_H #include #include @@ -42,26 +32,26 @@ namespace Cfg { // ------------------------------------------------------------------- // Class : "Cfg::ParameterWidget". - class ParameterWidget : public QObject { Q_OBJECT; public: enum Flags { UseSpinBox=0x1, IsFileName=0x2, IsPathName=0x4 }; public: - ParameterWidget ( ConfTabWidget* parent, Parameter*, const std::string& label, int flags ); - inline Parameter* getParameter (); - inline QLabel* getLabelWidget (); - inline QWidget* getValueWidget (); - inline ConfTabWidget* getConfTabWidget (); - ConfigurationWidget* getConfigurationWidget (); - inline int getFlags () const; - inline bool hasFlags ( int mask ) const; - inline void setFlags ( int mask ); - inline void unsetFlags ( int mask ); - void onUpdateValueCb ( Parameter* ); + ParameterWidget ( ConfTabWidget* parent, Parameter*, const std::string& label, int flags ); + virtual ~ParameterWidget (); + inline Parameter* getParameter (); + inline QLabel* getLabelWidget (); + inline QWidget* getValueWidget (); + inline ConfTabWidget* getConfTabWidget (); + ConfigurationWidget* getConfigurationWidget (); + inline int getFlags () const; + inline bool hasFlags ( int mask ) const; + inline void setFlags ( int mask ); + inline void unsetFlags ( int mask ); + void onUpdateValueCb ( Parameter* ); public slots: - void updateValue (); - void enableSlaves ( int ); + void updateValue (); + void enableSlaves ( int ); public: ConfTabWidget* _confTabWidget; Parameter* _parameter; @@ -82,6 +72,6 @@ namespace Cfg { inline void ParameterWidget::unsetFlags ( int mask ) { _flags &= ~mask; } -} // End of Cfg namespace. +} // Cfg namespace. -#endif // __CFG_PARAMETER_WIDGET__ +#endif // CFG_PARAMETER_WIDGET_H