diff --git a/crlcore/src/ccore/CellGauge.cpp b/crlcore/src/ccore/CellGauge.cpp index 7b3f2126..7ffa6e56 100644 --- a/crlcore/src/ccore/CellGauge.cpp +++ b/crlcore/src/ccore/CellGauge.cpp @@ -75,11 +75,20 @@ namespace CRL { , const DbU::Unit pitch , const DbU::Unit sliceHeight , const DbU::Unit sliceStep - ) : _name(name) + ) : _name (name) , _pinLayerName(pinLayerName) - , _pitch(pitch) - , _sliceHeight(sliceHeight) - , _sliceStep(sliceStep) + , _pitch (pitch) + , _sliceHeight (sliceHeight) + , _sliceStep (sliceStep) + { } + + + CellGauge::CellGauge ( const CellGauge& other ) + : _name (other._name) + , _pinLayerName(other._pinLayerName) + , _pitch (other._pitch) + , _sliceHeight (other._sliceHeight) + , _sliceStep (other._sliceStep) { } @@ -110,6 +119,10 @@ namespace CRL { { delete this; } + CellGauge* CellGauge::getClone () const + { return new CellGauge(*this); } + + string CellGauge::_getTypeName () const { return _TName("CellGauge"); } diff --git a/crlcore/src/ccore/Utilities.cpp b/crlcore/src/ccore/Utilities.cpp index cea4766c..0025b8bd 100644 --- a/crlcore/src/ccore/Utilities.cpp +++ b/crlcore/src/ccore/Utilities.cpp @@ -52,7 +52,7 @@ Dots::Dots ( const std::string& left, const std::string& right ) : _left(left), Dots Dots::asPercentage ( const std::string& left, float value ) { std::ostringstream right; - right << std::setprecision(3) << value << "%"; + right << std::setprecision(3) << (value*100.0) << "%"; return Dots(left,right.str()); } @@ -65,6 +65,10 @@ Dots Dots::asUInt ( const std::string& left, unsigned int value ) { std::ostringstream right; right << value; return Dots(left,right.str()); } +Dots Dots::asInt ( const std::string& left, int value ) +{ std::ostringstream right; right << value; return Dots(left,right.str()); } + + Dots Dots::asULong ( const std::string& left, unsigned long value ) { std::ostringstream right; right << value; return Dots(left,right.str()); } @@ -81,6 +85,10 @@ Dots Dots::asLambda ( const std::string& left, Hurricane::DbU::Unit value ) { std::ostringstream right; right << Hurricane::DbU::getValueString(value); return Dots(left,right.str()); } +Dots Dots::asLambda ( const std::string& left, double value ) +{ std::ostringstream right; right << Hurricane::DbU::getValueString(value); return Dots(left,right.str()); } + + Dots Dots::asIdentifier ( const std::string& left, const std::string& value ) { std::ostringstream right; right << "<" << value << ">"; return Dots(left,right.str()); } diff --git a/crlcore/src/ccore/agds/AgdsDriver.cpp b/crlcore/src/ccore/agds/AgdsDriver.cpp index 5f8d47fb..581e780f 100644 --- a/crlcore/src/ccore/agds/AgdsDriver.cpp +++ b/crlcore/src/ccore/agds/AgdsDriver.cpp @@ -21,10 +21,10 @@ using namespace std; #include "hurricane/Query.h" using namespace Hurricane; -#include "vlsisapd/agds/GdsLibrary.h" -#include "vlsisapd/agds/GdsStructure.h" -#include "vlsisapd/agds/GdsRectangle.h" -using namespace vlsisapd; +#include "vlsisapd/agds/Library.h" +#include "vlsisapd/agds/Structure.h" +#include "vlsisapd/agds/Rectangle.h" +using namespace AGDS; #include "Agds.h" @@ -33,7 +33,7 @@ class AgdsQuery : public Query { public: AgdsQuery ( Cell* ); - inline void setStructure(GdsStructure*); + inline void setStructure(Structure*); virtual bool hasGoCallback() const; virtual void goCallback ( Go* ); @@ -43,14 +43,14 @@ class AgdsQuery : public Query { private: Cell* _cell; - GdsStructure* _str; + Structure* _str; }; AgdsQuery::AgdsQuery(Cell* cell) : Query(), _cell(cell), _str(NULL) { Query::setQuery(_cell, _cell->getBoundingBox(), Transformation(), NULL, 0, Query::DoComponents); } -inline void AgdsQuery::setStructure(GdsStructure* str) { _str = str; } +inline void AgdsQuery::setStructure(Structure* str) { _str = str; } bool AgdsQuery::hasGoCallback() const { return true; } @@ -75,11 +75,11 @@ void AgdsQuery::goCallback(Go* go) { else { return; } - GdsRectangle* rect = new GdsRectangle ( layer->getExtractNumber() - , DbU::getPhysical(b.getXMin(), DbU::Nano) - , DbU::getPhysical(b.getYMin(), DbU::Nano) - , DbU::getPhysical(b.getXMax(), DbU::Nano) - , DbU::getPhysical(b.getYMax(), DbU::Nano)); + Rectangle* rect = new Rectangle ( layer->getExtractNumber() + , DbU::getPhysical(b.getXMin(), DbU::Nano) + , DbU::getPhysical(b.getYMin(), DbU::Nano) + , DbU::getPhysical(b.getXMax(), DbU::Nano) + , DbU::getPhysical(b.getYMax(), DbU::Nano)); _str->addElement(rect); } } // namespace @@ -92,12 +92,12 @@ void agdsDriver(const string& filePath, Cell* cell, string& name, string& lib, d replace(lib.begin(), lib.end(), ' ', '_'); uUnits = 0.001; pUnits = 1.0E-9; - GdsLibrary* gdsLib = new GdsLibrary(lib); + AGDS::Library* gdsLib = new AGDS::Library(lib); gdsLib->setUserUnits(uUnits); gdsLib->setPhysUnits(pUnits); AgdsQuery agdsQuery (cell); - GdsStructure* str = new GdsStructure(getString(name)); + Structure* str = new Structure(getString(name)); agdsQuery.setStructure(str); forEach ( BasicLayer*, basicLayer, DataBase::getDB()->getTechnology()->getBasicLayers() ) { @@ -106,6 +106,6 @@ void agdsDriver(const string& filePath, Cell* cell, string& name, string& lib, d } gdsLib->addStructure(str); - gdsLib->write(filePath); + gdsLib->writeToFile(filePath); } } // namespace CRL diff --git a/crlcore/src/ccore/cif/CifDriver.cpp b/crlcore/src/ccore/cif/CifDriver.cpp index 5c9eb6f8..517127dc 100644 --- a/crlcore/src/ccore/cif/CifDriver.cpp +++ b/crlcore/src/ccore/cif/CifDriver.cpp @@ -21,9 +21,9 @@ using namespace std; #include "hurricane/Query.h" using namespace Hurricane; -#include "vlsisapd/cif/CifCircuit.h" -#include "vlsisapd/cif/CifPolygon.h" -using namespace vlsisapd; +#include "vlsisapd/cif/Circuit.h" +#include "vlsisapd/cif/Polygon.h" +using namespace CIF; #include "Cif.h" @@ -32,7 +32,7 @@ class CifQuery : public Query { public: CifQuery ( Cell* ); - inline void setCircuit(CifCircuit*); + inline void setCircuit(Circuit*); virtual bool hasGoCallback() const; virtual void goCallback ( Go* ); @@ -41,15 +41,15 @@ class CifQuery : public Query { virtual void masterCellCallback() {}; private: - Cell* _cell; - CifCircuit* _circuit; + Cell* _cell; + Circuit* _circuit; }; CifQuery::CifQuery(Cell* cell) : Query(), _cell(cell), _circuit(NULL) { Query::setQuery(_cell, _cell->getBoundingBox(), Transformation(), NULL, 0, Query::DoComponents); } -inline void CifQuery::setCircuit(CifCircuit* circuit) { _circuit = circuit; } +inline void CifQuery::setCircuit(Circuit* circuit) { _circuit = circuit; } bool CifQuery::hasGoCallback() const { return true; } @@ -74,7 +74,7 @@ void CifQuery::goCallback(Go* go) { else { return; } - CifPolygon* poly = new CifPolygon ( layer->getExtractNumber() ); + Polygon* poly = new Polygon ( layer->getExtractNumber() ); long xMin = (long)round(DbU::getPhysical(b.getXMin(), DbU::Nano)); long yMin = (long)round(DbU::getPhysical(b.getYMin(), DbU::Nano)); long xMax = (long)round(DbU::getPhysical(b.getXMax(), DbU::Nano)); @@ -94,7 +94,7 @@ void cifDriver(const string& filePath, Cell* cell, string& name, string& units, replace(name.begin(), name.end(), ' ', '_'); units = "micro"; scale = 0.001; - CifCircuit* circuit = new CifCircuit(name, units, scale); + Circuit* circuit = new Circuit(name, units, scale); CifQuery cifQuery (cell); cifQuery.setCircuit(circuit); @@ -104,6 +104,6 @@ void cifDriver(const string& filePath, Cell* cell, string& name, string& units, cifQuery.doQuery(); } - circuit->write(filePath); + circuit->writeToFile(filePath); } } // namespace CRL diff --git a/crlcore/src/ccore/crlcore/CellGauge.h b/crlcore/src/ccore/crlcore/CellGauge.h index 99e42361..b256b73d 100644 --- a/crlcore/src/ccore/crlcore/CellGauge.h +++ b/crlcore/src/ccore/crlcore/CellGauge.h @@ -62,9 +62,9 @@ namespace CRL { // Constructors & Destructor. static CellGauge* create ( const char* name , const char* pinLayerName - , const DbU::Unit pitch=0 - , const DbU::Unit sliceHeight=0 - , const DbU::Unit sliceStep=0 ); + , const DbU::Unit pitch =0 + , const DbU::Unit sliceHeight =0 + , const DbU::Unit sliceStep =0 ); virtual void destroy (); // Accessors inline const Name& getName () const; @@ -72,6 +72,7 @@ namespace CRL { inline const DbU::Unit getPitch () const; inline const DbU::Unit getSliceHeight () const; inline const DbU::Unit getSliceStep () const; + CellGauge* getClone () const; // Hurricane management. virtual string _getTypeName () const; virtual string _getString () const; diff --git a/crlcore/src/ccore/crlcore/ToolBox.h b/crlcore/src/ccore/crlcore/ToolBox.h index 53a69ee3..f9590a09 100644 --- a/crlcore/src/ccore/crlcore/ToolBox.h +++ b/crlcore/src/ccore/crlcore/ToolBox.h @@ -62,6 +62,7 @@ namespace CRL { bool isNoInstancePlacedOrFixed ( Cell* ); Occurrence getRootNetOccurrence ( const Occurrence& netoccurrence ); void ConnectPlugHooks ( Cell* ); + size_t getInstancesCount ( const Cell* cell ); } // End of CRL namespace. diff --git a/crlcore/src/ccore/crlcore/Utilities.h b/crlcore/src/ccore/crlcore/Utilities.h index df10650c..88262f29 100644 --- a/crlcore/src/ccore/crlcore/Utilities.h +++ b/crlcore/src/ccore/crlcore/Utilities.h @@ -350,11 +350,13 @@ class Dots { public: static Dots asPercentage ( const std::string& left, float ); static Dots asBool ( const std::string& left, bool ); + static Dots asInt ( const std::string& left, int ); static Dots asUInt ( const std::string& left, unsigned int ); static Dots asULong ( const std::string& left, unsigned long ); static Dots asSizet ( const std::string& left, size_t ); static Dots asDouble ( const std::string& left, double ); static Dots asLambda ( const std::string& left, Hurricane::DbU::Unit ); + static Dots asLambda ( const std::string& left, double ); static Dots asIdentifier ( const std::string& left, const std::string& ); static Dots asString ( const std::string& left, const std::string& ); private: @@ -366,4 +368,90 @@ class Dots { }; +// ------------------------------------------------------------------- +// Class : "::linefill()". +// +// Wrapper around the STL ostream which try print unbufferized filed +// lines. + + +class linefill : public std::ostream { + public: + inline linefill ( const std::string& header, std::ostream &s ); + // Overload for formatted outputs. + template inline linefill& operator<< ( T& t ); + template inline linefill& operator<< ( T* t ); + template inline linefill& operator<< ( const T& t ); + template inline linefill& operator<< ( const T* t ); + inline std::ostream& base (); + inline void _print ( const std::string& field ); + inline linefill& flush (); + inline linefill& reset (); + // Overload for manipulators. + inline linefill& operator<< ( std::ostream &(*pf)(std::ostream &) ); + + // Internal: Attributes. + private: + std::string _header; + size_t _width; + size_t _lines; +}; + + +inline linefill::linefill ( const std::string& header, std::ostream& s ): std::ostream(s.rdbuf()) , _header(header), _width(0), _lines(0) {} +inline std::ostream& linefill::base () { return (*static_cast(this)); } +inline linefill& linefill::reset () { (*this) << std::endl; _width=0; return *this; } +inline linefill& linefill::flush () { static_cast(this)->flush(); return *this; } +inline linefill& linefill::operator<< ( std::ostream& (*pf)(std::ostream&) ) { (*pf)(*this); return *this; } + +inline void linefill::_print ( const std::string& field ) { + size_t fieldWidth = field.length(); + if ( _width+fieldWidth > 80 ) { _width = 0; ++_lines; } + if ( _width == 0 ) { + if ( _lines > 0 ) base() << std::endl; + base() << _header; _width+=_header.length(); + } else + base() << " "; + + _width += fieldWidth + 1; + base() << field; + base().flush (); +} + +template +inline linefill& linefill::operator<< ( T& t ) +{ std::ostringstream s; s << t; _print(s.str()); return *this; }; + +template +inline linefill& linefill::operator<< ( T* t ) +{ std::ostringstream s; s << t; _print(s.str()); return *this; }; + +template +inline linefill& linefill::operator<< ( const T& t ) +{ std::ostringstream s; s << t; _print(s.str()); return *this; }; + +template +inline linefill& linefill::operator<< ( const T* t ) +{ std::ostringstream s; s << t; _print(s.str()); return *this; }; + +// Specific non-member operator overload. Must be one for each type. +#define LINEFILL_V_SUPPORT(Type) \ + inline linefill& operator<< ( linefill& o, const Type t ) \ + { std::ostringstream s; s << t; return o; }; + +#define LINEFILL_R_SUPPORT(Type) \ + inline linefill& operator<< ( linefill& o, const Type& t ) \ + { std::ostringstream s; s << t; return o; }; + +#define LINEFILL_P_SUPPORT(Type) \ + inline linefill& operator<< ( linefill& o, const Type* t ) \ + { std::ostringstream s; s << t; return o; }; + +#define LINEFILL_PR_SUPPORT(Type) \ + LINEFILL_P_SUPPORT(Type) \ + LINEFILL_R_SUPPORT(Type) + +LINEFILL_PR_SUPPORT(std::string); + + # endif diff --git a/crlcore/src/ccore/toolbox/ToolBox.cpp b/crlcore/src/ccore/toolbox/ToolBox.cpp index 6c67393a..8455c076 100644 --- a/crlcore/src/ccore/toolbox/ToolBox.cpp +++ b/crlcore/src/ccore/toolbox/ToolBox.cpp @@ -540,4 +540,34 @@ void ConnectPlugHooks(Cell* cell) __plughooksconnected.clear(); } -} + + size_t _getInstancesCount ( const Cell* cell, map& gatesByMaster ) + { + map::iterator imaster = gatesByMaster.find ( cell ); + if ( imaster != gatesByMaster.end() ) + return imaster->second; + + size_t gates = 0; + forEach ( Instance*, iinstance, cell->getInstances() ) { + Cell* masterCell = iinstance->getMasterCell(); + + if ( masterCell->isTerminal() ) + ++gates; + else + _getInstancesCount ( masterCell, gatesByMaster ); + } + gatesByMaster.insert ( make_pair(cell,gates) ); + + return gates; + } + + + size_t getInstancesCount ( const Cell* cell ) + { + map gatesByMaster; + + return _getInstancesCount ( cell, gatesByMaster ); + } + + +} // End of CRL namespace.