diff --git a/hurricane/src/hurricane/CMakeLists.txt b/hurricane/src/hurricane/CMakeLists.txt index a480114d..93937242 100644 --- a/hurricane/src/hurricane/CMakeLists.txt +++ b/hurricane/src/hurricane/CMakeLists.txt @@ -1,5 +1,4 @@ - include_directories ( ${HURRICANE_SOURCE_DIR}/src/hurricane ) set ( includes hurricane/Mask.h hurricane/DebugSession.h @@ -151,7 +150,6 @@ Timer.cpp ) - add_library ( hurricane ${cpps} ) - install ( TARGETS hurricane DESTINATION /lib) - -install(FILES ${includes} DESTINATION /include/hurricane) + add_library ( hurricane ${cpps} ) + install ( TARGETS hurricane DESTINATION /lib) + install ( FILES ${includes} DESTINATION /include/hurricane ) diff --git a/hurricane/src/hurricane/Cell.cpp b/hurricane/src/hurricane/Cell.cpp index 03d0b73f..e7ccd6dc 100644 --- a/hurricane/src/hurricane/Cell.cpp +++ b/hurricane/src/hurricane/Cell.cpp @@ -17,6 +17,8 @@ // not, see . // **************************************************************************************************** +//#define TEST_INTRUSIVESET + #include "hurricane/Cell.h" #include "hurricane/DataBase.h" #include "hurricane/Library.h" @@ -369,7 +371,7 @@ void Cell::_removeSlaveEntity(Entity* entity, Entity* slaveEntity) pair bounds = _slaveEntityMap.equal_range(entity); - multimap::iterator it = bounds.first; + SlaveEntityMap::iterator it = bounds.first; for(; it != bounds.second ; it++ ) { if (it->second == slaveEntity) { _slaveEntityMap.erase(it); diff --git a/hurricane/src/hurricane/Commons.cpp b/hurricane/src/hurricane/Commons.cpp index 7dae43d9..feb0d5dd 100644 --- a/hurricane/src/hurricane/Commons.cpp +++ b/hurricane/src/hurricane/Commons.cpp @@ -17,12 +17,9 @@ // not, see . // **************************************************************************************************** -#ifdef HAVE_LIBIBERTY -#include "hurricane/demangle.h" -#include "hurricane/libiberty.h" -#endif -#include "hurricane/Commons.h" +#include +#include "hurricane/Commons.h" namespace Hurricane { @@ -100,26 +97,31 @@ void ltraceout (unsigned int level, unsigned int count ) } // ------------------------------------------------------------------- -// Function : "Demangle ()". +// Function : "demangle ()". + + +#define HAVE_CXA_DEMANGLE + +#ifdef HAVE_CXA_DEMANGLE string demangle ( const char* symbol ) -{ - string mangled = "_Z"; - mangled += symbol; - -# ifdef HAVE_LIBIBERTY - char* result = cplus_demangle ( mangled.c_str(), DMGL_PARAMS|DMGL_ANSI|DMGL_TYPES ); +{ + int status; + unsigned int length = 4096; + char demangled[length]; - if ( result ) { - mangled = result; - free ( result ); - return mangled; - } -# endif - - return mangled; + abi::__cxa_demangle ( symbol, demangled, &length, &status ); + return demangled; } +#else + +string demangle ( const char* symbol ) +{ + return symbol; +} + +#endif } // End of Hurricane namespace. diff --git a/hurricane/src/hurricane/DBo.cpp b/hurricane/src/hurricane/DBo.cpp index 7e59fcd8..daad74b6 100644 --- a/hurricane/src/hurricane/DBo.cpp +++ b/hurricane/src/hurricane/DBo.cpp @@ -38,8 +38,8 @@ // x-----------------------------------------------------------------x -#include "hurricane/DBo.h" #include "hurricane/Property.h" +#include "hurricane/DBo.h" #include "hurricane/Quark.h" #include "hurricane/Error.h" @@ -79,7 +79,7 @@ namespace Hurricane { Property* DBo::getProperty ( const Name& name ) const { - PropertySet::const_iterator iterator = _propertySet.begin(); + set::const_iterator iterator = _propertySet.begin(); while ( iterator != _propertySet.end() ) { Property* property = *iterator; if (property->getName() == name) return property; @@ -173,7 +173,7 @@ namespace Hurricane { Record* DBo::_getRecord () const { Record* record = new Record ( getString(this) ); - record->add ( getSlot("Properties", &_propertySet) ); + record->add ( getSlot("_propertySet", &_propertySet) ); return record; } diff --git a/hurricane/src/hurricane/DRCError.cpp b/hurricane/src/hurricane/DRCError.cpp index 11219070..93f79a84 100644 --- a/hurricane/src/hurricane/DRCError.cpp +++ b/hurricane/src/hurricane/DRCError.cpp @@ -18,13 +18,15 @@ // **************************************************************************************************** #include "hurricane/DRCError.h" -#include "hurricane/Cell.h" +//#include "hurricane/Cell.h" #include "hurricane/Slice.h" #include "hurricane/Error.h" namespace Hurricane { + class Cell; + // **************************************************************************************************** // DRCError implementation diff --git a/hurricane/src/hurricane/DataBase.cpp b/hurricane/src/hurricane/DataBase.cpp index 794d513a..0d50933f 100644 --- a/hurricane/src/hurricane/DataBase.cpp +++ b/hurricane/src/hurricane/DataBase.cpp @@ -20,8 +20,6 @@ #include "hurricane/DataBase.h" #include "hurricane/Technology.h" #include "hurricane/Library.h" -#include "hurricane/Cell.h" -#include "hurricane/Timer.h" #include "hurricane/Error.h" #include "hurricane/UpdateSession.h" @@ -87,10 +85,10 @@ Record* DataBase::_getRecord() const { Record* record = Inherit::_getRecord(); if (record) { - record->add(getSlot("Technology", _technology)); - record->add(getSlot("RootLibrary", _rootLibrary)); - record->add(getSlot("Precision", DbU::getPrecision())); - record->add(getSlot("Resolution", DbU::db(1))); + record->add(getSlot("_technology" , _technology )); + record->add(getSlot("_rootLibrary" , _rootLibrary )); + record->add(getSlot("DbU::precision" , DbU::getPrecision())); + record->add(getSlot("DbU::resolution", DbU::db(1) )); //record->add(getSlot("GridStep", getValueString(getGridStep()))); } return record; diff --git a/hurricane/src/hurricane/DebugSession.cpp b/hurricane/src/hurricane/DebugSession.cpp index 4179f459..5c42e460 100644 --- a/hurricane/src/hurricane/DebugSession.cpp +++ b/hurricane/src/hurricane/DebugSession.cpp @@ -47,8 +47,6 @@ #include "hurricane/DebugSession.h" - - namespace Hurricane { diff --git a/hurricane/src/hurricane/Record.cpp b/hurricane/src/hurricane/Record.cpp index 670f7dfc..6977f724 100644 --- a/hurricane/src/hurricane/Record.cpp +++ b/hurricane/src/hurricane/Record.cpp @@ -52,8 +52,8 @@ namespace Hurricane { Record::Record ( const string& name ) - : _name(name) - , _slotList() + : _name (name) + , _slots() { _allocateds++; } @@ -62,11 +62,9 @@ namespace Hurricane { Record::~Record () { //cerr << "Record::~Record() - " << _name << ": " << hex << (void*)this << dec << endl; - while (!_slotList.empty()) { - Slot* slot = *_slotList.begin(); - _slotList.remove(slot); - delete slot; - } + for ( size_t i=0 ; i<_slots.size() ; i++ ) + delete _slots[i]; + _allocateds--; } @@ -79,9 +77,8 @@ namespace Hurricane { Slot* Record::getSlot ( unsigned no ) const { - SlotList::const_iterator iterator = _slotList.begin(); - while (no-- && (iterator != _slotList.end())) ++iterator; - return (iterator == _slotList.end()) ? NULL : *iterator; + if ( no >= _slots.size() ) return NULL; + return _slots[no]; } @@ -91,7 +88,7 @@ namespace Hurricane { cerr << "[ERROR] Record::add(): Attempt to add NULL Slot." << endl; return; } - _slotList.push_back(slot); + _slots.push_back(slot); } diff --git a/hurricane/src/hurricane/hurricane/Cell.h b/hurricane/src/hurricane/hurricane/Cell.h index 8214ecdb..6f66f42b 100644 --- a/hurricane/src/hurricane/hurricane/Cell.h +++ b/hurricane/src/hurricane/hurricane/Cell.h @@ -23,8 +23,8 @@ #include "hurricane/Pathes.h" #include "hurricane/Entity.h" #include "hurricane/Cells.h" -#include "hurricane/Instance.h" #include "hurricane/DeepNet.h" +#include "hurricane/Instance.h" #include "hurricane/Pin.h" #include "hurricane/Pins.h" #include "hurricane/Slices.h" @@ -38,11 +38,12 @@ #include "hurricane/Transformation.h" #include "hurricane/Layer.h" #include "hurricane/QuadTree.h" -#include "hurricane/IntrusiveMap.h" +//#include "hurricane/IntrusiveMap.h" #include "hurricane/IntrusiveSet.h" #include "hurricane/MapCollection.h" + namespace Hurricane { class Library; @@ -168,7 +169,7 @@ class Cell : public Entity { private: bool _isPad; private: Cell* _nextOfLibraryCellMap; private: Cell* _nextOfSymbolCellSet; - private: multimap _slaveEntityMap; + private: SlaveEntityMap _slaveEntityMap; // Constructors // ************ diff --git a/hurricane/src/hurricane/hurricane/Commons.h b/hurricane/src/hurricane/hurricane/Commons.h index 24ed6cf1..a94fd64c 100644 --- a/hurricane/src/hurricane/hurricane/Commons.h +++ b/hurricane/src/hurricane/hurricane/Commons.h @@ -182,9 +182,10 @@ namespace Hurricane { // Forward declaration of "getSlot<>()" template. -template inline Hurricane::Slot* getSlot ( std::string& name, Data d ); -template inline Hurricane::Slot* getSlot ( const std::string& name, Data d ); -template inline Hurricane::Slot* getSlot ( const std::string& name, Data* d ); +template inline Hurricane::Slot* getSlot ( std::string& name, Data ); +template inline Hurricane::Slot* getSlot ( std::string& name, Data* ); +template inline Hurricane::Slot* getSlot ( const std::string& name, Data ); +template inline Hurricane::Slot* getSlot ( const std::string& name, Data* ); // ------------------------------------------------------------------- @@ -193,7 +194,9 @@ template inline Hurricane::Slot* getSlot ( const std::string& nam // Default match. template inline std::string getString ( Data data ) -{ return ""; } +{ return std::string(""); } // "const *" flavors. @@ -278,7 +281,7 @@ template<> inline std::string getString ( std::string* s ) template<> inline std::string getString ( bool b ) { return (b)?"True":"False" ; } -template<> inline std::string getString ( const char c ) +template<> inline std::string getString ( char c ) { return std::string(1,c); } template<> inline std::string getString ( int i ) @@ -314,7 +317,32 @@ template inline Hurricane::Record* getRecord ( Data data ) // ------------------------------------------------------------------- -// Inspector Support for : "const std::vector*". +// Inspector Support for : "[const] std::vector*". + + +template +inline std::string getString ( std::vector* v ) +{ + std::string name = "const std::vector:"; + return name + getString(v->size()); +} + + +template +inline Hurricane::Record* getRecord ( std::vector* v ) +{ + Hurricane::Record* record = NULL; + if ( !v->empty() ) { + record = new Hurricane::Record ( "std::vector" ); + unsigned n = 1; + typename std::vector::iterator iterator = v->begin(); + while ( iterator != v->end() ) { + record->add ( getSlot(getString(n++), *iterator) ); + ++iterator; + } + } + return record; +} template @@ -334,7 +362,7 @@ inline Hurricane::Record* getRecord ( const std::vector* v ) unsigned n = 1; typename std::vector::const_iterator iterator = v->begin(); while ( iterator != v->end() ) { - record->add ( getSlot(getString(n++), *iterator) ); + record->add ( getSlot(getString(n++), *iterator) ); ++iterator; } } @@ -363,7 +391,7 @@ inline Hurricane::Record* getRecord ( const std::list* l ) unsigned n = 1; typename std::list::const_iterator iterator = l->begin(); while ( iterator != l->end() ) { - record->add ( getSlot(getString(n++), *iterator) ); + record->add ( getSlot(getString(n++), *iterator) ); ++iterator; } } @@ -401,7 +429,7 @@ inline Hurricane::Record* getRecord ( std::list* l ) template -inline std::string getString ( const std::map* m ) +inline std::string getString ( std::map* m ) { std::string name = "std::map:"; return name + getString(m->size()); @@ -409,12 +437,12 @@ inline std::string getString ( const std::map* m ) template -inline Hurricane::Record* getRecord ( const std::map* m ) +inline Hurricane::Record* getRecord ( std::map* m ) { Hurricane::Record* record = NULL; if ( !m->empty() ) { record = new Hurricane::Record ( "std::map" ); - typename std::map::const_iterator iterator = m->begin(); + typename std::map::iterator iterator = m->begin(); while ( iterator != m->end() ) { record->add ( getSlot(getString(iterator->first), iterator->second) ); ++iterator; @@ -424,14 +452,38 @@ inline Hurricane::Record* getRecord ( const std::map* m ) } +template +inline std::string getString ( const std::map* m ) +{ + std::string name = "const std::map:"; + return name + getString(m->size()); +} + + +template +inline Hurricane::Record* getRecord ( const std::map* m ) +{ + Hurricane::Record* record = NULL; + if ( !m->empty() ) { + record = new Hurricane::Record ( "const std::map" ); + typename std::map::const_iterator iterator = m->begin(); + while ( iterator != m->end() ) { + record->add ( getSlot(getString(iterator->first), iterator->second) ); + ++iterator; + } + } + return record; +} + + // ------------------------------------------------------------------- -// Inspector Support for : "[const] std::multimap*. +// Inspector Support for : "const std::multimap*". template inline std::string getString ( const std::multimap* m ) { - std::string name = "std::multimap:"; + std::string name = "const std::multimap:"; return name + getString(m->size()); } @@ -441,10 +493,10 @@ inline Hurricane::Record* getRecord ( const std::multimap* { Hurricane::Record* record = NULL; if ( !m->empty() ) { - record = new Hurricane::Record ( "std::multimap" ); + record = new Hurricane::Record ( "const std::multimap" ); typename std::multimap::const_iterator iterator = m->begin(); while ( iterator != m->end() ) { - record->add ( getSlot(getString(iterator->first), iterator->second) ); + record->add ( getSlot(getString(iterator->first), iterator->second) ); ++iterator; } } @@ -497,32 +549,30 @@ inline Hurricane::Record* getRecord ( const std::set* s ) unsigned n = 1; typename std::set::const_iterator iterator = s->begin(); while ( iterator != s->end() ) { - record->add ( getSlot(getString(n++), *iterator) ); + record->add ( getSlot(getString(n++), *iterator) ); ++iterator; } } return record; } -// ------------------------------------------------------------------- -// Inspector Support for : "std::set*". -template -inline std::string getString ( std::set* s ) +template< typename Element, typename Compare, typename Allocator > +inline std::string getString ( std::set* s ) { std::string name = "std::set:"; return name + getString(s->size()); } -template -inline Hurricane::Record* getRecord ( std::set* s ) +template< typename Element, typename Compare, typename Allocator > +inline Hurricane::Record* getRecord ( std::set* s ) { Hurricane::Record* record = NULL; if ( !s->empty() ) { record = new Hurricane::Record ( "std::set" ); unsigned n = 1; - typename std::set::iterator iterator = s->begin(); + typename std::set::iterator iterator = s->begin(); while ( iterator != s->end() ) { record->add ( getSlot(getString(n++), *iterator) ); ++iterator; diff --git a/hurricane/src/hurricane/hurricane/DBo.h b/hurricane/src/hurricane/hurricane/DBo.h index a2746cf5..cb8941e2 100644 --- a/hurricane/src/hurricane/hurricane/DBo.h +++ b/hurricane/src/hurricane/hurricane/DBo.h @@ -42,16 +42,13 @@ #define __HURRICANE_DBO__ #include "hurricane/DBos.h" -#include "hurricane/Properties.h" #include "hurricane/Name.h" +#include "hurricane/Properties.h" namespace Hurricane { - class Property; - - // ------------------------------------------------------------------- // Class : "Hurricane::DBo". @@ -59,27 +56,25 @@ namespace Hurricane { class DBo { public: - // Types. - typedef set PropertySet; // Methods. - virtual void destroy(); - inline PropertySet& _getPropertySet (); - void _onDestroyed ( Property* property ); - Property* getProperty ( const Name& ) const; - Properties getProperties () const; - inline bool hasProperty () const; - void put ( Property* ); - void remove ( Property* ); - void removeProperty ( const Name& ); - void clearProperties (); - // Hurricane Managment. - virtual string _getTypeName () const; - virtual string _getString () const; - virtual Record* _getRecord () const; + virtual void destroy(); + inline set& _getPropertySet (); + void _onDestroyed ( Property* property ); + Property* getProperty ( const Name& ) const; + Properties getProperties () const; + inline bool hasProperty () const; + void put ( Property* ); + void remove ( Property* ); + void removeProperty ( const Name& ); + void clearProperties (); + // Hurricane Managment. + virtual string _getTypeName () const; + virtual string _getString () const; + virtual Record* _getRecord () const; private: // Internal: Attributes. - mutable PropertySet _propertySet; + mutable set _propertySet; protected: // Internal: Constructors & Destructors. @@ -95,8 +90,8 @@ namespace Hurricane { // Inline Functions. - inline DBo::PropertySet& DBo::_getPropertySet () { return _propertySet; } - inline bool DBo::hasProperty () const { return !_propertySet.empty(); } + inline set& DBo::_getPropertySet () { return _propertySet; } + inline bool DBo::hasProperty () const { return !_propertySet.empty(); } } // End of Hurricane namespace. @@ -105,18 +100,4 @@ namespace Hurricane { INSPECTOR_P_SUPPORT(Hurricane::DBo); -template<> -inline Hurricane::Slot* getSlot ( const std::string& name, const std::set* s ) -{ - return new Hurricane::SlotTemplate*>(name,s); -} - - -template<> -inline Hurricane::Slot* getSlot ( const std::string& name, std::set* s ) -{ - return new Hurricane::SlotTemplate*>(name,s); -} - - #endif // __HURRICANE_DBO__ diff --git a/hurricane/src/hurricane/hurricane/Instance.h b/hurricane/src/hurricane/hurricane/Instance.h index 09b977d2..ae6ae718 100644 --- a/hurricane/src/hurricane/hurricane/Instance.h +++ b/hurricane/src/hurricane/hurricane/Instance.h @@ -23,7 +23,7 @@ #include "hurricane/Go.h" #include "hurricane/Plug.h" #include "hurricane/SharedPath.h" -#include "hurricane/IntrusiveMap.h" +//#include "hurricane/IntrusiveMap.h" namespace Hurricane { diff --git a/hurricane/src/hurricane/hurricane/IntrusiveMap.h b/hurricane/src/hurricane/hurricane/IntrusiveMap.h index 963b1613..2bc60135 100644 --- a/hurricane/src/hurricane/hurricane/IntrusiveMap.h +++ b/hurricane/src/hurricane/hurricane/IntrusiveMap.h @@ -342,7 +342,7 @@ template class IntrusiveMap { n = 1; Element* element = _array[index]; while (element) { - record->add(getSlot(getString(index) + ":" + getString(n++), element)); + record->add(getSlot(getString(index) + ":" + getString(n++), element)); element = _getNextElement(element); } } diff --git a/hurricane/src/hurricane/hurricane/Record.h b/hurricane/src/hurricane/hurricane/Record.h index 80ee509f..574de673 100644 --- a/hurricane/src/hurricane/hurricane/Record.h +++ b/hurricane/src/hurricane/hurricane/Record.h @@ -57,25 +57,25 @@ namespace Hurricane { public: // Types. - typedef list SlotList; + typedef vector SlotVector; public: // Constructor & Destructor. - Record ( const string& name ); - virtual ~Record (); - // Methods. - static size_t getAllocateds (); - inline const string& getName () const; - Slot* getSlot ( unsigned no ) const; - void add ( Slot* slot ); - inline SlotList& _getSlotList (); + Record ( const string& name ); + virtual ~Record (); + // Methods. + static size_t getAllocateds (); + inline const string& getName () const; + Slot* getSlot ( unsigned no ) const; + void add ( Slot* slot ); + inline SlotVector& _getSlotVector (); private: // Internal: Static Attributes. static size_t _allocateds; // Internal: Attributes string _name; - SlotList _slotList; + SlotVector _slots; private: // Forbidden: Constructors @@ -85,8 +85,8 @@ namespace Hurricane { // Inline Functions. - inline const string& Record::getName () const { return _name; } - inline Record::SlotList& Record::_getSlotList () { return _slotList; } + inline const string& Record::getName () const { return _name; } + inline Record::SlotVector& Record::_getSlotVector () { return _slots; } } // End of Hurricane namespace. diff --git a/hurricane/src/hurricane/hurricane/Slot.h b/hurricane/src/hurricane/hurricane/Slot.h index 16739d69..f0e9bddc 100644 --- a/hurricane/src/hurricane/hurricane/Slot.h +++ b/hurricane/src/hurricane/hurricane/Slot.h @@ -91,11 +91,58 @@ namespace Hurricane { // ------------------------------------------------------------------- -// Class : "SlotTemplate". +// Class : "SlotTemplate". template class SlotTemplate : public Slot { + public: + // Constructor. + SlotTemplate ( const string& name, Data data ); + SlotTemplate ( string& name, Data data ); + // Accessors. + virtual string getDataString () const; + virtual Record* getDataRecord () const; + virtual SlotTemplate* + getClone () const; + + protected: + // Internal: Attributes. + Data _data; + + private: + // Internal: Constructors. + SlotTemplate ( const SlotTemplate& ); + SlotTemplate& operator= ( const SlotTemplate& ); + }; + + +// Inline Member Functions. + template + SlotTemplate::SlotTemplate ( const string& name, Data data ) + : Slot(name), _data(data) { } + + template + SlotTemplate::SlotTemplate ( string& name, Data data ) + : Slot(name), _data(data) { } + + template + string SlotTemplate::getDataString () const { return ::getString(_data); } + + template + Record* SlotTemplate::getDataRecord () const { return ::getRecord(_data); } + + template + SlotTemplate* SlotTemplate::getClone () const + { return new SlotTemplate(_name,_data); } + + +// ------------------------------------------------------------------- +// Class : "SlotTemplate". + + template + class SlotTemplate : public Slot { + public: // Constructor. SlotTemplate ( const string& name, const Data data ); @@ -103,7 +150,7 @@ namespace Hurricane { // Accessors. virtual string getDataString () const; virtual Record* getDataRecord () const; - virtual SlotTemplate* + virtual SlotTemplate* getClone () const; protected: @@ -119,21 +166,21 @@ namespace Hurricane { // Inline Member Functions. template - SlotTemplate::SlotTemplate ( const string& name, const Data data ) - : Slot(name), _data(data) { } + SlotTemplate::SlotTemplate ( const string& name, const Data data ) + : Slot(name), _data(data) { } template - SlotTemplate::SlotTemplate ( string& name, const Data data ) - : Slot(name), _data(data) { } + SlotTemplate::SlotTemplate ( string& name, const Data data ) + : Slot(name), _data(data) { } template - string SlotTemplate::getDataString () const { return getString(_data); } + string SlotTemplate::getDataString () const { return getString(_data); } template - Record* SlotTemplate::getDataRecord () const { return getRecord(_data); } + Record* SlotTemplate::getDataRecord () const { return getRecord(_data); } template - SlotTemplate* SlotTemplate::getClone () const + SlotTemplate* SlotTemplate::getClone () const { return new SlotTemplate(_name,_data); } @@ -175,16 +222,64 @@ namespace Hurricane { : Slot(name), _data(data) {} template - string SlotTemplate::getDataString () const { return getString(_data); } + string SlotTemplate::getDataString () const { return ::getString(_data); } template - Record* SlotTemplate::getDataRecord () const { return getRecord(_data); } + Record* SlotTemplate::getDataRecord () const { return ::getRecord(_data); } template SlotTemplate* SlotTemplate::getClone () const { return new SlotTemplate(_name,_data); } +// ------------------------------------------------------------------- +// Class : "SlotTemplate". + + + template + class SlotTemplate : public Slot { + + public: + // Constructor. + SlotTemplate ( const string& name, Data* const data ); + SlotTemplate ( string& name, Data* const data ); + // Accessors. + virtual string getDataString () const; + virtual Record* getDataRecord () const; + virtual SlotTemplate* + getClone () const; + + protected: + // Internal: Attributes. + Data* const _data; + + private: + // Internal: Constructors. + SlotTemplate ( const SlotTemplate& ); + SlotTemplate& operator= ( const SlotTemplate& ); + }; + + +// Inline Member Functions. + template + SlotTemplate::SlotTemplate ( const string& name, Data* const data ) + : Slot(name), _data(data) {} + + template + SlotTemplate::SlotTemplate ( string& name, Data* const data ) + : Slot(name), _data(data) {} + + template + string SlotTemplate::getDataString () const { return ::getString(_data); } + + template + Record* SlotTemplate::getDataRecord () const { return ::getRecord(_data); } + + template + SlotTemplate* SlotTemplate::getClone () const + { return new SlotTemplate(_name,_data); } + + // ------------------------------------------------------------------- // Class : "SlotTemplate". @@ -233,13 +328,23 @@ namespace Hurricane { template inline Hurricane::Slot* getSlot( std::string& name, Data d ) { +//std::cerr << "getSlot( \"" << name << "\" )" << std::endl; return new Hurricane::SlotTemplate ( name, d ); } +template +inline Hurricane::Slot* getSlot( std::string& name, Data* d ) +{ +//std::cerr << "getSlot( \"" << name << "\" )" << std::endl; + return new Hurricane::SlotTemplate ( name, d ); +} + + template inline Hurricane::Slot* getSlot( const std::string& name, Data d ) { +//std::cerr << "getSlot( \"" << name << "\" )" << std::endl; return new Hurricane::SlotTemplate ( name, d ); } @@ -247,6 +352,7 @@ inline Hurricane::Slot* getSlot( const std::string& name, Data d ) template inline Hurricane::Slot* getSlot( const std::string& name, Data* d ) { +//std::cerr << "getSlot( \"" << name << "\" )" << std::endl; return new Hurricane::SlotTemplate ( name, d ); } diff --git a/hurricane/src/hurricane/hurricane/demangle.h b/hurricane/src/hurricane/hurricane/demangle.h index 3ec49022..2fc182ff 100644 --- a/hurricane/src/hurricane/hurricane/demangle.h +++ b/hurricane/src/hurricane/hurricane/demangle.h @@ -21,7 +21,7 @@ #if !defined (DEMANGLE_H) #define DEMANGLE_H -#include "hurricane/libiberty.h" +//#include "hurricane/libiberty.h" #ifdef __cplusplus extern "C" { diff --git a/hurricane/src/viewer/InspectorWidget.cpp b/hurricane/src/viewer/InspectorWidget.cpp index 72f57703..3a314c2c 100644 --- a/hurricane/src/viewer/InspectorWidget.cpp +++ b/hurricane/src/viewer/InspectorWidget.cpp @@ -57,7 +57,7 @@ namespace Hurricane { } - void InspectorWidget::History::push ( Slot* slot ) + void InspectorWidget::History::push ( Slot* slot, Record* record ) { if ( _depth < _slots.size()-1 ) { while ( _depth < _slots.size()-1 ) pop (); @@ -66,8 +66,9 @@ namespace Hurricane { _depth++; _slots.push_back ( slot->getClone() ); _comboBox->addItem ( QString("%1: %2").arg(_depth).arg(_slots[_slots.size()-1]->getDataString().c_str())); - _comboBox->setCurrentIndex ( _depth ); + //_comboBox->setCurrentIndex ( _depth ); + //cerr << "After History::push()" << endl; } @@ -94,8 +95,10 @@ namespace Hurricane { void InspectorWidget::History::goTo ( int depth ) { if ( ( depth < 0 ) || ( depth >= (int)_slots.size() ) ) return; - - _depth = depth; + if ( depth != _depth ) { + _depth = depth; + _comboBox->setCurrentIndex ( _depth ); + } } @@ -185,6 +188,7 @@ namespace Hurricane { QHeaderView* verticalHeader = _view->verticalHeader (); verticalHeader->setVisible ( false ); + verticalHeader->setDefaultSectionSize ( _rowHeight ); _historyComboBox = new QComboBox ( this ); _history.setComboBox ( _historyComboBox ); @@ -218,13 +222,6 @@ namespace Hurricane { } - void InspectorWidget::forceRowHeight () - { - for ( int rows=_sortModel->rowCount()-1; rows >= 0 ; rows-- ) - _view->setRowHeight ( rows, _rowHeight ); - } - - void InspectorWidget::setRootOccurrence ( Occurrence& occurrence ) { _rootOccurrence = occurrence; @@ -241,12 +238,12 @@ namespace Hurricane { void InspectorWidget::_setRootRecord ( Record* record ) { + //cerr << "InspectorWidget::_setRootRecord()." << endl; //if ( _baseModel ) _baseModel->setSlot ( NULL, 0 ); - _history.setRootRecord ( record ); - if ( !record ) _rootOccurrence = Occurrence (); + if ( record == NULL ) _rootOccurrence = Occurrence (); - if ( !_baseModel ) { + if ( _baseModel == NULL ) { _baseModel = new RecordModel ( this ); _sortModel = new QSortFilterProxyModel ( this ); _sortModel->setSourceModel ( _baseModel ); @@ -259,49 +256,53 @@ namespace Hurricane { // Only after creating the RecordModel can we connect the ComboBox. connect ( _historyComboBox, SIGNAL(currentIndexChanged(int)) - , this , SLOT(historyChanged(int)) ); - connect ( _baseModel, SIGNAL(layoutChanged()), this, SLOT(forceRowHeight()) ); + , this , SLOT (historyChanged(int)) ); } - setSlot (); + _history.setRootRecord ( record ); } - bool InspectorWidget::setSlot () + bool InspectorWidget::setSlot ( Record* record ) { bool change = true; - change = _baseModel->setSlot ( _history.getSlot(), _history.getDepth() ); -// if ( change ) { -// int rows = _sortModel->rowCount (); -// for ( rows-- ; rows >= 0 ; rows-- ) -// _view->setRowHeight ( rows, _rowHeight ); -// _view->selectRow ( 0 ); -// } + if ( (_history.getSlot() != NULL) and (record == NULL) ) + record = _history.getSlot()->getDataRecord(); + + //cerr << " Effective setSlot() ." << endl; + change = _baseModel->setSlot ( _history.getSlot(), record, _history.getDepth() ); return change; } - void InspectorWidget::pushSlot ( Slot* slot ) + void InspectorWidget::pushSlot ( Slot* slot, Record* record ) { - _history.push ( slot ); - if ( !setSlot() ) - _history.pop (); + //cerr << "InspectorWidget::pushSlot()" << endl; + + if ( slot == NULL ) return; + if ( record == NULL ) { + record = slot->getDataRecord (); + if ( record == NULL ) return; + } + + _history.push ( slot, record ); + setSlot ( record ); } void InspectorWidget::popSlot () { _history.pop (); - setSlot (); + //setSlot (); } void InspectorWidget::back () { _history.back (); - setSlot (); + //setSlot (); } @@ -313,10 +314,11 @@ namespace Hurricane { if ( keyEvent->key() == Qt::Key_Right ) { QModelIndex index = _view->currentIndex(); if ( index.isValid() ) { + //cerr << "Key Right: do to sub-slot." << endl; Slot* slot = _baseModel->getRecord()->getSlot(_sortModel->mapToSource(index).row()); - if ( slot ) - pushSlot ( slot ); + if ( slot != NULL ) + pushSlot ( slot, slot->getDataRecord() ); } } else if ( keyEvent->key() == Qt::Key_Left ) { back (); @@ -332,7 +334,6 @@ namespace Hurricane { void InspectorWidget::textFilterChanged () { _sortModel->setFilterRegExp ( _filterPatternLineEdit->text() ); - forceRowHeight (); } diff --git a/hurricane/src/viewer/RecordModel.cpp b/hurricane/src/viewer/RecordModel.cpp index 56de01d7..08a90a0d 100644 --- a/hurricane/src/viewer/RecordModel.cpp +++ b/hurricane/src/viewer/RecordModel.cpp @@ -36,9 +36,10 @@ namespace Hurricane { RecordModel::RecordModel ( QObject* parent ) : QAbstractTableModel(parent) - , _slot(NULL) - , _record(NULL) - , _depth(0) + , _slot (NULL) + , _record (NULL) + , _depth (0) + , _cache () { } @@ -49,30 +50,53 @@ namespace Hurricane { } - bool RecordModel::setSlot ( Slot* slot, size_t depth ) + bool RecordModel::setSlot ( Slot* slot, Record* record, size_t depth ) { - if ( !slot ) { - _slot = NULL; - _record = NULL; - _depth = depth; + //cerr << " Slot change" << endl; + + vector< pair >().swap ( _cache ); + + if ( _slot ) { + delete _slot; + if ( _depth ) delete _record; + } + + _slot = NULL; + _record = NULL; + _depth = depth; + + if ( slot == NULL ) { + //cerr << " NULL Slot" << endl; emit layoutChanged (); return false; } - Record* record = slot->getDataRecord (); - if ( !record ) { - delete slot; - return false; + // Now supplied by argument. + if ( record == NULL ) { + record = slot->getDataRecord (); + //cerr << " New record build" << endl; + if ( record == NULL ) { + // cerr << " Slot " << slot->getDataString() << " has NULL Record" << endl; + + delete slot; + return false; + } } - if ( _depth ) delete _record; - if ( _slot ) delete _slot; + //cerr << " New Slot [" << depth << "] " << slot->getDataString() << endl; _slot = slot; _record = record; _depth = depth; + Record::SlotVector& slotVector = _record->_getSlotVector(); + Record::SlotVector::iterator islot = slotVector.begin(); + for ( ; islot != slotVector.end() ; islot++ ) { + _cache.push_back ( make_pair(QVariant(getString((*islot)->getName()).c_str()) + ,QVariant((*islot)->getDataString().c_str())) ); + } + emit layoutChanged (); return true; @@ -84,7 +108,7 @@ namespace Hurricane { static QFont nameFont = Graphics::getFixedFont ( QFont::Bold ); static QFont valueFont = Graphics::getFixedFont ( QFont::Normal, true ); - if ( !index.isValid() ) return QVariant (); + if ( not index.isValid() ) return QVariant (); if ( role == Qt::SizeHintRole ) { switch (index.column()) { @@ -94,6 +118,7 @@ namespace Hurricane { } if ( role == Qt::FontRole ) { + //if ( index.row() == 0 ) return QVariant(); switch (index.column()) { case 0: return nameFont; case 1: return valueFont; @@ -102,11 +127,13 @@ namespace Hurricane { if ( role == Qt::DisplayRole ) { int row = index.row (); - Slot* slot = _record->getSlot ( row ); - if ( slot ) { + //Slot* slot = _record->getSlot ( row ); + if ( row < _cache.size() ) { switch ( index.column() ) { - case 0: return QVariant(slot->getName ().c_str()); - case 1: return QVariant(slot->getDataString().c_str()); + case 0: return _cache[row].first; + case 1: return _cache[row].second; + //case 0: return QVariant(slot->getName ().c_str()); + //case 1: return QVariant(slot->getDataString().c_str()); } } } @@ -118,9 +145,14 @@ namespace Hurricane { , Qt::Orientation orientation , int role ) const { - if ( ( orientation == Qt::Vertical ) || ( section > 1 ) || (role != Qt::DisplayRole) ) + if ( ( orientation == Qt::Vertical ) or ( section > 1 ) ) return QVariant(); + static QFont headerFont = Graphics::getFixedFont ( QFont::Bold, false, false, +2 ); + + if ( role == Qt::FontRole ) return headerFont; + if ( role != Qt::DisplayRole ) return QVariant(); + if ( section == 0 ) return QVariant ( tr("Object Attribute") ); @@ -130,7 +162,8 @@ namespace Hurricane { int RecordModel::rowCount ( const QModelIndex& parent ) const { - return (_record) ? _record->_getSlotList().size() : 0; + //return (_record != NULL) ? _record->_getSlotList().size() : 0; + return _cache.size(); } diff --git a/hurricane/src/viewer/SelectionModel.cpp b/hurricane/src/viewer/SelectionModel.cpp index bb62290f..afa50921 100644 --- a/hurricane/src/viewer/SelectionModel.cpp +++ b/hurricane/src/viewer/SelectionModel.cpp @@ -131,6 +131,7 @@ namespace Hurricane { if ( !index.isValid() ) return QVariant (); if ( role == Qt::SizeHintRole ) { + if ( index.row() == 0 ) return QVariant(); switch (index.column()) { case 0: return 200; default: return -1; @@ -165,9 +166,14 @@ namespace Hurricane { , Qt::Orientation orientation , int role ) const { - if ( ( orientation == Qt::Vertical ) || (role != Qt::DisplayRole) ) + if ( orientation == Qt::Vertical ) return QVariant(); + static QFont headerFont = Graphics::getFixedFont ( QFont::Bold, false, false, +2 ); + + if ( role == Qt::FontRole ) return headerFont; + if ( role != Qt::DisplayRole ) return QVariant(); + switch ( section ) { case 0: return "Path"; case 1: return "Entity"; diff --git a/hurricane/src/viewer/SelectionPopupModel.cpp b/hurricane/src/viewer/SelectionPopupModel.cpp index d368f16a..d2ce1257 100644 --- a/hurricane/src/viewer/SelectionPopupModel.cpp +++ b/hurricane/src/viewer/SelectionPopupModel.cpp @@ -118,6 +118,7 @@ namespace Hurricane { } if ( role == Qt::FontRole ) { + if ( index.row() == 0 ) return QVariant(); switch (index.column()) { default: return entityFont; } @@ -148,12 +149,17 @@ namespace Hurricane { QVariant SelectionPopupModel::headerData ( int section - , Qt::Orientation orientation - , int role ) const + , Qt::Orientation orientation + , int role ) const { - if ( ( orientation == Qt::Vertical ) || (role != Qt::DisplayRole) ) + if ( orientation == Qt::Vertical ) return QVariant(); + static QFont headerFont = Graphics::getFixedFont ( QFont::Bold, false, false, +2 ); + + if ( role == Qt::FontRole ) return headerFont; + if ( role != Qt::DisplayRole ) return QVariant(); + if ( section == 0 ) { return "Path+Entity"; } diff --git a/hurricane/src/viewer/SelectionWidget.cpp b/hurricane/src/viewer/SelectionWidget.cpp index cf6da691..6fbf3838 100644 --- a/hurricane/src/viewer/SelectionWidget.cpp +++ b/hurricane/src/viewer/SelectionWidget.cpp @@ -124,7 +124,6 @@ namespace Hurricane { connect ( _filterPatternLineEdit, SIGNAL(textChanged(const QString &)) , this , SLOT (textFilterChanged()) ); - connect ( _baseModel , SIGNAL(layoutChanged()), this , SLOT(forceRowHeight()) ); connect ( _showSelection, SIGNAL(toggled(bool)) , this , SLOT(setShowSelection(bool)) ); connect ( _cumulative , SIGNAL(toggled(bool)) , this , SLOT(setCumulativeSelection(bool)) ); connect ( clear , SIGNAL(clicked()) , _baseModel, SLOT(clear()) ); @@ -151,13 +150,6 @@ namespace Hurricane { } - void SelectionWidget::forceRowHeight () - { - for ( int rows=_sortModel->rowCount()-1; rows >= 0 ; rows-- ) - _view->setRowHeight ( rows, _rowHeight ); - } - - void SelectionWidget::setCellWidget ( CellWidget* cw ) { if ( _cellWidget ) { @@ -168,7 +160,7 @@ namespace Hurricane { _cellWidget = cw; if ( !_cellWidget ) return; - connect ( _cellWidget, SIGNAL(selectionModeChanged()), this , SLOT(changeSelectionMode()) ); + connect ( _cellWidget, SIGNAL(selectionModeChanged()), this, SLOT(changeSelectionMode()) ); connect ( _cellWidget, SIGNAL(selectionChanged(const SelectorSet&)) , this , SLOT (setSelection (const SelectorSet&)) ); @@ -232,7 +224,6 @@ namespace Hurricane { void SelectionWidget::textFilterChanged () { _sortModel->setFilterRegExp ( _filterPatternLineEdit->text() ); - forceRowHeight (); } diff --git a/hurricane/src/viewer/hurricane/viewer/InspectorWidget.h b/hurricane/src/viewer/hurricane/viewer/InspectorWidget.h index ae34b555..0920f05f 100644 --- a/hurricane/src/viewer/hurricane/viewer/InspectorWidget.h +++ b/hurricane/src/viewer/hurricane/viewer/InspectorWidget.h @@ -57,7 +57,7 @@ namespace Hurricane { public: History (); ~History (); - void push ( Slot* slot ); + void push ( Slot*, Record* ); void pop (); void back (); void goTo ( int depth ); @@ -83,7 +83,6 @@ namespace Hurricane { void setRootRecord ( Record* ); void setRootOccurrence ( Occurrence& ); private slots: - void forceRowHeight (); void textFilterChanged (); void historyChanged ( int depth ); void forkInspector ( const QModelIndex& ); @@ -91,10 +90,10 @@ namespace Hurricane { bool eventFilter ( QObject*, QEvent* ); private: void _setRootRecord ( Record* ); - void pushSlot ( Slot* ); + void pushSlot ( Slot*, Record* record=NULL ); void popSlot (); void back (); - bool setSlot (); + bool setSlot ( Record* record=NULL ); private: RecordModel* _baseModel; diff --git a/hurricane/src/viewer/hurricane/viewer/NetlistModel.h b/hurricane/src/viewer/hurricane/viewer/NetlistModel.h index 18383976..6da00dda 100644 --- a/hurricane/src/viewer/hurricane/viewer/NetlistModel.h +++ b/hurricane/src/viewer/hurricane/viewer/NetlistModel.h @@ -15,7 +15,7 @@ // | Author : Jean-Paul CHAPUT | // | E-mail : Jean-Paul.Chaput@asim.lip6.fr | // | =============================================================== | -// | C++ Header : "./NetlistModel.h" | +// | C++ Header : "./NetlistModel.h" | // | *************************************************************** | // | U p d a t e s | // | | diff --git a/hurricane/src/viewer/hurricane/viewer/RecordModel.h b/hurricane/src/viewer/hurricane/viewer/RecordModel.h index 57605387..8490b295 100644 --- a/hurricane/src/viewer/hurricane/viewer/RecordModel.h +++ b/hurricane/src/viewer/hurricane/viewer/RecordModel.h @@ -53,6 +53,7 @@ #ifndef __RECORD_MODEL_H__ #define __RECORD_MODEL_H__ +#include #include #include "hurricane/Commons.h" @@ -67,7 +68,7 @@ namespace Hurricane { public: RecordModel ( QObject* parent=NULL ); ~RecordModel (); - bool setSlot ( Slot* slot, size_t depth ); + bool setSlot ( Slot* slot, Record* record, size_t depth ); int rowCount ( const QModelIndex& parent=QModelIndex() ) const; int columnCount ( const QModelIndex& parent=QModelIndex() ) const; QVariant data ( const QModelIndex& index, int role=Qt::DisplayRole ) const; @@ -76,9 +77,10 @@ namespace Hurricane { inline Slot* getSlot (); private: - Slot* _slot; - Record* _record; - size_t _depth; + Slot* _slot; + Record* _record; + size_t _depth; + std::vector< pair > _cache; }; diff --git a/hurricane/src/viewer/hurricane/viewer/SelectionWidget.h b/hurricane/src/viewer/hurricane/viewer/SelectionWidget.h index b78c0b03..562863f0 100644 --- a/hurricane/src/viewer/hurricane/viewer/SelectionWidget.h +++ b/hurricane/src/viewer/hurricane/viewer/SelectionWidget.h @@ -76,7 +76,6 @@ namespace Hurricane { void toggleSelection (); void toggleSelection ( Occurrence ); void toggleSelection ( const QModelIndex& ); - void forceRowHeight (); void inspect (); private slots: void textFilterChanged ();