correct bug: when loading an already existing OA design ...

This commit is contained in:
Jean-Manuel Caba 2010-07-22 14:27:56 +00:00
parent a516708ed4
commit 6b1613c990
1 changed files with 110 additions and 77 deletions

View File

@ -1,5 +1,5 @@
// -*-compile-command:"cd ../../../../.. && make"-*-
// Time-stamp: "2010-07-21 19:21:12" - OpenAccessWrapper.cpp
// Time-stamp: "2010-07-22 15:38:03" - OpenAccessWrapper.cpp
// x-----------------------------------------------------------------x
// | This file is part of the hurricaneAMS Software. |
// | Copyright (c) UPMC/LIP6 2008-2010, All Rights Reserved |
@ -46,7 +46,6 @@ namespace {
private:
typedef map<const Library*, oaLib*> Library2OALibMap;
typedef map<const Cell*, oaDesign*> Cell2OADesignMap;
typedef pair<oaModInst*, oaInst*> OAInstPair;
typedef map<Instance*, oaInst*> Instance2OAInstsMap;
typedef map<Layer*, oaPhysicalLayer*> Layer2OAPhysicalLayerMap;
@ -143,18 +142,19 @@ namespace {
assert(lib->isValid());
_library2OALib[library] = lib;
#if 0
// 2) for each cell convert them too : if it's a standard cell library for example
for_each_cell(c ,library->getCells()){
getOADesignForCell(c);
end_for;
}
// 3) also convert each contained library if any
for_each_library(l ,library->getLibraries()){
getOALibForLibrary(l);
end_for;
}
#endif
// 4) create, update library list file
try{
cerr << "Overwriting cds.lib file begin" << endl;
@ -162,7 +162,8 @@ namespace {
oaLibDefList* ldl = oaLibDefList::get( cdsPath.c_str(), 'a');
assert(ldl);
assert(ldl->isValid());
oaLibDef::create( ldl, scNameLib, strPathLib.c_str() );
if(!oaLibDef::find(ldl, scNameLib))
oaLibDef::create(ldl, scNameLib, strPathLib.c_str());
ldl->save();
ldl->destroy();//claim memory
ldl = NULL;
@ -170,9 +171,6 @@ namespace {
}catch(oaException& e){
cerr << "ERROR cds: " << e.getMsg() << endl;
exit(-2);
}catch(...){
cerr << "ERROR cds: [UNKNOWN]" << endl;
exit(-1);
}
return lib;
@ -184,9 +182,20 @@ namespace {
oaLayer* getOALayerFromLayer(Layer* layer,oaTech* theOATech) {
cerr << "getOALayerFromLayer" << endl;
assert(layer);
Layer2OAPhysicalLayerMap::iterator it = _layer2OAPhysicalLayer.find(layer);
if (it != _layer2OAPhysicalLayer.end()) {
return it->second;
}
assert(theOATech);
// 1) get or create layer
oaString layerName = getString(layer->getName()).c_str();
oaPhysicalLayer* aOALayer = NULL;
aOALayer = oaPhysicalLayer::find(theOATech, layerName, true);
if(aOALayer){
_layer2OAPhysicalLayer[layer] = aOALayer;
return aOALayer;
}
BasicLayer* bLayer = dynamic_cast<BasicLayer*>(layer);
if(bLayer)
aOALayer = oaPhysicalLayer::create(theOATech, layerName, _layerID++,getOAMaterial(bLayer->getMaterial()));
@ -202,14 +211,14 @@ namespace {
long minSpace = Hurricane::DbU::getDb(layer->getMinimalSpacing());
long pitch = Hurricane::DbU::getDb(layer->getPitch());
/*
#if 0
cerr << " o create constraint for min size : " << pitch << endl;
oaLayerConstraint* cMinSize = NULL;
try{
cMinSize = oaLayerConstraint::create(aOALayer->getNumber(),
oaLayerConstraintDef::get(oacMinSize),
oaIntValue::create(theOATech,500))
}catch(oaException& e){
}catch(oaException& e){
cerr << "ERROR oaLayer: " << e.getMsg() << endl;
exit(-2);
}catch(...){
@ -217,23 +226,23 @@ namespace {
exit(-1);
}
assert(cMinSize);
cerr << " o create constraint for min space" << endl;
oaLayerConstraint* cMinSpace = oaLayerConstraint::create(aOALayer->getNumber(),
oaLayerConstraintDef::get(oacMinSpacing),
oaIntValue::create(theOATech->getLib(),minSpace));
assert(cMinSpace);
cerr << " o create constraint for pitchH" << endl;
oaLayerConstraint* cPitchH = oaLayerConstraint::create(aOALayer->getNumber(),
oaLayerConstraintDef::get(oacHorizontalRouteGridPitch),
oaIntValue::create(theOATech->getLib(),pitch));
assert(cPitchH);
cerr << " o create constraint for min space" << endl;
oaLayerConstraint* cMinSpace = oaLayerConstraint::create(aOALayer->getNumber(),
oaLayerConstraintDef::get(oacMinSpacing),
oaIntValue::create(theOATech->getLib(),minSpace));
assert(cMinSpace);
cerr << " o create constraint for pitchH" << endl;
oaLayerConstraint* cPitchH = oaLayerConstraint::create(aOALayer->getNumber(),
oaLayerConstraintDef::get(oacHorizontalRouteGridPitch),
oaIntValue::create(theOATech->getLib(),pitch));
assert(cPitchH);
cerr << " o create constraint for pitchV" << endl;
oaLayerConstraint* cPitchV = oaLayerConstraint::create(aOALayer->getNumber(),
oaLayerConstraintDef::get(oacVerticalRouteGridPitch),
oaIntValue::create(theOATech->getLib(),pitch));
assert(cPitchV);
*/
cerr << " o create constraint for pitchV" << endl;
oaLayerConstraint* cPitchV = oaLayerConstraint::create(aOALayer->getNumber(),
oaLayerConstraintDef::get(oacVerticalRouteGridPitch),
oaIntValue::create(theOATech->getLib(),pitch));
assert(cPitchV);
#endif
if(bLayer){
unsigned gdsIInumber = bLayer->getExtractNumber();
}
@ -247,18 +256,17 @@ namespace {
@todo complete with technology info for layers
@see getOALibForLibrary
*/
oaTech* getOATechForTechnology(const Technology* technology) {
oaTech* getOATechForTechnology(const Technology* technology,const Library* lib) {
cerr << "createOATechForTechnology" << endl;
assert(technology);
//get or create Library for the techno
DataBase* db = technology->getDataBase();
assert(db);
Library* lib = db->getRootLibrary();
// 1) get or create Library for the techno
assert(lib);
oaLib* techOAlib = getOALibForLibrary(lib);
assert(techOAlib);
// 2) get or create oaTech container
bool created = false;
cerr << "oaTech::find" << endl;
oaTech* theOATech = oaTech::find(techOAlib);
if(!theOATech){
@ -269,35 +277,38 @@ namespace {
if(!theOATech){
cerr << "oaTech::create" << endl;
theOATech = oaTech::create(techOAlib);
}else{
return theOATech;
created = true;
}
}else{
return theOATech;
}
assert(techOAlib);
theOATech->setDefaultManufacturingGrid(10);
theOATech->setDBUPerUU(oaViewType::get(oacMaskLayout), 2000);
//create and add foundry constraint group for General manufacturing rules
//and add oaSimpleConstraintType too
oaConstraintGroup *cgFoundry = theOATech->getFoundryRules();
//TODO: add this layer
//first create "utility" layers
//strLayerDev ( "device" );
//strLayerText( "text" );
//strLayerPin ( "pin" );
//strLayerWire( "wire" );
if(created){
theOATech->setDefaultManufacturingGrid(10);
theOATech->setDBUPerUU(oaViewType::get(oacMaskLayout), 2000);
//create and add foundry constraint group for General manufacturing rules
//and add oaSimpleConstraintType too
oaConstraintGroup *cgFoundry = theOATech->getFoundryRules();
/*
add the constraint group LEFDefaultRouteSpec for oa2lef
*/
//TODO: add this layer
//first create "utility" layers
//strLayerDev ( "device" );
//strLayerText( "text" );
//strLayerPin ( "pin" );
//strLayerWire( "wire" );
}
// get or create physical layer
//create physical layer
for_each_layer(layer, technology->getLayers()) {
getOALayerFromLayer(layer,theOATech);
end_for;
}
printOALayers(theOATech);
return theOATech;
}
@ -325,7 +336,7 @@ namespace {
oaString strMasterName;
scMasterName.get(strMasterName);
oaScalarName scInstName(ns, getString(instance->getName()).c_str());
oaTransform transform;
getOATransformFromTransformation(transform, instance->getTransformation());
oaScalarInst* blockInst = oaScalarInst::create(topBlock, masterDesign, scInstName, transform);
@ -361,12 +372,13 @@ namespace {
assert(term);
oaPin* pin = oaPin::create(term);
assert(pin);
/*
oaLayerNum layer;
oaPurposeNum purpose;
getLayerPurpose(block->getDesign(), "pin", "drawing", layer, purpose);
oaPinFig *fig = oaPolygon::create(block, layer, purpose, points);
*/
#if 0
oaLayerNum layer;
oaPurposeNum purpose;
getLayerPurpose(block->getDesign(), "pin", "drawing", layer, purpose);
oaPinFig *fig = oaPolygon::create(block, layer, purpose, points);
#endif
return pin;
}
@ -401,7 +413,12 @@ namespace {
assert(net);
oaNativeNS ns;
oaScalarName scNetName(ns, getString(net->getName()).c_str());
oaScalarNet* blockNet = oaScalarNet::create(topBlock, scNetName, getOASigType(net->getType()));
oaScalarNet* blockNet = NULL;
blockNet = oaScalarNet::find(topBlock, scNetName);
if(blockNet)
return blockNet;
assert(!blockNet);
blockNet = oaScalarNet::create(topBlock, scNetName, getOASigType(net->getType()));
assert(blockNet);
if (net->isExternal()) {
oaPin* pin = getOAPinFromNet(net,blockNet);
@ -459,8 +476,11 @@ namespace {
_cell2OADesign4Netlist[cell] = designCellView;
// 3) create oaBlock singleton where we will do all the work
cerr << "oaBlock::create for netlist view" << endl;
oaBlock* topBlock = oaBlock::create(designCellView);
oaBlock* topBlock = designCellView->getTopBlock();
if(!topBlock){
cerr << "oaBlock::create for netlist view" << endl;
topBlock = oaBlock::create(designCellView);
}
assert(topBlock);
// 4) convert each OA object
@ -507,9 +527,13 @@ namespace {
oaDesign* designCellView = oaDesign::open(scNameLib, scNameDesign, scNameView, vType, 'a');
_cell2OADesign4Symbolic[cell] = designCellView;
// embed previous module
oaModule *topMod = oaModule::embed(designCellView, previous);
designCellView->setTopModule(topMod);
// get module or embed previous module
oaModule* topMod = NULL;
topMod = designCellView->getTopModule();
if(!topMod){
topMod = oaModule::embed(designCellView, previous);
designCellView->setTopModule(topMod);
}
oaBlock *topBlock = designCellView->getTopBlock();
assert(topBlock);
@ -517,7 +541,7 @@ namespace {
}
/**
Add schematic view to previous view ...
Add schematic view to previous view ...
*/
oaDesign* addSchematic(const Cell* cell,oaDesign* previous) {
cerr << "addSchematic" << cell << endl;
@ -527,7 +551,7 @@ namespace {
if (it != _cell2OADesign4Schematic.end()) {
return it->second;
}
oaNativeNS ns;
oaLib* lib = getOALibForLibrary(cell->getLibrary());
assert(lib);
@ -542,9 +566,13 @@ namespace {
oaDesign* designCellView = oaDesign::open(scNameLib, scNameDesign, scNameView, vType, 'a');
_cell2OADesign4Schematic[cell] = designCellView;
// embed previous module
oaModule *topMod = oaModule::embed(designCellView, previous);
designCellView->setTopModule(topMod);
// get module or embed previous module
oaModule* topMod = NULL;
topMod = designCellView->getTopModule();
if(!topMod){
topMod = oaModule::embed(designCellView, previous);
designCellView->setTopModule(topMod);
}
oaBlock *topBlock = designCellView->getTopBlock();
assert(topBlock);
@ -562,7 +590,7 @@ namespace {
if (it != _cell2OADesign4Layout.end()) {
return it->second;
}
oaNativeNS ns;
oaLib* lib = getOALibForLibrary(cell->getLibrary());
assert(lib);
@ -577,9 +605,13 @@ namespace {
oaDesign* designCellView = oaDesign::open(scNameLib, scNameDesign, scNameView, vType, 'a');
_cell2OADesign4Layout[cell] = designCellView;
// embed previous module
oaModule *topMod = oaModule::embed(designCellView, previous);
designCellView->setTopModule(topMod);
// get module or embed previous module
oaModule* topMod = NULL;
topMod = designCellView->getTopModule();
if(!topMod){
topMod = oaModule::embed(designCellView, previous);
designCellView->setTopModule(topMod);
}
oaBlock *topBlock = designCellView->getTopBlock();
assert(topBlock);
@ -588,14 +620,14 @@ namespace {
/**
Convert a Cell to OA designs ...
*/
*/
oaDesign* getOADesignForCell(const Cell* cell) {
cerr << "getOADesignForCell " << cell << endl;
assert(cell);
// 1) get technology
if(!_oaTech)
_oaTech = getOATechForTechnology(_technology);
_oaTech = getOATechForTechnology(_technology,cell->getLibrary());
// 2) create OA structure ...
oaDesign* netlistView = createOAasNetlist(cell);
@ -613,6 +645,7 @@ namespace {
#endif
}
namespace CRL {
void OpenAccessWrapper::oaDriver(const string& path, Cell* cell) {
#ifdef HAVE_OPENACCESS