use boost::filesystem::path to create and manage directries of OA database ...
This commit is contained in:
parent
3aefb415f2
commit
9505e8779a
|
@ -1,3 +1,5 @@
|
|||
|
||||
all:
|
||||
cd ../../../../.. && make
|
||||
|
||||
.PHONY: all
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
// -*-compile-command:"cd ../../../../.. && make"-*-
|
||||
// Time-stamp: "2010-08-02 17:50:42" - OpenAccessCommon.h
|
||||
// Time-stamp: "2010-08-05 18:18:32" - OpenAccessCommon.h
|
||||
// x-----------------------------------------------------------------x
|
||||
// | This file is part of the hurricaneAMS Software. |
|
||||
// | Copyright (c) UPMC/LIP6 2008-2010, All Rights Reserved |
|
||||
|
@ -14,7 +14,10 @@
|
|||
#define __OPENACCESSCOMMON_H__
|
||||
|
||||
#include <iostream>
|
||||
|
||||
using namespace std;
|
||||
#include <boost/filesystem/operations.hpp>
|
||||
namespace bfs = boost::filesystem;
|
||||
|
||||
#ifdef HAVE_OPENACCESS
|
||||
#include "hurricane/Cell.h"
|
||||
|
@ -252,14 +255,13 @@ namespace {
|
|||
}
|
||||
|
||||
/**
|
||||
handling realpath with string intead of char*
|
||||
handling realpath
|
||||
*/
|
||||
inline string realPath(const string& path){
|
||||
char* buffer = (char*) calloc(PATH_MAX+1,sizeof(char));
|
||||
realpath(path.c_str(), buffer);
|
||||
string res(buffer);
|
||||
free(buffer);
|
||||
return res;
|
||||
inline void realPath(string& pathToChange){
|
||||
if(bfs::path::default_name_check_writable())
|
||||
bfs::path::default_name_check(bfs::portable_posix_name);
|
||||
bfs::path resolvedPath = pathToChange;
|
||||
pathToChange = system_complete(resolvedPath).string();
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -274,22 +276,77 @@ namespace {
|
|||
return make_pair<oaScalarName,string>(scNameLib,strPathLib);
|
||||
}
|
||||
|
||||
/**
|
||||
suppose the path has been resolved with system_complete
|
||||
before calling this function and path are posix_name
|
||||
then split the path in boos::filesystem::path corresponding of each dir
|
||||
from most root parent to leaf dir
|
||||
@see create_all_dirs
|
||||
*/
|
||||
std::vector<bfs::path> split_in_dirs(const bfs::path& p){
|
||||
string pstr(p.string());
|
||||
register size_t len(pstr.length());
|
||||
register char delim('/');
|
||||
register size_t firstDelim=0;
|
||||
register size_t secondDelim=1;
|
||||
vector<bfs::path> dirs;
|
||||
while(firstDelim < len){
|
||||
while(secondDelim < len && pstr[secondDelim]!=delim)
|
||||
secondDelim++;
|
||||
string dir = pstr.substr(0,secondDelim);
|
||||
if(dir.empty())
|
||||
break;
|
||||
dirs.push_back(bfs::path(dir));
|
||||
firstDelim = secondDelim;
|
||||
secondDelim++;
|
||||
}
|
||||
return dirs;
|
||||
}
|
||||
|
||||
/**
|
||||
work around for boost::filesystem::create_directories
|
||||
missing in old boost versions like 1.33.1
|
||||
and equivalent to recursivly creating directories
|
||||
instead this is done iteratively.
|
||||
*/
|
||||
inline void create_all_dirs(const bfs::path& p){
|
||||
if(p.empty() || bfs::exists(p))
|
||||
return;
|
||||
std::vector<bfs::path> test;
|
||||
test = split_in_dirs(p);
|
||||
std::vector<bfs::path>::iterator it = test.begin();
|
||||
for(;it != test.end();it++){
|
||||
if(it->empty() || bfs::exists(*it))
|
||||
continue;
|
||||
bfs::create_directory(*it);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
open oaLib with the info gathered by libPath function
|
||||
*/
|
||||
inline oaLib* openOALib(const pair<oaScalarName,string>& infos){
|
||||
oaLib *lib = oaLib::find(infos.first);
|
||||
const char* pathLib = infos.second.c_str();
|
||||
if (!lib) {
|
||||
if (oaLib::exists(pathLib)){
|
||||
lib = oaLib::open(infos.first, pathLib);
|
||||
}else{
|
||||
string cmd = "mkdir -p "+ infos.second;
|
||||
system(cmd.c_str());
|
||||
}
|
||||
if(!lib){
|
||||
lib = oaLib::create(infos.first, pathLib);
|
||||
oaLib *lib = NULL;
|
||||
try{
|
||||
lib = oaLib::find(infos.first);
|
||||
const char* pathLib = infos.second.c_str();
|
||||
if (!lib) {
|
||||
if (oaLib::exists(pathLib)){
|
||||
lib = oaLib::open(infos.first, pathLib);
|
||||
}
|
||||
if(!lib){
|
||||
if(bfs::path::default_name_check_writable())
|
||||
bfs::path::default_name_check(bfs::portable_posix_name);
|
||||
bfs::path bfs_pathLib = pathLib;
|
||||
create_all_dirs(bfs_pathLib);
|
||||
cerr << "creating lib : " << pathLib << endl;
|
||||
lib = oaLib::create(infos.first, pathLib);
|
||||
}
|
||||
}
|
||||
assert(lib);
|
||||
}catch(std::exception& e){
|
||||
cerr << e.what() << endl;
|
||||
exit(-1);
|
||||
}
|
||||
return lib;
|
||||
}
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
// -*-compile-command:"cd ../../../../.. && make"-*-
|
||||
// Time-stamp: "2010-08-02 16:54:01" - OpenAccessDriver.cpp
|
||||
// Time-stamp: "2010-08-04 16:57:08" - OpenAccessDriver.cpp
|
||||
// x-----------------------------------------------------------------x
|
||||
// | This file is part of the hurricaneAMS Software. |
|
||||
// | Copyright (c) UPMC/LIP6 2008-2010, All Rights Reserved |
|
||||
|
@ -64,7 +64,7 @@ namespace {
|
|||
Technology* _technology;
|
||||
public:
|
||||
OADriver(const string& path) :
|
||||
_path(realPath(path)),
|
||||
_path(path),
|
||||
_oaTech(NULL),
|
||||
_library2OALib(),
|
||||
_cell2OADesign4Netlist(),
|
||||
|
@ -89,6 +89,8 @@ namespace {
|
|||
if (!_technology) {
|
||||
throw Error("no technology");
|
||||
}
|
||||
realPath(_path);
|
||||
cerr << "realpath: " << _path << endl;
|
||||
}
|
||||
|
||||
~OADriver() {
|
||||
|
@ -125,6 +127,7 @@ namespace {
|
|||
}
|
||||
|
||||
// 1) create or open library
|
||||
cerr << "lib path : " << _path << endl;
|
||||
pair<oaScalarName,string> infos=libInfos(_path,
|
||||
getString(library->getName()));
|
||||
oaLib *lib = openOALib(infos);
|
||||
|
@ -286,8 +289,12 @@ namespace {
|
|||
|
||||
//create and add foundry constraint group for General manufacturing rules
|
||||
//and add oaSimpleConstraintType too
|
||||
assert(theOATech);
|
||||
theOATech->getDefaultConstraintGroup();
|
||||
oaConstraintGroup *cgFoundry = theOATech->getFoundryRules();
|
||||
|
||||
|
||||
|
||||
/*
|
||||
add the constraint group LEFDefaultRouteSpec for oa2lef
|
||||
*/
|
||||
|
@ -699,10 +706,10 @@ namespace {
|
|||
|
||||
namespace CRL {
|
||||
oaCell* OpenAccess::oaDriver(const string& path, Cell* cell) {
|
||||
oaCell* convertedCell = NULL;
|
||||
#ifdef HAVE_OPENACCESS
|
||||
//for the moment a driver for hurricaneAMS
|
||||
//save the Cell only and all used Cell
|
||||
oaCell* convertedCell = NULL;
|
||||
cerr << "Saving " << cell << " in " << path << endl;
|
||||
try {
|
||||
oaDesignInit(oacAPIMajorRevNumber,
|
||||
|
@ -718,10 +725,9 @@ namespace CRL {
|
|||
cerr << "STD::ERROR => " << e.what() << endl;
|
||||
exit(2);
|
||||
}
|
||||
return convertedCell;
|
||||
#else
|
||||
cerr << "\nDummy OpenAccess driver call for " << path << endl;
|
||||
return NULL;
|
||||
#endif
|
||||
return convertedCell;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
// -*-compile-command:"cd ../../../../.. && make"-*-
|
||||
// Time-stamp: "2010-07-28 15:44:58" - OpenAccessParser.cpp
|
||||
// Time-stamp: "2010-08-04 15:45:06" - OpenAccessParser.cpp
|
||||
// x-----------------------------------------------------------------x
|
||||
// | This file is part of the hurricaneAMS Software. |
|
||||
// | Copyright (c) UPMC/LIP6 2008-2010, All Rights Reserved |
|
||||
|
@ -30,7 +30,8 @@ using namespace Hurricane;
|
|||
namespace {
|
||||
|
||||
#ifdef HAVE_OPENACCESS
|
||||
class OAParser {
|
||||
class OAParser{
|
||||
private:
|
||||
typedef map<oaLib*, Library*> OALib2LibMap;
|
||||
typedef map<Name, Library*> Name2LibMap;
|
||||
typedef map<oaLayerNum, Layer*> OALayerNum2LayerMap;
|
||||
|
@ -42,7 +43,7 @@ namespace {
|
|||
Name2LibMap _name2LibMap;
|
||||
Cell2OACellMap _cell2OACellMap;
|
||||
set<Cell*> _loadedCells;
|
||||
|
||||
public:
|
||||
OAParser():
|
||||
_oaTechnology(NULL),
|
||||
_oaLayerNum2LayerMap(),
|
||||
|
@ -50,16 +51,6 @@ namespace {
|
|||
_name2LibMap(),
|
||||
_cell2OACellMap(),
|
||||
_loadedCells(){
|
||||
try {
|
||||
oaDesignInit(oacAPIMajorRevNumber,
|
||||
oacAPIMinorRevNumber,
|
||||
oacDataModelRevNumber);
|
||||
} catch (oaException &excp) {
|
||||
cout << "ERROR: " << excp.getMsg() << endl;
|
||||
exit(1);
|
||||
}
|
||||
|
||||
|
||||
DataBase* db = DataBase::getDB();
|
||||
if (!db) {
|
||||
db = DataBase::create();
|
||||
|
@ -353,13 +344,34 @@ namespace {
|
|||
#endif
|
||||
}//namespace
|
||||
|
||||
using namespace oa;
|
||||
namespace CRL {
|
||||
Cell* OpenAccess::oaCellParser(oaCell* cell){
|
||||
Cell* convertedCell = NULL;
|
||||
if(!cell)
|
||||
return NULL;
|
||||
#ifdef HAVE_OPENACCESS
|
||||
cerr << "\nto implement ... " << endl;
|
||||
try {
|
||||
oaDesignInit(oacAPIMajorRevNumber,
|
||||
oacAPIMinorRevNumber,
|
||||
oacDataModelRevNumber);
|
||||
|
||||
OAParser oaParser;
|
||||
oaScalarName scalarCellName;
|
||||
oaString cellName;
|
||||
cell->getName(scalarCellName);
|
||||
convertedCell = oaParser.getCell(static_cast<const char*>(cellName));
|
||||
}catch (oaException &e) {
|
||||
cerr << "OA::ERROR => " << e.getMsg() << endl;
|
||||
exit(1);
|
||||
}catch(std::exception& e){
|
||||
cerr << "STD::ERROR => " << e.what() << endl;
|
||||
exit(2);
|
||||
}
|
||||
#else
|
||||
cerr << "\nDummy OpenAccess driver call for " << endl;
|
||||
#endif
|
||||
return convertedCell;
|
||||
}
|
||||
|
||||
Library* OpenAccess::oaLibParser(oaLib* lib){
|
||||
|
@ -368,6 +380,7 @@ namespace CRL {
|
|||
#else
|
||||
cerr << "\nDummy OpenAccess driver call for " << path << endl;
|
||||
#endif
|
||||
return NULL;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -21,7 +21,8 @@ valgrind_full: compile
|
|||
valgrind -v --leak-check=full --show-reachable=yes ./x86_64/usr/local/bin/testOAWrapper $(TECHNOFILE) $(TESTDIR) 2>&1 | tee $@.log
|
||||
|
||||
mrproper: clean
|
||||
rm -rf $(TESTDIR) *.log
|
||||
rm -rf $(TESTDIR) *.log .cadence
|
||||
cd sxlib2lef && make mrproper
|
||||
|
||||
clean:
|
||||
rm -rf x86_64
|
||||
|
|
|
@ -8,7 +8,9 @@ sxlib.lef:
|
|||
cp sxlib.lef sxlib.lef.bak
|
||||
|
||||
mrproper: clean
|
||||
rm -rf sxlib cds.lib
|
||||
rm -rf sxlib cds.lib .cadence
|
||||
|
||||
clean:
|
||||
rm -rf *.log *.slog *~ encounter* *.lef
|
||||
|
||||
.PHONY: all mrproper clean
|
||||
|
|
Loading…
Reference in New Issue