coriolis/hurricane/src/hurricane/Library.cpp

311 lines
9.2 KiB
C++

// ****************************************************************************************************
// File: ./Library.cpp
// Authors: R. Escassut
// Copyright (c) BULL S.A. 2000-2015, All Rights Reserved
//
// This file is part of Hurricane.
//
// Hurricane is free software: you can redistribute it and/or modify it under the terms of the GNU
// Lesser General Public License as published by the Free Software Foundation, either version 3 of the
// License, or (at your option) any later version.
//
// Hurricane is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even
// the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the Lesser GNU
// General Public License for more details.
//
// You should have received a copy of the Lesser GNU General Public License along with Hurricane. If
// not, see <http://www.gnu.org/licenses/>.
// ****************************************************************************************************
#include "hurricane/SharedName.h"
#include "hurricane/Library.h"
#include "hurricane/DataBase.h"
#include "hurricane/Cell.h"
#include "hurricane/Technology.h"
#include "hurricane/Error.h"
namespace Hurricane {
// ****************************************************************************************************
// Library implementation
// ****************************************************************************************************
Library::Library(DataBase* dataBase, Library* library, const Name& name)
// *********************************************************************
: Inherit(),
_dataBase(dataBase),
_library(library),
_name(name),
_libraryMap(),
_cellMap(),
_nextOfLibraryLibraryMap(NULL)
{
if (!_dataBase)
throw Error("Can't create " + _TName("Library") + " : null data base");
if (name.isEmpty())
throw Error("Can't create " + _TName("Library") + " : empty name");
if (!_library) {
if (_dataBase->getRootLibrary())
throw Error("Can't create " + _TName("Library") + " : root library already exists");
}
else {
if (_library->getLibrary(_name))
throw Error("Can't create Library " + getString(name) + " : already exists");
}
}
Library* Library::create(DataBase* dataBase, const Name& name)
// ***********************************************************
{
Library* library = new Library(dataBase, NULL, name);
library->_postCreate();
return library;
}
Library* Library::create(Library* library, const Name& name)
// *********************************************************
{
if (!library)
throw Error("Can't create " + _TName("Library") + " : null library");
library = new Library(library->getDataBase(), library, name);
library->_postCreate();
return library;
}
void Library::setName(const Name& name)
// ************************************
{
if (name != _name) {
if (name.isEmpty())
throw Error("Can't change library name : empty name");
if (_library && _library->getLibrary(name))
throw Error("Can't change library name : already exists");
if (_library) _library->_getLibraryMap()._remove(this);
_name = name;
if (_library) _library->_getLibraryMap()._insert(this);
}
}
string Library::getHierarchicalName () const
// *****************************************
{
string rpath;
Library* library = getLibrary();
do {
rpath.insert( 0, getString(library->getName())+"." );
library = library->getLibrary();
} while ( library );
return rpath + getString(getName());
}
void Library::_postCreate()
// ************************
{
if (!_library)
_dataBase->_setRootLibrary(this);
else
_library->_getLibraryMap()._insert(this);
Inherit::_postCreate();
}
void Library::_preDestroy()
// ***********************
{
Inherit::_preDestroy();
for_each_cell(cell, getCells()) cell->destroy(); end_for;
for_each_library(library, getLibraries()) library->destroy(); end_for;
if (!_library)
_dataBase->_setRootLibrary(NULL);
else
_library->_getLibraryMap()._remove(this);
}
string Library::_getString() const
// *******************************
{
string s = Inherit::_getString();
s.insert(s.length() - 1, " ");
s.insert(s.length() - 1, getString(_name));
return s;
}
Record* Library::_getRecord() const
// **************************
{
Record* record = Inherit::_getRecord();
if (record) {
record->add(getSlot("DataBase", _dataBase));
record->add(getSlot("Library", _library));
record->add(getSlot("Name", &_name));
record->add(getSlot("Libraries", &_libraryMap));
record->add(getSlot("Cells", &_cellMap));
}
return record;
}
// ****************************************************************************************************
// Library::LibraryMap implementation
// ****************************************************************************************************
Library::LibraryMap::LibraryMap()
// ******************************
: Inherit()
{
}
Name Library::LibraryMap::_getKey(Library* library) const
// ******************************************************
{
return library->getName();
}
unsigned Library::LibraryMap::_getHashValue(Name name) const
// *********************************************************
{
return name._getSharedName()->getId() / 8;
}
Library* Library::LibraryMap::_getNextElement(Library* library) const
// ******************************************************************
{
return library->_getNextOfLibraryLibraryMap();
}
void Library::LibraryMap::_setNextElement(Library* library, Library* nextLibrary) const
// ************************************************************************************
{
library->_setNextOfLibraryLibraryMap(nextLibrary);
};
// ****************************************************************************************************
// Library::CellMap implementation
// ****************************************************************************************************
Library::CellMap::CellMap()
// ************************
: Inherit()
{
}
Name Library::CellMap::_getKey(Cell* cell) const
// *********************************************
{
return cell->getName();
}
unsigned Library::CellMap::_getHashValue(Name name) const
// ******************************************************
{
return name._getSharedName()->getId() / 8;
}
Cell* Library::CellMap::_getNextElement(Cell* cell) const
// ******************************************************
{
return cell->_getNextOfLibraryCellMap();
}
void Library::CellMap::_setNextElement(Cell* cell, Cell* nextCell) const
// *********************************************************************
{
cell->_setNextOfLibraryCellMap(nextCell);
};
void Library::_toJson(JsonWriter* w) const
// ***************************************
{
Inherit::_toJson( w );
jsonWrite( w, "_name" , getName() );
//jsonWrite( w, "+cellMap" , getCells() );
jsonWrite( w, "+libraryMap", getLibraries() );
}
// ****************************************************************************************************
// JsonLibrary implementation
// ****************************************************************************************************
Initializer<JsonLibrary> jsonLibraryInit ( 0 );
void JsonLibrary::initialize()
// **************************
{ JsonTypes::registerType( new JsonLibrary (JsonWriter::RegisterMode) ); }
JsonLibrary::JsonLibrary(unsigned long flags)
// ************************************
: JsonDBo(flags)
{
//add( ".Library" , typeid(Library*) );
add( "_name" , typeid(string) );
//add( "+cellMap" , typeid(JsonArray) );
add( "+libraryMap", typeid(JsonArray) );
}
string JsonLibrary::getTypeName() const
// *********************************
{ return "Library"; }
JsonLibrary* JsonLibrary::clone(unsigned long flags) const
// *************************************************
{ return new JsonLibrary ( flags ); }
void JsonLibrary::toData(JsonStack& stack)
// ***************************************
{
check( stack, "JsonLibrary::toData" );
Name libName ( get<string> ( stack, "_name" ) );
Library* library = NULL;
Library* parent = NULL;
if (stack.rhas(".Library"))
parent = get<Library*>( stack, ".Library" );
else if (stack.rhas("_rootLibrary"))
parent = get<Library*>( stack, "_rootLibrary" );
if (parent) {
library = parent->getLibrary( libName );
if (not library)
library = Library::create( parent, libName );
} else {
library = DataBase::getDB()->getRootLibrary();
if (not library)
library = Library::create( DataBase::getDB(), libName );
else {
if (library->getName() != libName) {
throw Error( "JsonLibrary::toData(): Root library name discrepency, \"%s\" vs. \"%s\"."
, getString(library->getName()).c_str()
, getString(libName).c_str()
);
}
}
}
update( stack, library );
}
} // End of Hurricane namespace.
// ****************************************************************************************************
// Copyright (c) BULL S.A. 2000-2015, All Rights Reserved
// ****************************************************************************************************