adding agds directory

This commit is contained in:
Damien Dupuis 2010-06-03 13:42:20 +00:00
parent eefb15127a
commit b7926ee279
8 changed files with 251 additions and 0 deletions

View File

@ -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)

View File

@ -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

View File

@ -0,0 +1,59 @@
#include <iostream>
#include <fstream>
#include <ctime>
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<GdsStructure*>::iterator it = _structs.begin() ; it < _structs.end() ; it++ ) {
(*it)->write(file);
}
// Footer
file << "ENDLIB;" << endl;
file.close();
return true;
}
} // namespace

View File

@ -0,0 +1,31 @@
#ifndef __GDS_LIBRARY_H
#define __GDS_LIBRARY_H
#include <vector>
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<GdsStructure*> _structs;
};
inline void GdsLibrary::setUserUnits(double userUnits) { _userUnits = userUnits; };
inline void GdsLibrary::setPhysUnits(double physUnits) { _physUnits = physUnits; };
} // namespace
#endif

View File

@ -0,0 +1,34 @@
#include <iostream>
#include <iomanip>
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;
}
}

View File

@ -0,0 +1,22 @@
#ifndef __GDS_RECTANGLE_H
#define __GDS_RECTANGLE_H
#include <fstream>
#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

View File

@ -0,0 +1,47 @@
#include <iostream>
#include <ctime>
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<GdsElement*>::iterator it = _elements.begin() ; it < _elements.end() ; it++ ) {
(*it)->write(file);
}
// Footer
file << "ENDSTR;" << endl;
return true;
}
} // namespace

View File

@ -0,0 +1,29 @@
#ifndef __GDS_STRUCTURE_H
#define __GDS_STRUCTURE_H
#include <fstream>
#include <string>
#include <vector>
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<GdsElement*> _elements;
};
inline string GdsStructure::getName() { return _strName; };
}
#endif