diff --git a/crlcore/src/ccore/CMakeLists.txt b/crlcore/src/ccore/CMakeLists.txt index 080397cd..01517a1a 100644 --- a/crlcore/src/ccore/CMakeLists.txt +++ b/crlcore/src/ccore/CMakeLists.txt @@ -123,19 +123,14 @@ lefdef/LefParser.cpp lefdef/DefParser.cpp lefdef/DefDriver.cpp - ) - - if ( OA_FOUND ) - include_directories ( ${OA_INCLUDE_DIR} ) - set( openaccess_cpps openaccess/COpenAccessBridgeLayer.cpp - openaccess/OAWrapper.cpp - ) - endif ( OA_FOUND ) + ) if ( LEFDEF_FOUND ) include_directories ( ${LEFDEF_INCLUDE_DIR} ) endif ( LEFDEF_FOUND ) - set (openaccess_cpps ${openaccess_cpps} - openaccess/OpenAccessWrapper.cpp ) + if ( OA_FOUND ) + include_directories ( ${OA_INCLUDE_DIR} ) + endif ( OA_FOUND ) + set (openaccess_cpps openaccess/OpenAccessWrapper.cpp ) set ( VstParserSourceDir ${CRLCORE_SOURCE_DIR}/src/ccore/alliance/vst ) set ( VstParserBinaryDir ${CRLCORE_BINARY_DIR}/src/ccore/alliance/vst ) diff --git a/crlcore/src/ccore/ParsersDrivers.cpp b/crlcore/src/ccore/ParsersDrivers.cpp index 03b65ffb..b6872bb3 100644 --- a/crlcore/src/ccore/ParsersDrivers.cpp +++ b/crlcore/src/ccore/ParsersDrivers.cpp @@ -219,8 +219,8 @@ namespace CRL { registerSlot ( "spi", (CellParser_t*)spiceParser , "spi" ); registerSlot ( "def", (CellParser_t*)defParser , "def" ); registerSlot ( "def", (LibraryParser_t*)lefParser , "lef" ); - registerSlot ( "oa", (CellParser_t*)OpenAccessWrapper::oaDesignLoader , "oa" ); - registerSlot ( "oa", (LibraryParser_t*)OpenAccessWrapper::oaLibLoader , "oa" ); +// registerSlot ( "oa", (CellParser_t*)OpenAccessWrapper::oaDesignLoader , "oa" ); +// registerSlot ( "oa", (LibraryParser_t*)OpenAccessWrapper::oaLibLoader , "oa" ); registerSlot ( "aux", (CellParser_t*)bookshelfParser, "aux" ); } diff --git a/crlcore/src/ccore/openaccess/OpenAccessWrapper.cpp b/crlcore/src/ccore/openaccess/OpenAccessWrapper.cpp index cd1f715c..1cf2e207 100644 --- a/crlcore/src/ccore/openaccess/OpenAccessWrapper.cpp +++ b/crlcore/src/ccore/openaccess/OpenAccessWrapper.cpp @@ -1,3 +1,5 @@ +// -*-compile-command:"cd ../../../../.. && make"-*- +// Time-stamp: "2010-06-30 13:45:04" - OpenAccessWrapper.cpp // x-----------------------------------------------------------------x // | This file is part of the hurricaneAMS Software. | // | Copyright (c) UPMC/LIP6 2008-2010, All Rights Reserved | @@ -5,6 +7,10 @@ // | Author : Chistophe Alexandre | // | E-mail : Christophe.Alexandre@asim.lip6.fr | // x-----------------------------------------------------------------x +// | Author : Jean-Manuel Caba | +// | E-mail : Jean-Manuel.Caba@asim.lip6.fr | +// x-----------------------------------------------------------------x + #ifdef HAVE_OPENACCESS #include "oa/oaDesignDB.h" using namespace oa; @@ -24,50 +30,32 @@ namespace { #ifdef HAVE_OPENACCESS -#if 0 -oaModInstTerm* getModInstTerm(oaModInst* modInst, Plug* plug) { - oaNativeNS ns; - oaScalarName scPlugName(ns, getString(plug->getName()).c_str()); - oaName instTermName(scPlugName); - oaModInstTerm* instTerm = oaModInstTerm::find(modInst, instTermName); - if (instTerm) { - return instTerm; + oaString getDesignName(oaDesign* design) { + oaNativeNS ns; + oaString libName, cellName, viewName; + design->getLibName(ns, libName); + design->getCellName(ns, cellName); + design->getViewName(ns, viewName); + oaString designName = "<" + libName + "," + cellName + "," + viewName + ">"; + return designName; } - oaModule* masterModule = modInst->getMasterModule(); - oaModTerm* modTerm = oaModTerm::find(masterModule, instTermName); - assert(modTerm); - oaModNet* modNet = oaModNet::find(masterModule, instTermName); - assert(modNet); - instTerm = oaModInstTerm::create(modNet, modInst, instTermName); - return instTerm; -} -#endif -oaString getDesignName(oaDesign* design) { - oaNativeNS ns; - oaString libName, cellName, viewName; - design->getLibName(ns, libName); - design->getCellName(ns, cellName); - design->getViewName(ns, viewName); - oaString designName = "<" + libName + "," + cellName + "," + viewName + ">"; - return designName; -} - -void printBlockTerms(oaBlock* block) { - oaNativeNS ns; - oaDesign* design = block->getDesign(); - cerr << " o Printing " << getDesignName(design) << " terms" << endl; - oaIter termIter(block->getTerms()); - while (oaTerm* term = termIter.getNext()) { - oaString termName; - term->getName(ns, termName); - cerr << " - " << termName << endl; + void printBlockTerms(oaBlock* block) { + cerr << "printBlockTerms" << endl; + oaNativeNS ns; + oaDesign* design = block->getDesign(); + cerr << " o Printing " << getDesignName(design) << " terms" << endl; + oaIter termIter(block->getTerms()); + while (oaTerm* term = termIter.getNext()) { + oaString termName; + term->getName(ns, termName); + cerr << " - " << termName << endl; + } + cerr << endl; } - cerr << endl; -} -oaTermType getOATermType(const Net::Direction& direction) { - switch (direction) { + oaTermType getOATermType(const Net::Direction& direction) { + switch (direction) { case Net::Direction::IN: return oacInputTermType; case Net::Direction::OUT: @@ -76,14 +64,16 @@ oaTermType getOATermType(const Net::Direction& direction) { return oacInputOutputTermType; case Net::Direction::TRISTATE: return oacTristateTermType; + case Net::Direction::UNDEFINED: + return oacUnusedTermType;// is it OK ? default: throw Error("unrecognized direction"); + } } -} -oaOrient getOAOrientFromOrientation(const Transformation::Orientation& orientation) { - cerr << orientation << endl; - switch (orientation) { + oaOrient getOAOrientFromOrientation(const Transformation::Orientation& orientation) { + cerr << orientation << endl; + switch (orientation) { case Transformation::Orientation::ID: return oacR0; case Transformation::Orientation::R1: @@ -102,41 +92,42 @@ oaOrient getOAOrientFromOrientation(const Transformation::Orientation& orientati return oacMYR90; default: throw Error("Unrecognized orientation"); + } } -} -void getOATransformFromTransformation(oaTransform& transform, const Transformation& transformation) { - transform.set(transformation.getTx(), - transformation.getTy(), - getOAOrientFromOrientation(transformation.getOrientation())); -} + void getOATransformFromTransformation(oaTransform& transform, const Transformation& transformation) { + transform.set(transformation.getTx(), + transformation.getTy(), + getOAOrientFromOrientation(transformation.getOrientation())); + } -void getOABoxForBox(oaBox& box, const Box& hbox) { - box.set(hbox.getXMin(), hbox.getYMin(), hbox.getXMax(), hbox.getYMax()); -} + void getOABoxForBox(oaBox& box, const Box& hbox) { + box.set(hbox.getXMin(), hbox.getYMin(), hbox.getXMax(), hbox.getYMax()); + } -oaInstTerm* getInstTerm(oaInst* inst, Plug* plug) { - oaNativeNS ns; - oaScalarName scPlugName(ns, getString(plug->getMasterNet()->getName()).c_str()); - oaName instTermName(scPlugName); - oaInstTerm* instTerm = oaInstTerm::find(inst, instTermName); - if (instTerm) { + oaInstTerm* getInstTerm(oaInst* inst, Plug* plug) { + cerr << "getInstTerm" << endl; + oaNativeNS ns; + oaScalarName scPlugName(ns, getString(plug->getMasterNet()->getName()).c_str()); + oaName instTermName(scPlugName); + oaInstTerm* instTerm = oaInstTerm::find(inst, instTermName); + if (instTerm) { + return instTerm; + } + oaDesign* design = inst->getMaster(); + assert(design); + oaBlock* masterBlock = design->getTopBlock(); + oaTerm* term = oaTerm::find(masterBlock, instTermName); + if (!term) { + cerr << "looking for " << plug->getName() << endl; + printBlockTerms(masterBlock); + } + assert(term); + instTerm = oaInstTerm::create(NULL, inst, term); return instTerm; } - oaDesign* design = inst->getMaster(); - assert(design); - oaBlock* masterBlock = design->getTopBlock(); - oaTerm* term = oaTerm::find(masterBlock, instTermName); - if (!term) { - cerr << "looking for " << plug->getName() << endl; - printBlockTerms(masterBlock); - } - assert(term); - instTerm = oaInstTerm::create(NULL, inst, term); - return instTerm; -} -class OADriver { + class OADriver { private: typedef map Library2OALibMap; typedef map Cell2OADesignMap; @@ -149,64 +140,47 @@ class OADriver { Library2OALibMap _library2OALibMap; Cell2OADesignMap _cell2OADesignMap; Instance2OAInstsMap _instance2OAInstMap; - + DataBase* _db; + Technology* _technology; public: - OADriver(const string& path): _path(path), _oaTech(NULL), _oaBlock(NULL), _library2OALibMap(), _cell2OADesignMap(), - _instance2OAInstMap() { - DataBase* db = DataBase::getDB(); - if (!db) { - throw Error("no database"); - } - Technology* technology = db->getTechnology(); - //createOATechForTechnology(technology); + _instance2OAInstMap(), + _db(NULL), + _technology(NULL) { + _db = DataBase::getDB(); + if (!_db) { + throw Error("no database"); } + _technology = _db->getTechnology(); + if (!_technology) { + throw Error("no technology"); + } + } ~OADriver() { cerr << "SAVING ALL" << endl; - -#if 0 - oaNativeNS ns; - string fullPath = _path + "/lib.defs"; - oaScalarName scPath(ns, fullPath.c_str()); - oaString strPath; - scPath.get(strPath); - oaLibDefList* libDefList = oaLibDefList::get(strPath, 'w'); -#endif - for (Cell2OADesignMap::iterator it = _cell2OADesignMap.begin(); - it != _cell2OADesignMap.end(); - ++it) { + it != _cell2OADesignMap.end(); + ++it) { cerr << it->first << endl; oaDesign* design = it->second; design->save(); design->close(); } - for (Library2OALibMap::iterator it = _library2OALibMap.begin(); - it != _library2OALibMap.end(); - ++it) { + it != _library2OALibMap.end(); + ++it) { oaLib* lib = it->second; -#if 0 - oaScalarName libName; - lib->getName(libName); - oaString libPath; - lib->getFullPath(libPath); - oaLibDef* libDef = oaLibDef::create(libDefList, libName, libPath); -#endif lib->close(); } - - // libDefList->save(); cerr << "ALL SAVED" << endl; } - oaLib* getOALibForLibrary(const Library* library) { Library2OALibMap::iterator it = _library2OALibMap.find(library); if (it != _library2OALibMap.end()) { @@ -214,50 +188,40 @@ class OADriver { } oaNativeNS ns; const char* strNameLib = getString(library->getName()).c_str(); - if (!strcmp(strNameLib, ".")) { + if (!strcmp(strNameLib, ".")) strNameLib = "worklib"; - } string strPathLib = _path + '/' + strNameLib; - //cerr << "Creating new Library for Lib name=" - // << strNameLib << " to filesystem path=" << strPathLib << endl; + cerr << "Creating new Library for Lib name=" + << strNameLib << " to filesystem path=" << strPathLib << endl; oaScalarName scNameLib(ns, strNameLib); cerr << "Creating new Library for Lib name=" - << strNameLib << " to filesystem path=" << strPathLib << endl; + << strNameLib << " to filesystem path=" << strPathLib << endl; + + string cmd = "rm -rf "+strPathLib+"; mkdir -p "+strPathLib; + system(cmd.c_str()); oaLib* lib = oaLib::create(scNameLib, strPathLib.c_str(), oacSharedLibMode, "oaDMFileSys"); - //oaScalarName libName; - //_oaTech->getLibName(libName); - //oaTech::attach(lib, libName); - //assert(oaTech::find(lib)); - + assert(lib); + assert(lib->isValid()); + + assert(_oaTech == NULL); + _oaTech = createOATechForTechnology(_technology,lib); + + _library2OALibMap[library] = lib; + return lib; + } + + /** + @todo complete with technology info + */ + oaTech* createOATechForTechnology(const Technology* technology,oaLib* lib) { oaTech* oaTech = oaTech::create(lib); oaTech->setDefaultManufacturingGrid(10); oaTech->setDBUPerUU(oaViewType::get(oacMaskLayout), 1000); - oaLayer* drawingLayer = oaPhysicalLayer::create(oaTech, "drawing", 0); + assert(oaTech != NULL); - _library2OALibMap[library] = lib; - - return lib; - } - - void createOATechForTechnology(const Technology* technology) { - string strPathLib = _path + "/techlib"; - oaNativeNS ns; - oaScalarName scNameLib(ns, "techlib"); - oaLib* lib = oaLib::create(scNameLib, strPathLib.c_str(), oacSharedLibMode, "oaDMFileSys"); - _oaTech = oaTech::create(lib); - - oaLayer* drawingLayer = oaPhysicalLayer::create(_oaTech, "drawing", 0); - -#if 0 - for_each_layer(hlayer, technology->getLayers()) { - oaString strLayerName = getString(hlayer->getName()).c_str(); - oaPhysicalLayer* layer = oaPhysicalLayer::create(techno, strLayerName, layerNum++); - end_for; - } -#endif - lib->close(); + return oaTech; } oaDesign* getOADesignForCell(const Cell* cell) { @@ -268,33 +232,25 @@ class OADriver { } oaNativeNS ns; + cerr << "getOALibForLibrary" << endl; oaLib* lib = getOALibForLibrary(cell->getLibrary()); - oaScalarName scNameDesign(ns, getString(cell->getName()).c_str()); + oaScalarName scNameDesign(ns, getString(cell->getName()).c_str()); oaScalarName scNameView(ns, "layout"); oaScalarName scNameLib; lib->getName(scNameLib); oaDesign* design = oaDesign::open(scNameLib, scNameDesign, scNameView, oaViewType::get(oacSchematic), 'w'); - //oaModule* module = oaModule::create(design); oaBlock* block = oaBlock::create(design); - oaTech* tech = oaTech::find(lib); - assert(tech); - oaBox box; - getOABoxForBox(box, cell->getAbutmentBox()); - cerr << cell << " " << cell->getAbutmentBox() << endl; - oaRect::create(block, 0, oaPurpose::get(tech, oacDrawingPurposeType)->getNumber(), box); - + + cerr << "transformation of instance" << endl; for_each_instance(instance, cell->getInstances()) { Cell* masterCell = instance->getMasterCell(); - oaDesign* masterDesign = getOADesignForCell(masterCell); + oaDesign* masterDesign = getOADesignForCell(masterCell); oaScalarName scDesignName; masterDesign->getCellName(scDesignName); oaString strDesignName; scDesignName.get(strDesignName); - //oaModule* masterModule = masterDesign->getTopModule(); - //assert(masterModule); oaScalarName scInstName(ns, getString(instance->getName()).c_str()); - //oaModScalarInst* modInst = oaModScalarInst::create(masterModule, masterDesign, scInstName); oaTransform transform; getOATransformFromTransformation(transform, instance->getTransformation()); @@ -302,96 +258,69 @@ class OADriver { _instance2OAInstMap[instance] = blockInst; end_for; } - + cerr << "transformation of net" << endl; for_each_net(net, cell->getNets()) { oaScalarName scNetName(ns, getString(net->getName()).c_str()); - //oaModNet* modNet = oaModScalarNet::create(module, scNetName, oacAnalogSigType); oaScalarNet* blockNet = oaScalarNet::create(block, scNetName, oacAnalogSigType); if (net->isExternal()) { oaTerm* term = oaTerm::create(blockNet, scNetName, getOATermType(net->getDirection())); oaPin* pin = oaPin::create(term); - oaTech* tech = oaTech::find(lib); - assert(tech); Components externalComponents = NetExternalComponents::get(net); for_each_component(component, externalComponents) { oaBox box; getOABoxForBox(box, component->getBoundingBox()); oaRect* rect = oaRect::create(block, 0, - oaPurpose::get(tech, oacDrawingPurposeType)->getNumber(), - box); + oaPurpose::get(_oaTech, oacDrawingPurposeType)->getNumber(), + box); rect->addToPin(pin); end_for; } } - + cerr << "transformation of plug" << endl; for_each_plug(plug, net->getPlugs()) { Instance* instance = plug->getInstance(); Instance2OAInstsMap::iterator it = _instance2OAInstMap.find(instance); assert(it != _instance2OAInstMap.end()); - //oaModInst* modInst = it->second.first; oaInst* blockInst = it->second; - //oaModInstTerm* modInstTerm = getModInstTerm(modInst, plug); oaInstTerm* instTerm = getInstTerm(blockInst, plug); - //modInstTerm->addToNet(modNet); + assert(instTerm); instTerm->addToNet(blockNet); end_for; } - - for_each_component(component, net->getComponents()) { - end_for; - } end_for; } - _cell2OADesignMap[cell] = design; return design; } -}; + }; #endif - } namespace CRL { - -void OpenAccessWrapper::oaLibLoader(const string& libPath, Library *lib, Catalog &catalog) { - cerr << "\nDummy OpenAccess lib loader call for " << libPath << endl; -} - -void OpenAccessWrapper::oaDesignLoader(const string& path, Cell* cell) { - cerr << "\nDummy OpenAccess design loader call for " << path << endl; -} - -void OpenAccessWrapper::oaDriver(const string& path, Cell* cell, unsigned int& saveState) { + void OpenAccessWrapper::oaDriver(const string& path, Cell* cell, unsigned int& saveState) { #ifdef HAVE_OPENACCESS - //for the moment a driver for hurricaneAMS - //save the Cell and all used Cells - cerr << "Saving " << cell << " in " << path << endl; - try { - - oaDesignInit( + //for the moment a driver for hurricaneAMS + //save the Cell and all used Cells + cerr << "Saving " << cell << " in " << path << endl; + try { + oaDesignInit( oacAPIMajorRevNumber, oacAPIMinorRevNumber, oacDataModelRevNumber); - Library* library = cell->getLibrary(); - string pathLib = path + "/" + getString(library->getName()); + Library* library = cell->getLibrary(); + string pathLib = path + "/" + getString(library->getName()); - const char* strPathLib = pathLib.c_str(); - -// if (oaLib::exists(strPathLib)) { -// throw Error("impossible to drive Cell, there is an existing OpenAccess db"); -// } - - OADriver oaDriver(pathLib); - oaDesign* design = oaDriver.getOADesignForCell(cell); - - } catch (oaException &excp) { - cerr << "ERROR: " << excp.getMsg() << endl; - exit(1); - } + OADriver oaDriver(pathLib); + oaDesign* design = oaDriver.getOADesignForCell(cell); + if(design) + cerr << getDesignName(design) << endl; + } catch (oaException &excp) { + cerr << "ERROR: " << excp.getMsg() << endl; + exit(1); + } #else - cerr << "\nDummy OpenAccess driver call for " << path << endl; + cerr << "\nDummy OpenAccess driver call for " << path << endl; #endif -} - + } } diff --git a/crlcore/src/ccore/openaccess/OpenAccessWrapper.h b/crlcore/src/ccore/openaccess/OpenAccessWrapper.h index 9950fe4f..3aaf6fac 100644 --- a/crlcore/src/ccore/openaccess/OpenAccessWrapper.h +++ b/crlcore/src/ccore/openaccess/OpenAccessWrapper.h @@ -1,3 +1,5 @@ +// -*-compile-command:"cd ../../../../.. && make"-*- +// Time-stamp: "2010-06-29 11:55:46" - OpenAccessWrapper.h // x-----------------------------------------------------------------x // | This file is part of the hurricaneAMS Software. | // | Copyright (c) UPMC/LIP6 2008-2010, All Rights Reserved | @@ -5,8 +7,12 @@ // | Author : Chistophe Alexandre | // | E-mail : Christophe.Alexandre@asim.lip6.fr | // x-----------------------------------------------------------------x -#ifndef __OPENACCESSWRAPPER_H -#define __OPENACCESSWRAPPER_H +// | Author : Jean-Manuel Caba | +// | E-mail : Jean-Manuel.Caba@asim.lip6.fr | +// x-----------------------------------------------------------------x + +#ifndef __OPENACCESSWRAPPER_H__ +#define __OPENACCESSWRAPPER_H__ #include using namespace std; @@ -17,16 +23,10 @@ namespace Hurricane { } namespace CRL { - -class Catalog; - -class OpenAccessWrapper { + class OpenAccessWrapper { public: - static void oaLibLoader(const string& libPath, Hurricane::Library* lib, Catalog& catalog); - static void oaDesignLoader(const string& path, Hurricane::Cell* cell); static void oaDriver(const string& cellPath, Cell* cell, unsigned int& saveState); -}; - + }; } -#endif /*__OPENACCESSWRAPPER_H */ +#endif /*__OPENACCESSWRAPPER_H__ */ diff --git a/crlcore/src/ccore/openaccess/COpenAccessBridgeLayer.cpp b/crlcore/src/ccore/openaccess/obsolete/COpenAccessBridgeLayer.cpp similarity index 100% rename from crlcore/src/ccore/openaccess/COpenAccessBridgeLayer.cpp rename to crlcore/src/ccore/openaccess/obsolete/COpenAccessBridgeLayer.cpp diff --git a/crlcore/src/ccore/openaccess/COpenAccessBridgeLayer.h b/crlcore/src/ccore/openaccess/obsolete/COpenAccessBridgeLayer.h similarity index 100% rename from crlcore/src/ccore/openaccess/COpenAccessBridgeLayer.h rename to crlcore/src/ccore/openaccess/obsolete/COpenAccessBridgeLayer.h diff --git a/crlcore/src/ccore/openaccess/OAWrapper.cpp b/crlcore/src/ccore/openaccess/obsolete/OAWrapper.cpp similarity index 100% rename from crlcore/src/ccore/openaccess/OAWrapper.cpp rename to crlcore/src/ccore/openaccess/obsolete/OAWrapper.cpp diff --git a/crlcore/src/ccore/openaccess/OAWrapper.h b/crlcore/src/ccore/openaccess/obsolete/OAWrapper.h similarity index 100% rename from crlcore/src/ccore/openaccess/OAWrapper.h rename to crlcore/src/ccore/openaccess/obsolete/OAWrapper.h diff --git a/crlcore/src/ccore/openaccess/obsolete/OpenAccessWrapper.cpp b/crlcore/src/ccore/openaccess/obsolete/OpenAccessWrapper.cpp new file mode 100644 index 00000000..cd1f715c --- /dev/null +++ b/crlcore/src/ccore/openaccess/obsolete/OpenAccessWrapper.cpp @@ -0,0 +1,397 @@ +// x-----------------------------------------------------------------x +// | This file is part of the hurricaneAMS Software. | +// | Copyright (c) UPMC/LIP6 2008-2010, All Rights Reserved | +// | =============================================================== | +// | Author : Chistophe Alexandre | +// | E-mail : Christophe.Alexandre@asim.lip6.fr | +// x-----------------------------------------------------------------x +#ifdef HAVE_OPENACCESS +#include "oa/oaDesignDB.h" +using namespace oa; +#endif + +#include "hurricane/DataBase.h" +#include "hurricane/Library.h" +#include "hurricane/Cell.h" +#include "hurricane/NetExternalComponents.h" +#include "hurricane/Segment.h" +#include "hurricane/Pad.h" +using namespace Hurricane; + +#include "OpenAccessWrapper.h" + +namespace { + +#ifdef HAVE_OPENACCESS + +#if 0 +oaModInstTerm* getModInstTerm(oaModInst* modInst, Plug* plug) { + oaNativeNS ns; + oaScalarName scPlugName(ns, getString(plug->getName()).c_str()); + oaName instTermName(scPlugName); + oaModInstTerm* instTerm = oaModInstTerm::find(modInst, instTermName); + if (instTerm) { + return instTerm; + } + oaModule* masterModule = modInst->getMasterModule(); + oaModTerm* modTerm = oaModTerm::find(masterModule, instTermName); + assert(modTerm); + oaModNet* modNet = oaModNet::find(masterModule, instTermName); + assert(modNet); + instTerm = oaModInstTerm::create(modNet, modInst, instTermName); + return instTerm; +} +#endif + +oaString getDesignName(oaDesign* design) { + oaNativeNS ns; + oaString libName, cellName, viewName; + design->getLibName(ns, libName); + design->getCellName(ns, cellName); + design->getViewName(ns, viewName); + oaString designName = "<" + libName + "," + cellName + "," + viewName + ">"; + return designName; +} + +void printBlockTerms(oaBlock* block) { + oaNativeNS ns; + oaDesign* design = block->getDesign(); + cerr << " o Printing " << getDesignName(design) << " terms" << endl; + oaIter termIter(block->getTerms()); + while (oaTerm* term = termIter.getNext()) { + oaString termName; + term->getName(ns, termName); + cerr << " - " << termName << endl; + } + cerr << endl; +} + +oaTermType getOATermType(const Net::Direction& direction) { + switch (direction) { + case Net::Direction::IN: + return oacInputTermType; + case Net::Direction::OUT: + return oacOutputTermType; + case Net::Direction::INOUT: + return oacInputOutputTermType; + case Net::Direction::TRISTATE: + return oacTristateTermType; + default: + throw Error("unrecognized direction"); + } +} + +oaOrient getOAOrientFromOrientation(const Transformation::Orientation& orientation) { + cerr << orientation << endl; + switch (orientation) { + case Transformation::Orientation::ID: + return oacR0; + case Transformation::Orientation::R1: + return oacR90; + case Transformation::Orientation::R2: + return oacR180; + case Transformation::Orientation::R3: + return oacR270; + case Transformation::Orientation::MX: + return oacMX; + case Transformation::Orientation::XR: + return oacMXR90; + case Transformation::Orientation::MY: + return oacMY; + case Transformation::Orientation::YR: + return oacMYR90; + default: + throw Error("Unrecognized orientation"); + } +} + +void getOATransformFromTransformation(oaTransform& transform, const Transformation& transformation) { + transform.set(transformation.getTx(), + transformation.getTy(), + getOAOrientFromOrientation(transformation.getOrientation())); +} + +void getOABoxForBox(oaBox& box, const Box& hbox) { + box.set(hbox.getXMin(), hbox.getYMin(), hbox.getXMax(), hbox.getYMax()); +} + +oaInstTerm* getInstTerm(oaInst* inst, Plug* plug) { + oaNativeNS ns; + oaScalarName scPlugName(ns, getString(plug->getMasterNet()->getName()).c_str()); + oaName instTermName(scPlugName); + oaInstTerm* instTerm = oaInstTerm::find(inst, instTermName); + if (instTerm) { + return instTerm; + } + oaDesign* design = inst->getMaster(); + assert(design); + oaBlock* masterBlock = design->getTopBlock(); + oaTerm* term = oaTerm::find(masterBlock, instTermName); + if (!term) { + cerr << "looking for " << plug->getName() << endl; + printBlockTerms(masterBlock); + } + assert(term); + instTerm = oaInstTerm::create(NULL, inst, term); + return instTerm; +} + +class OADriver { + private: + typedef map Library2OALibMap; + typedef map Cell2OADesignMap; + typedef pair OAInstPair; + typedef map Instance2OAInstsMap; + + string _path; + oaTech* _oaTech; + oaBlock* _oaBlock; + Library2OALibMap _library2OALibMap; + Cell2OADesignMap _cell2OADesignMap; + Instance2OAInstsMap _instance2OAInstMap; + + public: + + OADriver(const string& path): + _path(path), + _oaTech(NULL), + _oaBlock(NULL), + _library2OALibMap(), + _cell2OADesignMap(), + _instance2OAInstMap() { + DataBase* db = DataBase::getDB(); + if (!db) { + throw Error("no database"); + } + Technology* technology = db->getTechnology(); + //createOATechForTechnology(technology); + } + + ~OADriver() { + cerr << "SAVING ALL" << endl; + +#if 0 + oaNativeNS ns; + string fullPath = _path + "/lib.defs"; + oaScalarName scPath(ns, fullPath.c_str()); + oaString strPath; + scPath.get(strPath); + oaLibDefList* libDefList = oaLibDefList::get(strPath, 'w'); +#endif + + for (Cell2OADesignMap::iterator it = _cell2OADesignMap.begin(); + it != _cell2OADesignMap.end(); + ++it) { + cerr << it->first << endl; + oaDesign* design = it->second; + design->save(); + design->close(); + } + + for (Library2OALibMap::iterator it = _library2OALibMap.begin(); + it != _library2OALibMap.end(); + ++it) { + oaLib* lib = it->second; +#if 0 + oaScalarName libName; + lib->getName(libName); + oaString libPath; + lib->getFullPath(libPath); + oaLibDef* libDef = oaLibDef::create(libDefList, libName, libPath); +#endif + lib->close(); + } + + // libDefList->save(); + cerr << "ALL SAVED" << endl; + } + + + oaLib* getOALibForLibrary(const Library* library) { + Library2OALibMap::iterator it = _library2OALibMap.find(library); + if (it != _library2OALibMap.end()) { + return it->second; + } + oaNativeNS ns; + const char* strNameLib = getString(library->getName()).c_str(); + if (!strcmp(strNameLib, ".")) { + strNameLib = "worklib"; + } + string strPathLib = _path + '/' + strNameLib; + //cerr << "Creating new Library for Lib name=" + // << strNameLib << " to filesystem path=" << strPathLib << endl; + oaScalarName scNameLib(ns, strNameLib); + cerr << "Creating new Library for Lib name=" + << strNameLib << " to filesystem path=" << strPathLib << endl; + oaLib* lib = oaLib::create(scNameLib, strPathLib.c_str(), oacSharedLibMode, "oaDMFileSys"); + + //oaScalarName libName; + //_oaTech->getLibName(libName); + //oaTech::attach(lib, libName); + //assert(oaTech::find(lib)); + + oaTech* oaTech = oaTech::create(lib); + oaTech->setDefaultManufacturingGrid(10); + oaTech->setDBUPerUU(oaViewType::get(oacMaskLayout), 1000); + + oaLayer* drawingLayer = oaPhysicalLayer::create(oaTech, "drawing", 0); + + _library2OALibMap[library] = lib; + + return lib; + } + + void createOATechForTechnology(const Technology* technology) { + string strPathLib = _path + "/techlib"; + oaNativeNS ns; + oaScalarName scNameLib(ns, "techlib"); + oaLib* lib = oaLib::create(scNameLib, strPathLib.c_str(), oacSharedLibMode, "oaDMFileSys"); + _oaTech = oaTech::create(lib); + + oaLayer* drawingLayer = oaPhysicalLayer::create(_oaTech, "drawing", 0); + +#if 0 + for_each_layer(hlayer, technology->getLayers()) { + oaString strLayerName = getString(hlayer->getName()).c_str(); + oaPhysicalLayer* layer = oaPhysicalLayer::create(techno, strLayerName, layerNum++); + end_for; + } +#endif + lib->close(); + } + + oaDesign* getOADesignForCell(const Cell* cell) { + cerr << "getOADesignForCell " << cell << endl; + Cell2OADesignMap::iterator it = _cell2OADesignMap.find(cell); + if (it != _cell2OADesignMap.end()) { + return it->second; + } + + oaNativeNS ns; + oaLib* lib = getOALibForLibrary(cell->getLibrary()); + oaScalarName scNameDesign(ns, getString(cell->getName()).c_str()); + oaScalarName scNameView(ns, "layout"); + oaScalarName scNameLib; + lib->getName(scNameLib); + + oaDesign* design = oaDesign::open(scNameLib, scNameDesign, scNameView, oaViewType::get(oacSchematic), 'w'); + //oaModule* module = oaModule::create(design); + oaBlock* block = oaBlock::create(design); + oaTech* tech = oaTech::find(lib); + assert(tech); + oaBox box; + getOABoxForBox(box, cell->getAbutmentBox()); + cerr << cell << " " << cell->getAbutmentBox() << endl; + oaRect::create(block, 0, oaPurpose::get(tech, oacDrawingPurposeType)->getNumber(), box); + + for_each_instance(instance, cell->getInstances()) { + Cell* masterCell = instance->getMasterCell(); + oaDesign* masterDesign = getOADesignForCell(masterCell); + oaScalarName scDesignName; + masterDesign->getCellName(scDesignName); + oaString strDesignName; + scDesignName.get(strDesignName); + //oaModule* masterModule = masterDesign->getTopModule(); + //assert(masterModule); + oaScalarName scInstName(ns, getString(instance->getName()).c_str()); + //oaModScalarInst* modInst = oaModScalarInst::create(masterModule, masterDesign, scInstName); + + oaTransform transform; + getOATransformFromTransformation(transform, instance->getTransformation()); + oaScalarInst* blockInst = oaScalarInst::create(block, masterDesign, scInstName, transform); + _instance2OAInstMap[instance] = blockInst; + end_for; + } + + for_each_net(net, cell->getNets()) { + oaScalarName scNetName(ns, getString(net->getName()).c_str()); + //oaModNet* modNet = oaModScalarNet::create(module, scNetName, oacAnalogSigType); + oaScalarNet* blockNet = oaScalarNet::create(block, scNetName, oacAnalogSigType); + if (net->isExternal()) { + oaTerm* term = oaTerm::create(blockNet, scNetName, getOATermType(net->getDirection())); + oaPin* pin = oaPin::create(term); + oaTech* tech = oaTech::find(lib); + assert(tech); + Components externalComponents = NetExternalComponents::get(net); + for_each_component(component, externalComponents) { + oaBox box; + getOABoxForBox(box, component->getBoundingBox()); + oaRect* rect = oaRect::create(block, 0, + oaPurpose::get(tech, oacDrawingPurposeType)->getNumber(), + box); + rect->addToPin(pin); + end_for; + } + } + + for_each_plug(plug, net->getPlugs()) { + Instance* instance = plug->getInstance(); + Instance2OAInstsMap::iterator it = _instance2OAInstMap.find(instance); + assert(it != _instance2OAInstMap.end()); + //oaModInst* modInst = it->second.first; + oaInst* blockInst = it->second; + //oaModInstTerm* modInstTerm = getModInstTerm(modInst, plug); + oaInstTerm* instTerm = getInstTerm(blockInst, plug); + //modInstTerm->addToNet(modNet); + instTerm->addToNet(blockNet); + end_for; + } + + for_each_component(component, net->getComponents()) { + end_for; + } + end_for; + } + + _cell2OADesignMap[cell] = design; + return design; + } +}; +#endif + +} + +namespace CRL { + +void OpenAccessWrapper::oaLibLoader(const string& libPath, Library *lib, Catalog &catalog) { + cerr << "\nDummy OpenAccess lib loader call for " << libPath << endl; +} + +void OpenAccessWrapper::oaDesignLoader(const string& path, Cell* cell) { + cerr << "\nDummy OpenAccess design loader call for " << path << endl; +} + +void OpenAccessWrapper::oaDriver(const string& path, Cell* cell, unsigned int& saveState) { +#ifdef HAVE_OPENACCESS + //for the moment a driver for hurricaneAMS + //save the Cell and all used Cells + cerr << "Saving " << cell << " in " << path << endl; + try { + + oaDesignInit( + oacAPIMajorRevNumber, + oacAPIMinorRevNumber, + oacDataModelRevNumber); + + Library* library = cell->getLibrary(); + string pathLib = path + "/" + getString(library->getName()); + + const char* strPathLib = pathLib.c_str(); + +// if (oaLib::exists(strPathLib)) { +// throw Error("impossible to drive Cell, there is an existing OpenAccess db"); +// } + + OADriver oaDriver(pathLib); + oaDesign* design = oaDriver.getOADesignForCell(cell); + + } catch (oaException &excp) { + cerr << "ERROR: " << excp.getMsg() << endl; + exit(1); + } +#else + cerr << "\nDummy OpenAccess driver call for " << path << endl; +#endif +} + +} diff --git a/crlcore/src/ccore/openaccess/obsolete/OpenAccessWrapper.h b/crlcore/src/ccore/openaccess/obsolete/OpenAccessWrapper.h new file mode 100644 index 00000000..9950fe4f --- /dev/null +++ b/crlcore/src/ccore/openaccess/obsolete/OpenAccessWrapper.h @@ -0,0 +1,32 @@ +// x-----------------------------------------------------------------x +// | This file is part of the hurricaneAMS Software. | +// | Copyright (c) UPMC/LIP6 2008-2010, All Rights Reserved | +// | =============================================================== | +// | Author : Chistophe Alexandre | +// | E-mail : Christophe.Alexandre@asim.lip6.fr | +// x-----------------------------------------------------------------x +#ifndef __OPENACCESSWRAPPER_H +#define __OPENACCESSWRAPPER_H + +#include +using namespace std; + +namespace Hurricane { + class Library; + class Cell; +} + +namespace CRL { + +class Catalog; + +class OpenAccessWrapper { + public: + static void oaLibLoader(const string& libPath, Hurricane::Library* lib, Catalog& catalog); + static void oaDesignLoader(const string& path, Hurricane::Cell* cell); + static void oaDriver(const string& cellPath, Cell* cell, unsigned int& saveState); +}; + +} + +#endif /*__OPENACCESSWRAPPER_H */ diff --git a/crlcore/src/ccore/openaccess/test/CMakeLists.txt b/crlcore/src/ccore/openaccess/test/CMakeLists.txt new file mode 100755 index 00000000..9cf258e8 --- /dev/null +++ b/crlcore/src/ccore/openaccess/test/CMakeLists.txt @@ -0,0 +1,20 @@ +PROJECT(testOAWrapper) + +CMAKE_MINIMUM_REQUIRED(VERSION 2.4.0) + +SET(CMAKE_MODULE_PATH "$ENV{CORIOLIS_USER_TOP}/share/cmake/Modules/" + "$ENV{CORIOLIS_TOP}/share/cmake/Modules/" + "$ENV{IO_USER_TOP}/share/cmake/Modules/" + "$ENV{IO_TOP}/share/cmake/Modules/" + "$ENV{CHAMS_USER_TOP}/share/cmake/Modules/" + "$ENV{CHAMS_TOP}/share/cmake/Modules/") + +FIND_PACKAGE(HURRICANE REQUIRED) +FIND_PACKAGE(CORIOLIS REQUIRED) +FIND_PACKAGE(VLSISAPD REQUIRED) +FIND_PACKAGE(HURRICANEAMS REQUIRED) +FIND_PACKAGE(AMSCORE REQUIRED) +FIND_PACKAGE(LibXml2 REQUIRED) +FIND_PACKAGE(PythonLibs REQUIRED) + +ADD_SUBDIRECTORY(src) diff --git a/crlcore/src/ccore/openaccess/test/Makefile b/crlcore/src/ccore/openaccess/test/Makefile new file mode 100644 index 00000000..0c928b95 --- /dev/null +++ b/crlcore/src/ccore/openaccess/test/Makefile @@ -0,0 +1,10 @@ + + +all: + ./compile.sh + +run: + cd x86_64/usr/local/bin && ./testOAWrapper /asim/chams/etc/chams/config.freePDK45.xml + +clean: + rm -rf x86_64 diff --git a/crlcore/src/ccore/openaccess/test/compile.sh b/crlcore/src/ccore/openaccess/test/compile.sh new file mode 100755 index 00000000..bcac6239 --- /dev/null +++ b/crlcore/src/ccore/openaccess/test/compile.sh @@ -0,0 +1,14 @@ +#!/bin/bash +ARCH=`uname -m` + +if [ ! -e "./compile.sh" ]; then + echo "You must run compile.sh in its own direcotry : ./compile.sh" + exit 1 +fi + +if [ ! -d "$ARCH/build" ]; then + echo "Creating build directory" + mkdir -p $ARCH/build +fi + +cd $ARCH/build && cmake ../.. && make DESTDIR=.. -j2 install diff --git a/crlcore/src/ccore/openaccess/test/src/CMakeLists.txt b/crlcore/src/ccore/openaccess/test/src/CMakeLists.txt new file mode 100755 index 00000000..19c7b7ae --- /dev/null +++ b/crlcore/src/ccore/openaccess/test/src/CMakeLists.txt @@ -0,0 +1,24 @@ + +INCLUDE_DIRECTORIES ( ${HURRICANE_INCLUDE_DIR} + ${CORIOLIS_INCLUDE_DIR} + ${HURRICANEAMS_INCLUDE_DIR} + ${HURRICANEAMS_GRAPHICAL_INCLUDE_DIR} + ${AMSCORE_INCLUDE_DIR} + ${SCHEMATIC_SOURCE_DIR}/src + ) + +SET ( CPPS main.cpp ) + +SET(EXECUTABLE_OUTPUT_PATH ${CMAKE_BINARY_DIR}/bin) +ADD_EXECUTABLE(testOAWrapper ${QRCS_SRCS} ${MOCS} ${CPPS} ${QRCS}) +TARGET_LINK_LIBRARIES(testOAWrapper ${HURRICANE_LIBRARIES} + ${HURRICANE_PYTHON_LIBRARIES} + ${OPENCHAMS_LIBRARY} + ${CIF_LIBRARY} + ${AGDS_LIBRARY} + ${CORIOLIS_LIBRARIES} + ${HURRICANEAMS_LIBRARIES} + ${AMSCORE_LIBRARIES} + ${OA_LIBRARIES} ) +INSTALL(TARGETS testOAWrapper DESTINATION bin) + diff --git a/crlcore/src/ccore/openaccess/test/src/main.cpp b/crlcore/src/ccore/openaccess/test/src/main.cpp new file mode 100755 index 00000000..6b3a6952 --- /dev/null +++ b/crlcore/src/ccore/openaccess/test/src/main.cpp @@ -0,0 +1,88 @@ +// -*-compile-command:"cd .. && make"-*- +// x-----------------------------------------------------------------x +// | This file is part of | +// | Copyright (c) UPMC/LIP6 2008-2009, All Rights Reserved | +// | =============================================================== | +// | Author : Jean-Manuel Caba | +// | E-mail : Jean-Manuel.Caba@asim.lip6.fr | +// x-----------------------------------------------------------------x + +#include + +using namespace std; + +#include "hurricane/Cell.h" +#include "hurricane/Library.h" +#include "hurricane/DataBase.h" + +using namespace Hurricane; + +#include "crlcore/Catalog.h" +#include "crlcore/AllianceFramework.h" + +#include "hurricaneAMS/environment/AnalogEnv.h" +#include "hurricaneAMS/devices/SimpleCurrentMirror.h" + +#include "crlcore/GdsDriver.h" +#include "crlcore/OADriver.h" + +namespace { + static string designName = "design"; + static string libName = "WorkLibrary"; +}; + +void testCell(Cell* dev){ + if(dev) + cout << "Cell created" << endl; + + cout << "driving GDS" << endl; + CRL::GdsDriver(dev).save("/tmp/testGDS"); + + cout << "driving OA" << endl; + CRL::OADriver(dev).save("/tmp/testOA"); +} + + +int main(int argc,char** argv) { + if(argc != 2) + exit(-5); + + AnalogEnv::create(argv[1]);//create Database ... + cout << "analog environment loaded and database created" << endl; + DataBase* db = DataBase::getDB(); + assert(db != NULL); + Library* rootLib = db->getRootLibrary(); + if(!rootLib){ + Library::create(db, "RootLibrary"); + rootLib = db->getRootLibrary(); + } + assert(rootLib != NULL); + + Library* workLibrary = rootLib->getLibrary(libName); + if(!workLibrary) + workLibrary = Library::create(rootLib, libName); + assert(workLibrary != NULL); + + Cell* design = workLibrary->getCell(designName); + if(!design) + design = Cell::create(workLibrary, designName); + assert(design != NULL); + + cout << "creating cell myCM" << endl; + + bool bulkConnected = true;//bulk connected to source + Cell* dev = SimpleCurrentMirror::create(workLibrary, Name("myCM"), + TransistorFamily::NMOS, + bulkConnected); + + cout << "testing cell myCM" << endl; + + testCell(dev); + +// cout << "creating and testing cell from sxlib inv_x1" << endl; + +// testCell(CRL::AllianceFramework::get()->getCell( "inv_x1", CRL::Catalog::State::Views )); + + cout << "ending normally" << endl; + return 0; +}