From b7926ee279fc432bc024409c2f85720bc2e9abd1 Mon Sep 17 00:00:00 2001 From: Damien Dupuis Date: Thu, 3 Jun 2010 13:42:20 +0000 Subject: [PATCH] adding agds directory --- vlsisapd/src/agds/CMakeLists.txt | 9 +++++ vlsisapd/src/agds/GdsElement.h | 20 ++++++++++ vlsisapd/src/agds/GdsLibrary.cpp | 59 ++++++++++++++++++++++++++++++ vlsisapd/src/agds/GdsLibrary.h | 31 ++++++++++++++++ vlsisapd/src/agds/GdsRectangle.cpp | 34 +++++++++++++++++ vlsisapd/src/agds/GdsRectangle.h | 22 +++++++++++ vlsisapd/src/agds/GdsStructure.cpp | 47 ++++++++++++++++++++++++ vlsisapd/src/agds/GdsStructure.h | 29 +++++++++++++++ 8 files changed, 251 insertions(+) create mode 100644 vlsisapd/src/agds/CMakeLists.txt create mode 100644 vlsisapd/src/agds/GdsElement.h create mode 100644 vlsisapd/src/agds/GdsLibrary.cpp create mode 100644 vlsisapd/src/agds/GdsLibrary.h create mode 100644 vlsisapd/src/agds/GdsRectangle.cpp create mode 100644 vlsisapd/src/agds/GdsRectangle.h create mode 100644 vlsisapd/src/agds/GdsStructure.cpp create mode 100644 vlsisapd/src/agds/GdsStructure.h diff --git a/vlsisapd/src/agds/CMakeLists.txt b/vlsisapd/src/agds/CMakeLists.txt new file mode 100644 index 00000000..4a6a9323 --- /dev/null +++ b/vlsisapd/src/agds/CMakeLists.txt @@ -0,0 +1,9 @@ +INCLUDE_DIRECTORIES(${CHAMS_SOURCE_DIR}/agds) + +SET ( includes GdsLibrary.h GdsStructure.h GdsElement.h GdsRectangle.h ) +SET ( cpps GdsLibrary.cpp GdsStructure.cpp GdsRectangle.cpp ) + +ADD_LIBRARY(agds ${cpps}) +INSTALL(TARGETS agds DESTINATION lib${LIB_SUFFIX}) + +INSTALL(FILES ${includes} DESTINATION include/vlsisapd/agds) diff --git a/vlsisapd/src/agds/GdsElement.h b/vlsisapd/src/agds/GdsElement.h new file mode 100644 index 00000000..a69c63fe --- /dev/null +++ b/vlsisapd/src/agds/GdsElement.h @@ -0,0 +1,20 @@ +#ifndef __GDS_ELEMENT_H +#define __GDS_ELEMENT_H + +namespace vlsisapd { +class GdsElement { + protected: + inline GdsElement (int layer); + virtual ~GdsElement (); + + public: + virtual bool write ( ofstream &file ) = 0; + + protected: + int _layer; +}; + +inline GdsElement::GdsElement(int layer) : _layer(layer) {} +} +#endif + diff --git a/vlsisapd/src/agds/GdsLibrary.cpp b/vlsisapd/src/agds/GdsLibrary.cpp new file mode 100644 index 00000000..5908ad53 --- /dev/null +++ b/vlsisapd/src/agds/GdsLibrary.cpp @@ -0,0 +1,59 @@ +#include +#include +#include +using namespace std; + +#include "GdsLibrary.h" + +namespace vlsisapd { + +GdsLibrary::GdsLibrary(string libName) + : _libName(libName) + , _userUnits(0.00) + , _physUnits(0.00) {} + + +bool GdsLibrary::addStructure(GdsStructure* gdsStruct) { + if(gdsStruct) + _structs.push_back(gdsStruct); + else { + cerr << "[GDS DRIVE ERROR]: cannot hold GdsStructure: " << gdsStruct->getName() << endl; + return false; + } + return true; +} + +bool GdsLibrary::write(string filename) { + time_t curtime = time(0); + tm now = *localtime(&curtime); + char date[BUFSIZ]={0}; + const char format[]="%y-%m-%d %H:%M:%S"; + if (!strftime(date, sizeof(date)-1, format, &now)>0) + cerr << "[GDS DRIVE ERROR]: cannot build current date." << endl; + + ofstream file; + file.open(filename.c_str(), ios::out); + // Header + file << "HEADER 5;" << endl + << "BGNLIB;" << endl + << " LASTMOD {" << date << "};" << endl + << " LASTACC {" << date << "};" << endl + << "LIBNAME " << _libName << ".DB;" << endl + << "UNITS;" << endl + << " USERUNITS " << _userUnits << ";" << endl; + file << scientific << " PHYSUNITS " << _physUnits << ";" << endl + << endl; + file.unsetf(ios::floatfield); + + // For each Struct : write struct. + for ( vector::iterator it = _structs.begin() ; it < _structs.end() ; it++ ) { + (*it)->write(file); + } + + // Footer + file << "ENDLIB;" << endl; + + file.close(); + return true; +} +} // namespace diff --git a/vlsisapd/src/agds/GdsLibrary.h b/vlsisapd/src/agds/GdsLibrary.h new file mode 100644 index 00000000..51d491da --- /dev/null +++ b/vlsisapd/src/agds/GdsLibrary.h @@ -0,0 +1,31 @@ +#ifndef __GDS_LIBRARY_H +#define __GDS_LIBRARY_H + +#include +using namespace std; + +#include "GdsStructure.h" + +namespace vlsisapd { +class GdsLibrary { + public: + GdsLibrary(string libName); + + inline void setUserUnits ( double userUnits ); + inline void setPhysUnits ( double physUnits ); + + bool addStructure ( GdsStructure* ); + bool write ( string fileName ); + + private: + string _libName; + double _userUnits; + double _physUnits; + + vector _structs; +}; + +inline void GdsLibrary::setUserUnits(double userUnits) { _userUnits = userUnits; }; +inline void GdsLibrary::setPhysUnits(double physUnits) { _physUnits = physUnits; }; +} // namespace +#endif diff --git a/vlsisapd/src/agds/GdsRectangle.cpp b/vlsisapd/src/agds/GdsRectangle.cpp new file mode 100644 index 00000000..6f371b0c --- /dev/null +++ b/vlsisapd/src/agds/GdsRectangle.cpp @@ -0,0 +1,34 @@ +#include +#include +using namespace std; + +#include "GdsRectangle.h" + +namespace vlsisapd { +GdsElement::~GdsElement () { } + +GdsRectangle::GdsRectangle(int layer, double xmin, double ymin, double xmax, double ymax) + : GdsElement(layer) + , _xmin(xmin) + , _ymin(ymin) + , _xmax(xmax) + , _ymax(ymax) {} + +GdsRectangle::~GdsRectangle () { } + +bool GdsRectangle::write(ofstream &file) { + file << "BOUNDARY;" << endl + << "LAYER " << _layer << ";" << endl + << "DATATYPE 0;" << endl + << "XY 5;" << endl + << " X: " << _xmin << ";\tY: " << _ymin << ";" << endl + << " X: " << _xmin << ";\tY: " << _ymax << ";" << endl + << " X: " << _xmax << ";\tY: " << _ymax << ";" << endl + << " X: " << _xmax << ";\tY: " << _ymin << ";" << endl + << " X: " << _xmin << ";\tY: " << _ymin << ";" << endl + << "ENDEL;" << endl + << endl; + + return true; +} +} diff --git a/vlsisapd/src/agds/GdsRectangle.h b/vlsisapd/src/agds/GdsRectangle.h new file mode 100644 index 00000000..c656aaea --- /dev/null +++ b/vlsisapd/src/agds/GdsRectangle.h @@ -0,0 +1,22 @@ +#ifndef __GDS_RECTANGLE_H +#define __GDS_RECTANGLE_H + +#include + +#include "GdsElement.h" + +namespace vlsisapd { +class GdsRectangle : public GdsElement { + public: + GdsRectangle (int layer, double xmin, double ymin, double xmax, double ymax); + virtual ~GdsRectangle (); + virtual bool write ( ofstream &file ); + private: + double _xmin; + double _ymin; + double _xmax; + double _ymax; +}; +} +#endif + diff --git a/vlsisapd/src/agds/GdsStructure.cpp b/vlsisapd/src/agds/GdsStructure.cpp new file mode 100644 index 00000000..16e1c6b9 --- /dev/null +++ b/vlsisapd/src/agds/GdsStructure.cpp @@ -0,0 +1,47 @@ +#include +#include +using namespace std; + +#include "GdsStructure.h" + +namespace vlsisapd { +GdsStructure::GdsStructure(string strName) + : _strName(strName) {} + + +bool GdsStructure::addElement(GdsElement* gdsElement) { + if(gdsElement) + _elements.push_back(gdsElement); + else { + cerr << "[GDS DRIVE ERROR]: cannot hold GdsElement." << endl; + return false; + } + return true; +} + +bool GdsStructure::write(ofstream &file) { + time_t curtime = time(0); + tm now = *localtime(&curtime); + char date[BUFSIZ]={0}; + const char format[]="%y-%m-%d %H:%M:%S"; + if (!strftime(date, sizeof(date)-1, format, &now)>0) + cerr << "[GDS DRIVE ERROR]: cannot build current date." << endl; + + // Header + file << "BGNSTR;" << endl + << " CREATION {" << date << "};" << endl + << " LASTMOD {" << date << "};" << endl + << "STRNAME " << _strName << ";" << endl + << endl; + + // For each Element : write element. + for ( vector::iterator it = _elements.begin() ; it < _elements.end() ; it++ ) { + (*it)->write(file); + } + + // Footer + file << "ENDSTR;" << endl; + + return true; +} +} // namespace diff --git a/vlsisapd/src/agds/GdsStructure.h b/vlsisapd/src/agds/GdsStructure.h new file mode 100644 index 00000000..70c0d1bc --- /dev/null +++ b/vlsisapd/src/agds/GdsStructure.h @@ -0,0 +1,29 @@ +#ifndef __GDS_STRUCTURE_H +#define __GDS_STRUCTURE_H + +#include +#include +#include +using namespace std; + +#include "GdsElement.h" + +namespace vlsisapd { +class GdsStructure { + public: + GdsStructure(string strName); + + bool addElement ( GdsElement* ); + bool write ( ofstream &file ); + + inline string getName(); + + private: + string _strName; + + vector _elements; +}; + +inline string GdsStructure::getName() { return _strName; }; +} +#endif