Merge branch 'devel_anabatic' of ssh://bop/users/largo2/git/coriolis into devel_anabatic
This commit is contained in:
commit
16bd5270f7
9
Makefile
9
Makefile
|
@ -1,15 +1,16 @@
|
|||
|
||||
UNAME_S = $(shell uname -s)
|
||||
UNAME_R = $(shell uname -r)
|
||||
DEVTOOLSET_VERSION = 7
|
||||
|
||||
# We must use devtoolset-2 only under RHEL6 & clones.
|
||||
# We must use devtoolset only under RHEL6 & clones.
|
||||
DEVTOOLSET_OPTION =
|
||||
ifeq ($(UNAME_S),Linux)
|
||||
ifneq ($(findstring .el6.,$(UNAME_R)),)
|
||||
DEVTOOLSET_OPTION = --devtoolset-2
|
||||
ifneq ($(findstring .el7.,$(UNAME_R)),)
|
||||
DEVTOOLSET_OPTION = --devtoolset=$(DEVTOOLSET_VERSION)
|
||||
endif
|
||||
ifneq ($(findstring .slsoc6.,$(UNAME_R)),)
|
||||
DEVTOOLSET_OPTION = --devtoolset-2
|
||||
DEVTOOLSET_OPTION = --devtoolset=$(DEVTOOLSET_VERSION)
|
||||
endif
|
||||
endif
|
||||
|
||||
|
|
|
@ -20,6 +20,7 @@
|
|||
|
||||
find_package(PythonLibs 2 REQUIRED)
|
||||
find_package(PythonSitePackages REQUIRED)
|
||||
find_package(FLUTE REQUIRED)
|
||||
find_package(VLSISAPD REQUIRED)
|
||||
find_package(HURRICANE REQUIRED)
|
||||
find_package(CORIOLIS REQUIRED)
|
||||
|
|
|
@ -504,6 +504,24 @@ namespace Anabatic {
|
|||
}
|
||||
|
||||
|
||||
void AnabaticEngine::exclude ( const Name& netName )
|
||||
{
|
||||
Net* net = _cell->getNet( netName );
|
||||
if (not net) return;
|
||||
|
||||
exclude( net );
|
||||
}
|
||||
|
||||
|
||||
void AnabaticEngine::exclude ( Net* net )
|
||||
{
|
||||
NetDatas::iterator inet =_netDatas.find( net->getId() );
|
||||
if (inet == _netDatas.end()) return;
|
||||
|
||||
(*inet).second->setExcluded( true );
|
||||
}
|
||||
|
||||
|
||||
void AnabaticEngine::updateMatrix()
|
||||
{
|
||||
_matrix.setCell( getCell(), Session::getSliceHeight() );
|
||||
|
@ -1028,7 +1046,7 @@ namespace Anabatic {
|
|||
|
||||
void AnabaticEngine::updateNetTopology ( Net* net )
|
||||
{
|
||||
DebugSession::open( net, 140, 150 );
|
||||
DebugSession::open( net, 145, 150 );
|
||||
|
||||
cdebug_log(149,0) << "Anabatic::updateNetTopology( " << net << " )" << endl;
|
||||
cdebug_tabw(145,1);
|
||||
|
@ -1069,7 +1087,7 @@ namespace Anabatic {
|
|||
|
||||
void AnabaticEngine::_alignate ( Net* net )
|
||||
{
|
||||
DebugSession::open( net, 140, 150 );
|
||||
DebugSession::open( net, 145, 150 );
|
||||
|
||||
cdebug_log(149,0) << "Anabatic::_alignate( " << net << " )" << endl;
|
||||
cdebug_tabw(145,1);
|
||||
|
@ -1127,7 +1145,7 @@ namespace Anabatic {
|
|||
|
||||
void AnabaticEngine::_computeNetTerminals ( Net* net )
|
||||
{
|
||||
DebugSession::open( net, 140, 150 );
|
||||
DebugSession::open( net, 145, 150 );
|
||||
|
||||
cdebug_log(149,0) << "Anabatic::_computeNetTerminals( " << net << " )" << endl;
|
||||
cdebug_tabw(145,1);
|
||||
|
@ -1146,7 +1164,7 @@ namespace Anabatic {
|
|||
|
||||
void AnabaticEngine::_saveNet ( Net* net )
|
||||
{
|
||||
DebugSession::open( net, 140, 150 );
|
||||
DebugSession::open( net, 145, 150 );
|
||||
|
||||
cdebug_log(145,0) << "Anabatic::_saveNet() " << net << endl;
|
||||
cdebug_tabw(145,1);
|
||||
|
|
|
@ -110,7 +110,7 @@ namespace Anabatic {
|
|||
|
||||
void AutoContact::_preDestroy ()
|
||||
{
|
||||
DebugSession::open( _contact->getNet(), 140, 150 );
|
||||
DebugSession::open( _contact->getNet(), 145, 150 );
|
||||
|
||||
cdebug_log(145,0) << "AutoContact::_preDestroy() - <AutoContact id:" << _id << ">" << endl;
|
||||
|
||||
|
@ -552,6 +552,20 @@ namespace Anabatic {
|
|||
}
|
||||
|
||||
|
||||
void AutoContact::setLayerAndWidth ( size_t delta, size_t depth )
|
||||
{
|
||||
if (delta == 0) {
|
||||
setLayer( Session::getRoutingLayer(depth) );
|
||||
setSizes( Session::getWireWidth (depth)
|
||||
, Session::getWireWidth (depth) );
|
||||
} else {
|
||||
setLayer( Session::getContactLayer(depth) );
|
||||
setSizes( Session::getViaWidth (depth)
|
||||
, Session::getViaWidth (depth) );
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
AutoContact* AutoContact::createFrom ( Contact* hurricaneContact )
|
||||
{
|
||||
AutoContact* autoContact = NULL;
|
||||
|
|
|
@ -200,7 +200,7 @@ namespace Anabatic {
|
|||
|
||||
void AutoContactHTee::updateCache ()
|
||||
{
|
||||
DebugSession::open( getNet(), 140, 150 );
|
||||
DebugSession::open( getNet(), 145, 150 );
|
||||
|
||||
cdebug_log(145,1) << _getTypeName() << "::updateCache() " << this << endl;
|
||||
|
||||
|
@ -249,7 +249,7 @@ namespace Anabatic {
|
|||
|
||||
void AutoContactHTee::updateGeometry ()
|
||||
{
|
||||
DebugSession::open( getNet(), 140, 150 );
|
||||
DebugSession::open( getNet(), 145, 150 );
|
||||
|
||||
cdebug_log(145,1) << _getTypeName() << "::updateGeometry() " << this << endl;
|
||||
|
||||
|
@ -277,7 +277,7 @@ namespace Anabatic {
|
|||
|
||||
void AutoContactHTee::updateTopology ()
|
||||
{
|
||||
DebugSession::open( getNet(), 140, 150 );
|
||||
DebugSession::open( getNet(), 145, 150 );
|
||||
|
||||
cdebug_log(145,1) << _getTypeName() << "::updateTopology() " << this << endl;
|
||||
|
||||
|
@ -309,10 +309,10 @@ namespace Anabatic {
|
|||
if (depthH1 == depthH2) {
|
||||
// Dogleg on the vertical.
|
||||
switch ( delta ) {
|
||||
case 0: setLayer( rg->getRoutingLayer(minDepth) ); break;
|
||||
case 1: setLayer( rg->getContactLayer(minDepth) ); break;
|
||||
case 0:
|
||||
case 1: setLayerAndWidth( delta, minDepth ); break;
|
||||
default:
|
||||
setLayer( rg->getContactLayer( depthH1 + ((depthH1==minDepth)?0:-1) ) );
|
||||
setLayerAndWidth( delta, depthH1 + ((depthH1==minDepth)?0:-1) );
|
||||
_vertical1 = static_cast<AutoVertical*>( _vertical1->makeDogleg(this) );
|
||||
break;
|
||||
}
|
||||
|
@ -322,12 +322,12 @@ namespace Anabatic {
|
|||
int deltaH2 = (int)depthH2 - (int)depthV1;
|
||||
|
||||
if (std::abs(deltaH1) > std::abs(deltaH2)) {
|
||||
setLayer( rg->getContactLayer( depthH2 + ((depthH2<depthV1)?0:-1) ) );
|
||||
setLayerAndWidth( 2, depthH2 + ((depthH2<depthV1)?0:-1) );
|
||||
//_horizontal1 = static_cast<AutoHorizontal*>( _horizontal1->makeDogleg(this) );
|
||||
_horizontal1->makeDogleg(this);
|
||||
cdebug_log(145,0) << "New h1:" << _horizontal1 << endl;
|
||||
} else {
|
||||
setLayer( rg->getContactLayer( depthH1 + ((depthH1<depthV1)?0:-1) ) );
|
||||
setLayerAndWidth( 2, depthH1 + ((depthH1<depthV1)?0:-1) );
|
||||
//_horizontal2 = static_cast<AutoHorizontal*>( _horizontal2->makeDogleg(this) );
|
||||
_horizontal2->makeDogleg(this);
|
||||
cdebug_log(145,0) << "New h2:" << _horizontal2 << endl;
|
||||
|
|
|
@ -347,7 +347,7 @@ namespace Anabatic {
|
|||
|
||||
void AutoContactTerminal::cacheAttach ( AutoSegment* segment )
|
||||
{
|
||||
DebugSession::open( getNet(), 140, 150 );
|
||||
DebugSession::open( getNet(), 145, 150 );
|
||||
|
||||
cdebug_log(145,1) << _getTypeName() << "::cacheAttach() " << this << endl;
|
||||
|
||||
|
@ -379,7 +379,7 @@ namespace Anabatic {
|
|||
|
||||
void AutoContactTerminal::updateCache ()
|
||||
{
|
||||
DebugSession::open( getNet(), 140, 150 );
|
||||
DebugSession::open( getNet(), 145, 150 );
|
||||
|
||||
cdebug_log(145,1) << _getTypeName() << "::updateCache() " << this << endl;
|
||||
|
||||
|
@ -438,7 +438,7 @@ namespace Anabatic {
|
|||
|
||||
void AutoContactTerminal::updateGeometry ()
|
||||
{
|
||||
DebugSession::open( getNet(), 140, 150 );
|
||||
DebugSession::open( getNet(), 145, 150 );
|
||||
|
||||
cdebug_log(145,1) << _getTypeName() << "::updateGeometry() " << this << endl;
|
||||
|
||||
|
@ -522,7 +522,7 @@ namespace Anabatic {
|
|||
|
||||
void AutoContactTerminal::updateTopology ()
|
||||
{
|
||||
DebugSession::open( getNet(), 140, 150 );
|
||||
DebugSession::open( getNet(), 145, 150 );
|
||||
|
||||
cdebug_log(145,1) << _getTypeName() << "::updateTopology() " << this << endl;
|
||||
|
||||
|
@ -550,8 +550,8 @@ namespace Anabatic {
|
|||
cdebug_log(145,0) << "Update seg: " << _segment << endl;
|
||||
delta = abssub( anchorDepth, rg->getLayerDepth( _segment->getLayer() ) );
|
||||
}
|
||||
else if (delta == 0) setLayer( rg->getRoutingLayer(anchorDepth) );
|
||||
else if (delta == 1) setLayer( rg->getContactLayer(std::min(anchorDepth,segmentDepth)) );
|
||||
else if (delta == 0) setLayerAndWidth( delta, anchorDepth );
|
||||
else if (delta == 1) setLayerAndWidth( delta, std::min(anchorDepth,segmentDepth) );
|
||||
}
|
||||
_segment->invalidate( this );
|
||||
|
||||
|
|
|
@ -154,7 +154,7 @@ namespace Anabatic {
|
|||
|
||||
void AutoContactTurn::updateCache ()
|
||||
{
|
||||
DebugSession::open( getNet(), 140, 150 );
|
||||
DebugSession::open( getNet(), 145, 150 );
|
||||
|
||||
cdebug_log(145,1) << _getTypeName() << "::updateCache() " << this << endl;
|
||||
|
||||
|
@ -195,7 +195,7 @@ namespace Anabatic {
|
|||
|
||||
void AutoContactTurn::updateGeometry ()
|
||||
{
|
||||
DebugSession::open( getNet(), 140, 150 );
|
||||
DebugSession::open( getNet(), 145, 150 );
|
||||
|
||||
cdebug_log(145,1) << _getTypeName() << "::updateGeometry() " << this << endl;
|
||||
|
||||
|
@ -223,7 +223,7 @@ namespace Anabatic {
|
|||
|
||||
void AutoContactTurn::updateTopology ()
|
||||
{
|
||||
DebugSession::open ( getNet(), 140, 150 );
|
||||
DebugSession::open ( getNet(), 145, 150 );
|
||||
|
||||
cdebug_log(145,1) << _getTypeName() << "::updateTopology() " << this << endl;
|
||||
|
||||
|
@ -263,7 +263,7 @@ namespace Anabatic {
|
|||
delta = abssub ( depthH1, depthV1 );
|
||||
}
|
||||
|
||||
setLayer ( (delta == 0) ? rg->getRoutingLayer(depthContact) : rg->getContactLayer(depthContact) );
|
||||
setLayerAndWidth( delta, depthContact );
|
||||
}
|
||||
|
||||
_horizontal1->invalidate( this );
|
||||
|
|
|
@ -169,7 +169,7 @@ namespace Anabatic {
|
|||
|
||||
void AutoContactVTee::updateCache ()
|
||||
{
|
||||
DebugSession::open( getNet(), 140, 150 );
|
||||
DebugSession::open( getNet(), 145, 150 );
|
||||
|
||||
cdebug_log(145,1) << "AutoContactVTee::updateCache() " << this << endl;
|
||||
|
||||
|
@ -215,7 +215,7 @@ namespace Anabatic {
|
|||
|
||||
void AutoContactVTee::updateGeometry ()
|
||||
{
|
||||
DebugSession::open( getNet(), 140, 150 );
|
||||
DebugSession::open( getNet(), 145, 150 );
|
||||
|
||||
cdebug_log(145,1) << "AutoContactVTee::updateGeometry() " << this << endl;
|
||||
|
||||
|
@ -243,7 +243,7 @@ namespace Anabatic {
|
|||
|
||||
void AutoContactVTee::updateTopology ()
|
||||
{
|
||||
DebugSession::open ( getNet(), 140, 150 );
|
||||
DebugSession::open ( getNet(), 145, 150 );
|
||||
|
||||
cdebug_log(145,1) << "AutoContactVTee::updateTopology() " << this << endl;
|
||||
|
||||
|
@ -278,11 +278,11 @@ namespace Anabatic {
|
|||
cdebug_log(145,0) << "depthV1 == depthV2 (" << depthV1 << ")" << endl;
|
||||
// Dogleg on the horizontal.
|
||||
switch ( delta ) {
|
||||
case 0: setLayer( rg->getRoutingLayer(minDepth) ); break;
|
||||
case 1: setLayer( rg->getContactLayer(minDepth) ); break;
|
||||
case 0:
|
||||
case 1: setLayerAndWidth( delta, minDepth ); break;
|
||||
default:
|
||||
cdebug_log(145,0) << "Restore connectivity: dogleg on h1." << endl;
|
||||
setLayer( rg->getContactLayer( depthV1 + ((depthV1==minDepth)?0:-1) ) );
|
||||
setLayerAndWidth( delta, depthV1 + ((depthV1==minDepth)?0:-1) );
|
||||
_horizontal1 = static_cast<AutoHorizontal*>( _horizontal1->makeDogleg(this) );
|
||||
break;
|
||||
}
|
||||
|
@ -292,11 +292,11 @@ namespace Anabatic {
|
|||
int deltaV2 = (int)depthV2 - (int)depthH1;
|
||||
|
||||
if (std::abs(deltaV1) > std::abs(deltaV2)) {
|
||||
setLayer( rg->getContactLayer( depthV2 + ((depthV2<depthH1)?0:-1) ) );
|
||||
setLayerAndWidth( 2, depthV2 + ((depthV2<depthH1)?0:-1) );
|
||||
//_vertical1 = static_cast<AutoVertical*>( _vertical1->makeDogleg(this) );
|
||||
_vertical1->makeDogleg(this);
|
||||
} else {
|
||||
setLayer( rg->getContactLayer( depthV1 + ((depthV1<depthH1)?0:-1) ) );
|
||||
setLayerAndWidth( 2, depthV1 + ((depthV1<depthH1)?0:-1) );
|
||||
//_vertical2 = static_cast<AutoVertical*>( _vertical2->makeDogleg(this) );
|
||||
_vertical2->makeDogleg(this);
|
||||
}
|
||||
|
|
|
@ -762,7 +762,7 @@ namespace Anabatic {
|
|||
|
||||
Flags AutoHorizontal::_makeDogleg ( GCell* doglegGCell, Flags flags )
|
||||
{
|
||||
DebugSession::open( getNet(), 140, 150 );
|
||||
DebugSession::open( getNet(), 145, 150 );
|
||||
cdebug_log(149,0) << "AutoHorizontal::_makeDogleg(GCell*) in " << doglegGCell << endl;
|
||||
cdebug_tabw(149,1);
|
||||
|
||||
|
@ -804,8 +804,9 @@ namespace Anabatic {
|
|||
upLayer = (depth+1 <= Session::getConfiguration()->getAllowedDepth());
|
||||
}
|
||||
|
||||
size_t doglegDepth = depth + ((upLayer)?1:-1);
|
||||
Layer* contactLayer = Session::getRoutingGauge()->getContactLayer( depth + ((upLayer)?0:-1) );
|
||||
const Layer* doglegLayer = Session::getRoutingGauge()->getRoutingLayer( depth + ((upLayer)?1:-1) );
|
||||
const Layer* doglegLayer = Session::getRoutingGauge()->getRoutingLayer( doglegDepth );
|
||||
|
||||
Session::dogleg( this );
|
||||
targetDetach();
|
||||
|
@ -814,7 +815,7 @@ namespace Anabatic {
|
|||
AutoContact* dlContact1 = AutoContactTurn::create( doglegGCell, _horizontal->getNet(), contactLayer );
|
||||
AutoContact* dlContact2 = AutoContactTurn::create( doglegGCell, _horizontal->getNet(), contactLayer );
|
||||
AutoSegment* segment1 = AutoSegment::create( dlContact1 , dlContact2, Flags::Vertical );
|
||||
segment1->setLayer( doglegLayer );
|
||||
segment1->setLayer( doglegDepth );
|
||||
segment1->_setAxis( doglegAxis );
|
||||
segment1->setFlags( SegDogleg|SegSlackened|SegCanonical|SegNotAligned );
|
||||
|
||||
|
@ -825,7 +826,7 @@ namespace Anabatic {
|
|||
targetAttach( dlContact1 );
|
||||
AutoSegment* segment2 = AutoSegment::create( dlContact2 , autoTarget, Flags::Horizontal );
|
||||
autoTarget->cacheAttach( segment2 );
|
||||
segment2->setLayer( getLayer() );
|
||||
segment2->setLayer( depth );
|
||||
segment2->_setAxis( getY() );
|
||||
segment2->setFlags( (isSlackened()?SegSlackened:0) );
|
||||
Session::dogleg( segment2 );
|
||||
|
|
|
@ -1632,7 +1632,7 @@ namespace Anabatic {
|
|||
|
||||
const Layer* newLayer = Session::getRoutingGauge()->getRoutingLayer(depth);
|
||||
if (getLayer() != newLayer) {
|
||||
setLayer( newLayer );
|
||||
setLayer( depth );
|
||||
getAutoSource()->invalidate( Flags::Topology|Flags::NoCheckLayer );
|
||||
getAutoTarget()->invalidate( Flags::Topology|Flags::NoCheckLayer );
|
||||
}
|
||||
|
@ -2110,18 +2110,18 @@ namespace Anabatic {
|
|||
if (getLayer()->above(from->getLayer())) {
|
||||
cdebug_log(149,0) << "Go Down from depth " << segmentDepth << endl;
|
||||
|
||||
doglegs[ index + 1 ]->setLayer( rg->getRoutingLayer(segmentDepth-1) );
|
||||
doglegs[ index + 1 ]->setLayer( segmentDepth-1 );
|
||||
cdebug_log(149,0) << "doglegs[i+1]: " << doglegs[index+1] << endl;
|
||||
|
||||
if (isSource) {
|
||||
doglegs[ index + 0 ]->setLayer( rg->getRoutingLayer(segmentDepth-2) );
|
||||
doglegs[ index + 0 ]->setLayer( segmentDepth-2 );
|
||||
doglegs[ index + 1 ]->getAutoSource()->setLayer( rg->getContactLayer(segmentDepth-2) );
|
||||
doglegs[ index + 1 ]->getAutoTarget()->setLayer( rg->getContactLayer(segmentDepth-1) );
|
||||
cdebug_log(149,0) << "doglegs[i+0]: " << doglegs[index+0] << endl;
|
||||
cdebug_log(149,0) << "doglegs[i+1]: " << doglegs[index+1]->getAutoSource() << endl;
|
||||
cdebug_log(149,0) << "doglegs[i+1]: " << doglegs[index+1]->getAutoTarget() << endl;
|
||||
} else {
|
||||
doglegs[ index + 2 ]->setLayer( rg->getRoutingLayer(segmentDepth-2) );
|
||||
doglegs[ index + 2 ]->setLayer( segmentDepth-2 );
|
||||
doglegs[ index + 1 ]->getAutoTarget()->setLayer( rg->getContactLayer(segmentDepth-2) );
|
||||
doglegs[ index + 1 ]->getAutoSource()->setLayer( rg->getContactLayer(segmentDepth-1) );
|
||||
cdebug_log(149,0) << "doglegs[i+2]: " << doglegs[index+2] << endl;
|
||||
|
@ -2131,18 +2131,18 @@ namespace Anabatic {
|
|||
} else {
|
||||
cdebug_log(149,0) << "Go Up from depth " << segmentDepth << endl;
|
||||
|
||||
doglegs[ index + 1 ]->setLayer( rg->getRoutingLayer(segmentDepth+1) );
|
||||
doglegs[ index + 1 ]->setLayer( segmentDepth+1 );
|
||||
cdebug_log(149,0) << "doglegs[i+1]: " << doglegs[index+1] << endl;
|
||||
|
||||
if (isSource) {
|
||||
doglegs[ index + 0 ]->setLayer( rg->getRoutingLayer(segmentDepth+2) );
|
||||
doglegs[ index + 0 ]->setLayer( segmentDepth+2 );
|
||||
doglegs[ index + 1 ]->getAutoSource()->setLayer( rg->getContactLayer(segmentDepth+1) );
|
||||
doglegs[ index + 1 ]->getAutoTarget()->setLayer( rg->getContactLayer(segmentDepth ) );
|
||||
cdebug_log(149,0) << "doglegs[i+0]: " << doglegs[index+0] << endl;
|
||||
cdebug_log(149,0) << "doglegs[i+1]: " << doglegs[index+1]->getAutoSource() << endl;
|
||||
cdebug_log(149,0) << "doglegs[i+1]: " << doglegs[index+1]->getAutoTarget() << endl;
|
||||
} else {
|
||||
doglegs[ index + 2 ]->setLayer( rg->getRoutingLayer(segmentDepth+2) );
|
||||
doglegs[ index + 2 ]->setLayer( segmentDepth+2 );
|
||||
doglegs[ index + 1 ]->getAutoTarget()->setLayer( rg->getContactLayer(segmentDepth+1) );
|
||||
doglegs[ index + 1 ]->getAutoSource()->setLayer( rg->getContactLayer(segmentDepth ) );
|
||||
cdebug_log(149,0) << "doglegs[i+2]: " << doglegs[index+2] << endl;
|
||||
|
|
|
@ -712,8 +712,9 @@ namespace Anabatic {
|
|||
upLayer = (depth+1 <= Session::getConfiguration()->getAllowedDepth());
|
||||
}
|
||||
|
||||
size_t doglegDepth = depth + ((upLayer)?1:-1);
|
||||
Layer* contactLayer = Session::getRoutingGauge()->getContactLayer ( depth + ((upLayer)?0:-1) );
|
||||
const Layer* doglegLayer = Session::getRoutingGauge()->getRoutingLayer ( depth + ((upLayer)?1:-1) );
|
||||
const Layer* doglegLayer = Session::getRoutingGauge()->getRoutingLayer ( doglegDepth );
|
||||
|
||||
Session::dogleg( this );
|
||||
targetDetach();
|
||||
|
@ -725,7 +726,7 @@ namespace Anabatic {
|
|||
cdebug_log(149,0) << dlContact2 << endl;
|
||||
AutoSegment* segment1 = AutoSegment::create( dlContact1 , dlContact2, Flags::Horizontal );
|
||||
cdebug_log(149,0) << segment1 << endl;
|
||||
segment1->setLayer( doglegLayer );
|
||||
segment1->setLayer( doglegDepth );
|
||||
segment1->_setAxis( doglegAxis );
|
||||
segment1->setFlags( SegDogleg|SegSlackened|SegCanonical|SegNotAligned );
|
||||
cdebug_log(149,0) << "New " << dlContact1->base() << "." << endl;
|
||||
|
@ -735,7 +736,7 @@ namespace Anabatic {
|
|||
targetAttach( dlContact1 );
|
||||
AutoSegment* segment2 = AutoVertical::create ( dlContact2, autoTarget, Flags::Vertical );
|
||||
autoTarget->cacheAttach( segment2 );
|
||||
segment2->setLayer( getLayer() );
|
||||
segment2->setLayer( depth );
|
||||
segment2->_setAxis( getX() );
|
||||
segment2->setFlags( (isSlackened()?SegSlackened:0) );
|
||||
Session::dogleg( segment2 );
|
||||
|
|
|
@ -8,6 +8,7 @@ endif ( CHECK_DETERMINISM )
|
|||
${CORIOLIS_INCLUDE_DIR}
|
||||
${HURRICANE_INCLUDE_DIR}
|
||||
${CONFIGURATION_INCLUDE_DIR}
|
||||
${FLUTE_INCLUDE_DIR}
|
||||
${Boost_INCLUDE_DIRS}
|
||||
${QtX_INCLUDE_DIR}
|
||||
${PYTHON_INCLUDE_PATH}
|
||||
|
@ -76,6 +77,7 @@ endif ( CHECK_DETERMINISM )
|
|||
${CONFIGURATION_LIBRARY}
|
||||
${CIF_LIBRARY}
|
||||
${AGDS_LIBRARY}
|
||||
${FLUTE_LIBRARIES}
|
||||
${LEFDEF_LIBRARIES}
|
||||
${OA_LIBRARIES}
|
||||
${QtX_LIBRARIES}
|
||||
|
|
|
@ -92,11 +92,14 @@ namespace Anabatic {
|
|||
GCell::setDisplayMode( Cfg::getParamEnumerate("anabatic.gcell.displayMode", GCell::Boundary)->asInt() );
|
||||
|
||||
if (cg == NULL) cg = AllianceFramework::get()->getCellGauge();
|
||||
if (cg == NULL)
|
||||
throw Error( "AnabaticEngine::Configuration(): Unable to find default cell gauge." );
|
||||
|
||||
if (rg == NULL) {
|
||||
string gaugeName = Cfg::getParamString("anabatic.routingGauge","sxlib")->asString();
|
||||
rg = AllianceFramework::get()->getRoutingGauge( gaugeName );
|
||||
if (rg == NULL)
|
||||
throw Error( "Anabatic::Configuration(): No routing gauge named \"%s\"", gaugeName.c_str() );
|
||||
throw Error( "AnabaticEngine::Configuration(): No routing gauge named \"%s\"", gaugeName.c_str() );
|
||||
}
|
||||
_cg = cg->getClone();
|
||||
_rg = rg->getClone();
|
||||
|
@ -425,6 +428,12 @@ namespace Anabatic {
|
|||
return true;
|
||||
}
|
||||
|
||||
#define BETTER_FOR_TSMC 0
|
||||
#if BETTER_FOR_TSMC
|
||||
rp->setOnBestComponent( RoutingPad::BiggestArea );
|
||||
cdebug_tabw(112,-1);
|
||||
return true;
|
||||
#else
|
||||
Box ab = rp->getCell()->getAbutmentBox();
|
||||
const Layer* metal1 = getLayerGauge( 0 )->getLayer();
|
||||
RoutingLayerGauge* gauge = getLayerGauge( 1 );
|
||||
|
@ -506,6 +515,7 @@ namespace Anabatic {
|
|||
|
||||
cdebug_tabw(112,-1);
|
||||
return false;
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -54,6 +54,8 @@ namespace Anabatic {
|
|||
const BaseFlags Flags::DestroyBaseSegment = (1L << 9);
|
||||
// Flags for NetDatas objects states only.
|
||||
const BaseFlags Flags::GlobalRouted = (1L << 5);
|
||||
const BaseFlags Flags::GlobalEstimated = (1L << 6);
|
||||
const BaseFlags Flags::ExcludeRoute = (1L << 7);
|
||||
// Masks.
|
||||
const BaseFlags Flags::WestSide = Horizontal|Target;
|
||||
const BaseFlags Flags::EastSide = Horizontal|Source;
|
||||
|
@ -113,6 +115,7 @@ namespace Anabatic {
|
|||
const BaseFlags Flags::CheckLowDensity = (1L << 30);
|
||||
const BaseFlags Flags::CheckLowUpDensity = (1L << 31);
|
||||
const BaseFlags Flags::NoUpdate = (1L << 32);
|
||||
const BaseFlags Flags::NorthPath = (1L << 33);
|
||||
|
||||
|
||||
Flags::~Flags ()
|
||||
|
|
|
@ -1334,6 +1334,31 @@ namespace Anabatic {
|
|||
}
|
||||
|
||||
|
||||
// -------------------------------------------------------------------
|
||||
// Class : "Anabatic::PrioriryQueue::CompareByDistance".
|
||||
|
||||
|
||||
PriorityQueue* PriorityQueue::CompareByDistance::_pqueue = NULL;
|
||||
|
||||
|
||||
bool PriorityQueue::CompareByDistance::operator() ( const Vertex* lhs, const Vertex* rhs )
|
||||
{
|
||||
if (lhs->getDistance() == rhs->getDistance()) {
|
||||
if (_pqueue and _pqueue->hasAttractor()) {
|
||||
DbU::Unit lhsDistance = _pqueue->getAttractor().manhattanDistance( lhs->getCenter() );
|
||||
DbU::Unit rhsDistance = _pqueue->getAttractor().manhattanDistance( rhs->getCenter() );
|
||||
|
||||
cdebug_log(112,0) << "CompareByDistance: lhs:" << DbU::getValueString(lhsDistance)
|
||||
<< " rhs:" << DbU::getValueString(rhsDistance) << endl;
|
||||
|
||||
if (lhsDistance != rhsDistance) return lhsDistance < rhsDistance;
|
||||
}
|
||||
return lhs->getBranchId() > rhs->getBranchId();
|
||||
}
|
||||
return lhs->getDistance() < rhs->getDistance();
|
||||
}
|
||||
|
||||
|
||||
// -------------------------------------------------------------------
|
||||
// Class : "Anabatic::Dijkstra".
|
||||
|
||||
|
@ -1754,6 +1779,7 @@ namespace Anabatic {
|
|||
//_checkEdges();
|
||||
_sources.clear();
|
||||
_targets.clear();
|
||||
_queue.clear();
|
||||
_searchArea.makeEmpty();
|
||||
_connectedsId = 0;
|
||||
}
|
||||
|
@ -2184,6 +2210,7 @@ namespace Anabatic {
|
|||
}
|
||||
|
||||
_queue.clear();
|
||||
_queue.setAttractor( _searchArea.getCenter() );
|
||||
_connectedsId = (*_sources.begin())->getConnexId();
|
||||
for ( Vertex* source : _sources ) {
|
||||
_queue.push( source );
|
||||
|
|
|
@ -197,7 +197,7 @@ namespace Anabatic {
|
|||
DbU::Unit dy = targetCenter.getY() - sourceCenter.getY();
|
||||
|
||||
if (dx < 0) dx = -dx;
|
||||
if (dx) dx += DbU::fromLambda( 0.1 );
|
||||
//if (dx) dx += DbU::fromLambda( 0.1 );
|
||||
|
||||
return dx + ((dy > 0) ? dy : -dy);
|
||||
}
|
||||
|
|
|
@ -20,6 +20,7 @@
|
|||
|
||||
namespace Anabatic {
|
||||
|
||||
using std::cerr;
|
||||
using std::endl;
|
||||
|
||||
|
||||
|
@ -141,4 +142,144 @@ namespace Anabatic {
|
|||
}
|
||||
|
||||
|
||||
// -------------------------------------------------------------------
|
||||
// Class : "Anabatic::Path_Edges".
|
||||
|
||||
Path_Edges::Locator::Locator ( const GCell* source, const GCell* target, Flags pathFlags )
|
||||
: EdgesHL()
|
||||
, _source (source)
|
||||
, _target (target)
|
||||
, _stateFlags(Flags::NoFlags)
|
||||
, _uprobe (0)
|
||||
, _edge (NULL)
|
||||
{
|
||||
if (_source == _target) return;
|
||||
|
||||
Interval hoverlap = _source->getHSide().getIntersection( _target->getHSide() );
|
||||
Interval voverlap = _source->getVSide().getIntersection( _target->getVSide() );
|
||||
|
||||
if (not voverlap.isEmpty()) {
|
||||
if (_source->getXMin() > _target->getXMin()) std::swap( _source, _target );
|
||||
_stateFlags |= Flags::EastSide;
|
||||
_uprobe = voverlap.getCenter();
|
||||
} else if (not hoverlap.isEmpty()) {
|
||||
if (_source->getYMin() > _target->getYMin()) std::swap( _source, _target );
|
||||
_stateFlags |= Flags::NorthSide;
|
||||
_uprobe = hoverlap.getCenter();
|
||||
} else {
|
||||
if (_source->getXMin() > _target->getXMin()) {
|
||||
std::swap( _source, _target );
|
||||
}
|
||||
|
||||
if (_source->getYMin() < _target->getYMin()) {
|
||||
if (pathFlags & Flags::NorthPath) {
|
||||
_stateFlags |= Flags::NorthSide;
|
||||
_uprobe = _source->getXCenter();
|
||||
} else {
|
||||
_stateFlags |= Flags::EastSide;
|
||||
_uprobe = _source->getYCenter();
|
||||
}
|
||||
} else {
|
||||
if (pathFlags & Flags::NorthPath) {
|
||||
_stateFlags |= Flags::EastSide;
|
||||
_uprobe = _source->getYCenter();
|
||||
} else {
|
||||
_stateFlags |= Flags::SouthSide;
|
||||
_uprobe = _source->getXCenter();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
_edge = _source->getEdgeAt( _stateFlags, _uprobe );
|
||||
}
|
||||
|
||||
|
||||
EdgesHL* Path_Edges::Locator::getClone () const
|
||||
{ return new Locator (*this); }
|
||||
|
||||
|
||||
Edge* Path_Edges::Locator::getElement () const
|
||||
{ return _edge; }
|
||||
|
||||
|
||||
bool Path_Edges::Locator::isValid () const
|
||||
{ return (_edge != NULL); }
|
||||
|
||||
|
||||
void Path_Edges::Locator::progress ()
|
||||
{
|
||||
if (not _edge) return;
|
||||
|
||||
GCell* neighbor = NULL;
|
||||
if (_stateFlags.contains(Flags::SouthSide) or _stateFlags.contains(Flags::WestSide)) neighbor = _edge->getSource();
|
||||
if (_stateFlags.contains(Flags::NorthSide) or _stateFlags.contains(Flags::EastSide)) neighbor = _edge->getTarget();
|
||||
|
||||
if (neighbor == _target) { _edge = NULL; return; }
|
||||
|
||||
if (_stateFlags.contains(Flags::EastSide)) {
|
||||
Interval overlap = neighbor->getHSide().getIntersection( _target->getHSide() );
|
||||
|
||||
if (not overlap.isEmpty()) {
|
||||
overlap = neighbor->getVSide().getIntersection( _target->getVSide() );
|
||||
if (not overlap.isEmpty()) { _edge = NULL; return; }
|
||||
|
||||
_stateFlags.reset( Flags::EastSide );
|
||||
_stateFlags |= (_target->getYMin() < _source->getYMin()) ? Flags::SouthSide
|
||||
: Flags::NorthSide;
|
||||
_uprobe = overlap.getCenter();
|
||||
}
|
||||
} else if (_stateFlags.contains(Flags::SouthSide)) {
|
||||
Interval overlap = neighbor->getVSide().getIntersection( _target->getVSide() );
|
||||
|
||||
if (not overlap.isEmpty()) {
|
||||
overlap = neighbor->getHSide().getIntersection( _target->getHSide() );
|
||||
if (not overlap.isEmpty()) {
|
||||
_edge = NULL; return; }
|
||||
|
||||
_stateFlags.reset( Flags::SouthSide );
|
||||
_stateFlags |= Flags::EastSide;
|
||||
_uprobe = overlap.getCenter();
|
||||
}
|
||||
} else if (_stateFlags.contains(Flags::NorthSide)) {
|
||||
Interval overlap = neighbor->getVSide().getIntersection( _target->getVSide() );
|
||||
|
||||
if (not overlap.isEmpty()) {
|
||||
overlap = neighbor->getHSide().getIntersection( _target->getHSide() );
|
||||
if (not overlap.isEmpty()) { _edge = NULL; return; }
|
||||
|
||||
_stateFlags.reset( Flags::NorthSide );
|
||||
_stateFlags |= Flags::EastSide;
|
||||
_uprobe = overlap.getCenter();
|
||||
}
|
||||
}
|
||||
|
||||
_edge = neighbor->getEdgeAt( _stateFlags, _uprobe );
|
||||
}
|
||||
|
||||
|
||||
string Path_Edges::Locator::_getString () const
|
||||
{
|
||||
string s = "<Path_Edges::Locator @" + getString(_edge) + ">";
|
||||
return s;
|
||||
}
|
||||
|
||||
|
||||
EdgesHC* Path_Edges::getClone () const
|
||||
{ return new Path_Edges( *this ); }
|
||||
|
||||
|
||||
EdgesHL* Path_Edges::getLocator () const
|
||||
{ return new Locator (_source,_target,_pathFlags); }
|
||||
|
||||
|
||||
string Path_Edges::_getString () const
|
||||
{
|
||||
string s = "<Path_Edges from:"
|
||||
+ getString(_source) + "to:"
|
||||
+ getString(_target)
|
||||
+ ">";
|
||||
return s;
|
||||
}
|
||||
|
||||
|
||||
} // Anabatic namespace.
|
||||
|
|
|
@ -273,6 +273,8 @@ namespace Anabatic {
|
|||
|
||||
Name GCell::_extensionName = "Anabatic::GCell";
|
||||
uint32_t GCell::_displayMode = GCell::Boundary;
|
||||
DbU::Unit GCell::_matrixHSide = 0;
|
||||
DbU::Unit GCell::_matrixVSide = 0;
|
||||
|
||||
|
||||
uint32_t GCell::getDisplayMode () { return _displayMode; }
|
||||
|
@ -304,6 +306,14 @@ namespace Anabatic {
|
|||
, _globalsCount (new float [_depth])
|
||||
, _key (this,1)
|
||||
{
|
||||
if (not _matrixHSide) {
|
||||
_matrixVSide = Session::getSliceHeight();
|
||||
_matrixHSide = Session::getSliceHeight();
|
||||
|
||||
if (_matrixHSide % Session::getSliceStep())
|
||||
_matrixHSide += Session::getSliceStep() - _matrixHSide % Session::getSliceStep();
|
||||
}
|
||||
|
||||
for ( size_t i=0 ; i<_depth ; i++ ) {
|
||||
_blockages [i] = 0;
|
||||
_densities [i] = 0.0;
|
||||
|
@ -774,15 +784,11 @@ namespace Anabatic {
|
|||
bool openSession = Session::isOpen();
|
||||
if (not openSession) getAnabatic()->openSession();
|
||||
|
||||
DbU::Unit vside = Session::getSliceHeight();
|
||||
DbU::Unit hside = Session::getSliceHeight();
|
||||
DbU::Unit vside = getMatrixVSide();
|
||||
DbU::Unit hside = getMatrixHSide();
|
||||
Interval hspan = getSide( Flags::Horizontal );
|
||||
Interval vspan = getSide( Flags::Vertical );
|
||||
|
||||
if (hside % Session::getSliceStep()) {
|
||||
hside += Session::getSliceStep() - hside % Session::getSliceStep();
|
||||
}
|
||||
|
||||
// if (hspan.getSize() < 2*hside) {
|
||||
// cerr << Error( "GCell::doGrid(): GCell is too narrow (dx:%s) to build a grid.\n"
|
||||
// " (%s)"
|
||||
|
|
|
@ -117,8 +117,14 @@ namespace Anabatic {
|
|||
}
|
||||
|
||||
global++;
|
||||
if ((*isegment)->getLayer() == Session::getRoutingLayer(1)) (*isegment)->setLayer( Session::getRoutingLayer(3) );
|
||||
if ((*isegment)->getLayer() == Session::getRoutingLayer(2)) (*isegment)->setLayer( Session::getRoutingLayer(4) );
|
||||
if ((*isegment)->getLayer() == Session::getRoutingLayer(1)) {
|
||||
(*isegment)->setLayer( Session::getRoutingLayer(3) );
|
||||
(*isegment)->setWidth( Session::getWireWidth (3) );
|
||||
}
|
||||
if ((*isegment)->getLayer() == Session::getRoutingLayer(2)) {
|
||||
(*isegment)->setLayer( Session::getRoutingLayer(4) );
|
||||
(*isegment)->setWidth( Session::getWireWidth (4) );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -142,7 +148,7 @@ namespace Anabatic {
|
|||
|
||||
void AnabaticEngine::_layerAssignByTrunk ( Net* net, set<Net*>& globalNets, unsigned long& total, unsigned long& global )
|
||||
{
|
||||
DebugSession::open( net, 140, 150 );
|
||||
DebugSession::open( net, 145, 150 );
|
||||
|
||||
cdebug_log(149,0) << "Anabatic::_layerAssignByTrunk ( " << net << " )" << endl;
|
||||
cdebug_tabw(145,1);
|
||||
|
@ -172,8 +178,14 @@ namespace Anabatic {
|
|||
netGlobal++;
|
||||
|
||||
cdebug_log(145,0) << "Migrate to M4/M5: " << autoSegment << endl;
|
||||
if (autoSegment->isHorizontal()) autoSegment->setLayer( Session::getRoutingLayer(3) );
|
||||
if (autoSegment->isVertical ()) autoSegment->setLayer( Session::getRoutingLayer(4) );
|
||||
if (autoSegment->isHorizontal()) {
|
||||
autoSegment->setLayer( Session::getRoutingLayer(3) );
|
||||
autoSegment->setWidth( Session::getWireWidth (3) );
|
||||
}
|
||||
if (autoSegment->isVertical()) {
|
||||
autoSegment->setLayer( Session::getRoutingLayer(4) );
|
||||
autoSegment->setWidth( Session::getWireWidth (4) );
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -316,7 +328,7 @@ namespace Anabatic {
|
|||
void AnabaticEngine::moveULeft ( AutoSegment* seed, set<Net*>& globalNets, GCell::Set& invalidateds )
|
||||
{
|
||||
Net* net = seed->getNet();
|
||||
DebugSession::open( net, 140, 150 );
|
||||
DebugSession::open( net, 145, 150 );
|
||||
|
||||
cdebug_log(9000,0) << "Deter| Move left: " << seed << endl;
|
||||
|
||||
|
@ -353,7 +365,7 @@ namespace Anabatic {
|
|||
void AnabaticEngine::moveURight ( AutoSegment* seed, set<Net*>& globalNets, GCell::Set& invalidateds )
|
||||
{
|
||||
Net* net = seed->getNet();
|
||||
DebugSession::open( net, 140, 150 );
|
||||
DebugSession::open( net, 145, 150 );
|
||||
|
||||
cdebug_log(9000,0) << "Deter| Move right: " << seed << endl;
|
||||
|
||||
|
@ -393,7 +405,7 @@ namespace Anabatic {
|
|||
Net* net = seed->getNet();
|
||||
unsigned int seedDepth = Session::getRoutingGauge()->getLayerDepth(seed->getLayer());
|
||||
|
||||
DebugSession::open( net, 140, 150 );
|
||||
DebugSession::open( net, 145, 150 );
|
||||
cdebug_log(9000,0) << "Deter| moveUpNetTrunk() depth:" << seedDepth << " " << seed << endl;
|
||||
|
||||
if (not seed->canMoveUp( 1.0, Flags::Propagate|Flags::AllowTerminal|Flags::NoCheckLayer) ) {
|
||||
|
|
|
@ -385,7 +385,7 @@ namespace Anabatic {
|
|||
_sourceContact = sourceContact;
|
||||
_fromHook = fromHook;
|
||||
|
||||
cdebug_log(145,1) << "NetBuilder::NetBuilder()" << endl;
|
||||
cdebug_log(145,1) << "NetBuilder::setStartHook()" << endl;
|
||||
cdebug_log(145,0) << "* _fromHook: " << fromHook << endl;
|
||||
cdebug_log(145,0) << "* _sourceContact:" << sourceContact << endl;
|
||||
|
||||
|
@ -614,10 +614,14 @@ namespace Anabatic {
|
|||
// End xG cascaded cases.
|
||||
// Optimized specific cases.
|
||||
case Conn_1G_1PinM2: _do_1G_1PinM2 (); break;
|
||||
case Conn_2G_1PinM2:
|
||||
case Conn_3G_1PinM2: _do_xG_1PinM2 (); break;
|
||||
case Conn_1G_1PinM3: _do_1G_1PinM3 (); break;
|
||||
case Conn_2G_1PinM3:
|
||||
case Conn_3G_1PinM3: _do_xG_1PinM3 (); break;
|
||||
case Conn_1G_1M1_1M2: _do_xG_1M1_1M2(); break;
|
||||
case Conn_1G_1M1_1M3: _do_1G_xM1 (); break;
|
||||
case Conn_2G_1M1_1M2: _do_xG_1M1_1M2(); break;
|
||||
case Conn_2G_1PinM2: _do_xG_xM2 (); break;
|
||||
default:
|
||||
if (not isTwoMetals())
|
||||
throw Bug( "Unmanaged Configuration [%d] = [%d+%d+%d+%d,%d+%d] %s in %s\n"
|
||||
|
@ -955,6 +959,27 @@ namespace Anabatic {
|
|||
}
|
||||
|
||||
|
||||
bool NetBuilder::_do_xG_1PinM2 ()
|
||||
{
|
||||
cdebug_log(145,0) << getTypeName() << "::_do_xG_1PinM2() method *not* reimplemented from base class." << endl;
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
bool NetBuilder::_do_1G_1PinM3 ()
|
||||
{
|
||||
cdebug_log(145,0) << getTypeName() << "::_do_1G_1PinM3() method *not* reimplemented from base class." << endl;
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
bool NetBuilder::_do_xG_1PinM3 ()
|
||||
{
|
||||
cdebug_log(145,0) << getTypeName() << "::_do_xG_1PinM3() method *not* reimplemented from base class." << endl;
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
bool NetBuilder::_do_1G_1M1 ()
|
||||
{
|
||||
cdebug_log(145,0) << getTypeName() << "::_do_1G_1M1() method *not* reimplemented from base class." << endl;
|
||||
|
|
|
@ -32,6 +32,7 @@
|
|||
#include "hurricane/RoutingPad.h"
|
||||
#include "hurricane/RoutingPads.h"
|
||||
#include "hurricane/Pad.h"
|
||||
#include "hurricane/Pin.h"
|
||||
#include "hurricane/Plug.h"
|
||||
#include "hurricane/Cell.h"
|
||||
#include "hurricane/Instance.h"
|
||||
|
@ -55,6 +56,7 @@ namespace Anabatic {
|
|||
using Hurricane::Transformation;
|
||||
using Hurricane::Warning;
|
||||
using Hurricane::Error;
|
||||
using Hurricane::Pin;
|
||||
|
||||
|
||||
NetBuilderVH::NetBuilderVH ()
|
||||
|
@ -253,6 +255,144 @@ namespace Anabatic {
|
|||
}
|
||||
|
||||
|
||||
bool NetBuilderVH::_do_1G_1PinM2 ()
|
||||
{
|
||||
cdebug_log(145,1) << getTypeName() << "::_do_1G_1PinM2() [Managed Configuration - Optimized] " << getTopology() << endl;
|
||||
|
||||
Pin* pin = dynamic_cast<Pin*>( getRoutingPads()[0]->getOccurrence().getEntity() );
|
||||
if ( (pin->getAccessDirection() != Pin::AccessDirection::SOUTH)
|
||||
and (pin->getAccessDirection() != Pin::AccessDirection::NORTH) ) {
|
||||
cerr << Error( "%s::do_1G_1PinM2(): %s *must* be north or south."
|
||||
, getTypeName().c_str()
|
||||
, getString(pin).c_str() ) << endl;
|
||||
}
|
||||
|
||||
uint64_t flags = NoFlags;
|
||||
if (east()) { flags |= HAccess|VSmall; }
|
||||
else if (west()) { flags |= HAccess|VSmall; }
|
||||
|
||||
setBothCornerContacts( doRp_Access(getGCell(),getRoutingPads()[0],flags) );
|
||||
|
||||
cdebug_tabw(145,-1);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
bool NetBuilderVH::_do_xG_1PinM2 ()
|
||||
{
|
||||
cdebug_log(145,1) << getTypeName() << "::_do_xG_1PinM2() [Managed Configuration] " << getTopology() << endl;
|
||||
|
||||
Pin* pin = dynamic_cast<Pin*>( getRoutingPads()[0]->getOccurrence().getEntity() );
|
||||
if ( (pin->getAccessDirection() != Pin::AccessDirection::SOUTH)
|
||||
and (pin->getAccessDirection() != Pin::AccessDirection::NORTH) ) {
|
||||
cerr << Error( "%s::do_xG_1PinM2(): %s *must* be north or south."
|
||||
, getTypeName().c_str()
|
||||
, getString(pin).c_str() ) << endl;
|
||||
}
|
||||
|
||||
RoutingPad* rp = getRoutingPads()[0];
|
||||
AutoContact* pinContact = NULL;
|
||||
doRp_AutoContacts( getGCell(), rp, pinContact, pinContact, HSmall|VSmall );
|
||||
|
||||
if (not north() and not south()) {
|
||||
AutoContact* subContact1 = AutoContactHTee::create( getGCell(), rp->getNet(), Session::getContactLayer(1) );
|
||||
AutoSegment::create( pinContact, subContact1, Flags::Vertical );
|
||||
setBothCornerContacts( subContact1 );
|
||||
} else {
|
||||
AutoContact* subContact1 = AutoContactVTee::create( getGCell(), rp->getNet(), Session::getContactLayer(1) );
|
||||
AutoSegment::create( pinContact, subContact1, Flags::Vertical );
|
||||
|
||||
if (east() and west()) {
|
||||
AutoContact* subContact2 = AutoContactVTee::create( getGCell(), rp->getNet(), Session::getContactLayer(1) );
|
||||
AutoSegment::create( subContact1, subContact2, Flags::Vertical );
|
||||
|
||||
setSouthWestContact( (south()) ? subContact1 : subContact2 );
|
||||
setNorthEastContact( (south()) ? subContact2 : subContact1 );
|
||||
} else
|
||||
setBothCornerContacts( subContact1 );
|
||||
}
|
||||
|
||||
cdebug_tabw(145,-1);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
bool NetBuilderVH::_do_1G_1PinM3 ()
|
||||
{
|
||||
cdebug_log(145,1) << getTypeName() << "::_do_1G_1PinM3() [Managed Configuration - Optimized] " << getTopology() << endl;
|
||||
|
||||
Pin* pin = dynamic_cast<Pin*>( getRoutingPads()[0]->getOccurrence().getEntity() );
|
||||
if ( (pin->getAccessDirection() != Pin::AccessDirection::EAST)
|
||||
and (pin->getAccessDirection() != Pin::AccessDirection::WEST) ) {
|
||||
cerr << Error( "%s::do_1G_1PinM2(): %s *must* be east or west."
|
||||
, getTypeName().c_str()
|
||||
, getString(pin).c_str() ) << endl;
|
||||
}
|
||||
|
||||
AutoContact* pinContact = NULL;
|
||||
doRp_AutoContacts( getGCell(), getRoutingPads()[0], pinContact, pinContact, HSmall|VSmall );
|
||||
|
||||
if (east() or west()) {
|
||||
AutoContact* subContact1 = AutoContactTurn::create( getGCell(), getRoutingPads()[0]->getNet(), Session::getContactLayer(1) );
|
||||
AutoContact* subContact2 = AutoContactTurn::create( getGCell(), getRoutingPads()[0]->getNet(), Session::getContactLayer(1) );
|
||||
|
||||
AutoSegment::create( pinContact , subContact1, Flags::Horizontal );
|
||||
AutoSegment::create( subContact1, subContact2, Flags::Vertical );
|
||||
pinContact = subContact2;
|
||||
} else {
|
||||
AutoContact* subContact1 = NULL;
|
||||
subContact1 = AutoContactTurn::create( getGCell(), getRoutingPads()[0]->getNet(), Session::getContactLayer(1) );
|
||||
|
||||
AutoSegment::create( pinContact, subContact1, Flags::Horizontal );
|
||||
pinContact = subContact1;
|
||||
}
|
||||
|
||||
setBothCornerContacts( pinContact );
|
||||
|
||||
cdebug_tabw(145,-1);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
bool NetBuilderVH::_do_xG_1PinM3 ()
|
||||
{
|
||||
cdebug_log(145,1) << getTypeName() << "::_do_xG_1PinM3() [Managed Configuration] " << getTopology() << endl;
|
||||
|
||||
RoutingPad* rp = getRoutingPads()[0];
|
||||
Pin* pin = dynamic_cast<Pin*>( rp->getOccurrence().getEntity() );
|
||||
if ( (pin->getAccessDirection() != Pin::AccessDirection::EAST)
|
||||
and (pin->getAccessDirection() != Pin::AccessDirection::WEST) ) {
|
||||
cerr << Error( "%s::do_xG_1PinM3(): %s *must* be east or west."
|
||||
, getTypeName().c_str()
|
||||
, getString(pin).c_str() ) << endl;
|
||||
}
|
||||
|
||||
AutoContact* pinContact = NULL;
|
||||
doRp_AutoContacts( getGCell(), rp, pinContact, pinContact, HSmall|VSmall );
|
||||
|
||||
if (not east() and not west()) {
|
||||
AutoContact* subContact1 = AutoContactVTee::create( getGCell(), rp->getNet(), Session::getContactLayer(1) );
|
||||
AutoSegment::create( pinContact, subContact1, Flags::Horizontal );
|
||||
setBothCornerContacts( subContact1 );
|
||||
} else {
|
||||
AutoContact* subContact1 = AutoContactHTee::create( getGCell(), rp->getNet(), Session::getContactLayer(1) );
|
||||
AutoSegment::create( pinContact, subContact1, Flags::Horizontal );
|
||||
|
||||
if (north() and south()) {
|
||||
AutoContact* subContact2 = AutoContactHTee::create( getGCell(), rp->getNet(), Session::getContactLayer(1) );
|
||||
AutoSegment::create( subContact1, subContact2, Flags::Horizontal );
|
||||
|
||||
setSouthWestContact( (west()) ? subContact1 : subContact2 );
|
||||
setNorthEastContact( (west()) ? subContact2 : subContact1 );
|
||||
} else
|
||||
setBothCornerContacts( subContact1 );
|
||||
}
|
||||
|
||||
cdebug_tabw(145,-1);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
bool NetBuilderVH::_do_1G_1M1 ()
|
||||
{
|
||||
cdebug_log(145,1) << getTypeName() << "::_do_1G_1M1() [Managed Configuration - Optimized] " << getTopology() << endl;
|
||||
|
|
|
@ -161,7 +161,7 @@ namespace Anabatic {
|
|||
|
||||
void AnabaticEngine::computeNetConstraints ( Net* net )
|
||||
{
|
||||
DebugSession::open( net, 140, 150);
|
||||
DebugSession::open( net, 145, 150);
|
||||
|
||||
cdebug_log(149,0) << "Anabatic::computeNetConstraints( " << net << " )" << endl;
|
||||
cdebug_tabw(145,1);
|
||||
|
|
|
@ -61,7 +61,7 @@ namespace Anabatic {
|
|||
|
||||
void AnabaticEngine::toOptimals ( Net* net )
|
||||
{
|
||||
DebugSession::open( net, 140, 150 );
|
||||
DebugSession::open( net, 145, 150 );
|
||||
cdebug_log(149,0) << "Anabatic::_toOptimals( " << net << " )" << endl;
|
||||
cdebug_tabw(145,1);
|
||||
|
||||
|
|
|
@ -103,9 +103,11 @@ namespace Anabatic {
|
|||
class NetData {
|
||||
public:
|
||||
NetData ( Net* );
|
||||
inline bool isGlobalEstimated () const;
|
||||
inline bool isGlobalRouted () const;
|
||||
inline bool isMixedPreRoute () const;
|
||||
inline bool isFixed () const;
|
||||
inline bool isExcluded () const;
|
||||
inline Net* getNet () const;
|
||||
inline NetRoutingState* getNetRoutingState () const;
|
||||
inline const Box& getSearchArea () const;
|
||||
|
@ -114,7 +116,9 @@ namespace Anabatic {
|
|||
inline DbU::Unit getSparsity () const;
|
||||
inline void setNetRoutingState ( NetRoutingState* );
|
||||
inline void setSearchArea ( Box );
|
||||
inline void setGlobalEstimated ( bool );
|
||||
inline void setGlobalRouted ( bool );
|
||||
inline void setExcluded ( bool );
|
||||
inline void setRpCount ( size_t );
|
||||
private:
|
||||
NetData ( const NetData& );
|
||||
|
@ -130,9 +134,11 @@ namespace Anabatic {
|
|||
};
|
||||
|
||||
|
||||
inline bool NetData::isGlobalEstimated () const { return _flags & Flags::GlobalEstimated; }
|
||||
inline bool NetData::isGlobalRouted () const { return _flags & Flags::GlobalRouted; }
|
||||
inline bool NetData::isMixedPreRoute () const { return (_state) ? _state->isMixedPreRoute() : false; }
|
||||
inline bool NetData::isFixed () const { return (_state) ? _state->isFixed () : false; }
|
||||
inline bool NetData::isExcluded () const { return _flags & Flags::ExcludeRoute; }
|
||||
inline Net* NetData::getNet () const { return _net; }
|
||||
inline NetRoutingState* NetData::getNetRoutingState () const { return _state; }
|
||||
inline const Box& NetData::getSearchArea () const { return _searchArea; }
|
||||
|
@ -140,7 +146,9 @@ namespace Anabatic {
|
|||
inline size_t NetData::getRpCount () const { return _rpCount; }
|
||||
inline void NetData::setNetRoutingState ( NetRoutingState* state ) { _state=state; }
|
||||
inline DbU::Unit NetData::getSparsity () const { return _sparsity; }
|
||||
inline void NetData::setGlobalEstimated ( bool state ) { _flags.set(Flags::GlobalEstimated,state); }
|
||||
inline void NetData::setGlobalRouted ( bool state ) { _flags.set(Flags::GlobalRouted ,state); }
|
||||
inline void NetData::setExcluded ( bool state ) { _flags.set(Flags::ExcludeRoute ,state); }
|
||||
inline void NetData::setRpCount ( size_t count ) { _rpCount=count; _update(); }
|
||||
|
||||
|
||||
|
@ -195,6 +203,7 @@ namespace Anabatic {
|
|||
inline GCell* getGCellUnder ( DbU::Unit x, DbU::Unit y ) const;
|
||||
inline GCell* getGCellUnder ( Point ) const;
|
||||
inline GCellsUnder getGCellsUnder ( Segment* ) const;
|
||||
inline Edges getEdgesUnderPath ( GCell* source, GCell* target, Flags pathFlags=Flags::NorthPath ) const;
|
||||
Interval getUSide ( Flags direction ) const;
|
||||
int getCapacity ( Interval, Flags ) const;
|
||||
size_t getNetsFromEdge ( const Edge*, NetSet& );
|
||||
|
@ -206,6 +215,8 @@ namespace Anabatic {
|
|||
inline const NetDatas& getNetDatas () const;
|
||||
NetData* getNetData ( Net*, Flags flags=Flags::NoFlags );
|
||||
void setupNetDatas ();
|
||||
void exclude ( const Name& netName );
|
||||
void exclude ( Net* );
|
||||
void updateMatrix ();
|
||||
// Dijkstra related functions.
|
||||
inline int getStamp () const;
|
||||
|
@ -330,6 +341,7 @@ namespace Anabatic {
|
|||
inline GCell* AnabaticEngine::getGCellUnder ( DbU::Unit x, DbU::Unit y ) const { return _matrix.getUnder(x,y); }
|
||||
inline GCell* AnabaticEngine::getGCellUnder ( Point p ) const { return _matrix.getUnder(p); }
|
||||
inline GCellsUnder AnabaticEngine::getGCellsUnder ( Segment* s ) const { return std::shared_ptr<RawGCellsUnder>( new RawGCellsUnder(this,s) ); }
|
||||
inline Edges AnabaticEngine::getEdgesUnderPath ( GCell* source, GCell* target, Flags pathFlags ) const { return new Path_Edges(source,target,pathFlags); }
|
||||
inline uint64_t AnabaticEngine::getDensityMode () const { return _densityMode; }
|
||||
inline void AnabaticEngine::setDensityMode ( uint64_t mode ) { _densityMode=mode; }
|
||||
inline void AnabaticEngine::setBlockageNet ( Net* net ) { _blockageNet = net; }
|
||||
|
|
|
@ -178,6 +178,7 @@ namespace Anabatic {
|
|||
, Flags flags=Flags::WarnOnError );
|
||||
void restoreNativeConstraintBox ();
|
||||
void migrateConstraintBox ( AutoContact* other );
|
||||
void setLayerAndWidth ( size_t delta, size_t depth );
|
||||
void destroy ();
|
||||
// Inspector Management.
|
||||
Record* _getRecord () const;
|
||||
|
|
|
@ -178,6 +178,8 @@ namespace Anabatic {
|
|||
inline DbU::Unit getTargetY () const;
|
||||
inline void invert ();
|
||||
inline void setLayer ( const Layer* );
|
||||
inline void setLayer ( size_t depth );
|
||||
inline void setWidth ( DbU::Unit );
|
||||
// Predicates.
|
||||
inline bool isHorizontal () const;
|
||||
inline bool isVertical () const;
|
||||
|
@ -538,6 +540,7 @@ namespace Anabatic {
|
|||
inline void AutoSegment::incReduceds () { if (_reduceds<3) ++_reduceds; }
|
||||
inline void AutoSegment::decReduceds () { if (_reduceds>0) --_reduceds; }
|
||||
inline void AutoSegment::setLayer ( const Layer* layer ) { base()->setLayer(layer); _depth=Session::getLayerDepth(layer); _flags|=SegInvalidatedLayer; }
|
||||
inline void AutoSegment::setWidth ( DbU::Unit width ) { base()->setWidth(width); }
|
||||
inline void AutoSegment::setOptimalMin ( DbU::Unit min ) { _optimalMin = (unsigned int)DbU::getLambda(min-getOrigin()); }
|
||||
inline void AutoSegment::setOptimalMax ( DbU::Unit max ) { _optimalMax = (unsigned int)DbU::getLambda(max-getOrigin()); }
|
||||
inline void AutoSegment::mergeNativeMin ( DbU::Unit min ) { _nativeConstraints.getVMin() = std::max( min, _nativeConstraints.getVMin() ); }
|
||||
|
@ -547,6 +550,17 @@ namespace Anabatic {
|
|||
inline void AutoSegment::resetUserConstraints () { _userConstraints = Interval(false); }
|
||||
|
||||
|
||||
inline void AutoSegment::setLayer ( size_t depth )
|
||||
{
|
||||
RoutingLayerGauge* layerGauge = Session::getLayerGauge( depth );
|
||||
base()->setLayer( layerGauge->getLayer () );
|
||||
base()->setWidth( layerGauge->getWireWidth() );
|
||||
|
||||
_depth = depth;
|
||||
_flags|=SegInvalidatedLayer;
|
||||
}
|
||||
|
||||
|
||||
inline DbU::Unit AutoSegment::getContactWidth () const
|
||||
{ return getWidth() + Session::getViaWidth(getLayer()) - Session::getWireWidth(getLayer()); }
|
||||
|
||||
|
|
|
@ -54,6 +54,8 @@ namespace Anabatic {
|
|||
static const BaseFlags DestroyBaseSegment ; // = (1 << 9);
|
||||
// Flags for NetDatas objects states only.
|
||||
static const BaseFlags GlobalRouted ; // = (1 << 5);
|
||||
static const BaseFlags GlobalEstimated ; // = (1 << 6);
|
||||
static const BaseFlags ExcludeRoute ; // = (1 << 7);
|
||||
// Masks.
|
||||
static const BaseFlags WestSide ; // = Horizontal|Target;
|
||||
static const BaseFlags EastSide ; // = Horizontal|Source;
|
||||
|
@ -96,6 +98,7 @@ namespace Anabatic {
|
|||
static const BaseFlags CheckLowDensity ;
|
||||
static const BaseFlags CheckLowUpDensity ;
|
||||
static const BaseFlags NoUpdate ;
|
||||
static const BaseFlags NorthPath ;
|
||||
public:
|
||||
inline Flags ( uint64_t flags = NoFlags );
|
||||
inline Flags ( const Hurricane::BaseFlags& );
|
||||
|
|
|
@ -424,30 +424,40 @@ namespace Anabatic {
|
|||
inline void pop ();
|
||||
inline void clear ();
|
||||
inline void dump () const;
|
||||
inline void setAttractor ( const Point& );
|
||||
inline const Point& getAttractor () const;
|
||||
inline bool hasAttractor () const;
|
||||
private:
|
||||
class CompareByDistance {
|
||||
public:
|
||||
inline bool operator() ( const Vertex* lhs, const Vertex* rhs );
|
||||
inline CompareByDistance ();
|
||||
bool operator() ( const Vertex* lhs, const Vertex* rhs );
|
||||
static inline void setQueue ( PriorityQueue* );
|
||||
private:
|
||||
static PriorityQueue* _pqueue;
|
||||
};
|
||||
private:
|
||||
bool _hasAttractor;
|
||||
Point _attractor;
|
||||
multiset<Vertex*,CompareByDistance> _queue;
|
||||
};
|
||||
|
||||
|
||||
inline bool PriorityQueue::CompareByDistance::operator() ( const Vertex* lhs, const Vertex* rhs )
|
||||
{
|
||||
if (lhs->getDistance() == rhs->getDistance()) return lhs->getBranchId() > rhs->getBranchId();
|
||||
return lhs->getDistance() < rhs->getDistance();
|
||||
}
|
||||
inline PriorityQueue::CompareByDistance::CompareByDistance () { }
|
||||
|
||||
inline void PriorityQueue::CompareByDistance::setQueue ( PriorityQueue* pqueue ) { _pqueue = pqueue; }
|
||||
|
||||
|
||||
inline PriorityQueue::PriorityQueue () : _queue() { }
|
||||
inline PriorityQueue::PriorityQueue () : _hasAttractor(false), _attractor(), _queue() { PriorityQueue::CompareByDistance::setQueue(this); }
|
||||
inline PriorityQueue::~PriorityQueue () { }
|
||||
inline bool PriorityQueue::empty () const { return _queue.empty(); }
|
||||
inline size_t PriorityQueue::size () const { return _queue.size(); }
|
||||
inline void PriorityQueue::push ( Vertex* v ) { _queue.insert(v); }
|
||||
inline Vertex* PriorityQueue::top () { return _queue.empty() ? NULL : *_queue.begin(); }
|
||||
inline void PriorityQueue::clear () { _queue.clear(); }
|
||||
inline void PriorityQueue::clear () { _queue.clear(); _hasAttractor=false; }
|
||||
inline void PriorityQueue::setAttractor ( const Point& p ) { _attractor=p; _hasAttractor=true; }
|
||||
inline bool PriorityQueue::hasAttractor () const { return _hasAttractor; }
|
||||
inline const Point& PriorityQueue::getAttractor () const { return _attractor; }
|
||||
|
||||
inline void PriorityQueue::pop ()
|
||||
{
|
||||
|
|
|
@ -63,7 +63,7 @@ namespace Anabatic {
|
|||
inline unsigned int getReservedCapacity () const;
|
||||
inline unsigned int getCapacity ( size_t depth ) const;
|
||||
inline unsigned int getRealOccupancy () const;
|
||||
inline unsigned int getEstimateOccupancy () const;
|
||||
inline float getEstimateOccupancy () const;
|
||||
inline float getHistoricCost () const;
|
||||
DbU::Unit getDistance () const;
|
||||
inline GCell* getSource () const;
|
||||
|
@ -82,6 +82,7 @@ namespace Anabatic {
|
|||
inline void setRealOccupancy ( int );
|
||||
void incRealOccupancy ( int );
|
||||
void incRealOccupancy2 ( int );
|
||||
inline void incEstimateOccupancy ( float );
|
||||
inline void setHistoricCost ( float );
|
||||
bool isEnding ( Segment* ) const;
|
||||
void add ( Segment* );
|
||||
|
@ -139,7 +140,7 @@ namespace Anabatic {
|
|||
inline unsigned int Edge::getCapacity ( size_t depth ) const { return (_capacities) ? _capacities->getCapacity(depth) : 0; }
|
||||
inline unsigned int Edge::getReservedCapacity () const { return _reservedCapacity; }
|
||||
inline unsigned int Edge::getRealOccupancy () const { return _realOccupancy; }
|
||||
inline unsigned int Edge::getEstimateOccupancy () const { return _estimateOccupancy; }
|
||||
inline float Edge::getEstimateOccupancy () const { return _estimateOccupancy; }
|
||||
inline float Edge::getHistoricCost () const { return _historicCost; }
|
||||
inline GCell* Edge::getSource () const { return _source; }
|
||||
inline GCell* Edge::getTarget () const { return _target; }
|
||||
|
@ -150,6 +151,7 @@ namespace Anabatic {
|
|||
//inline void Edge::setCapacity ( int c ) { _capacity = ((int) c > 0) ? c : 0; }
|
||||
inline void Edge::setRealOccupancy ( int c ) { _realOccupancy = ((int) c > 0) ? c : 0; }
|
||||
inline void Edge::setHistoricCost ( float hcost ) { _historicCost = hcost; }
|
||||
inline void Edge::incEstimateOccupancy ( float delta ) { _estimateOccupancy += delta; }
|
||||
inline const Flags& Edge::flags () const { return _flags; }
|
||||
inline Flags& Edge::flags () { return _flags; }
|
||||
inline Flags& Edge::setFlags ( Flags mask ) { _flags |= mask; return _flags; }
|
||||
|
|
|
@ -19,6 +19,7 @@
|
|||
|
||||
#include <string>
|
||||
#include <vector>
|
||||
#include "hurricane/DbU.h"
|
||||
#include "hurricane/Collection.h"
|
||||
#include "anabatic/Constants.h"
|
||||
|
||||
|
@ -27,6 +28,7 @@ namespace Anabatic {
|
|||
|
||||
using std::string;
|
||||
using std::vector;
|
||||
using Hurricane::DbU;
|
||||
using Hurricane::Record;
|
||||
using Hurricane::Filter;
|
||||
using Hurricane::Locator;
|
||||
|
@ -110,12 +112,82 @@ namespace Anabatic {
|
|||
{ }
|
||||
|
||||
|
||||
// -------------------------------------------------------------------
|
||||
// Class : "Path_Edges".
|
||||
|
||||
class Path_Edges : public EdgesHC {
|
||||
public:
|
||||
// Sub-Class: Locator.
|
||||
class Locator : public EdgesHL {
|
||||
public:
|
||||
Locator ( const GCell* source, const GCell* target, Flags pathFlags );
|
||||
inline Locator ( const Locator& );
|
||||
virtual Edge* getElement () const;
|
||||
virtual EdgesHL* getClone () const;
|
||||
virtual bool isValid () const;
|
||||
virtual void progress ();
|
||||
virtual string _getString () const;
|
||||
protected:
|
||||
const GCell* _source;
|
||||
const GCell* _target;
|
||||
Flags _stateFlags;
|
||||
DbU::Unit _uprobe;
|
||||
Edge* _edge;
|
||||
};
|
||||
|
||||
// GCell_Edges.
|
||||
public:
|
||||
inline Path_Edges ( const GCell* source, const GCell* target, Flags pathFlags=Flags::NorthPath );
|
||||
inline Path_Edges ( const Path_Edges& );
|
||||
virtual EdgesHC* getClone () const;
|
||||
virtual EdgesHL* getLocator () const;
|
||||
virtual string _getString () const;
|
||||
protected:
|
||||
const GCell* _source;
|
||||
const GCell* _target;
|
||||
Flags _pathFlags;
|
||||
};
|
||||
|
||||
|
||||
inline Path_Edges::Locator::Locator ( const Locator &locator )
|
||||
: EdgesHL()
|
||||
, _source (locator._source)
|
||||
, _target (locator._target)
|
||||
, _stateFlags(locator._stateFlags)
|
||||
, _uprobe (locator._uprobe)
|
||||
, _edge (locator._edge)
|
||||
{
|
||||
// cdebug_log(110,0) << "GCell_Edges::Locator::Locator(const Locator&)" << std::endl;
|
||||
}
|
||||
|
||||
|
||||
inline Path_Edges::Path_Edges ( const GCell* source, const GCell* target, Flags pathFlags )
|
||||
: EdgesHC()
|
||||
, _source (source)
|
||||
, _target (target)
|
||||
, _pathFlags(pathFlags)
|
||||
{ }
|
||||
|
||||
|
||||
inline Path_Edges::Path_Edges ( const Path_Edges& path )
|
||||
: EdgesHC()
|
||||
, _source (path._source)
|
||||
, _target (path._target)
|
||||
, _pathFlags(path._pathFlags)
|
||||
{ }
|
||||
|
||||
|
||||
} // Anabatic namespace.
|
||||
|
||||
|
||||
GETSTRING_POINTER_SUPPORT(Anabatic::GCell_Edges);
|
||||
GETSTRING_POINTER_SUPPORT(Anabatic::GCell_Edges::Locator);
|
||||
GETSTRING_POINTER_SUPPORT(Anabatic::Path_Edges);
|
||||
GETSTRING_POINTER_SUPPORT(Anabatic::Path_Edges::Locator);
|
||||
|
||||
IOSTREAM_POINTER_SUPPORT(Anabatic::GCell_Edges);
|
||||
IOSTREAM_POINTER_SUPPORT(Anabatic::GCell_Edges::Locator);
|
||||
IOSTREAM_POINTER_SUPPORT(Anabatic::Path_Edges);
|
||||
IOSTREAM_POINTER_SUPPORT(Anabatic::Path_Edges::Locator);
|
||||
|
||||
#endif // ANABATIC_EDGES_H
|
||||
|
|
|
@ -128,6 +128,8 @@ namespace Anabatic {
|
|||
static uint32_t getDisplayMode ();
|
||||
static void setDisplayMode ( uint32_t );
|
||||
static Box getBorder ( const GCell*, const GCell* );
|
||||
static inline DbU::Unit getMatrixHSide ();
|
||||
static inline DbU::Unit getMatrixVSide ();
|
||||
public:
|
||||
static GCell* create ( AnabaticEngine* );
|
||||
public:
|
||||
|
@ -168,6 +170,8 @@ namespace Anabatic {
|
|||
inline DbU::Unit getConstraintXMax ( int shrink=0 ) const;
|
||||
inline DbU::Unit getConstraintYMax ( int shrink=0 ) const;
|
||||
inline Interval getSide ( Flags direction, int shrink=0 ) const;
|
||||
inline Interval getHSide ( int shrink=0 ) const;
|
||||
inline Interval getVSide ( int shrink=0 ) const;
|
||||
inline Point getCenter () const;
|
||||
inline Box getConstraintBox () const;
|
||||
inline const vector<Edge*>& getWestEdges () const;
|
||||
|
@ -299,6 +303,8 @@ namespace Anabatic {
|
|||
private:
|
||||
static Name _extensionName;
|
||||
static uint32_t _displayMode;
|
||||
static DbU::Unit _matrixHSide;
|
||||
static DbU::Unit _matrixVSide;
|
||||
Observable _observable;
|
||||
AnabaticEngine* _anabatic;
|
||||
Flags _flags;
|
||||
|
@ -341,10 +347,14 @@ namespace Anabatic {
|
|||
inline bool GCell::isChannelRow () const { return _flags & Flags::ChannelRow; }
|
||||
inline bool GCell::isSaturated () const { return _flags & Flags::Saturated; }
|
||||
inline bool GCell::isInvalidated () const { return _flags & Flags::Invalidated; }
|
||||
inline DbU::Unit GCell::getMatrixHSide () { return _matrixHSide; }
|
||||
inline DbU::Unit GCell::getMatrixVSide () { return _matrixVSide; }
|
||||
inline Flags GCell::getType () const { return _flags & Flags::GCellTypeMask; }
|
||||
inline AnabaticEngine* GCell::getAnabatic () const { return _anabatic; }
|
||||
inline DbU::Unit GCell::getXMin () const { return _xmin; }
|
||||
inline DbU::Unit GCell::getYMin () const { return _ymin; }
|
||||
inline Interval GCell::getHSide ( int shrink ) const { return getSide(Flags::Horizontal,shrink); }
|
||||
inline Interval GCell::getVSide ( int shrink ) const { return getSide(Flags::Vertical ,shrink); }
|
||||
inline Edges GCell::getEdges ( Flags sides ) const { return new GCell_Edges(this,sides); }
|
||||
inline const vector<Edge*>& GCell::getWestEdges () const { return _westEdges; }
|
||||
inline const vector<Edge*>& GCell::getEastEdges () const { return _eastEdges; }
|
||||
|
|
|
@ -203,6 +203,9 @@ namespace Anabatic {
|
|||
virtual bool _do_2G ();
|
||||
virtual bool _do_xG_1Pad ();
|
||||
virtual bool _do_1G_1PinM2 ();
|
||||
virtual bool _do_xG_1PinM2 ();
|
||||
virtual bool _do_1G_1PinM3 ();
|
||||
virtual bool _do_xG_1PinM3 ();
|
||||
virtual bool _do_1G_1M1 ();
|
||||
virtual bool _do_2G_1M1 ();
|
||||
virtual bool _do_1G_xM1 ();
|
||||
|
@ -234,7 +237,7 @@ namespace Anabatic {
|
|||
+ ((pads) << (GlobalBSize+Metal1BSize+Metal2BSize+Metal3BSize)) \
|
||||
+ ((pins) << (GlobalBSize+Metal1BSize+Metal2BSize+Metal3BSize+PadsBSize))
|
||||
|
||||
// Connexity Name | G|M1|M2|M2|Pad|Pin|
|
||||
// Connexity Name | G|M1|M2|M3|Pad|Pin|
|
||||
enum ConnexityFlag { Conn_0G = CONNEXITY_VALUE( 0, 0, 0, 0, 0 , 0 )
|
||||
, Conn_2G = CONNEXITY_VALUE( 2, 0, 0, 0, 0 , 0 )
|
||||
, Conn_3G = CONNEXITY_VALUE( 3, 0, 0, 0, 0 , 0 )
|
||||
|
@ -257,7 +260,7 @@ namespace Anabatic {
|
|||
, Conn_1G_4M3 = CONNEXITY_VALUE( 1, 0, 0, 4, 0 , 0 )
|
||||
, Conn_1G_1M1_1M2 = CONNEXITY_VALUE( 1, 1, 1, 0, 0 , 0 )
|
||||
, Conn_1G_1M1_1M3 = CONNEXITY_VALUE( 1, 1, 0, 1, 0 , 0 )
|
||||
// Connexity Name | G|M1|M2|M2|Pad|Pin|
|
||||
// Connexity Name | G|M1|M2|M3|Pad|Pin|
|
||||
, Conn_2G_1M1 = CONNEXITY_VALUE( 2, 1, 0, 0, 0 , 0 )
|
||||
, Conn_2G_2M1 = CONNEXITY_VALUE( 2, 2, 0, 0, 0 , 0 )
|
||||
, Conn_2G_3M1 = CONNEXITY_VALUE( 2, 3, 0, 0, 0 , 0 )
|
||||
|
@ -272,7 +275,7 @@ namespace Anabatic {
|
|||
, Conn_2G_3M3 = CONNEXITY_VALUE( 2, 0, 0, 3, 0 , 0 )
|
||||
, Conn_2G_4M3 = CONNEXITY_VALUE( 2, 0, 0, 4, 0 , 0 )
|
||||
, Conn_2G_1M1_1M2 = CONNEXITY_VALUE( 2, 1, 1, 0, 0 , 0 )
|
||||
// Connexity Name | G|M1|M2|M2|Pad|Pin|
|
||||
// Connexity Name | G|M1|M2|M3|Pad|Pin|
|
||||
, Conn_3G_1M1 = CONNEXITY_VALUE( 3, 1, 0, 0, 0 , 0 )
|
||||
, Conn_3G_2M1 = CONNEXITY_VALUE( 3, 2, 0, 0, 0 , 0 )
|
||||
, Conn_3G_3M1 = CONNEXITY_VALUE( 3, 3, 0, 0, 0 , 0 )
|
||||
|
@ -283,7 +286,7 @@ namespace Anabatic {
|
|||
, Conn_3G_2M3 = CONNEXITY_VALUE( 3, 0, 0, 2, 0 , 0 )
|
||||
, Conn_3G_3M3 = CONNEXITY_VALUE( 3, 0, 0, 3, 0 , 0 )
|
||||
, Conn_3G_4M3 = CONNEXITY_VALUE( 3, 0, 0, 4, 0 , 0 )
|
||||
// Connexity Name | G|M1|M2|M2|Pad|Pin|
|
||||
// Connexity Name | G|M1|M2|M3|Pad|Pin|
|
||||
, Conn_4G_1M1 = CONNEXITY_VALUE( 4, 1, 0, 0, 0 , 0 )
|
||||
, Conn_4G_2M1 = CONNEXITY_VALUE( 4, 2, 0, 0, 0 , 0 )
|
||||
, Conn_4G_3M1 = CONNEXITY_VALUE( 4, 3, 0, 0, 0 , 0 )
|
||||
|
@ -295,6 +298,10 @@ namespace Anabatic {
|
|||
, Conn_3G_1Pad = CONNEXITY_VALUE( 3, 0, 0, 0, 1 , 0 )
|
||||
, Conn_1G_1PinM2 = CONNEXITY_VALUE( 1, 0, 1, 0, 0 , 1 )
|
||||
, Conn_2G_1PinM2 = CONNEXITY_VALUE( 2, 0, 1, 0, 0 , 1 )
|
||||
, Conn_3G_1PinM2 = CONNEXITY_VALUE( 3, 0, 1, 0, 0 , 1 )
|
||||
, Conn_1G_1PinM3 = CONNEXITY_VALUE( 1, 0, 0, 1, 0 , 1 )
|
||||
, Conn_2G_1PinM3 = CONNEXITY_VALUE( 2, 0, 0, 1, 0 , 1 )
|
||||
, Conn_3G_1PinM3 = CONNEXITY_VALUE( 3, 0, 0, 1, 0 , 1 )
|
||||
};
|
||||
|
||||
#undef CONNEXITY_VALUE
|
||||
|
|
|
@ -32,6 +32,10 @@ namespace Anabatic {
|
|||
virtual void doRp_AutoContacts ( GCell*, Component*, AutoContact*& source, AutoContact*& target, uint64_t flags );
|
||||
virtual AutoContact* doRp_Access ( GCell*, Component*, uint64_t flags );
|
||||
private:
|
||||
virtual bool _do_1G_1PinM2 ();
|
||||
virtual bool _do_xG_1PinM2 ();
|
||||
virtual bool _do_1G_1PinM3 ();
|
||||
virtual bool _do_xG_1PinM3 ();
|
||||
virtual bool _do_1G_1M1 ();
|
||||
virtual bool _do_1G_xM1 ();
|
||||
virtual bool _do_2G_1M1 ();
|
||||
|
|
|
@ -38,9 +38,10 @@ build: FORCE
|
|||
esac; \
|
||||
case "$${X_SCLS}" in \
|
||||
*"devtoolset"*) \
|
||||
version="`echo $${X_SCLS} | sed 's,devtoolset-,,'`"; \
|
||||
cmakeArgs="$${cmakeArgs} -D Boost_NO_SYSTEM_PATHS:STRING=TRUE"; \
|
||||
BOOST_INCLUDEDIR="/opt/rh/devtoolset-2/root/usr/include"; \
|
||||
BOOST_LIBRARYDIR="/opt/rh/devtoolset-2/root/usr/lib"; \
|
||||
BOOST_INCLUDEDIR="/opt/rh/devtoolset-$${version}/root/usr/include"; \
|
||||
BOOST_LIBRARYDIR="/opt/rh/devtoolset-$${version}/root/usr/lib"; \
|
||||
export BOOST_INCLUDEDIR BOOST_LIBRARYDIR; \
|
||||
echo "** Using $${X_SCLS}."; \
|
||||
;; \
|
||||
|
|
|
@ -14,6 +14,7 @@ projects = [
|
|||
, { 'name' : "coriolis"
|
||||
, 'tools' : [ "bootstrap"
|
||||
, "lefdef"
|
||||
, "flute"
|
||||
, "vlsisapd"
|
||||
, "hurricane"
|
||||
, "crlcore"
|
||||
|
|
|
@ -37,7 +37,7 @@ class Builder:
|
|||
self._clang = False
|
||||
self._noSystemBoost = False
|
||||
self._macports = False
|
||||
self._devtoolset2 = False
|
||||
self._devtoolset = 0
|
||||
self._qt5 = False
|
||||
self._openmp = False
|
||||
self._enableShared = "ON"
|
||||
|
@ -66,8 +66,8 @@ class Builder:
|
|||
elif attribute == "macports":
|
||||
self._macports = value
|
||||
if value: self._noSystemBoost = True
|
||||
elif attribute == "devtoolset2":
|
||||
self._devtoolset2 = value
|
||||
elif attribute == "devtoolset":
|
||||
self._devtoolset = value
|
||||
if value: self._noSystemBoost = True
|
||||
elif attribute == "qt5": self._qt5 = value
|
||||
elif attribute == "openmp": self._openmp = value
|
||||
|
@ -132,14 +132,15 @@ class Builder:
|
|||
|
||||
|
||||
def _execute ( self, command, error ):
|
||||
if self._devtoolset2 == True:
|
||||
print 'Using devtoolset-2 (scl enable devtoolset-2 ...)'
|
||||
if self._devtoolset:
|
||||
print 'Using devtoolset-%(v)d (scl enable devtoolset-%(v)d ...)' % {'v':self._devtoolset}
|
||||
commandAsString = ''
|
||||
for i in range(len(command)):
|
||||
if i: commandAsString += ' '
|
||||
if ' ' in command[i]: commandAsString += '"'+command[i]+'"'
|
||||
else: commandAsString += command[i]
|
||||
command = [ 'scl', 'enable', 'devtoolset-2', commandAsString ]
|
||||
command = [ 'scl', 'enable', 'devtoolset-%d' % self._devtoolset
|
||||
, commandAsString ]
|
||||
|
||||
#print command
|
||||
sys.stdout.flush ()
|
||||
|
@ -174,7 +175,10 @@ class Builder:
|
|||
|
||||
command = [ 'cmake' ]
|
||||
if self._ninja: command += [ "-G", "Ninja" ]
|
||||
if self._noSystemBoost: command += [ "-D", "Boost_NO_SYSTEM_PATHS:STRING=TRUE" ]
|
||||
if self._noSystemBoost: command += [ "-D", "Boost_NO_SYSTEM_PATHS:STRING=TRUE"
|
||||
, "-D", "BOOST_INCLUDEDIR:STRING=/usr/include/boost157"
|
||||
, "-D", "BOOST_LIBRARYDIR:STRING=/usr/lib/boost157"
|
||||
]
|
||||
if self._qt5: command += [ "-D", "WITH_QT5:STRING=TRUE" ]
|
||||
if self._openmp: command += [ "-D", "WITH_OPENMP:STRING=TRUE" ]
|
||||
|
||||
|
@ -206,6 +210,8 @@ class Builder:
|
|||
if self._checkDeterminism == 'ON': command += [ "-D", "CHECK_DETERMINISM:STRING=ON" ]
|
||||
command += [ toolSourceDir ]
|
||||
|
||||
print self._noSystemBoost
|
||||
print command
|
||||
self._execute ( command, "Second CMake failed" )
|
||||
|
||||
if self._doBuild:
|
||||
|
@ -295,9 +301,9 @@ class Builder:
|
|||
if self._clang:
|
||||
self._environment[ 'CC' ] = '/usr/bin/clang'
|
||||
self._environment[ 'CXX' ] = '/usr/bin/clang++'
|
||||
if self._devtoolset2:
|
||||
self._environment[ 'BOOST_INCLUDEDIR' ] = '/opt/rh/devtoolset-2/root/usr/include'
|
||||
self._environment[ 'BOOST_LIBRARYDIR' ] = '/opt/rh/devtoolset-2/root/usr/lib'
|
||||
if self._devtoolset:
|
||||
self._environment[ 'BOOST_INCLUDEDIR' ] = '/opt/rh/devtoolset-%d/root/usr/include' % self._devtoolset
|
||||
self._environment[ 'BOOST_LIBRARYDIR' ] = '/opt/rh/devtoolset-%d/root/usr/lib' % self._devtoolset
|
||||
if self._macports:
|
||||
self._environment[ 'BOOST_INCLUDEDIR' ] = '/opt/local/include'
|
||||
self._environment[ 'BOOST_LIBRARYDIR' ] = '/opt/local/lib'
|
||||
|
@ -430,8 +436,8 @@ class Builder:
|
|||
, "--define", "_tmppath %s" % self.tmppathDir
|
||||
#, "--define", "_enable_debug_packages 0"
|
||||
, "--with", "binarytar" ]
|
||||
if self._devtoolset2 == True:
|
||||
command += [ "--define", "scl devtoolset-2" ]
|
||||
if self._devtoolset:
|
||||
command += [ "--define", "scl devtoolset-%d"%self._devtoolset ]
|
||||
command += [ "-ba", "--clean", rpmSpecFile ]
|
||||
|
||||
self._execute ( command, "Rebuild rpm packages" )
|
||||
|
|
|
@ -142,7 +142,7 @@ class CompileWidget ( QWidget ):
|
|||
#if self.options.svnUpdate: command += [ '--svn-update' ]
|
||||
#if self.options.svnStatus: command += [ '--svn-update' ]
|
||||
if self.options.enableDoc: command += [ '--doc' ]
|
||||
if self.options.devtoolset2: command += [ '--devtoolset-2' ]
|
||||
if self.options.devtoolset: command += [ '--devtoolset-8' ]
|
||||
if self.options.qt5: command += [ '--qt5' ]
|
||||
if self.options.noCache: command += [ '--no-cache' ]
|
||||
if self.options.rmBuild: command += [ '--rm-build' ]
|
||||
|
|
|
@ -65,7 +65,7 @@ class OptionsWidget ( QWidget ):
|
|||
#self._svnStatus = QCheckBox( 'SVN Status' )
|
||||
self._make = QCheckBox( 'Build' )
|
||||
self._enableDoc = QCheckBox( 'Build Documentation' )
|
||||
self._devtoolset2 = QCheckBox( 'Build with devtoolset 2' )
|
||||
self._devtoolset = QCheckBox( 'Build with devtoolset 8' )
|
||||
self._qt5 = QCheckBox( 'Build with Qt 5 (Qt 4 default)' )
|
||||
self._noCache = QCheckBox( 'Remove previous CMake cache' )
|
||||
self._rmBuild = QCheckBox( 'Cleanup Build Directory' )
|
||||
|
@ -91,7 +91,7 @@ class OptionsWidget ( QWidget ):
|
|||
vLayout = QVBoxLayout()
|
||||
vLayout.addWidget( self._buildMode )
|
||||
vLayout.addWidget( self._enableDoc )
|
||||
vLayout.addWidget( self._devtoolset2 )
|
||||
vLayout.addWidget( self._devtoolset )
|
||||
vLayout.addWidget( self._qt5 )
|
||||
vLayout.addWidget( self._noCache )
|
||||
vLayout.addWidget( self._rmBuild )
|
||||
|
@ -130,7 +130,7 @@ class OptionsWidget ( QWidget ):
|
|||
#def _getSvnStatus ( self ): return self._svnStatus.isChecked()
|
||||
def _getMake ( self ): return self._make.isChecked()
|
||||
def _getEnableDoc ( self ): return self._enableDoc.isChecked()
|
||||
def _getDevtoolset2 ( self ): return self._devtoolset2.isChecked()
|
||||
def _getDevtoolset ( self ): return self._devtoolset.isChecked()
|
||||
def _getQt5 ( self ): return self._qt5.isChecked()
|
||||
def _getNoCache ( self ): return self._noCache.isChecked()
|
||||
def _getRmBuild ( self ): return self._rmBuild.isChecked()
|
||||
|
@ -143,7 +143,7 @@ class OptionsWidget ( QWidget ):
|
|||
#svnStatus = property( _getSvnStatus )
|
||||
make = property( _getMake )
|
||||
enableDoc = property( _getEnableDoc )
|
||||
devtoolset2 = property( _getDevtoolset2 )
|
||||
devtoolset = property( _getDevtoolset )
|
||||
qt5 = property( _getQt5 )
|
||||
noCache = property( _getNoCache )
|
||||
rmBuild = property( _getRmBuild )
|
||||
|
@ -156,7 +156,7 @@ class OptionsWidget ( QWidget ):
|
|||
#self._svnStatus .setChecked( settings.value('builder/svnStatus').toBool() )
|
||||
self._make .setChecked( settings.value('builder/make' ).toBool() )
|
||||
self._enableDoc .setChecked( settings.value('builder/enableDoc').toBool() )
|
||||
self._devtoolset2.setChecked( settings.value('builder/devtoolset2').toBool() )
|
||||
self._devtoolset .setChecked( settings.value('builder/devtoolset').toBool() )
|
||||
self._qt5 .setChecked( settings.value('builder/qt5').toBool() )
|
||||
self._noCache .setChecked( settings.value('builder/noCache' ).toBool() )
|
||||
self._rmBuild .setChecked( settings.value('builder/rmBuild' ).toBool() )
|
||||
|
@ -180,7 +180,7 @@ class OptionsWidget ( QWidget ):
|
|||
#settings.setValue('builder/svnStatus' , self._svnStatus .isChecked() )
|
||||
settings.setValue('builder/make' , self._make .isChecked() )
|
||||
settings.setValue('builder/enableDoc' , self._enableDoc .isChecked() )
|
||||
settings.setValue('builder/devtoolset2', self._devtoolset2.isChecked() )
|
||||
settings.setValue('builder/devtoolset', self._devtoolset.isChecked() )
|
||||
settings.setValue('builder/qt5' , self._qt5 .isChecked() )
|
||||
settings.setValue('builder/buildMode' , self._buildMode .currentText() )
|
||||
settings.setValue('builder/noCache' , self._noCache .isChecked() )
|
||||
|
|
|
@ -208,7 +208,7 @@ parser.add_option ( "--no-build" , action="store_true" ,
|
|||
parser.add_option ( "--no-cache" , action="store_true" , dest="noCache" , help="Remove previous CMake cache before building." )
|
||||
parser.add_option ( "--rm-build" , action="store_true" , dest="rmBuild" , help="Remove previous build directoty before building." )
|
||||
parser.add_option ( "--macports" , action="store_true" , dest="macports" , help="Build against MacPorts." )
|
||||
parser.add_option ( "--devtoolset-2" , action="store_true" , dest="devtoolset2" , help="Build against TUV Dev Toolset 2." )
|
||||
parser.add_option ( "--devtoolset" , action="store" , type="int" , dest="devtoolset" , help="Build against TUV Dev Toolset 8." )
|
||||
parser.add_option ( "--qt5" , action="store_true" , dest="qt5" , help="Build against Qt 5 (default: Qt 4)." )
|
||||
parser.add_option ( "--openmp" , action="store_true" , dest="openmp" , help="Enable the use of OpenMP in Gcc." )
|
||||
parser.add_option ( "--ninja" , action="store_true" , dest="ninja" , help="Use Ninja instead of UNIX Makefile." )
|
||||
|
@ -286,7 +286,7 @@ else:
|
|||
if options.ninja: builder.ninja = True
|
||||
if options.clang: builder.clang = True
|
||||
if options.macports: builder.macports = True
|
||||
if options.devtoolset2: builder.devtoolset2 = True
|
||||
if options.devtoolset: builder.devtoolset = options.devtoolset
|
||||
if options.qt5: builder.qt5 = True
|
||||
if options.openmp: builder.openmp = True
|
||||
if options.makeArguments: builder.makeArguments = options.makeArguments
|
||||
|
|
|
@ -85,8 +85,8 @@
|
|||
set(ADDTIONAL_FLAGS "")
|
||||
set(CXX_STANDARD "c++11")
|
||||
endif()
|
||||
set(CMAKE_C_FLAGS_DEBUG "-std=${CXX_STANDARD} -Wall ${ADDTIONAL_FLAGS} ${DEBUG_FLAGS}" CACHE STRING "C Compiler Debug options." FORCE)
|
||||
set(CMAKE_C_FLAGS_RELEASE "-std=${CXX_STANDARD} -Wall -O2 ${ADDTIONAL_FLAGS} -DNDEBUG" CACHE STRING "C Compiler Release options." FORCE)
|
||||
set(CMAKE_C_FLAGS_DEBUG " -Wall ${ADDTIONAL_FLAGS} ${DEBUG_FLAGS}" CACHE STRING "C Compiler Debug options." FORCE)
|
||||
set(CMAKE_C_FLAGS_RELEASE " -Wall -O2 ${ADDTIONAL_FLAGS} -DNDEBUG" CACHE STRING "C Compiler Release options." FORCE)
|
||||
set(CMAKE_CXX_FLAGS_DEBUG "-std=${CXX_STANDARD} -Wall ${ADDTIONAL_FLAGS} ${DEBUG_FLAGS}" CACHE STRING "C++ Compiler Debug options." FORCE)
|
||||
set(CMAKE_CXX_FLAGS_RELEASE "-std=${CXX_STANDARD} -Wall -O2 ${ADDTIONAL_FLAGS} -DNDEBUG" CACHE STRING "C++ Compiler Release options." FORCE)
|
||||
|
||||
|
@ -294,10 +294,10 @@
|
|||
#
|
||||
macro(setup_sysconfdir INSTALLDIR)
|
||||
message("-- Checking installation directory <${INSTALLDIR}>")
|
||||
string(REGEX MATCH "^/opt/rh/devtoolset-2/root/usr$" IS_OPT_RH ${INSTALLDIR})
|
||||
string(REGEX MATCH "^/opt/rh/devtoolset-[0-9]+/root" IS_OPT_RH ${INSTALLDIR})
|
||||
if(IS_OPT_RH)
|
||||
message("-- Using devtoolset-2 install tree /opt/rh/devtoolset-2/root/etc.")
|
||||
set(SYS_CONF_DIR "/opt/rh/devtoolset-2/root/etc" CACHE STRING "System configuration directory (/etc)" FORCE)
|
||||
message("-- Using devtoolset-X install tree ${IS_OPT_RH}/etc.")
|
||||
set(SYS_CONF_DIR ${IS_OPT_RH} CACHE STRING "System configuration directory (/etc)" FORCE)
|
||||
else()
|
||||
string(REGEX MATCH "^/usr$" IS_USR ${INSTALLDIR})
|
||||
string(REGEX MATCH "^/opt$" IS_OPT ${INSTALLDIR})
|
||||
|
|
|
@ -41,7 +41,7 @@ def scrubPath ( pathName ):
|
|||
|
||||
|
||||
def guessOs ():
|
||||
useDevtoolset2 = False
|
||||
useDevtoolset = False
|
||||
osSlsoc7x_64 = re.compile (".*Linux.*el7.*x86_64.*")
|
||||
osSlsoc6x_64 = re.compile (".*Linux.*el6.*x86_64.*")
|
||||
osSlsoc6x = re.compile (".*Linux.*(el|slsoc)6.*")
|
||||
|
@ -74,10 +74,10 @@ def guessOs ():
|
|||
elif osSlsoc6x_64.match(lines[0]):
|
||||
osType = "Linux.slsoc6x_64"
|
||||
libDir = "lib64"
|
||||
useDevtoolset2 = True
|
||||
useDevtoolset = True
|
||||
elif osSlsoc6x.match(lines[0]):
|
||||
osType = "Linux.slsoc6x"
|
||||
useDevtoolset2 = True
|
||||
useDevtoolset = True
|
||||
elif osSLSoC5x_64.match(lines[0]):
|
||||
osType = "Linux.SLSoC5x_64"
|
||||
libDir = "lib64"
|
||||
|
@ -132,12 +132,12 @@ def guessOs ():
|
|||
print " (using: \"%s\")" % osType
|
||||
|
||||
ldLibraryPath = os.getenv('LD_LIBRARY_PATH')
|
||||
if ldLibraryPath and 'devtoolset' in ldLibraryPath: useDevtoolset2 = False
|
||||
if ldLibraryPath and 'devtoolset' in ldLibraryPath: useDevtoolset = False
|
||||
|
||||
if libDir == 'lib64' and not os.path.exists('/usr/lib64'):
|
||||
libDir = 'lib'
|
||||
|
||||
return (osType,libDir,useDevtoolset2)
|
||||
return (osType,libDir,useDevtoolset)
|
||||
|
||||
|
||||
def guessShell ():
|
||||
|
@ -170,7 +170,7 @@ def guessShell ():
|
|||
|
||||
if __name__ == "__main__":
|
||||
|
||||
osType,libDir,useDevtoolset2 = guessOs()
|
||||
osType,libDir,useDevtoolset = guessOs()
|
||||
buildType = "Release"
|
||||
linkType = "Shared"
|
||||
rootDir = None
|
||||
|
@ -226,6 +226,8 @@ if __name__ == "__main__":
|
|||
|
||||
# 'setenv STRATUS_MAPPING_NAME "%(SYSCONF_DIR)s/stratus2sxlib.xml";' \
|
||||
|
||||
reDevtoolset = re.compile( r'/opt/rh/devtoolset-(?P<version>\d+)/root/etc/coriolis2.*' )
|
||||
|
||||
buildDir = buildType + "." + linkType
|
||||
scriptDir = os.path.dirname ( os.path.abspath(__file__) )
|
||||
#print "echo \"Script Location: %s\";" % scriptDir,
|
||||
|
@ -233,10 +235,13 @@ if __name__ == "__main__":
|
|||
coriolisTop = "/usr"
|
||||
sysconfDir = scriptDir
|
||||
shellMessage = "Using system-wide Coriolis 2 (/usr)"
|
||||
elif scriptDir.startswith("/opt/rh/devtoolset-2/root/etc/coriolis2"):
|
||||
coriolisTop = "/opt/rh/devtoolset-2/root/usr"
|
||||
else:
|
||||
m = reDevtoolset.match( scriptDir )
|
||||
if m:
|
||||
coriolisTop = "/opt/rh/devtoolset-%d/root/usr" % m.group('version')
|
||||
sysconfDir = scriptDir
|
||||
shellMessage = "Using system-wide devtoolset-2 Coriolis 2 (/opt/rh/devtoolset-2/root/usr)"
|
||||
shellMessage = "Using system-wide devtoolset-%(v)d Coriolis 2 (/opt/rh/devtoolset-%(v)d/root/usr)" \
|
||||
% { 'v':m.group('version') }
|
||||
elif scriptDir.startswith(os.getenv("HOME")+"/nightly/coriolis-2.x/"):
|
||||
rootDir = os.getenv("HOME") + "/nightly/coriolis-2.x"
|
||||
coriolisTop = "%s/%s/%s/install" % ( rootDir, osType, buildDir )
|
||||
|
@ -304,10 +309,10 @@ if __name__ == "__main__":
|
|||
if isBourneShell: shellScript = shellScriptSh
|
||||
else: shellScript = shellScriptCsh
|
||||
|
||||
if useDevtoolset2:
|
||||
if useDevtoolset:
|
||||
shellScript += \
|
||||
' echo "Launching a devtoolset-2 subshell though scl (CTRL+D to exit).";' \
|
||||
' scl enable devtoolset-2 %(SHELL)s'
|
||||
' echo "Launching a devtoolset-8 subshell though scl (CTRL+D to exit).";' \
|
||||
' scl enable devtoolset-8 %(SHELL)s'
|
||||
|
||||
evalScript = shellScript % { "PATH" : strippedPath
|
||||
, "LD_LIBRARY_PATH" : strippedLibraryPath
|
||||
|
|
|
@ -499,11 +499,11 @@ try:
|
|||
[ ( conf.targets['SL7_64'], buildCommand % (3,conf.debugArg) , conf.fds['build' ] )
|
||||
, ( conf.targets['SL7_64'], buildCommand % (1,conf.debugArg+' --doc') , conf.fds['build' ] )
|
||||
, ( conf.targets['SL7_64'], benchsCommand , conf.fds['benchs'] )
|
||||
, ( conf.targets['SL6_64'], buildCommand % (6,conf.debugArg+' --devtoolset-2') , conf.fds['build' ] )
|
||||
, ( conf.targets['SL6_64'], buildCommand % (1,conf.debugArg+' --devtoolset-2 --doc'), conf.fds['build' ] )
|
||||
, ( conf.targets['SL6_64'], buildCommand % (6,conf.debugArg+' --devtoolset-8') , conf.fds['build' ] )
|
||||
, ( conf.targets['SL6_64'], buildCommand % (1,conf.debugArg+' --devtoolset-8 --doc'), conf.fds['build' ] )
|
||||
, ( conf.targets['SL6_64'], benchsCommand , conf.fds['benchs'] )
|
||||
, ( conf.targets['SL6'] , buildCommand % (2,conf.debugArg+' --devtoolset-2') , conf.fds['build' ] )
|
||||
, ( conf.targets['SL6'] , buildCommand % (1,conf.debugArg+' --devtoolset-2 --doc'), conf.fds['build' ] )
|
||||
, ( conf.targets['SL6'] , buildCommand % (2,conf.debugArg+' --devtoolset-8') , conf.fds['build' ] )
|
||||
, ( conf.targets['SL6'] , buildCommand % (1,conf.debugArg+' --devtoolset-8 --doc'), conf.fds['build' ] )
|
||||
, ( conf.targets['SL6'] , benchsCommand , conf.fds['benchs'] )
|
||||
]
|
||||
|
||||
|
|
|
@ -23,6 +23,7 @@
|
|||
find_package(PythonSitePackages REQUIRED)
|
||||
find_package(LEFDEF REQUIRED)
|
||||
find_package(VLSISAPD REQUIRED)
|
||||
find_package(FLUTE REQUIRED)
|
||||
find_package(HURRICANE REQUIRED)
|
||||
find_package(CORIOLIS REQUIRED)
|
||||
find_package(ANABATIC REQUIRED)
|
||||
|
|
|
@ -85,6 +85,7 @@
|
|||
${CONFIGURATION_LIBRARY}
|
||||
${CIF_LIBRARY}
|
||||
${AGDS_LIBRARY}
|
||||
${FLUTE_LIBRARIES}
|
||||
${LEFDEF_LIBRARIES}
|
||||
${OA_LIBRARIES}
|
||||
${QWT_LIBRARY}
|
||||
|
|
|
@ -2,6 +2,7 @@
|
|||
#include "coloquinte/legalizer.hxx"
|
||||
#include "coloquinte/optimization_subproblems.hxx"
|
||||
|
||||
#include <iostream>
|
||||
#include <algorithm>
|
||||
#include <cmath>
|
||||
#include <queue>
|
||||
|
@ -272,7 +273,8 @@ std::vector<cell_leg_properties> good_legalize(
|
|||
}
|
||||
else{
|
||||
// If it is a fixed cell, we use fixed locations
|
||||
throw std::runtime_error("I don't handle fucking macros\n");
|
||||
std::cerr << "cell.nbr_rows:" << cell.nbr_rows << std::endl;
|
||||
throw std::runtime_error("I don't handle fucking macros (good_legalize)\n");
|
||||
}
|
||||
};
|
||||
|
||||
|
@ -330,7 +332,7 @@ std::vector<cell_leg_properties> good_legalize(
|
|||
}
|
||||
}
|
||||
else{
|
||||
throw std::runtime_error("I don't handle fucking macros\n");
|
||||
throw std::runtime_error("I don't handle fucking macros (here)\n");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -0,0 +1,39 @@
|
|||
# -*- Mode:Python; explicit-buffer-name: "alliance.conf<ispd18>" -*-
|
||||
|
||||
import os
|
||||
from helpers.Alliance import AddMode
|
||||
from helpers.Alliance import Gauge
|
||||
|
||||
|
||||
allianceTop = None
|
||||
if os.environ.has_key('ALLIANCE_TOP'):
|
||||
allianceTop = os.environ['ALLIANCE_TOP']
|
||||
if not os.path.isdir(allianceTop):
|
||||
allianceTop = None
|
||||
|
||||
if not allianceTop: allianceTop = '/soc/alliance'
|
||||
|
||||
cellsTop = allianceTop+'/cells/'
|
||||
|
||||
|
||||
allianceConfig = \
|
||||
( ( 'CATALOG' , 'CATAL')
|
||||
, ( 'WORKING_LIBRARY' , '.')
|
||||
, ( 'SYSTEM_LIBRARY' , ( (cellsTop+'/nsxlib' , Environment.Append)
|
||||
, (cellsTop+'/mpxlib' , Environment.Append)) )
|
||||
, ( 'SCALE_X' , 100)
|
||||
, ( 'IN_LO' , 'vst')
|
||||
, ( 'IN_PH' , 'ap')
|
||||
, ( 'OUT_LO' , 'vst')
|
||||
, ( 'OUT_PH' , 'ap')
|
||||
, ( 'POWER' , 'vdd')
|
||||
, ( 'GROUND' , 'vss')
|
||||
, ( 'CLOCK' , '^ck.*')
|
||||
, ( 'BLOCKAGE' , '^blockage[Nn]et*')
|
||||
, ( 'PAD' , '.*_mpx$')
|
||||
# The following are only read by the Alliance tool wrappers.
|
||||
, ( 'ALLIANCE_TOP' , allianceTop)
|
||||
, ( 'MBK_TARGET_LIB' , cellsTop+'/msxlib')
|
||||
, ( 'RDS_TECHNO_NAME' , allianceTop+'/etc/scn6m_deep_09.rds')
|
||||
, ( 'GRAAL_TECHNO_NAME' , allianceTop+'/etc/graal.rds')
|
||||
)
|
|
@ -0,0 +1,10 @@
|
|||
# -*- Mode:Python; explicit-buffer-name: "analog.conf<ispd18>" -*-
|
||||
|
||||
import helpers
|
||||
|
||||
|
||||
parametersTable = \
|
||||
( ('analog.techno' , TypeString, 'Analog_technology_is_disabled',
|
||||
{ 'flags':Cfg.Parameter.Flags.NeedRestart|Cfg.Parameter.Flags.MustExist } )
|
||||
, ('analog.devices', TypeString, helpers.technoDir+'/devices.conf' )
|
||||
)
|
|
@ -0,0 +1,11 @@
|
|||
# -*- Mode:Python; explicit-buffer-name: "display.conf<ispd18>" -*-
|
||||
|
||||
import helpers
|
||||
|
||||
# Provides standard settings for:
|
||||
# - <defaultStyle>
|
||||
# - <stylesTable>
|
||||
|
||||
scale = 0.5
|
||||
|
||||
execfile( helpers.sysConfDir+'/common/display.conf' )
|
|
@ -0,0 +1,13 @@
|
|||
# -*- Mode:Python; explicit-buffer-name: "etesian.conf<ispd18>" -*-
|
||||
|
||||
import helpers
|
||||
|
||||
execfile( helpers.sysConfDir+'/common/etesian.conf' )
|
||||
|
||||
parametersTable = helpers.overload \
|
||||
( parametersTable
|
||||
, ( ('etesian.feedNames', TypeString, 'FILL' )
|
||||
, ('etesian.cell.zero', TypeString, 'missing_tie_low' )
|
||||
, ('etesian.cell.one' , TypeString, 'missing_tie_high')
|
||||
)
|
||||
)
|
|
@ -0,0 +1,5 @@
|
|||
# -*- Mode:Python; explicit-buffer-name: "hMetis.conf<ispd18>" -*-
|
||||
|
||||
import helpers
|
||||
|
||||
execfile( helpers.sysConfDir+'/common/hMetis.conf' )
|
|
@ -0,0 +1,68 @@
|
|||
# -*- Mode:Python; explicit-buffer-name: "kite.conf<ispd18>" -*-
|
||||
|
||||
import helpers
|
||||
from helpers import l, u, n
|
||||
|
||||
# Contains the layout (shared by all technologies).
|
||||
execfile( helpers.sysConfDir+'/common/kite.conf' )
|
||||
|
||||
|
||||
parametersTable = \
|
||||
( ('lefImport.minTerminalWidth' ,TypeDouble ,0.065 )
|
||||
, ("katabatic.globalLengthThreshold",TypeInt ,1450 ) # Katabatic parameters.
|
||||
, ("katabatic.saturateRatio" ,TypePercentage,90 )
|
||||
, ("katabatic.saturateRp" ,TypeInt ,10 )
|
||||
, ('katabatic.topRoutingLayer' ,TypeString , 'metal9')
|
||||
, ('anabatic.routingGauge' ,TypeString , 'ispd18')
|
||||
, ('crlcore.groundName' ,TypeString , 'VSS' )
|
||||
, ('crlcore.powerName' ,TypeString , 'VDD' )
|
||||
# Kite parameters.
|
||||
, ("kite.hTracksReservedLocal" ,TypeInt ,4 , { 'min':0, 'max':18 } )
|
||||
, ("kite.vTracksReservedLocal" ,TypeInt ,3 , { 'min':0, 'max':18 } )
|
||||
, ("kite.eventsLimit" ,TypeInt ,4000002 )
|
||||
, ("kite.ripupCost" ,TypeInt ,3 , { 'min':0 } )
|
||||
, ("kite.strapRipupLimit" ,TypeInt ,16 , { 'min':1 } )
|
||||
, ("kite.localRipupLimit" ,TypeInt ,9 , { 'min':1 } )
|
||||
, ("kite.globalRipupLimit" ,TypeInt ,5 , { 'min':1 } )
|
||||
, ("kite.longGlobalRipupLimit" ,TypeInt ,5 , { 'min':1 } )
|
||||
# Anabatic parameters are temporarily hosted here.
|
||||
, ("anabatic.edgeLength" ,TypeInt ,24 )
|
||||
, ("anabatic.edgeWidth" ,TypeInt ,4 )
|
||||
, ("anabatic.edgeCostH" ,TypeDouble ,9.0 )
|
||||
, ("anabatic.edgeCostK" ,TypeDouble ,-10.0 )
|
||||
, ("anabatic.edgeHScaling" ,TypeDouble ,1.0 )
|
||||
, ("anabatic.globalIterations" ,TypeInt ,10 , { 'min':1, 'max':100 } )
|
||||
, ("anabatic.gcell.displayMode" ,TypeEnumerate ,1
|
||||
, { 'values':( ("Boundary" , 1)
|
||||
, ("Density" , 2) ) }
|
||||
)
|
||||
)
|
||||
|
||||
|
||||
# Format of routingGaugesTable (dictionary):
|
||||
# A list of entry of the form:
|
||||
# ( METAL_NAME, (Direction, Type, depth, density, offset, pitch, wire_width, via_width, obs_dw) )
|
||||
|
||||
routingGaugesTable = {}
|
||||
|
||||
routingGaugesTable['ispd18'] = \
|
||||
( ( 'symbolic', False )
|
||||
, ( 'metal1' , ( Gauge.Horizontal, Gauge.PinOnly, 0, 0.0, u(0.095), u(0.190), u(0.060), u(0.070), u(7) ) )
|
||||
, ( 'metal2' , ( Gauge.Vertical , Gauge.Default, 1, 0.0, u(0.100), u(0.200), u(0.070), u(0.070), u(8) ) )
|
||||
, ( 'metal3' , ( Gauge.Horizontal, Gauge.Default, 2, 0.0, u(0.100), u(0.200), u(0.070), u(0.070), u(8) ) )
|
||||
, ( 'metal4' , ( Gauge.Vertical , Gauge.Default, 3, 0.0, u(0.100), u(0.200), u(0.070), u(0.070), u(8) ) )
|
||||
, ( 'metal5' , ( Gauge.Horizontal, Gauge.Default, 4, 0.0, u(0.100), u(0.200), u(0.070), u(0.070), u(8) ) )
|
||||
, ( 'metal6' , ( Gauge.Vertical , Gauge.Default, 5, 0.0, u(0.100), u(0.200), u(0.070), u(0.360), u(8) ) )
|
||||
, ( 'metal7' , ( Gauge.Horizontal, Gauge.Default, 6, 0.0, u(0.100), u(0.200), u(0.070), u(0.360), u(8) ) )
|
||||
, ( 'metal8' , ( Gauge.Vertical , Gauge.Default, 7, 0.0, u(0.100), u(0.200), u(0.070), u(0.360), u(8) ) )
|
||||
, ( 'metal9' , ( Gauge.Horizontal, Gauge.Default, 8, 0.0, u(0.475), u(0.330), u(0.070), u(0.360), u(8) ) )
|
||||
)
|
||||
|
||||
|
||||
# Format of cellGaugesTable (dictionary):
|
||||
# A list of entry of the form:
|
||||
# ( METAL_PIN, xy_common_pitch, slice_height, slice_step )
|
||||
|
||||
cellGaugesTable = {}
|
||||
cellGaugesTable['ispd18'] = ('metal2', u(0.2), u(1.71), u(0.2))
|
||||
|
|
@ -0,0 +1,5 @@
|
|||
# -*- Mode:Python; explicit-buffer-name: "mauka.conf<ispd18>" -*-
|
||||
|
||||
import helpers
|
||||
|
||||
execfile( helpers.sysConfDir+'/common/mauka.conf' )
|
|
@ -0,0 +1,9 @@
|
|||
# -*- Mode:Python; explicit-buffer-name: "misc.conf<ispd18>" -*-
|
||||
|
||||
import helpers
|
||||
|
||||
# Provides standard settings for:
|
||||
# # - <defaultStyle>
|
||||
# # - <stylesTable>
|
||||
#
|
||||
execfile( helpers.sysConfDir+'/common/misc.conf' )
|
|
@ -0,0 +1,5 @@
|
|||
# -*- Mode:Python; explicit-buffer-name: "nimbus.conf<ispd18>" -*-
|
||||
|
||||
import helpers
|
||||
|
||||
execfile( helpers.sysConfDir+'/common/nimbus.conf' )
|
|
@ -0,0 +1,5 @@
|
|||
# -*- Mode:Python; explicit-buffer-name: "patterns.conf<ispd18>" -*-
|
||||
|
||||
import helpers
|
||||
|
||||
execfile( helpers.sysConfDir+'/common/patterns.conf' )
|
|
@ -0,0 +1,27 @@
|
|||
# -*- Mode:Python; explicit-buffer-name: "plugins.conf<ispd18>" -*-
|
||||
|
||||
import helpers
|
||||
|
||||
# Contains the layout (shared by all technologies).
|
||||
#execfile( helpers.sysConfDir+'/common/plugins.conf' )
|
||||
|
||||
|
||||
# WARNING: Those values have not been adjusted yet for this technologies.
|
||||
# Must be done.
|
||||
#
|
||||
# Parameters for chip plugin.
|
||||
parametersTable = \
|
||||
( ("chip.block.rails.count" , TypeInt , 5 )
|
||||
, ("chip.block.rails.hWidth" , TypeInt , 24 )
|
||||
, ("chip.block.rails.vWidth" , TypeInt , 24 )
|
||||
, ("chip.block.rails.hSpacing" , TypeInt , 12 )
|
||||
, ("chip.block.rails.vSpacing" , TypeInt , 12 )
|
||||
, ('chip.pad.pck' , TypeString, 'pck_mpx')
|
||||
, ('chip.pad.pvddick' , TypeString, 'pvddick_mpx')
|
||||
, ('chip.pad.pvssick' , TypeString, 'pvssick_mpx')
|
||||
, ('chip.pad.pvddeck' , TypeString, 'pvddeck_mpx')
|
||||
, ('chip.pad.pvsseck' , TypeString, 'pvsseck_mpx')
|
||||
, ('clockTree.minimumSide' , TypeInt , 1000)
|
||||
, ('clockTree.buffer' , TypeString, 'buf_x2')
|
||||
, ('clockTree.placerEngine' , TypeString, 'Etesian')
|
||||
)
|
|
@ -0,0 +1,13 @@
|
|||
# -*- Mode:Python; explicit-buffer-name: "stratus1.conf<ispd18>" -*-
|
||||
|
||||
import helpers
|
||||
|
||||
|
||||
# Status1 parameters.
|
||||
parametersTable = \
|
||||
( ("stratus1.format" , TypeString, "vst")
|
||||
, ("stratus1.simulator" , TypeString, "asimut")
|
||||
,)
|
||||
|
||||
|
||||
execfile( helpers.sysConfDir+'/common/stratus1.conf' )
|
|
@ -0,0 +1,148 @@
|
|||
# -*- Mode:Python; explicit-buffer-name: "technology.conf<ispd18>" -*-
|
||||
#
|
||||
# FreePDK 45 nanometers.
|
||||
#
|
||||
# Provides standard settings for:
|
||||
# - <viewerConfig>
|
||||
# - <realLayersTable>
|
||||
# - <compositeLayersTable>
|
||||
# - <symbolicLayersTable>
|
||||
|
||||
from Hurricane import DbU
|
||||
from helpers import sysConfDir
|
||||
from helpers import l, u, n
|
||||
from helpers.Technology import initTechno
|
||||
|
||||
initTechno( { 'name' : 'ispd18'
|
||||
, 'precision' : 2
|
||||
, 'gridValue' : 0.0005
|
||||
, 'gridUnit' : DbU.UnitPowerMicro
|
||||
, 'gridsPerLambda' : 10
|
||||
, 'symbolicGridStep' : 1.0
|
||||
, 'polygonStep' : 1.0
|
||||
} )
|
||||
|
||||
# Contains the layers
|
||||
execfile( helpers.sysConfDir+'/common/technology.conf' )
|
||||
|
||||
|
||||
# Format of <layersExtensionsTable>:
|
||||
# Each entry is a pair of (string, value).
|
||||
# * string: a synthetic way to designate the real or symbolic layer on
|
||||
# which it applies, an optional sub layer (BasicLayer) in case
|
||||
# where there is more than one, and the dimension name.
|
||||
# * value : the rule (dimension) value.
|
||||
# Values/dimensions must be given using one of the following conversion
|
||||
# function:
|
||||
# * l(value) : value expressed in lambda (symbolic).
|
||||
# * u(value) : value is expressed in microns.
|
||||
# * n(value) : value is expressed in nanometers.
|
||||
|
||||
layersExtensionsTable = symbolicLayersExtensionsTable + \
|
||||
[ ('metal1.minimalSpacing' , u( 0.1 ))
|
||||
, ('metal2.minimalSpacing' , u( 0.15 ))
|
||||
, ('metal3.minimalSpacing' , u( 0.15 ))
|
||||
, ('metal4.minimalSpacing' , u( 0.15 ))
|
||||
, ('metal5.minimalSpacing' , u( 0.15 ))
|
||||
, ('metal6.minimalSpacing' , u( 0.15 ))
|
||||
, ('metal7.minimalSpacing' , u( 0.15 ))
|
||||
, ('metal8.minimalSpacing' , u( 0.15 ))
|
||||
, ('metal9.minimalSpacing' , u( 0.15 ))
|
||||
, ('metal10.minimalSpacing' , u( 0.15 ))
|
||||
|
||||
# VIAs (i.e. Metal <--> Metal) (real).
|
||||
, ('via12.minimum.side' , u(0.070))
|
||||
, ('via12.metal1.enclosure' , (u(0.030 ), u(0.0 )) )
|
||||
, ('via12.metal2.enclosure' , (u(0.0 ), u(0.030)) )
|
||||
, ('via23.minimum.side' , u(0.070 ))
|
||||
, ('via23.metal2.enclosure' , (u(0.0 ), u(0.030)) )
|
||||
, ('via23.metal3.enclosure' , (u(0.030 ), u(0.0 )) )
|
||||
, ('via34.minimum.side' , u(0.070))
|
||||
, ('via34.metal3.enclosure' , (u(0.030 ), u(0.0 )) )
|
||||
, ('via34.metal4.enclosure' , (u(0.0 ), u(0.030)) )
|
||||
, ('via45.minimum.side' , u(0.070 ))
|
||||
, ('via45.metal4.enclosure' , (u(0.0 ), u(0.030)) )
|
||||
, ('via45.metal5.enclosure' , (u(0.030 ), u(0.0 )) )
|
||||
, ('via56.minimum.side' , u(0.070))
|
||||
, ('via56.metal5.enclosure' , (u(0.030 ), u(0.0 )) )
|
||||
, ('via56.metal6.enclosure' , (u(0.0 ), u(0.030)) )
|
||||
, ('via67.minimum.side' , u(0.360))
|
||||
, ('via67.metal6.enclosure' , (u(0.02 ), u(0.08 )) )
|
||||
, ('via67.metal7.enclosure' , (u(0.08 ), u(0.02 )) )
|
||||
, ('via78.minimum.side' , u(0.360))
|
||||
, ('via78.metal7.enclosure' , (u(0.08 ), u(0.02 )) )
|
||||
, ('via78.metal8.enclosure' , (u(0.02 ), u(0.08 )) )
|
||||
, ('via89.minimum.side' , u(0.360))
|
||||
, ('via89.metal8.enclosure' , (u(0.02 ), u(0.08 )) )
|
||||
, ('via89.metal9.enclosure' , (u(0.08 ), u(0.02 )) )
|
||||
]
|
||||
|
||||
|
||||
# Table guessed from the Cadence configuration files:
|
||||
# FreePDK45/ncsu_basekit/techfile/FreePDK45.tf
|
||||
#
|
||||
# Format of an entry in the table:
|
||||
# (Symbolic_Name, CIF_Name, GDSII_Number)
|
||||
#gdsLayersTable = \
|
||||
# ( ("pWell" , "CWN" , 2, 0)
|
||||
# , ("nWell" , "CWP" , 3, 0)
|
||||
# , ("active" , "CAA" , 1, 0)
|
||||
# , ("pImplant", "CSP" , 5, 0)
|
||||
# , ("nImplant", "CSN" , 4, 0)
|
||||
# , ("poly" , "CPG" , 9, 0)
|
||||
# , ("cut0" , "CCC" , 10, 0)
|
||||
# , ("metal1" , "CM1" , 11, 0)
|
||||
# , ("cut1" , "CV1" , 12, 0)
|
||||
# , ("metal2" , "CM2" , 13, 0)
|
||||
# , ("cut2" , "CV2" , 14, 0)
|
||||
# , ("metal3" , "CM3" , 15, 0)
|
||||
# , ("cut3" , "CV3" , 16, 0)
|
||||
# , ("metal4" , "CM4" , 17, 0)
|
||||
# , ("cut4" , "CV4" , 18, 0)
|
||||
# , ("metal5" , "CM5" , 19, 0)
|
||||
# , ("cut5" , "CV5" , 20, 0)
|
||||
# , ("metal6" , "CM6" , 21, 0)
|
||||
# , ("cut6" , "CV6" , 22, 0)
|
||||
# , ("metal7" , "CM7" , 23, 0)
|
||||
# , ("cut7" , "CV7" , 24, 0)
|
||||
# , ("metal8" , "CM8" , 25, 0)
|
||||
# , ("cut8" , "CV8" , 26, 0)
|
||||
# , ("metal9" , "CM9" , 27, 0)
|
||||
# , ("cut9" , "CV9" , 28, 0)
|
||||
# , ("metal10" , "CM10" , 29, 0)
|
||||
# )
|
||||
|
||||
|
||||
# Table guessed from the GDSII layouts of the cells.
|
||||
# FreePDK45/osu_soc/lib/source/gds/*.gds
|
||||
#
|
||||
# Format of an entry in the table:
|
||||
# (Symbolic_Name, CIF_Name, GDSII_Number)
|
||||
gdsLayersTable = \
|
||||
( ("pWell" , "CWN" , 2, 0)
|
||||
, ("nWell" , "CWP" , 1, 0)
|
||||
, ("active" , "CAA" , 5, 0)
|
||||
, ("pImplant", "CSP" , 8, 0)
|
||||
, ("nImplant", "CSN" , 7, 0)
|
||||
, ("poly" , "CPG" , 15, 0)
|
||||
, ("cut0" , "CCC" , 16, 0)
|
||||
, ("metal1" , "CM1" , 21, 0)
|
||||
, ("cut1" , "CV1" , 22, 0)
|
||||
, ("metal2" , "CM2" , 23, 0)
|
||||
, ("cut2" , "CV2" , 24, 0)
|
||||
, ("metal3" , "CM3" , 25, 0)
|
||||
, ("cut3" , "CV3" , 26, 0)
|
||||
, ("metal4" , "CM4" , 27, 0)
|
||||
, ("cut4" , "CV4" , 28, 0)
|
||||
, ("metal5" , "CM5" , 29, 0)
|
||||
, ("cut5" , "CV5" , 30, 0)
|
||||
, ("metal6" , "CM6" , 31, 0)
|
||||
, ("cut6" , "CV6" , 32, 0)
|
||||
, ("metal7" , "CM7" , 33, 0)
|
||||
, ("cut7" , "CV7" , 34, 0)
|
||||
, ("metal8" , "CM8" , 35, 0)
|
||||
, ("cut8" , "CV8" , 36, 0)
|
||||
, ("metal9" , "CM9" , 37, 0)
|
||||
, ("cut9" , "CV9" , 38, 0)
|
||||
, ("metal10" , "CM10" , 39, 0)
|
||||
)
|
|
@ -403,7 +403,7 @@ stylesTable = \
|
|||
, (Drawing, 'gmetalh' , { 'color':'128,255,200', 'pattern':'light_antihash0.8' , 'border':1 })
|
||||
, (Drawing, 'gmetalv' , { 'color':'200,200,255', 'pattern':'light_antihash1.8' , 'border':1 })
|
||||
, (Drawing, 'gcut' , { 'color':'255,255,190', 'border':1 })
|
||||
, (Drawing, 'Anabatic::Edge' , { 'color':'255,255,190', 'pattern':'0000000000000000', 'border':4 })
|
||||
, (Drawing, 'Anabatic::GCell', { 'color':'255,255,190', 'pattern':'0000000000000000', 'border':4 })
|
||||
, (Drawing, 'Anabatic::Edge' , { 'color':'255,255,190', 'pattern':'0000000000000000', 'border':2 })
|
||||
, (Drawing, 'Anabatic::GCell', { 'color':'Black' , 'pattern':'0000000000000000', 'border':2, 'threshold':0.80*scale })
|
||||
)
|
||||
)
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
# -*- Mode:Python; explicit-buffer-name: "analog.conf<common>" -*-
|
||||
# -*- Mode:Python; explicit-buffer-name: "analog.conf<cmos>" -*-
|
||||
|
||||
import helpers
|
||||
|
||||
|
|
|
@ -13,7 +13,6 @@ parametersTable = \
|
|||
, ("katabatic.saturateRatio" ,TypePercentage,80 )
|
||||
, ("katabatic.saturateRp" ,TypeInt ,8 )
|
||||
, ('katabatic.topRoutingLayer' ,TypeString , 'METAL5')
|
||||
, ('anabatic.routingGauge' ,TypeString , 'sxlib' )
|
||||
# Kite parameters.
|
||||
, ("kite.hTracksReservedLocal" ,TypeInt ,3 , { 'min':0, 'max':20 } )
|
||||
, ("kite.vTracksReservedLocal" ,TypeInt ,3 , { 'min':0, 'max':20 } )
|
||||
|
@ -23,17 +22,31 @@ parametersTable = \
|
|||
, ("kite.localRipupLimit" ,TypeInt ,9 , { 'min':1 } )
|
||||
, ("kite.globalRipupLimit" ,TypeInt ,5 , { 'min':1 } )
|
||||
, ("kite.longGlobalRipupLimit" ,TypeInt ,5 , { 'min':1 } )
|
||||
# Anabatic parameters are temporarily hosted here.
|
||||
# Anabatic & Katana parameters are temporarily hosted here.
|
||||
, ('anabatic.routingGauge' ,TypeString , 'sxlib' )
|
||||
, ("anabatic.globalLengthThreshold" ,TypeInt ,1450 )
|
||||
, ("anabatic.saturateRatio" ,TypePercentage,80 )
|
||||
, ("anabatic.saturateRp" ,TypeInt ,8 )
|
||||
, ('anabatic.topRoutingLayer' ,TypeString , 'METAL5')
|
||||
, ("anabatic.edgeLength" ,TypeInt ,24 )
|
||||
, ("anabatic.edgeWidth" ,TypeInt ,4 )
|
||||
, ("anabatic.edgeCostH" ,TypeDouble ,9.0 )
|
||||
, ("anabatic.edgeCostK" ,TypeDouble ,-10.0 )
|
||||
, ("anabatic.edgeCostH" ,TypeDouble ,19.0 )
|
||||
, ("anabatic.edgeCostK" ,TypeDouble ,-60.0 )
|
||||
, ("anabatic.edgeHScaling" ,TypeDouble ,1.0 )
|
||||
, ("anabatic.globalIterations" ,TypeInt ,10 , { 'min':1, 'max':100 } )
|
||||
, ("anabatic.gcell.displayMode" ,TypeEnumerate ,1
|
||||
, { 'values':( ("Boundary" , 1)
|
||||
, ("Density" , 2) ) }
|
||||
)
|
||||
, ("katana.hTracksReservedLocal" ,TypeInt ,3 , { 'min':0, 'max':20 } )
|
||||
, ("katana.vTracksReservedLocal" ,TypeInt ,3 , { 'min':0, 'max':20 } )
|
||||
, ("katana.eventsLimit" ,TypeInt ,4000002 )
|
||||
, ("katana.ripupCost" ,TypeInt ,3 , { 'min':0 } )
|
||||
, ("katana.strapRipupLimit" ,TypeInt ,16 , { 'min':1 } )
|
||||
, ("katana.localRipupLimit" ,TypeInt ,9 , { 'min':1 } )
|
||||
, ("katana.globalRipupLimit" ,TypeInt ,5 , { 'min':1 } )
|
||||
, ("katana.longGlobalRipupLimit" ,TypeInt ,5 , { 'min':1 } )
|
||||
, ('chip.padCoreSide' ,TypeString ,'South' )
|
||||
)
|
||||
|
||||
|
||||
|
@ -65,3 +78,4 @@ routingGaugesTable['sxlib-2M'] = \
|
|||
|
||||
cellGaugesTable = {}
|
||||
cellGaugesTable['sxlib'] = ('metal2', l(5.0), l( 50.0), l( 5.0))
|
||||
cellGaugesTable['pxlib'] = ('metal2', l(5.0), l(400.0), l(200.0))
|
||||
|
|
|
@ -14,7 +14,7 @@ from helpers.Technology import initTechno
|
|||
# - <compositeLayersTable>
|
||||
# - <symbolicLayersTable>
|
||||
|
||||
initTechno( { 'name' : 'cmos'
|
||||
initTechno( { 'name' : 'cmos45'
|
||||
, 'precision' : 2
|
||||
, 'gridValue' : 0.005
|
||||
, 'gridUnit' : DbU.UnitPowerMicro
|
||||
|
|
|
@ -0,0 +1,39 @@
|
|||
# -*- Mode:Python; explicit-buffer-name: "alliance.conf<cmos45>" -*-
|
||||
|
||||
import os
|
||||
from helpers.Alliance import AddMode
|
||||
from helpers.Alliance import Gauge
|
||||
|
||||
|
||||
allianceTop = None
|
||||
if os.environ.has_key('ALLIANCE_TOP'):
|
||||
allianceTop = os.environ['ALLIANCE_TOP']
|
||||
if not os.path.isdir(allianceTop):
|
||||
allianceTop = None
|
||||
|
||||
if not allianceTop: allianceTop = '/soc/alliance'
|
||||
|
||||
cellsTop = allianceTop+'/cells/'
|
||||
|
||||
|
||||
allianceConfig = \
|
||||
( ( 'CATALOG' , 'CATAL')
|
||||
, ( 'WORKING_LIBRARY' , '.')
|
||||
, ( 'SYSTEM_LIBRARY' , ( (cellsTop+'/nsxlib' , Environment.Append)
|
||||
, (cellsTop+'/mpxlib' , Environment.Append)) )
|
||||
, ( 'SCALE_X' , 100)
|
||||
, ( 'IN_LO' , 'vst')
|
||||
, ( 'IN_PH' , 'ap')
|
||||
, ( 'OUT_LO' , 'vst')
|
||||
, ( 'OUT_PH' , 'ap')
|
||||
, ( 'POWER' , 'vdd')
|
||||
, ( 'GROUND' , 'vss')
|
||||
, ( 'CLOCK' , '^ck.*')
|
||||
, ( 'BLOCKAGE' , '^blockage[Nn]et*')
|
||||
, ( 'PAD' , '.*_mpx$')
|
||||
# The following are only read by the Alliance tool wrappers.
|
||||
, ( 'ALLIANCE_TOP' , allianceTop)
|
||||
, ( 'MBK_TARGET_LIB' , cellsTop+'/msxlib')
|
||||
, ( 'RDS_TECHNO_NAME' , allianceTop+'/etc/scn6m_deep_09.rds')
|
||||
, ( 'GRAAL_TECHNO_NAME' , allianceTop+'/etc/graal.rds')
|
||||
)
|
|
@ -0,0 +1,6 @@
|
|||
# -*- Mode:Python; explicit-buffer-name: "analog.conf<cmos45>" -*-
|
||||
|
||||
import helpers
|
||||
|
||||
|
||||
execfile( helpers.ndaConfDir+'/common/analog.conf' )
|
|
@ -0,0 +1,6 @@
|
|||
# -*- Mode:Python; explicit-buffer-name: "devices.conf<cmos45>" -*-
|
||||
|
||||
import helpers
|
||||
|
||||
|
||||
execfile( helpers.ndaConfDir+'/common/devices.conf' )
|
|
@ -0,0 +1,11 @@
|
|||
# -*- Mode:Python; explicit-buffer-name: "display.conf<cmos45>" -*-
|
||||
|
||||
import helpers
|
||||
|
||||
# Provides standard settings for:
|
||||
# - <defaultStyle>
|
||||
# - <stylesTable>
|
||||
|
||||
scale = 0.5
|
||||
|
||||
execfile( helpers.sysConfDir+'/common/display.conf' )
|
|
@ -0,0 +1,5 @@
|
|||
# -*- Mode:Python; explicit-buffer-name: "etesian.conf<cmos45>" -*-
|
||||
|
||||
import helpers
|
||||
|
||||
execfile( helpers.sysConfDir+'/common/etesian.conf' )
|
|
@ -0,0 +1,5 @@
|
|||
# -*- Mode:Python; explicit-buffer-name: "hMetis.conf<cmos45>" -*-
|
||||
|
||||
import helpers
|
||||
|
||||
execfile( helpers.sysConfDir+'/common/hMetis.conf' )
|
|
@ -0,0 +1,68 @@
|
|||
# -*- Mode:Python; explicit-buffer-name: "kite.conf<cmos45>" -*-
|
||||
|
||||
import helpers
|
||||
from helpers import l, u, n
|
||||
|
||||
# Contains the layout (shared by all technologies).
|
||||
execfile( helpers.sysConfDir+'/common/kite.conf' )
|
||||
|
||||
|
||||
parametersTable = \
|
||||
( ('lefImport.minTerminalWidth' ,TypeDouble ,0.0 )
|
||||
, ("katabatic.globalLengthThreshold",TypeInt ,1450 ) # Katabatic parameters.
|
||||
, ("katabatic.saturateRatio" ,TypePercentage,80 )
|
||||
, ("katabatic.saturateRp" ,TypeInt ,8 )
|
||||
, ('katabatic.topRoutingLayer' ,TypeString , 'METAL6')
|
||||
# Kite parameters.
|
||||
, ("kite.hTracksReservedLocal" ,TypeInt ,4 , { 'min':0, 'max':18 } )
|
||||
, ("kite.vTracksReservedLocal" ,TypeInt ,3 , { 'min':0, 'max':18 } )
|
||||
, ("kite.eventsLimit" ,TypeInt ,4000002 )
|
||||
, ("kite.ripupCost" ,TypeInt ,3 , { 'min':0 } )
|
||||
, ("kite.strapRipupLimit" ,TypeInt ,16 , { 'min':1 } )
|
||||
, ("kite.localRipupLimit" ,TypeInt ,9 , { 'min':1 } )
|
||||
, ("kite.globalRipupLimit" ,TypeInt ,5 , { 'min':1 } )
|
||||
, ("kite.longGlobalRipupLimit" ,TypeInt ,5 , { 'min':1 } )
|
||||
# Anabatic parameters are temporarily hosted here.
|
||||
, ("anabatic.routingGauge" ,TypeString ,'msxlib' )
|
||||
, ("anabatic.edgeLength" ,TypeInt ,48 )
|
||||
, ("anabatic.edgeWidth" ,TypeInt ,8 )
|
||||
, ("anabatic.edgeCostH" ,TypeDouble ,19.0 )
|
||||
, ("anabatic.edgeCostK" ,TypeDouble ,-60.0 )
|
||||
, ("anabatic.edgeHInc" ,TypeDouble ,1.0 )
|
||||
, ("anabatic.edgeHScaling" ,TypeDouble ,1.0 )
|
||||
, ("anabatic.globalIterations" ,TypeInt ,20 , { 'min':1, 'max':100 } )
|
||||
, ("anabatic.gcell.displayMode" ,TypeEnumerate ,1
|
||||
, { 'values':( ("Boundary" , 1)
|
||||
, ("Density" , 2) ) }
|
||||
)
|
||||
)
|
||||
|
||||
|
||||
# Format of routingGaugesTable (dictionary):
|
||||
# A list of entry of the form:
|
||||
# ( METAL_NAME, (Direction, Type, depth, density, offset, pitch, wire_width, via_width, obs_dw) )
|
||||
|
||||
routingGaugesTable = {}
|
||||
|
||||
routingGaugesTable['msxlib'] = \
|
||||
( ( 'METAL1' , ( Gauge.Vertical , Gauge.PinOnly, 0, 0.0, l(0), l(10), l(3), l(2), l(7) ) )
|
||||
, ( 'METAL2' , ( Gauge.Horizontal, Gauge.Default, 1, 0.0, l(0), l(10), l(3), l(2), l(8) ) )
|
||||
, ( 'METAL3' , ( Gauge.Vertical , Gauge.Default, 2, 0.0, l(0), l(10), l(3), l(2), l(8) ) )
|
||||
, ( 'METAL4' , ( Gauge.Horizontal, Gauge.Default, 3, 0.0, l(0), l(20), l(6), l(4), l(8) ) )
|
||||
, ( 'METAL5' , ( Gauge.Vertical , Gauge.Default, 4, 0.0, l(0), l(20), l(6), l(4), l(8) ) )
|
||||
, ( 'METAL6' , ( Gauge.Horizontal, Gauge.Default, 5, 0.0, l(0), l(20), l(6), l(4), l(8) ) )
|
||||
)
|
||||
|
||||
routingGaugesTable['msxlib-2M'] = \
|
||||
( ( 'METAL1', ( Gauge.Horizontal, Gauge.Default, 0, 0.0, l(0), l(10), l(3), l(3), l(7) ) )
|
||||
, ( 'METAL2', ( Gauge.Vertical , Gauge.Default, 1, 0.0, l(0), l(10), l(3), l(3), l(8) ) )
|
||||
)
|
||||
|
||||
|
||||
# Format of cellGaugesTable (dictionary):
|
||||
# A list of entry of the form:
|
||||
# ( METAL_PIN, xy_common_pitch, slice_height, slice_step )
|
||||
|
||||
cellGaugesTable = {}
|
||||
cellGaugesTable['msxlib'] = ('metal2', l(10), l(100), l(10))
|
||||
|
|
@ -0,0 +1,5 @@
|
|||
# -*- Mode:Python; explicit-buffer-name: "mauka.conf<cmos45>" -*-
|
||||
|
||||
import helpers
|
||||
|
||||
execfile( helpers.sysConfDir+'/common/mauka.conf' )
|
|
@ -0,0 +1,9 @@
|
|||
# -*- Mode:Python; explicit-buffer-name: "misc.conf<cmos45>" -*-
|
||||
|
||||
import helpers
|
||||
|
||||
# Provides standard settings for:
|
||||
# # - <defaultStyle>
|
||||
# # - <stylesTable>
|
||||
#
|
||||
execfile( helpers.sysConfDir+'/common/misc.conf' )
|
|
@ -0,0 +1,5 @@
|
|||
# -*- Mode:Python; explicit-buffer-name: "nimbus.conf<cmos45>" -*-
|
||||
|
||||
import helpers
|
||||
|
||||
execfile( helpers.sysConfDir+'/common/nimbus.conf' )
|
|
@ -0,0 +1,5 @@
|
|||
# -*- Mode:Python; explicit-buffer-name: "patterns.conf<cmos45>" -*-
|
||||
|
||||
import helpers
|
||||
|
||||
execfile( helpers.sysConfDir+'/common/patterns.conf' )
|
|
@ -0,0 +1,27 @@
|
|||
# -*- Mode:Python; explicit-buffer-name: "plugins.conf<cmos45>" -*-
|
||||
|
||||
import helpers
|
||||
|
||||
# Contains the layout (shared by all technologies).
|
||||
#execfile( helpers.sysConfDir+'/common/plugins.conf' )
|
||||
|
||||
|
||||
# WARNING: Those values have not been adjusted yet for this technologies.
|
||||
# Must be done.
|
||||
#
|
||||
# Parameters for chip plugin.
|
||||
parametersTable = \
|
||||
( ("chip.block.rails.count" , TypeInt , 5 )
|
||||
, ("chip.block.rails.hWidth" , TypeInt , 24 )
|
||||
, ("chip.block.rails.vWidth" , TypeInt , 24 )
|
||||
, ("chip.block.rails.hSpacing" , TypeInt , 12 )
|
||||
, ("chip.block.rails.vSpacing" , TypeInt , 12 )
|
||||
, ('chip.pad.pck' , TypeString, 'pck_mpx')
|
||||
, ('chip.pad.pvddick' , TypeString, 'pvddick_mpx')
|
||||
, ('chip.pad.pvssick' , TypeString, 'pvssick_mpx')
|
||||
, ('chip.pad.pvddeck' , TypeString, 'pvddeck_mpx')
|
||||
, ('chip.pad.pvsseck' , TypeString, 'pvsseck_mpx')
|
||||
, ('clockTree.minimumSide' , TypeInt , 1000)
|
||||
, ('clockTree.buffer' , TypeString, 'buf_x2')
|
||||
, ('clockTree.placerEngine' , TypeString, 'Etesian')
|
||||
)
|
|
@ -0,0 +1,13 @@
|
|||
# -*- Mode:Python; explicit-buffer-name: "stratus1.conf<cmos45>" -*-
|
||||
|
||||
import helpers
|
||||
|
||||
|
||||
# Status1 parameters.
|
||||
parametersTable = \
|
||||
( ("stratus1.format" , TypeString, "vst")
|
||||
, ("stratus1.simulator" , TypeString, "asimut")
|
||||
,)
|
||||
|
||||
|
||||
execfile( helpers.sysConfDir+'/common/stratus1.conf' )
|
|
@ -0,0 +1,242 @@
|
|||
# -*- Mode:Python; explicit-buffer-name: "technology.conf<cmos45>" -*-
|
||||
|
||||
from Hurricane import DbU
|
||||
from helpers import sysConfDir
|
||||
from helpers import l, u, n
|
||||
from helpers.Technology import initTechno
|
||||
|
||||
# The informations here are extracted from the Alliance ".rds" file,
|
||||
# and must be consistent with it.
|
||||
#
|
||||
# Provides standard settings for:
|
||||
# - <viewerConfig>
|
||||
# - <realLayersTable>
|
||||
# - <compositeLayersTable>
|
||||
# - <symbolicLayersTable>
|
||||
|
||||
|
||||
# MOSIS SCN6M_DEEP is a portable technology where lengths are expresseds
|
||||
# in symbolic unit (lambda). We only know that the lambda is equal to half
|
||||
# the value of the technology, that is 180nm gives 90nm. We have no information
|
||||
# about the foundry grid.
|
||||
#
|
||||
# We set the foundry grid to .0025um and set the gridsPerLambda to 10.
|
||||
|
||||
initTechno( { 'name' : 'cmos45'
|
||||
, 'precision' : 2
|
||||
, 'gridValue' : 0.0025
|
||||
, 'gridUnit' : DbU.UnitPowerMicro
|
||||
, 'gridsPerLambda' : 10
|
||||
, 'symbolicGridStep': 1.0
|
||||
, 'polygonStep' : 10.0
|
||||
} )
|
||||
|
||||
execfile( sysConfDir+'/common/technology.conf' )
|
||||
|
||||
|
||||
# Format of <layersExtensionsTable>:
|
||||
# Each entry is a pair of (string, value).
|
||||
# * string: a synthetic way to designate the real or symbolic layer on
|
||||
# which it applies, an optional sub layer (BasicLayer) in case
|
||||
# where there is more than one, and the dimension name.
|
||||
# * value : the rule (dimension) value.
|
||||
# Values/dimensions must be given using one of the following conversion
|
||||
# function:
|
||||
# * l(value) : value expressed in lambda (symbolic).
|
||||
# * u(value) : value is expressed in microns.
|
||||
# * n(value) : value is expressed in nanometers.
|
||||
|
||||
def scaleUp ( extensionsTable ):
|
||||
scaled = []
|
||||
for entry in extensionsTable:
|
||||
scaled.append( ( entry[0], 2*entry[1] ) )
|
||||
return scaled
|
||||
|
||||
#layersExtensionsTable = \
|
||||
# [ ('METAL1.minimalSpacing' , l( 6.0))
|
||||
# , ('METAL2.minimalSpacing' , l( 6.0))
|
||||
# , ('METAL3.minimalSpacing' , l( 6.0))
|
||||
# , ('METAL4.minimalSpacing' , l( 6.0))
|
||||
# , ('METAL5.minimalSpacing' , l( 6.0))
|
||||
# , ('METAL6.minimalSpacing' , l( 6.0))
|
||||
# ] + \
|
||||
# scaleUp( symbolicLayersExtensionsTable )
|
||||
|
||||
layersExtensionsTable = \
|
||||
( ('METAL1.minimalSpacing' , l( 6.0))
|
||||
, ('METAL2.minimalSpacing' , l( 6.0))
|
||||
, ('METAL3.minimalSpacing' , l( 6.0))
|
||||
, ('METAL4.minimalSpacing' , l( 6.0))
|
||||
, ('METAL5.minimalSpacing' , l( 6.0))
|
||||
, ('METAL6.minimalSpacing' , l( 6.0))
|
||||
|
||||
, ('NWELL.nWell.extention.cap' , l( 4.0))
|
||||
, ('PWELL.pWell.extention.cap' , l( 4.0))
|
||||
|
||||
, ('NTIE.minimum.width' , l( 3.0))
|
||||
, ('NTIE.nWell.extention.cap' , l( 3.0))
|
||||
, ('NTIE.nWell.extention.width' , l( 2.0))
|
||||
, ('NTIE.nImplant.extention.cap' , l( 2.5))
|
||||
, ('NTIE.nImplant.extention.width' , l( 1.5))
|
||||
, ('NTIE.active.extention.cap' , l( 0.5))
|
||||
, ('NTIE.active.extention.width' , l(-0.5))
|
||||
|
||||
, ('PTIE.minimum.width' , l( 3.0))
|
||||
, ('PTIE.pWell.extention.cap' , l( 3.0))
|
||||
, ('PTIE.pWell.extention.width' , l( 2.0))
|
||||
, ('PTIE.pImplant.extention.cap' , l( 2.5))
|
||||
, ('PTIE.pImplant.extention.width' , l( 1.5))
|
||||
, ('PTIE.active.extention.cap' , l( 0.5))
|
||||
, ('PTIE.active.extention.width' , l(-0.5))
|
||||
|
||||
, ('NDIF.minimum.width' , l( 3.0))
|
||||
, ('NDIF.nImplant.extention.cap' , l( 4.0))
|
||||
, ('NDIF.nImplant.extention.width' , l( 2.0))
|
||||
, ('NDIF.active.extention.cap' , l( 2.0))
|
||||
, ('NDIF.active.extention.width' , l( 0.0))
|
||||
|
||||
, ('PDIF.minimum.width' , l( 3.0))
|
||||
, ('PDIF.pImplant.extention.cap' , l( 4.0))
|
||||
, ('PDIF.pImplant.extention.width' , l( 2.0))
|
||||
, ('PDIF.active.extention.cap' , l( 2.0))
|
||||
, ('PDIF.active.extention.width' , l( 0.0))
|
||||
|
||||
, ('GATE.minimum.width' , l( 2.0))
|
||||
, ('GATE.poly.extention.cap' , l( 2.5))
|
||||
|
||||
, ('NTRANS.minimum.width' , l( 2.0))
|
||||
, ('NTRANS.nImplant.extention.cap' , l( 2.0))
|
||||
, ('NTRANS.nImplant.extention.width' , l( 7.0))
|
||||
, ('NTRANS.active.extention.cap' , l( 0.0))
|
||||
, ('NTRANS.active.extention.width' , l( 3.0))
|
||||
, ('NTRANS.poly.extention.cap' , l( 3.0))
|
||||
, ('NTRANS.poly.extention.width' , l( 0.0))
|
||||
|
||||
, ('PTRANS.minimum.width' , l( 2.0))
|
||||
, ('PTRANS.nWell.extention.cap' , l( 2.5))
|
||||
, ('PTRANS.nWell.extention.width' , l( 7.5))
|
||||
, ('PTRANS.pImplant.extention.cap' , l( 2.0))
|
||||
, ('PTRANS.pImplant.extention.width' , l( 7.0))
|
||||
, ('PTRANS.active.extention.cap' , l( 0.0))
|
||||
, ('PTRANS.active.extention.width' , l( 3.0))
|
||||
, ('PTRANS.poly.extention.cap' , l( 3.0))
|
||||
, ('PTRANS.poly.extention.width' , l( 0.0))
|
||||
|
||||
, ('POLY.minimum.width' , l( 2.0))
|
||||
, ('POLY.poly.extention.cap' , l( 1.0))
|
||||
, ('POLY2.minimum.width' , l( 2.0))
|
||||
, ('POLY2.poly2.extention.cap' , l( 2.0))
|
||||
|
||||
# Routing Layers (symbolic).
|
||||
, ('METAL1.minimum.width' , l( 2.0))
|
||||
, ('METAL1.metal1.extention.cap' , l( 2.0))
|
||||
, ('METAL1.metal1.extention.width' , l( 1.0))
|
||||
, ('METAL2.minimum.width' , l( 4.0))
|
||||
, ('METAL2.metal2.extention.cap' , l( 2.0))
|
||||
, ('METAL3.minimum.width' , l( 4.0))
|
||||
, ('METAL3.metal3.extention.cap' , l( 2.0))
|
||||
, ('METAL4.minimum.width' , l( 4.0))
|
||||
, ('METAL4.metal4.extention.cap' , l( 2.0))
|
||||
, ('METAL5.minimum.width' , l( 4.0))
|
||||
, ('METAL5.metal5.extention.cap' , l( 2.0))
|
||||
, ('METAL6.minimum.width' , l(10.0))
|
||||
, ('METAL6.metal6.extention.cap' , l( 5.0))
|
||||
#, ('METAL7.minimum.width' , l( 2.0))
|
||||
#, ('METAL7.metal7.extention.cap' , l( 2.5))
|
||||
#, ('METAL8.minimum.width' , l( 2.0))
|
||||
#, ('METAL8.metal8.extention.cap' , l( 2.5))
|
||||
|
||||
# Blockages (symbolic).
|
||||
, ('BLOCKAGE1.minimum.width' , l( 4.0))
|
||||
, ('BLOCKAGE1.blockage1.extention.cap' , l( 2.0))
|
||||
, ('BLOCKAGE1.blockage1.extention.width', l( 0.5))
|
||||
, ('BLOCKAGE2.minimum.width' , l( 4.0))
|
||||
, ('BLOCKAGE2.blockage2.extention.cap' , l( 2.0))
|
||||
, ('BLOCKAGE3.minimum.width' , l( 4.0))
|
||||
, ('BLOCKAGE3.blockage3.extention.cap' , l( 2.0))
|
||||
, ('BLOCKAGE4.minimum.width' , l( 4.0))
|
||||
, ('BLOCKAGE4.blockage4.extention.cap' , l( 2.0))
|
||||
, ('BLOCKAGE5.minimum.width' , l( 4.0))
|
||||
, ('BLOCKAGE5.blockage5.extention.cap' , l( 2.0))
|
||||
, ('BLOCKAGE6.minimum.width' , l( 8.0))
|
||||
, ('BLOCKAGE6.blockage6.extention.cap' , l( 2.5))
|
||||
#, ('BLOCKAGE7.minimum.width' , l( 2.0))
|
||||
#, ('BLOCKAGE7.blockage6.extention.cap' , l( 4.0))
|
||||
#, ('BLOCKAGE8.minimum.width' , l( 2.0))
|
||||
#, ('BLOCKAGE8.blockage6.extention.cap' , l( 4.0))
|
||||
|
||||
# Contacts (i.e. Active <--> Metal) (symbolic).
|
||||
, ('CONT_BODY_N.minimum.side' , l( 2.0))
|
||||
, ('CONT_BODY_N.nWell.enclosure' , l( 4.0))
|
||||
, ('CONT_BODY_N.nImplant.enclosure' , l( 3.5))
|
||||
, ('CONT_BODY_N.active.enclosure' , l( 1.5))
|
||||
, ('CONT_BODY_N.metal1.enclosure' , l( 1.0))
|
||||
|
||||
, ('CONT_BODY_P.minimum.side' , l( 2.0))
|
||||
, ('CONT_BODY_P.pWell.enclosure' , l( 4.0))
|
||||
, ('CONT_BODY_P.pImplant.enclosure' , l( 3.5))
|
||||
, ('CONT_BODY_P.active.enclosure' , l( 1.5))
|
||||
, ('CONT_BODY_P.metal1.enclosure' , l( 1.0))
|
||||
|
||||
, ('CONT_DIF_N.minimum.side' , l( 2.0))
|
||||
, ('CONT_DIF_N.nImplant.enclosure' , l( 4.0))
|
||||
, ('CONT_DIF_N.active.enclosure' , l( 2.0))
|
||||
, ('CONT_DIF_N.metal1.enclosure' , l( 1.0))
|
||||
|
||||
, ('CONT_DIF_P.minimum.side' , l( 2.0))
|
||||
, ('CONT_DIF_P.pImplant.enclosure' , l( 4.0))
|
||||
, ('CONT_DIF_P.active.enclosure' , l( 2.0))
|
||||
, ('CONT_DIF_P.metal1.enclosure' , l( 1.0))
|
||||
|
||||
, ('CONT_POLY.minimum.width' , l( 2.0))
|
||||
, ('CONT_POLY.poly.enclosure' , l( 2.0))
|
||||
, ('CONT_POLY.metal1.enclosure' , l( 1.0))
|
||||
|
||||
# VIAs (i.e. Metal <--> Metal) (symbolic).
|
||||
, ('VIA12.minimum.side' , l( 2.0))
|
||||
, ('VIA12.metal1.enclosure' , l( 1.0))
|
||||
, ('VIA12.metal2.enclosure' , l( 1.0))
|
||||
, ('VIA23.minimum.side' , l( 2.0))
|
||||
, ('VIA23.metal2.enclosure' , l( 1.0))
|
||||
, ('VIA23.metal3.enclosure' , l( 1.0))
|
||||
, ('VIA34.minimum.side' , l( 2.0))
|
||||
, ('VIA34.metal3.enclosure' , l( 1.0))
|
||||
, ('VIA34.metal4.enclosure' , l( 1.0))
|
||||
, ('VIA45.minimum.side' , l( 2.0))
|
||||
, ('VIA45.metal4.enclosure' , l( 1.0))
|
||||
, ('VIA45.metal5.enclosure' , l( 1.0))
|
||||
, ('VIA56.minimum.side' , l( 5.0))
|
||||
, ('VIA56.metal5.enclosure' , l( 1.0))
|
||||
, ('VIA56.metal6.enclosure' , l( 1.5))
|
||||
#, ('VIA67.minimum.side' , l( 2.0))
|
||||
#, ('VIA67.metal6.enclosure' , l( 3.0))
|
||||
#, ('VIA67.metal7.enclosure' , l( 3.0))
|
||||
#, ('VIA78.minimum.side' , l( 2.0))
|
||||
#, ('VIA78.metal7.enclosure' , l( 3.0))
|
||||
#, ('VIA78.metal8.enclosure' , l( 3.0))
|
||||
)
|
||||
|
||||
|
||||
# Format of an entry in the table:
|
||||
# (Symbolic_Name, CIF_Name, GDSII_Number)
|
||||
gdsLayersTable = \
|
||||
( ("pWell" , "CWN" , 41, 0)
|
||||
, ("nWell" , "CWP" , 42, 0)
|
||||
, ("active" , "CAA" , 43, 0)
|
||||
, ("pImplant", "CSP" , 44, 0)
|
||||
, ("nImplant", "CSN" , 45, 0)
|
||||
, ("poly" , "CPG" , 46, 0)
|
||||
, ("poly2" , "CM1" , 49, 0) # poly2 is in fact metal1.
|
||||
, ("cut0" , "CCC" , 25, 0)
|
||||
, ("metal1" , "CM1" , 49, 0)
|
||||
, ("cut1" , "CV1" , 50, 0)
|
||||
, ("metal2" , "CM2" , 51, 0)
|
||||
, ("cut2" , "CV2" , 61, 0)
|
||||
, ("metal3" , "CM3" , 62, 0)
|
||||
, ("cut3" , "CV3" , 30, 0)
|
||||
, ("metal4" , "CM4" , 31, 0)
|
||||
, ("cut4" , "CV4" , 32, 0)
|
||||
, ("metal5" , "CM5" , 33, 0)
|
||||
, ("cut5" , "CV5" , 36, 0)
|
||||
, ("metal6" , "CM6" , 37, 0)
|
||||
)
|
|
@ -0,0 +1,10 @@
|
|||
# -*- Mode:Python; explicit-buffer-name: "analog.conf<cmos>" -*-
|
||||
|
||||
import helpers
|
||||
|
||||
|
||||
parametersTable = \
|
||||
( ('analog.techno' , TypeString, 'Analog_technology_is_disabled',
|
||||
{ 'flags':Cfg.Parameter.Flags.NeedRestart|Cfg.Parameter.Flags.MustExist } )
|
||||
, ('analog.devices', TypeString, helpers.technoDir+'/devices.conf' )
|
||||
)
|
|
@ -1,6 +1,7 @@
|
|||
# -*- Mode:Python; explicit-buffer-name: "kite.conf<cmos>" -*-
|
||||
# -*- Mode:Python; explicit-buffer-name: "kite.conf<ispd05>" -*-
|
||||
|
||||
import helpers
|
||||
from helpers import l, u, n
|
||||
|
||||
# Contains the layout (shared by all technologies).
|
||||
execfile( helpers.sysConfDir+'/common/kite.conf' )
|
||||
|
@ -21,8 +22,31 @@ parametersTable = \
|
|||
, ("kite.localRipupLimit" ,TypeInt ,9 , { 'min':1 } )
|
||||
, ("kite.globalRipupLimit" ,TypeInt ,5 , { 'min':1 } )
|
||||
, ("kite.longGlobalRipupLimit" ,TypeInt ,5 , { 'min':1 } )
|
||||
# Anabatic & Katana parameters are temporarily hosted here.
|
||||
, ('anabatic.routingGauge' ,TypeString , 'sxlib' )
|
||||
, ("anabatic.globalLengthThreshold" ,TypeInt ,1450 )
|
||||
, ("anabatic.saturateRatio" ,TypePercentage,80 )
|
||||
, ("anabatic.saturateRp" ,TypeInt ,8 )
|
||||
, ('anabatic.topRoutingLayer' ,TypeString , 'METAL5')
|
||||
, ("anabatic.edgeLength" ,TypeInt ,24 )
|
||||
, ("anabatic.edgeWidth" ,TypeInt ,4 )
|
||||
, ("anabatic.edgeCostH" ,TypeDouble ,19.0 )
|
||||
, ("anabatic.edgeCostK" ,TypeDouble ,-60.0 )
|
||||
, ("anabatic.edgeHScaling" ,TypeDouble ,1.0 )
|
||||
, ("anabatic.globalIterations" ,TypeInt ,10 , { 'min':1, 'max':100 } )
|
||||
, ("anabatic.gcell.displayMode" ,TypeEnumerate ,1
|
||||
, { 'values':( ("Boundary" , 1)
|
||||
, ("Density" , 2) ) }
|
||||
)
|
||||
, ("katana.hTracksReservedLocal" ,TypeInt ,3 , { 'min':0, 'max':20 } )
|
||||
, ("katana.vTracksReservedLocal" ,TypeInt ,3 , { 'min':0, 'max':20 } )
|
||||
, ("katana.eventsLimit" ,TypeInt ,4000002 )
|
||||
, ("katana.ripupCost" ,TypeInt ,3 , { 'min':0 } )
|
||||
, ("katana.strapRipupLimit" ,TypeInt ,16 , { 'min':1 } )
|
||||
, ("katana.localRipupLimit" ,TypeInt ,9 , { 'min':1 } )
|
||||
, ("katana.globalRipupLimit" ,TypeInt ,5 , { 'min':1 } )
|
||||
, ("katana.longGlobalRipupLimit" ,TypeInt ,5 , { 'min':1 } )
|
||||
, ('chip.padCoreSide' ,TypeString ,'South' )
|
||||
)
|
||||
|
||||
|
||||
|
@ -33,13 +57,13 @@ parametersTable = \
|
|||
routingGaugesTable = {}
|
||||
|
||||
routingGaugesTable['sxlib'] = \
|
||||
( ( 'METAL1', ( Gauge.Vertical , Gauge.PinOnly, 0, 0.0, 0, 5, 2, 1, 4 ) )
|
||||
, ( 'METAL2', ( Gauge.Horizontal, Gauge.Default, 1, 7.0, 0, 5, 2, 1, 4 ) )
|
||||
, ( 'METAL3', ( Gauge.Vertical , Gauge.Default, 2, 0.0, 0, 5, 2, 1, 4 ) )
|
||||
, ( 'METAL4', ( Gauge.Horizontal, Gauge.Default, 3, 0.0, 0, 5, 2, 1, 4 ) )
|
||||
, ( 'METAL5', ( Gauge.Vertical , Gauge.Default, 4, 0.0, 0, 5, 2, 1, 4 ) )
|
||||
#, ( 'METAL6', ( Gauge.Horizontal, Gauge.Default, 5, 0.0, 0, 5, 2, 1, 4 ) )
|
||||
#, ( 'METAL7', ( Gauge.Vertical , Gauge.Default, 6, 0.0, 0, 5, 2, 1, 4 ) )
|
||||
( ( 'METAL1', ( Gauge.Vertical , Gauge.PinOnly, 0, 0.0, l(0), l(5), l(2), l(1), l(4) ) )
|
||||
, ( 'METAL2', ( Gauge.Horizontal, Gauge.Default, 1, 7.0, l(0), l(5), l(2), l(1), l(4) ) )
|
||||
, ( 'METAL3', ( Gauge.Vertical , Gauge.Default, 2, 0.0, l(0), l(5), l(2), l(1), l(4) ) )
|
||||
, ( 'METAL4', ( Gauge.Horizontal, Gauge.Default, 3, 0.0, l(0), l(5), l(2), l(1), l(4) ) )
|
||||
, ( 'METAL5', ( Gauge.Vertical , Gauge.Default, 4, 0.0, l(0), l(5), l(2), l(1), l(4) ) )
|
||||
#, ( 'METAL6', ( Gauge.Horizontal, Gauge.Default, 5, 0.0, l(0), l(5), l(2), l(1), l(4) ) )
|
||||
#, ( 'METAL7', ( Gauge.Vertical , Gauge.Default, 6, 0.0, l(0), l(5), l(2), l(1), l(4) ) )
|
||||
)
|
||||
|
||||
|
||||
|
@ -48,5 +72,5 @@ routingGaugesTable['sxlib'] = \
|
|||
# ( METAL_PIN, xy_common_pitch, slice_height, slice_step )
|
||||
|
||||
cellGaugesTable = {}
|
||||
cellGaugesTable['ispd05'] = ('metal2', 5.0, 60.0, 5.0)
|
||||
cellGaugesTable['ispd05'] = ('metal2', l(5.0), l(60.0), l(5.0))
|
||||
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
# -*- Mode:Python; explicit-buffer-name: "technology.conf<ispd05>" -*-
|
||||
|
||||
import helpers
|
||||
from helpers.Technology import initTechno
|
||||
from Hurricane import DbU
|
||||
|
||||
# Provides standard settings for:
|
||||
|
@ -9,17 +10,18 @@ from Hurricane import DbU
|
|||
# - <compositeLayersTable>
|
||||
# - <symbolicLayersTable>
|
||||
|
||||
execfile( helpers.sysConfDir+'/common/technology.conf' )
|
||||
|
||||
|
||||
technoConfig = { 'name' : 'ISPD05/symbolic'
|
||||
initTechno( { 'name' : 'IPSD05/symbolic'
|
||||
, 'precision' : 2
|
||||
, 'gridValue' : 0.005
|
||||
, 'gridUnit' : DbU.UnitPowerMicro
|
||||
, 'gridsPerLambda' : 24
|
||||
, 'symbolicGridStep' : 1.0
|
||||
, 'polygonStep' : 24.0
|
||||
}
|
||||
} )
|
||||
|
||||
|
||||
execfile( helpers.sysConfDir+'/common/technology.conf' )
|
||||
|
||||
|
||||
# Format of <layersExtensionsTable>:
|
||||
|
@ -27,150 +29,14 @@ technoConfig = { 'name' : 'ISPD05/symbolic'
|
|||
# * string: a synthetic way to designate the real or symbolic layer on
|
||||
# which it applies, an optional sub layer (BasicLayer) in case
|
||||
# where there is more than one, and the dimension name.
|
||||
# * value : the rule (dimension) value. If the main layer is symbolic it
|
||||
# must be expressed in lambda, if it is for a real layers it
|
||||
# must be expressed in microns.
|
||||
# * value : the rule (dimension) value.
|
||||
# Values/dimensions must be given using one of the following conversion
|
||||
# function:
|
||||
# * l(value) : value expressed in lambda (symbolic).
|
||||
# * u(value) : value is expressed in microns.
|
||||
# * n(value) : value is expressed in nanometers.
|
||||
|
||||
layersExtensionsTable = \
|
||||
( ('NWELL.nWell.extention.cap' , 0.0)
|
||||
, ('PWELL.pWell.extention.cap' , 0.0)
|
||||
|
||||
, ('NTIE.minimum.width' , 3.0)
|
||||
, ('NTIE.nWell.extention.cap' , 1.5)
|
||||
, ('NTIE.nWell.extention.width' , 0.5)
|
||||
, ('NTIE.nImplant.extention.cap' , 1.0)
|
||||
, ('NTIE.nImplant.extention.width' , 0.5)
|
||||
, ('NTIE.active.extention.cap' , 0.5)
|
||||
, ('NTIE.active.extention.width' , 0.0)
|
||||
|
||||
, ('PTIE.minimum.width' , 3.0)
|
||||
, ('PTIE.pWell.extention.cap' , 1.5)
|
||||
, ('PTIE.pWell.extention.width' , 0.5)
|
||||
, ('PTIE.pImplant.extention.cap' , 1.0)
|
||||
, ('PTIE.pImplant.extention.width' , 0.5)
|
||||
, ('PTIE.active.extention.cap' , 0.5)
|
||||
, ('PTIE.active.extention.width' , 0.0)
|
||||
|
||||
, ('NDIF.minimum.width' , 3.0)
|
||||
, ('NDIF.nImplant.extention.cap' , 1.0)
|
||||
, ('NDIF.nImplant.extention.width' , 0.5)
|
||||
, ('NDIF.active.extention.cap' , 0.5)
|
||||
, ('NDIF.active.extention.width' , 0.0)
|
||||
|
||||
, ('PDIF.minimum.width' , 3.0)
|
||||
, ('PDIF.pImplant.extention.cap' , 1.0)
|
||||
, ('PDIF.pImplant.extention.width' , 0.5)
|
||||
, ('PDIF.active.extention.cap' , 0.5)
|
||||
, ('PDIF.active.extention.width' , 0.0)
|
||||
|
||||
, ('GATE.minimum.width' , 1.0)
|
||||
, ('GATE.poly.extention.cap' , 1.5)
|
||||
|
||||
, ('NTRANS.minimum.width' , 1.0)
|
||||
, ('NTRANS.nImplant.extention.cap' , -1.0)
|
||||
, ('NTRANS.nImplant.extention.width' , 2.5)
|
||||
, ('NTRANS.active.extention.cap' , -1.5)
|
||||
, ('NTRANS.active.extention.width' , 2.0)
|
||||
|
||||
, ('PTRANS.minimum.width' , 1.0)
|
||||
, ('PTRANS.nWell.extention.cap' , -1.0)
|
||||
, ('PTRANS.nWell.extention.width' , 4.5)
|
||||
, ('PTRANS.pImplant.extention.cap' , -1.0)
|
||||
, ('PTRANS.pImplant.extention.width' , 4.0)
|
||||
, ('PTRANS.active.extention.cap' , -1.5)
|
||||
, ('PTRANS.active.extention.width' , 3.0)
|
||||
|
||||
, ('POLY.minimum.width' , 1.0)
|
||||
, ('POLY.poly.extention.cap' , 0.5)
|
||||
, ('POLY2.minimum.width' , 1.0)
|
||||
, ('POLY2.poly.extention.cap' , 0.5)
|
||||
|
||||
# Routing Layers (symbolic).
|
||||
, ('METAL1.minimum.width' , 1.0)
|
||||
, ('METAL1.metal1.extention.cap' , 0.5)
|
||||
, ('METAL2.minimum.width' , 1.0)
|
||||
, ('METAL2.metal2.extention.cap' , 1.0)
|
||||
, ('METAL3.minimum.width' , 1.0)
|
||||
, ('METAL3.metal3.extention.cap' , 1.0)
|
||||
, ('METAL4.minimum.width' , 1.0)
|
||||
, ('METAL4.metal4.extention.cap' , 1.0)
|
||||
, ('METAL5.minimum.width' , 2.0)
|
||||
, ('METAL5.metal5.extention.cap' , 1.0)
|
||||
, ('METAL6.minimum.width' , 2.0)
|
||||
, ('METAL6.metal6.extention.cap' , 1.0)
|
||||
, ('METAL7.minimum.width' , 2.0)
|
||||
, ('METAL7.metal6.extention.cap' , 1.0)
|
||||
, ('METAL8.minimum.width' , 2.0)
|
||||
, ('METAL8.metal6.extention.cap' , 1.0)
|
||||
|
||||
# Contacts (i.e. Active <--> Metal) (symbolic).
|
||||
, ('CONT_BODY_N.minimum.side' , 1.0)
|
||||
, ('CONT_BODY_N.nWell.enclosure' , 1.5)
|
||||
, ('CONT_BODY_N.nImplant.enclosure' , 1.5)
|
||||
, ('CONT_BODY_N.active.enclosure' , 1.0)
|
||||
, ('CONT_BODY_N.metal1.enclosure' , 0.5)
|
||||
|
||||
, ('CONT_BODY_P.minimum.side' , 1.0)
|
||||
, ('CONT_BODY_P.pWell.enclosure' , 1.5)
|
||||
, ('CONT_BODY_P.pImplant.enclosure' , 1.5)
|
||||
, ('CONT_BODY_P.active.enclosure' , 1.0)
|
||||
, ('CONT_BODY_P.metal1.enclosure' , 0.5)
|
||||
|
||||
, ('CONT_DIF_N.minimum.side' , 1.0)
|
||||
, ('CONT_DIF_N.nImplant.enclosure' , 1.0)
|
||||
, ('CONT_DIF_N.active.enclosure' , 0.5)
|
||||
, ('CONT_DIF_N.metal1.enclosure' , 0.5)
|
||||
|
||||
, ('CONT_DIF_P.minimum.side' , 1.0)
|
||||
, ('CONT_DIF_P.pImplant.enclosure' , 1.0)
|
||||
, ('CONT_DIF_P.active.enclosure' , 0.5)
|
||||
, ('CONT_DIF_P.metal1.enclosure' , 0.5)
|
||||
|
||||
, ('CONT_POLY.minimum.width' , 1.0)
|
||||
, ('CONT_POLY.poly.enclosure' , 0.5)
|
||||
, ('CONT_POLY.metal1.enclosure' , 0.5)
|
||||
|
||||
# VIAs (i.e. Metal <--> Metal) (symbolic).
|
||||
, ('VIA12.minimum.side' , 1.0)
|
||||
, ('VIA12.metal1.enclosure' , 0.5)
|
||||
, ('VIA12.metal2.enclosure' , 0.5)
|
||||
, ('VIA23.minimum.side' , 1.0)
|
||||
, ('VIA23.metal2.enclosure' , 0.5)
|
||||
, ('VIA23.metal3.enclosure' , 0.5)
|
||||
, ('VIA34.minimum.side' , 1.0)
|
||||
, ('VIA34.metal3.enclosure' , 0.5)
|
||||
, ('VIA34.metal4.enclosure' , 0.5)
|
||||
, ('VIA45.minimum.side' , 1.0)
|
||||
, ('VIA45.metal4.enclosure' , 0.5)
|
||||
, ('VIA45.metal5.enclosure' , 0.5)
|
||||
, ('VIA56.minimum.side' , 1.0)
|
||||
, ('VIA56.metal5.enclosure' , 0.5)
|
||||
, ('VIA56.metal6.enclosure' , 0.5)
|
||||
, ('VIA67.minimum.side' , 1.0)
|
||||
, ('VIA67.metal6.enclosure' , 0.5)
|
||||
, ('VIA67.metal7.enclosure' , 0.5)
|
||||
, ('VIA78.minimum.side' , 1.0)
|
||||
, ('VIA78.metal7.enclosure' , 0.5)
|
||||
, ('VIA78.metal8.enclosure' , 0.5)
|
||||
|
||||
# Blockages (symbolic).
|
||||
, ('BLOCKAGE1.minimum.width' , 1.0)
|
||||
, ('BLOCKAGE1.blockage1.extention.cap' , 0.5)
|
||||
, ('BLOCKAGE2.minimum.width' , 2.0)
|
||||
, ('BLOCKAGE2.blockage2.extention.cap' , 0.5)
|
||||
, ('BLOCKAGE3.minimum.width' , 2.0)
|
||||
, ('BLOCKAGE3.blockage3.extention.cap' , 0.5)
|
||||
, ('BLOCKAGE4.minimum.width' , 2.0)
|
||||
, ('BLOCKAGE4.blockage4.extention.cap' , 0.5)
|
||||
, ('BLOCKAGE5.minimum.width' , 2.0)
|
||||
, ('BLOCKAGE5.blockage5.extention.cap' , 1.0)
|
||||
, ('BLOCKAGE6.minimum.width' , 2.0)
|
||||
, ('BLOCKAGE6.blockage6.extention.cap' , 1.0)
|
||||
, ('BLOCKAGE7.minimum.width' , 2.0)
|
||||
, ('BLOCKAGE7.blockage6.extention.cap' , 1.0)
|
||||
, ('BLOCKAGE8.minimum.width' , 2.0)
|
||||
, ('BLOCKAGE8.blockage6.extention.cap' , 1.0)
|
||||
)
|
||||
layersExtensionsTable = symbolicLayersExtensionsTable
|
||||
|
||||
|
||||
gdsLayersTable = \
|
||||
|
|
|
@ -103,7 +103,7 @@ namespace CRL {
|
|||
, "BLIF (Yosys/ABC)"
|
||||
, CellLoader::Importer|CellLoader::MultiCell
|
||||
, Catalog::State::Logical
|
||||
, std::bind( &Blif::load, placeholders::_1 ) ) );
|
||||
, std::bind( &Blif::load, placeholders::_1, true ) ) );
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -29,6 +29,8 @@
|
|||
#include "crlcore/RoutingLayerGauge.h"
|
||||
#include "crlcore/AllianceFramework.h"
|
||||
|
||||
#include "hurricane/SharedName.h"
|
||||
|
||||
|
||||
namespace CRL {
|
||||
|
||||
|
@ -753,7 +755,38 @@ namespace CRL {
|
|||
}
|
||||
|
||||
_cellGauges [ gauge->getName() ] = gauge;
|
||||
_defaultCellGauge = gauge;
|
||||
if (not _defaultCellGauge) _defaultCellGauge = gauge;
|
||||
}
|
||||
|
||||
|
||||
CellGauge* AllianceFramework::matchCellGauge ( DbU::Unit width, DbU::Unit height ) const
|
||||
{
|
||||
for ( const auto item : _cellGauges ) {
|
||||
CellGauge* cg = item.second;
|
||||
DbU::Unit hcount = width / cg->getSliceStep ();
|
||||
DbU::Unit hremains = width % cg->getSliceStep ();
|
||||
DbU::Unit vcount = height / cg->getSliceHeight();
|
||||
DbU::Unit vremains = height % cg->getSliceHeight();
|
||||
|
||||
if ( (hcount) and (not hremains) and (vcount == 1) and (not vremains) )
|
||||
return cg;
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
||||
CellGauge* AllianceFramework::matchCellGaugeByHeight ( DbU::Unit height ) const
|
||||
{
|
||||
for ( const auto item : _cellGauges ) {
|
||||
CellGauge* cg = item.second;
|
||||
DbU::Unit vcount = height / cg->getSliceHeight();
|
||||
DbU::Unit vremains = height % cg->getSliceHeight();
|
||||
|
||||
if ( (vcount == 1) and (not vremains) ) return cg;
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -38,6 +38,7 @@ namespace CRL {
|
|||
, _pitch (pitch)
|
||||
, _sliceHeight (sliceHeight)
|
||||
, _sliceStep (sliceStep)
|
||||
, _flags (Flags::NoFlags)
|
||||
{ }
|
||||
|
||||
|
||||
|
@ -47,6 +48,7 @@ namespace CRL {
|
|||
, _pitch (other._pitch)
|
||||
, _sliceHeight (other._sliceHeight)
|
||||
, _sliceStep (other._sliceStep)
|
||||
, _flags (other._flags)
|
||||
{ }
|
||||
|
||||
|
||||
|
@ -100,11 +102,12 @@ namespace CRL {
|
|||
Record* CellGauge::_getRecord () const
|
||||
{
|
||||
Record* record = new Record ( getString(this) );
|
||||
record->add( getSlot ( "Name" , &_name ) );
|
||||
record->add( getSlot ( "PinLayerName" , &_pinLayerName ) );
|
||||
record->add( DbU::getValueSlot( "pitch" , &_pitch ) );
|
||||
record->add( DbU::getValueSlot( "sliceHeight" , &_sliceHeight ) );
|
||||
record->add( DbU::getValueSlot( "sliceStep" , &_sliceStep ) );
|
||||
record->add( getSlot ( "_name" , &_name ) );
|
||||
record->add( getSlot ( "_pinLayerName" , &_pinLayerName ) );
|
||||
record->add( DbU::getValueSlot( "_pitch" , &_pitch ) );
|
||||
record->add( DbU::getValueSlot( "_sliceHeight" , &_sliceHeight ) );
|
||||
record->add( DbU::getValueSlot( "_sliceStep" , &_sliceStep ) );
|
||||
record->add( getSlot ( "_flags" , &_flags ) );
|
||||
return ( record );
|
||||
}
|
||||
|
||||
|
@ -118,6 +121,7 @@ namespace CRL {
|
|||
jsonWrite( w, "_pitch" , _pitch );
|
||||
jsonWrite( w, "_sliceHeight" , _sliceHeight );
|
||||
jsonWrite( w, "_sliceStep" , _sliceStep );
|
||||
jsonWrite( w, "_flags" , _flags );
|
||||
w->endObject();
|
||||
}
|
||||
|
||||
|
@ -162,6 +166,7 @@ namespace CRL {
|
|||
DbU::Unit pitch = get<int64_t>( stack, "_pitch" );
|
||||
DbU::Unit sliceHeight = get<int64_t>( stack, "_sliceHeight" );
|
||||
DbU::Unit sliceStep = get<int64_t>( stack, "_sliceStep" );
|
||||
unsigned long flags = get<int64_t>( stack, "_flags" );
|
||||
|
||||
if (stack.issetFlags(JsonWriter::TechnoMode)) {
|
||||
if (af) {
|
||||
|
@ -172,6 +177,7 @@ namespace CRL {
|
|||
, sliceHeight
|
||||
, sliceStep
|
||||
);
|
||||
cg->setFlags( flags );
|
||||
af->addCellGauge( cg );
|
||||
}
|
||||
} else {
|
||||
|
|
|
@ -123,7 +123,8 @@ namespace CRL {
|
|||
RoutingLayerGauge* RoutingGauge::getHorizontalGauge () const
|
||||
{
|
||||
for ( RoutingLayerGauge* gauge : _layerGauges ) {
|
||||
if ( (gauge->getType() != Constant::LayerGaugeType::PinOnly) and gauge->isHorizontal() )
|
||||
//if ( (gauge->getType() != Constant::LayerGaugeType::PinOnly) and gauge->isHorizontal() )
|
||||
if (gauge->isHorizontal())
|
||||
return gauge;
|
||||
}
|
||||
return NULL;
|
||||
|
@ -133,7 +134,8 @@ namespace CRL {
|
|||
RoutingLayerGauge* RoutingGauge::getVerticalGauge () const
|
||||
{
|
||||
for ( RoutingLayerGauge* gauge : _layerGauges ) {
|
||||
if ( (gauge->getType() != Constant::LayerGaugeType::PinOnly) and gauge->isVertical() )
|
||||
//if ( (gauge->getType() != Constant::LayerGaugeType::PinOnly) and gauge->isVertical() )
|
||||
if (gauge->isVertical())
|
||||
return gauge;
|
||||
}
|
||||
return NULL;
|
||||
|
|
|
@ -267,9 +267,7 @@ namespace CRL {
|
|||
|
||||
|
||||
DbU::Unit RoutingLayerGauge::getTrackPosition ( DbU::Unit start, unsigned depth ) const
|
||||
{
|
||||
return depth * _pitch + _offset + start;
|
||||
}
|
||||
{ return depth * _pitch + _offset + start; }
|
||||
|
||||
|
||||
string RoutingLayerGauge::_getTypeName () const
|
||||
|
|
|
@ -281,6 +281,10 @@ namespace CRL {
|
|||
);
|
||||
}
|
||||
|
||||
if ( arguments.count("coriolis_top") ) {
|
||||
_pathes.insert ( make_pair("coriolis_top", arguments["coriolis_top"].as<string>()) );
|
||||
}
|
||||
|
||||
Utilities::Path sysConfDir ( SYS_CONF_DIR );
|
||||
if ( not sysConfDir.absolute() ) {
|
||||
if ( arguments.count("coriolis_top") ) {
|
||||
|
|
|
@ -667,7 +667,7 @@ namespace CRL {
|
|||
{ if (library) _libraries.push_back( library ); }
|
||||
|
||||
|
||||
Cell* Blif::load ( string cellPath )
|
||||
Cell* Blif::load ( string cellPath, bool enforceVhdl )
|
||||
{
|
||||
using namespace std;
|
||||
|
||||
|
@ -824,7 +824,7 @@ namespace CRL {
|
|||
|
||||
Model::orderModels();
|
||||
Model::connectModels();
|
||||
Model::toVhdlModels();
|
||||
if (enforceVhdl) Model::toVhdlModels();
|
||||
Model::clearStatic();
|
||||
UpdateSession::close();
|
||||
|
||||
|
|
|
@ -32,6 +32,7 @@ namespace CRL {
|
|||
using Hurricane::BaseObserver;
|
||||
using Hurricane::JsonObject;
|
||||
using Hurricane::JsonStack;
|
||||
using Hurricane::DbU;
|
||||
using Hurricane::Cell;
|
||||
using Hurricane::Net;
|
||||
class RoutingGauge;
|
||||
|
@ -98,6 +99,8 @@ namespace CRL {
|
|||
void saveLibrary ( AllianceLibrary* );
|
||||
RoutingGauge* getRoutingGauge ( const Name& name="" );
|
||||
CellGauge* getCellGauge ( const Name& name="" );
|
||||
CellGauge* matchCellGauge ( DbU::Unit width, DbU::Unit height ) const;
|
||||
CellGauge* matchCellGaugeByHeight ( DbU::Unit height ) const;
|
||||
inline const Name getDefaultCGPinLayerName () const;
|
||||
// Modifiers.
|
||||
RoutingGauge* setRoutingGauge ( const Name& name="" );
|
||||
|
|
|
@ -56,7 +56,7 @@ namespace CRL {
|
|||
|
||||
class Blif {
|
||||
public:
|
||||
static Cell* load ( std::string netlist );
|
||||
static Cell* load ( std::string netlist, bool enforceVhdl=true );
|
||||
static void add ( Library* );
|
||||
static inline const std::vector<Library*>& getLibraries ();
|
||||
private:
|
||||
|
|
|
@ -41,38 +41,40 @@ namespace CRL {
|
|||
// Class : "CRL::CellGauge".
|
||||
|
||||
class CellGauge {
|
||||
|
||||
public:
|
||||
// Constructors & Destructor.
|
||||
enum Flags { NoFlags = 0, Pad = ( 1<<0) };
|
||||
public:
|
||||
static CellGauge* create ( const char* name
|
||||
, const char* pinLayerName
|
||||
, const DbU::Unit pitch =0
|
||||
, const DbU::Unit sliceHeight =0
|
||||
, const DbU::Unit sliceStep =0 );
|
||||
virtual void destroy ();
|
||||
// Accessors
|
||||
inline bool isPad () const;
|
||||
inline const Name& getName () const;
|
||||
inline unsigned long getFlags () const;
|
||||
inline const Name& getPinLayerName () const;
|
||||
inline const DbU::Unit getPitch () const;
|
||||
inline const DbU::Unit getSliceHeight () const;
|
||||
inline const DbU::Unit getSliceStep () const;
|
||||
CellGauge* getClone () const;
|
||||
// Hurricane management.
|
||||
inline void setFlags ( unsigned long flags );
|
||||
inline void resetFlags ( unsigned long flags );
|
||||
inline void setPitch ( DbU::Unit );
|
||||
inline void setSliceHeight ( DbU::Unit );
|
||||
inline void setSliceStep ( DbU::Unit );
|
||||
void toJson ( JsonWriter* ) const;
|
||||
virtual string _getTypeName () const;
|
||||
virtual string _getString () const;
|
||||
virtual Record* _getRecord () const;
|
||||
|
||||
protected:
|
||||
// Internal: Attributes.
|
||||
Name _name;
|
||||
Name _pinLayerName;
|
||||
DbU::Unit _pitch;
|
||||
DbU::Unit _sliceHeight;
|
||||
DbU::Unit _sliceStep;
|
||||
|
||||
unsigned long _flags;
|
||||
protected:
|
||||
// Internal: Constructors & Destructors.
|
||||
CellGauge ( const char* name
|
||||
, const char* pinLayerName
|
||||
, const DbU::Unit pitch
|
||||
|
@ -91,11 +93,18 @@ namespace CRL {
|
|||
|
||||
|
||||
// Inline Functions.
|
||||
inline bool CellGauge::isPad () const { return _flags & Flags::Pad; }
|
||||
inline const Name& CellGauge::getName () const { return _name; }
|
||||
inline const Name& CellGauge::getPinLayerName () const { return _pinLayerName; }
|
||||
inline const DbU::Unit CellGauge::getPitch () const { return _pitch; }
|
||||
inline const DbU::Unit CellGauge::getSliceHeight () const { return _sliceHeight; }
|
||||
inline const DbU::Unit CellGauge::getSliceStep () const { return _sliceStep; }
|
||||
inline unsigned long CellGauge::getFlags () const { return _flags; }
|
||||
inline void CellGauge::setFlags ( unsigned long flags ) { _flags |= flags; }
|
||||
inline void CellGauge::resetFlags ( unsigned long flags ) { _flags &= ~flags; }
|
||||
inline void CellGauge::setPitch ( DbU::Unit pitch ) { _pitch = pitch; }
|
||||
inline void CellGauge::setSliceHeight ( DbU::Unit height ) { _sliceHeight = height; }
|
||||
inline void CellGauge::setSliceStep ( DbU::Unit step ) { _sliceStep = step; }
|
||||
|
||||
|
||||
// -------------------------------------------------------------------
|
||||
|
|
|
@ -8,7 +8,7 @@
|
|||
// | C a d e n c e D E F I m p o r t e r |
|
||||
// | |
|
||||
// | Author : Jean-Paul CHAPUT |
|
||||
// | E-mail : Jean-Paul.Chaput@asim.lip6.fr |
|
||||
// | E-mail : Jean-Paul.Chaput@lip6.fr |
|
||||
// | =============================================================== |
|
||||
// | C++ Header : "./crlcore/DefImport.h" |
|
||||
// +-----------------------------------------------------------------+
|
||||
|
@ -31,6 +31,7 @@ namespace CRL {
|
|||
public:
|
||||
enum Flags { FitAbOnCells=0x1 };
|
||||
public:
|
||||
static void reset ();
|
||||
static Hurricane::Cell* load ( std::string design, unsigned int flags );
|
||||
};
|
||||
|
||||
|
|
|
@ -607,6 +607,15 @@ namespace {
|
|||
(*this) << ENDEL;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
Rectilinear* rectilinear = dynamic_cast<Rectilinear*>(component);
|
||||
if (rectilinear) {
|
||||
for ( const BasicLayer* layer : component->getLayer()->getBasicLayers() ) {
|
||||
(*this) << BOUNDARY;
|
||||
(*this) << layer;
|
||||
(*this) << rectilinear->getPoints();
|
||||
(*this) << ENDEL;
|
||||
}
|
||||
} else {
|
||||
Diagonal* diagonal = dynamic_cast<Diagonal*>(component);
|
||||
if (diagonal) {
|
||||
|
@ -630,6 +639,7 @@ namespace {
|
|||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
(*this) << ENDSTR;
|
||||
|
||||
|
|
|
@ -154,6 +154,7 @@ namespace CRL {
|
|||
AllianceFramework* af = AllianceFramework::get();
|
||||
pitch = af->getCellGauge()->getPitch();
|
||||
|
||||
size_t count = 0;
|
||||
UpdateSession::open ();
|
||||
|
||||
unique_ptr<Bookshelf::Circuit> circuit ( Bookshelf::Circuit::parse( benchmark
|
||||
|
@ -172,6 +173,11 @@ namespace CRL {
|
|||
for ( auto net : circuit->getNets() ) {
|
||||
dots.dot();
|
||||
Net::create ( cell, net->getName() );
|
||||
|
||||
if (++count % 1000) {
|
||||
UpdateSession::close ();
|
||||
UpdateSession::open ();
|
||||
}
|
||||
}
|
||||
dots.finish( Dots::Reset|Dots::FirstDot );
|
||||
|
||||
|
@ -196,6 +202,11 @@ namespace CRL {
|
|||
Net* masterNet = master->getNet( netName );
|
||||
instance->getPlug( masterNet )->setNet( cell->getNet(netName) );
|
||||
}
|
||||
|
||||
if (++count % 1000) {
|
||||
UpdateSession::close ();
|
||||
UpdateSession::open ();
|
||||
}
|
||||
}
|
||||
dots.finish( Dots::Reset|Dots::FirstDot );
|
||||
|
||||
|
|
|
@ -65,6 +65,8 @@ namespace {
|
|||
class DefParser {
|
||||
public:
|
||||
static AllianceFramework* getFramework ();
|
||||
static Cell* getLefCell ( string name );
|
||||
static void setUnits ( double );
|
||||
static DbU::Unit fromDefUnits ( int );
|
||||
static Transformation::Orientation
|
||||
fromDefOrientation ( int orient );
|
||||
|
@ -98,6 +100,7 @@ namespace {
|
|||
void toHurricaneName ( string& );
|
||||
inline void mergeToFitOnCellsDieArea ( const Box& );
|
||||
private:
|
||||
static int _unitsCbk ( defrCallbackType_e, double , defiUserData );
|
||||
static int _busBitCbk ( defrCallbackType_e, const char* , defiUserData );
|
||||
static int _designEndCbk ( defrCallbackType_e, void* , defiUserData );
|
||||
static int _dieAreaCbk ( defrCallbackType_e, defiBox* , defiUserData );
|
||||
|
@ -111,6 +114,7 @@ namespace {
|
|||
private:
|
||||
static double _defUnits;
|
||||
static AllianceFramework* _framework;
|
||||
static Library* _lefRootLibrary;
|
||||
string _file;
|
||||
unsigned int _flags;
|
||||
AllianceLibrary* _library;
|
||||
|
@ -127,6 +131,7 @@ namespace {
|
|||
|
||||
double DefParser::_defUnits = 0.01;
|
||||
AllianceFramework* DefParser::_framework = NULL;
|
||||
Library* DefParser::_lefRootLibrary = NULL;
|
||||
|
||||
|
||||
DefParser::DefParser ( string& file, AllianceLibrary* library, unsigned int flags )
|
||||
|
@ -143,6 +148,7 @@ namespace {
|
|||
, _errors ()
|
||||
{
|
||||
defrInit ();
|
||||
defrSetUnitsCbk ( _unitsCbk );
|
||||
defrSetBusBitCbk ( _busBitCbk );
|
||||
defrSetDesignEndCbk ( _designEndCbk );
|
||||
defrSetDieAreaCbk ( _dieAreaCbk );
|
||||
|
@ -162,7 +168,8 @@ namespace {
|
|||
|
||||
|
||||
AllianceFramework* DefParser::getFramework () { return _framework; }
|
||||
inline DbU::Unit DefParser::fromDefUnits ( int u ) { return DbU::lambda(_defUnits*(double)u); }
|
||||
inline void DefParser::setUnits ( double units ) { _defUnits = 1/units; }
|
||||
inline DbU::Unit DefParser::fromDefUnits ( int u ) { return DbU::fromPhysical(_defUnits*(double)u,DbU::UnitPower::Micro); }
|
||||
inline bool DefParser::hasErrors () { return not _errors.empty(); }
|
||||
inline unsigned int DefParser::getFlags () const { return _flags; }
|
||||
inline string DefParser::getBusBits () const { return _busBits; }
|
||||
|
@ -182,6 +189,32 @@ namespace {
|
|||
inline void DefParser::mergeToFitOnCellsDieArea ( const Box& box ) { _fitOnCellsDieArea.merge(box); }
|
||||
|
||||
|
||||
Cell* DefParser::getLefCell ( string name )
|
||||
{
|
||||
if (not _lefRootLibrary) {
|
||||
DataBase* db = DataBase::getDB();
|
||||
Library* rootLibrary = db->getRootLibrary();
|
||||
|
||||
if (rootLibrary) {
|
||||
_lefRootLibrary = rootLibrary->getLibrary( "LEF" );
|
||||
}
|
||||
}
|
||||
|
||||
Cell* masterCell = NULL;
|
||||
if (_lefRootLibrary) {
|
||||
for ( Library* library : _lefRootLibrary->getLibraries() ) {
|
||||
masterCell = library->getCell( name );
|
||||
if (masterCell) break;
|
||||
}
|
||||
}
|
||||
|
||||
if (not masterCell)
|
||||
masterCell = DefParser::getFramework()->getCell ( name, Catalog::State::Views );
|
||||
|
||||
return masterCell;
|
||||
}
|
||||
|
||||
|
||||
Transformation::Orientation DefParser::fromDefOrientation ( int orient )
|
||||
{
|
||||
// Note : the codes between DEF & Hurricane matches.
|
||||
|
@ -273,6 +306,14 @@ namespace {
|
|||
}
|
||||
|
||||
|
||||
int DefParser::_unitsCbk ( defrCallbackType_e c, double defUnits, lefiUserData ud )
|
||||
{
|
||||
DefParser* parser = (DefParser*)ud;
|
||||
parser->setUnits( defUnits );
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
int DefParser::_busBitCbk ( defrCallbackType_e c, const char* busbits, lefiUserData ud )
|
||||
{
|
||||
DefParser* parser = (DefParser*)ud;
|
||||
|
@ -343,8 +384,8 @@ namespace {
|
|||
|
||||
string componentName = component->name();
|
||||
string componentId = component->id();
|
||||
Cell* masterCell = getLefCell( componentName );
|
||||
|
||||
Cell* masterCell = DefParser::getFramework()->getCell ( componentName, Catalog::State::Views );
|
||||
if ( masterCell == NULL ) {
|
||||
ostringstream message;
|
||||
message << "Unknown model/Cell (LEF MACRO) " << componentName << " in <%s>.";
|
||||
|
@ -375,6 +416,9 @@ namespace {
|
|||
parser->mergeToFitOnCellsDieArea ( instance->getAbutmentBox() );
|
||||
}
|
||||
|
||||
//cerr << "Create " << componentId << " of " << masterCell
|
||||
// << " ab:" << masterCell->getAbutmentBox() << " @" << placement << endl;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -412,13 +456,13 @@ namespace {
|
|||
name.erase ( 0, name.size()-75 );
|
||||
name.insert( 0, 3, '.' );
|
||||
}
|
||||
name.insert( 0, "<" );
|
||||
name.insert( name.size(), ">" );
|
||||
name.insert( 0, "\"" );
|
||||
name.insert( name.size(), "\"" );
|
||||
if (name.size() < 80) name.insert( name.size(), 80-name.size(), ' ' );
|
||||
|
||||
if (tty::enabled()) {
|
||||
cmess2 << " "
|
||||
<< tty::bold << setw(7) << setfill('0') << ++netCount << ":" << setfill(' ')
|
||||
cmess2 << " <net:"
|
||||
<< tty::bold << setw(7) << setfill('0') << ++netCount << "> " << setfill(' ')
|
||||
<< tty::reset << setw(80) << name << tty::cr;
|
||||
cmess2.flush ();
|
||||
}
|
||||
|
@ -573,7 +617,7 @@ namespace {
|
|||
}
|
||||
|
||||
|
||||
} // End of anonymous namespace.
|
||||
} // Anonymous namespace.
|
||||
|
||||
#endif // HAVE_LEFDEF
|
||||
|
||||
|
@ -606,4 +650,10 @@ namespace CRL {
|
|||
}
|
||||
|
||||
|
||||
} // End of CRL namespace.
|
||||
void DefImport::reset ()
|
||||
{
|
||||
// DefParser::reset();
|
||||
}
|
||||
|
||||
|
||||
} // CRL namespace.
|
||||
|
|
|
@ -84,6 +84,8 @@ namespace {
|
|||
inline Library* getLibrary ( bool create=false );
|
||||
inline Cell* getCell () const;
|
||||
inline void setCell ( Cell* );
|
||||
inline CellGauge* getCellGauge () const;
|
||||
inline void setCellGauge ( CellGauge* );
|
||||
inline Net* getNet () const;
|
||||
inline void setNet ( Net* );
|
||||
static void setCoreSite ( DbU::Unit x, DbU::Unit y );
|
||||
|
@ -103,7 +105,6 @@ namespace {
|
|||
inline int getNthCut () const;
|
||||
inline void incNthCut ();
|
||||
inline RoutingGauge* getRoutingGauge () const;
|
||||
inline CellGauge* getCellGauge () const;
|
||||
inline void addPinSegment ( string name, Segment* );
|
||||
inline void clearPinSegments ();
|
||||
private:
|
||||
|
@ -112,8 +113,10 @@ namespace {
|
|||
static int _siteCbk ( lefrCallbackType_e, lefiSite* , lefiUserData );
|
||||
static int _obstructionCbk ( lefrCallbackType_e, lefiObstruction*, lefiUserData );
|
||||
static int _macroCbk ( lefrCallbackType_e, lefiMacro* , lefiUserData );
|
||||
static int _macroSiteCbk ( lefrCallbackType_e, const lefiMacroSite* , lefiUserData );
|
||||
static int _pinCbk ( lefrCallbackType_e, lefiPin* , lefiUserData );
|
||||
void _pinPostProcess ();
|
||||
void _pinStdPostProcess ();
|
||||
void _pinPadPostProcess ();
|
||||
private:
|
||||
string _file;
|
||||
string _libraryName;
|
||||
|
@ -141,6 +144,7 @@ namespace {
|
|||
inline Library* LefParser::getLibrary ( bool create ) { if (not _library and create) createLibrary(); return _library; }
|
||||
inline Cell* LefParser::getCell () const { return _cell; }
|
||||
inline void LefParser::setCell ( Cell* cell ) { _cell=cell; }
|
||||
inline void LefParser::setCellGauge ( CellGauge* gauge ) { _cellGauge=gauge; }
|
||||
inline Net* LefParser::getNet () const { return _net; }
|
||||
inline void LefParser::setNet ( Net* net ) { _net=net; }
|
||||
inline DbU::Unit LefParser::fromUnitsMicrons ( double d ) const { return DbU::fromPhysical(d,DbU::Micro); }
|
||||
|
@ -219,6 +223,7 @@ namespace {
|
|||
lefrSetSiteCbk ( _siteCbk );
|
||||
lefrSetObstructionCbk( _obstructionCbk );
|
||||
lefrSetMacroCbk ( _macroCbk );
|
||||
lefrSetMacroSiteCbk ( _macroSiteCbk );
|
||||
lefrSetPinCbk ( _pinCbk );
|
||||
}
|
||||
|
||||
|
@ -342,26 +347,47 @@ namespace {
|
|||
int LefParser::_siteCbk ( lefrCallbackType_e c, lefiSite* site, lefiUserData ud )
|
||||
{
|
||||
LefParser* parser = (LefParser*)ud;
|
||||
AllianceFramework* af = AllianceFramework::get();
|
||||
|
||||
if (site->hasClass()) {
|
||||
string siteClass = site->siteClass();
|
||||
boost::to_upper( siteClass );
|
||||
|
||||
DbU::Unit lefSiteWidth = DbU::fromPhysical( site->sizeX(), DbU::Micro );
|
||||
DbU::Unit lefSiteHeight = DbU::fromPhysical( site->sizeY(), DbU::Micro );
|
||||
|
||||
if (siteClass == "CORE") {
|
||||
CellGauge* gauge = parser->getCellGauge();
|
||||
|
||||
DbU::Unit lefSliceStep = DbU::fromPhysical( site->sizeX(), DbU::Micro );
|
||||
DbU::Unit lefSliceHeight = DbU::fromPhysical( site->sizeY(), DbU::Micro );
|
||||
DbU::Unit crlSliceStep = gauge->getSliceStep ();
|
||||
DbU::Unit crlSliceHeight = gauge->getSliceHeight();
|
||||
|
||||
if (not parser->getCoreSiteX()
|
||||
or ((parser->getCoreSiteX() != crlSliceStep) and (parser->getCoreSiteY() != crlSliceHeight)) ) {
|
||||
parser->setCoreSite( lefSliceStep, lefSliceHeight );
|
||||
parser->setCoreSite( lefSiteWidth, lefSiteHeight );
|
||||
|
||||
if ( (crlSliceStep == lefSliceStep) and (crlSliceHeight == lefSliceHeight) )
|
||||
if ( (crlSliceStep == lefSiteWidth) and (crlSliceHeight == lefSiteHeight) )
|
||||
cerr << " - Site \"" << site->name() << "\" of class CORE match the Coriolis Cell gauge." << endl;
|
||||
}
|
||||
} else if (siteClass == "PAD") {
|
||||
string name = string("LEF.") + site->name();
|
||||
CellGauge* cg = af->getCellGauge( name );
|
||||
|
||||
if (cg) {
|
||||
if ( (cg->getSliceStep() != lefSiteWidth) or (cg->getSliceHeight() != lefSiteHeight)) {
|
||||
cerr << " - Site \"" << site->name() << "\" of class PAD has mismatched redefinition OVERWRITING." << endl;
|
||||
cerr << " width: " << DbU::getValueString(cg->getSliceStep ()) << " vs. " << DbU::getValueString(lefSiteWidth)
|
||||
<< " height: " << DbU::getValueString(cg->getSliceHeight()) << " vs. " << DbU::getValueString(lefSiteHeight)
|
||||
<< endl;
|
||||
//cg->setPitch ( lefSiteWidth );
|
||||
cg->setSliceStep ( lefSiteWidth );
|
||||
cg->setSliceHeight( lefSiteHeight );
|
||||
}
|
||||
cg->setFlags( CellGauge::Flags::Pad );
|
||||
} else {
|
||||
cg = CellGauge::create( name.c_str(), "unknown", lefSiteWidth, lefSiteHeight, lefSiteWidth );
|
||||
cg->setFlags( CellGauge::Flags::Pad );
|
||||
af->addCellGauge( cg );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -421,8 +447,11 @@ namespace {
|
|||
|
||||
int LefParser::_macroCbk ( lefrCallbackType_e c, lefiMacro* macro, lefiUserData ud )
|
||||
{
|
||||
AllianceFramework* af = AllianceFramework::get();
|
||||
LefParser* parser = (LefParser*)ud;
|
||||
|
||||
parser->setCellGauge( NULL );
|
||||
|
||||
string cellName = macro->name();
|
||||
DbU::Unit width = 0;
|
||||
DbU::Unit height = 0;
|
||||
|
@ -441,17 +470,47 @@ namespace {
|
|||
cell->setAbutmentBox( Box( 0, 0, width, height ) );
|
||||
}
|
||||
|
||||
parser->_pinPostProcess();
|
||||
bool isPad = false;
|
||||
string gaugeName = "Unknown SITE";
|
||||
if (macro->hasSiteName()) {
|
||||
gaugeName = string("LEF.") + macro->siteName();
|
||||
CellGauge* cg = af->getCellGauge( gaugeName );
|
||||
if (cg) {
|
||||
isPad = cg->isPad();
|
||||
if (cg->getSliceHeight() != height) {
|
||||
cerr << Warning( "LefParser::_macroCbk(): Cell height %s do not match CellGauge/SITE \"%s\" of %s."
|
||||
, DbU::getValueString(height).c_str()
|
||||
, getString(cg->getName()).c_str()
|
||||
, DbU::getValueString(cg->getSliceHeight()).c_str()
|
||||
) << endl;
|
||||
}
|
||||
parser->setCellGauge( cg );
|
||||
} else {
|
||||
cerr << Warning( "LefParser::_macroCbk(): No CellGauge associated to SITE \"%s\"."
|
||||
, macro->siteName() ) << endl;
|
||||
}
|
||||
}
|
||||
|
||||
if (not isPad) parser->_pinStdPostProcess();
|
||||
else parser->_pinPadPostProcess();
|
||||
parser->clearPinSegments();
|
||||
|
||||
cerr << " - " << cellName
|
||||
<< " " << DbU::getValueString(width) << " " << DbU::getValueString(height) << endl;
|
||||
<< " " << DbU::getValueString(width) << " " << DbU::getValueString(height)
|
||||
<< " " << gaugeName;
|
||||
if (isPad) cerr << " (PAD)";
|
||||
cerr << endl;
|
||||
|
||||
parser->setCell( NULL );
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
int LefParser::_macroSiteCbk ( lefrCallbackType_e c, const lefiMacroSite* site, lefiUserData ud )
|
||||
{ return 0; }
|
||||
|
||||
|
||||
int LefParser::_pinCbk ( lefrCallbackType_e c, lefiPin* pin, lefiUserData ud )
|
||||
{
|
||||
LefParser* parser = (LefParser*)ud;
|
||||
|
@ -519,6 +578,10 @@ namespace {
|
|||
//cerr << " | " << segment << endl;
|
||||
continue;
|
||||
}
|
||||
if (geoms->itemType(igeom) == lefiGeomClassE) {
|
||||
// Ignore CLASS <site>. Deduced from segments positions.
|
||||
continue;
|
||||
}
|
||||
|
||||
string geomTypeName;
|
||||
switch ( geoms->itemType(igeom) ) {
|
||||
|
@ -550,13 +613,13 @@ namespace {
|
|||
}
|
||||
|
||||
|
||||
void LefParser::_pinPostProcess ()
|
||||
void LefParser::_pinStdPostProcess ()
|
||||
{
|
||||
const Layer* metal1 = _routingGauge->getLayerGauge( (size_t)0 )->getLayer();
|
||||
const RoutingLayerGauge* gaugeMetal2 = _routingGauge->getLayerGauge( 1 );
|
||||
Box ab = _cell->getAbutmentBox();
|
||||
|
||||
//cerr << " @ _pinPostProcess" << endl;
|
||||
//cerr << " @ _pinStdPostProcess" << endl;
|
||||
|
||||
for ( auto element : _pinSegments ) {
|
||||
string pinName = element.first;
|
||||
|
@ -612,8 +675,11 @@ namespace {
|
|||
}
|
||||
|
||||
if (ongrids.empty()) {
|
||||
cerr << Warning( "LefParser::_pinPostProcess(): Pin \"%s\" has no terminal ongrid."
|
||||
cerr << Warning( "LefParser::_pinStdPostProcess(): Pin \"%s\" has no terminal ongrid."
|
||||
, pinName.c_str() ) << endl;
|
||||
for ( Segment* segment : segments ) {
|
||||
NetExternalComponents::setExternal( segment );
|
||||
}
|
||||
} else {
|
||||
for ( Segment* segment : ongrids ) {
|
||||
NetExternalComponents::setExternal( segment );
|
||||
|
@ -623,6 +689,112 @@ namespace {
|
|||
}
|
||||
|
||||
|
||||
void LefParser::_pinPadPostProcess ()
|
||||
{
|
||||
Box ab = getCell()->getAbutmentBox();
|
||||
bool isCornerPad = (_cellGauge) and (_cellGauge->getSliceHeight() == _cellGauge->getSliceStep());
|
||||
|
||||
for ( auto element : _pinSegments ) {
|
||||
string pinName = element.first;
|
||||
vector<Segment*>& segments = element.second;
|
||||
vector<Segment*> ongrids;
|
||||
|
||||
if (segments.empty()) continue;
|
||||
|
||||
Net* net = segments[0]->getNet();
|
||||
|
||||
for ( size_t i=0 ; i<segments.size() ; ++i ) {
|
||||
Box bb = segments[i]->getBoundingBox();
|
||||
Interval hspan = Interval( bb.getXMin(), bb.getXMax() );
|
||||
Interval vspan = Interval( bb.getYMin(), bb.getYMax() );
|
||||
Segment* capSegment = NULL;
|
||||
|
||||
if (segments[i]->getLayer()->isBlockage()) continue;
|
||||
|
||||
if (net->isSupply()) {
|
||||
if (hspan.contains(ab.getXMin())) {
|
||||
capSegment = Horizontal::create( net
|
||||
, segments[i]->getLayer()
|
||||
, vspan.getCenter()
|
||||
, vspan.getSize()
|
||||
, ab.getXMin()
|
||||
, hspan.getVMax()
|
||||
);
|
||||
} else if (hspan.contains(ab.getXMax())) {
|
||||
capSegment = Horizontal::create( net
|
||||
, segments[i]->getLayer()
|
||||
, vspan.getCenter()
|
||||
, vspan.getSize()
|
||||
, hspan.getVMin()
|
||||
, ab.getXMax()
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
if (not capSegment) {
|
||||
vector<DbU::Unit> distanceToSide;
|
||||
distanceToSide.push_back( std::abs(bb.getXMin() - ab.getXMin()) ); // West.
|
||||
distanceToSide.push_back( std::abs(ab.getXMax() - bb.getXMax()) ); // East.
|
||||
distanceToSide.push_back( std::abs(bb.getYMin() - ab.getYMin()) ); // South.
|
||||
distanceToSide.push_back( std::abs(ab.getYMax() - bb.getYMax()) ); // North.
|
||||
|
||||
size_t closestSide = ((isCornerPad) ? 0 : 2);
|
||||
for ( size_t i=closestSide ; i < distanceToSide.size() ; ++i ) {
|
||||
if (distanceToSide[i] < distanceToSide[closestSide])
|
||||
closestSide = i;
|
||||
}
|
||||
|
||||
switch ( closestSide ) {
|
||||
default:
|
||||
case 0: // West.
|
||||
capSegment = Horizontal::create( net
|
||||
, segments[i]->getLayer()
|
||||
, vspan.getCenter()
|
||||
, vspan.getSize()
|
||||
, ab.getXMin()
|
||||
, hspan.getVMax()
|
||||
);
|
||||
break;
|
||||
case 1: // East.
|
||||
capSegment = Horizontal::create( net
|
||||
, segments[i]->getLayer()
|
||||
, vspan.getCenter()
|
||||
, vspan.getSize()
|
||||
, hspan.getVMin()
|
||||
, ab.getXMax()
|
||||
);
|
||||
break;
|
||||
case 2: // South.
|
||||
capSegment = Vertical::create( net
|
||||
, segments[i]->getLayer()
|
||||
, hspan.getCenter()
|
||||
, hspan.getSize()
|
||||
, ab.getYMin()
|
||||
, vspan.getVMax()
|
||||
);
|
||||
break;
|
||||
case 3: // North.
|
||||
capSegment = Vertical::create( net
|
||||
, segments[i]->getLayer()
|
||||
, hspan.getCenter()
|
||||
, hspan.getSize()
|
||||
, vspan.getVMin()
|
||||
, ab.getYMax()
|
||||
);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (capSegment) {
|
||||
NetExternalComponents::setExternal( capSegment );
|
||||
segments[i]->destroy();
|
||||
segments[i] = NULL;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
int LefParser::flushErrors ()
|
||||
{
|
||||
int code = (hasErrors()) ? 1 : 0;
|
||||
|
|
|
@ -46,6 +46,7 @@
|
|||
PyBlif.cpp
|
||||
PyGds.cpp
|
||||
PyLefImport.cpp
|
||||
PyDefImport.cpp
|
||||
)
|
||||
set( pyIncludes crlcore/PyBanner.h
|
||||
crlcore/PyCatalog.h
|
||||
|
@ -65,6 +66,7 @@
|
|||
crlcore/PyBlif.h
|
||||
crlcore/PyGds.h
|
||||
crlcore/PyLefImport.h
|
||||
crlcore/PyDefImport.h
|
||||
)
|
||||
set( depLibs crlcore
|
||||
${HURRICANE_PYTHON_LIBRARIES}
|
||||
|
|
|
@ -440,6 +440,39 @@ extern "C" {
|
|||
}
|
||||
|
||||
|
||||
static PyObject* PyAllianceFramework_matchCellGauge ( PyAllianceFramework* self, PyObject* args )
|
||||
{
|
||||
cdebug_log(30,0) << "PyAllianceFramework_matchCellGauge()" << endl;
|
||||
|
||||
CellGauge* cg = NULL;
|
||||
HTRY
|
||||
METHOD_HEAD( "AllianceFramework.matchCellGauge()" )
|
||||
|
||||
PyObject* arg0;
|
||||
PyObject* arg1;
|
||||
__cs.init( "AllianceFramework.matchCellGauge" );
|
||||
if (not PyArg_ParseTuple( args
|
||||
, "O&O&|O&:AllianceFramework.matchCellGauge"
|
||||
, Converter, &arg0
|
||||
, Converter, &arg1
|
||||
)) {
|
||||
PyErr_SetString( ConstructorError, "Invalid number of parameters for AllianceFramework.matchCellGauge()." );
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (__cs.getObjectIds() == ":int:int") {
|
||||
cg = af->matchCellGauge( PyAny_AsLong(arg0), PyAny_AsLong(arg1) );
|
||||
} else {
|
||||
PyErr_SetString( ConstructorError, "Bad parameter type for AllianceFramework.matchCelGauge()." );
|
||||
return NULL;
|
||||
}
|
||||
HCATCH
|
||||
|
||||
if (cg == NULL) Py_RETURN_NONE;
|
||||
return PyCellGauge_Link(cg);
|
||||
}
|
||||
|
||||
|
||||
static PyObject* PyAllianceFramework_loadLibraryCells ( PyAllianceFramework* self, PyObject* args )
|
||||
{
|
||||
cdebug_log(30,0) << "PyAllianceFramework_loadLibraryCells()" << endl;
|
||||
|
@ -505,6 +538,8 @@ extern "C" {
|
|||
, "Add a new cell gauge." }
|
||||
, { "getCellGauge" , (PyCFunction)PyAllianceFramework_getCellGauge , METH_VARARGS
|
||||
, "Get a cell gauge (whithout a name, return the default)." }
|
||||
, { "matchCellGauge" , (PyCFunction)PyAllianceFramework_matchCellGauge , METH_VARARGS
|
||||
, "Find the first CellGauge comptible with width and height." }
|
||||
, { "addRoutingGauge" , (PyCFunction)PyAllianceFramework_addRoutingGauge , METH_VARARGS
|
||||
, "Add a new routing gauge." }
|
||||
, { "getRoutingGauge" , (PyCFunction)PyAllianceFramework_getRoutingGauge , METH_VARARGS
|
||||
|
|
|
@ -88,9 +88,12 @@ extern "C" {
|
|||
|
||||
HTRY
|
||||
char* benchName = NULL;
|
||||
PyObject* pyEnforceVhdl = NULL;
|
||||
|
||||
if (PyArg_ParseTuple( args, "s:Blif.load", &benchName )) {
|
||||
cell = Blif::load( benchName );
|
||||
if (PyArg_ParseTuple( args, "s|O:Blif.load", &benchName, &pyEnforceVhdl )) {
|
||||
bool enforceVhdl = true;
|
||||
if (pyEnforceVhdl and (PyObject_IsTrue(pyEnforceVhdl) == 0)) enforceVhdl = false;
|
||||
cell = Blif::load( benchName, enforceVhdl );
|
||||
} else {
|
||||
PyErr_SetString ( ConstructorError, "Blif.load(): Bad type or bad number of parameters." );
|
||||
return NULL;
|
||||
|
|
|
@ -34,6 +34,7 @@
|
|||
#include "crlcore/PyBlif.h"
|
||||
#include "crlcore/PyGds.h"
|
||||
#include "crlcore/PyLefImport.h"
|
||||
#include "crlcore/PyDefImport.h"
|
||||
#include "crlcore/VhdlEntity.h"
|
||||
|
||||
|
||||
|
@ -124,6 +125,7 @@ extern "C" {
|
|||
PyBlif_LinkPyType ();
|
||||
PyGds_LinkPyType ();
|
||||
PyLefImport_LinkPyType ();
|
||||
PyDefImport_LinkPyType ();
|
||||
|
||||
PYTYPE_READY ( Banner );
|
||||
PYTYPE_READY ( CatalogState );
|
||||
|
@ -144,6 +146,7 @@ extern "C" {
|
|||
PYTYPE_READY ( Blif );
|
||||
PYTYPE_READY ( Gds );
|
||||
PYTYPE_READY ( LefImport );
|
||||
PYTYPE_READY ( DefImport );
|
||||
|
||||
// Identifier string can take up to 10 characters.
|
||||
__cs.addType ( "alcLib" , &PyTypeAllianceLibrary , "<AllianceLibrary>" , false );
|
||||
|
@ -198,6 +201,8 @@ extern "C" {
|
|||
PyModule_AddObject ( module, "Gds", (PyObject*)&PyTypeGds );
|
||||
Py_INCREF ( &PyTypeLefImport );
|
||||
PyModule_AddObject ( module, "LefImport", (PyObject*)&PyTypeLefImport );
|
||||
Py_INCREF ( &PyTypeDefImport );
|
||||
PyModule_AddObject ( module, "DefImport", (PyObject*)&PyTypeDefImport );
|
||||
|
||||
PyCatalog_postModuleInit ();
|
||||
PyEnvironment_postModuleInit ();
|
||||
|
|
|
@ -56,9 +56,11 @@ extern "C" {
|
|||
// +=================================================================+
|
||||
|
||||
|
||||
DirectGetBoolAttribute(PyCellGauge_isPad ,isPad ,PyCellGauge,CellGauge)
|
||||
DirectGetLongAttribute(PyCellGauge_getSliceHeight,getSliceHeight,PyCellGauge,CellGauge)
|
||||
DirectGetLongAttribute(PyCellGauge_getSliceStep ,getSliceStep ,PyCellGauge,CellGauge)
|
||||
DirectGetLongAttribute(PyCellGauge_getPitch ,getPitch ,PyCellGauge,CellGauge)
|
||||
DirectGetNameAttribute(PyCellGauge_getName ,getName ,PyCellGauge,CellGauge)
|
||||
|
||||
|
||||
static PyObject* PyCellGauge_create ( PyObject*, PyObject* args )
|
||||
|
@ -113,9 +115,11 @@ extern "C" {
|
|||
PyMethodDef PyCellGauge_Methods[] =
|
||||
{ { "create" , (PyCFunction)PyCellGauge_create , METH_VARARGS|METH_STATIC
|
||||
, "Create a new CellGauge." }
|
||||
, { "isPad" , (PyCFunction)PyCellGauge_isPad , METH_NOARGS , "Is the gauge for the IO pads." }
|
||||
, { "getSliceHeight" , (PyCFunction)PyCellGauge_getSliceHeight, METH_NOARGS , "Return the slice height." }
|
||||
, { "getSliceStep" , (PyCFunction)PyCellGauge_getSliceStep , METH_NOARGS , "Return the slice step." }
|
||||
, { "getPitch" , (PyCFunction)PyCellGauge_getPitch , METH_NOARGS , "Return the smallest common pitch." }
|
||||
, { "getName" , (PyCFunction)PyCellGauge_getName , METH_NOARGS , "Return the gauge name." }
|
||||
//, { "destroy" , (PyCFunction)PyCellGauge_destroy , METH_VARARGS
|
||||
// , "Destroy the associated hurricane object. The python object remains." }
|
||||
, {NULL, NULL, 0, NULL} /* sentinel */
|
||||
|
|
|
@ -0,0 +1,121 @@
|
|||
// -*- C++ -*-
|
||||
//
|
||||
// This file is part of the Coriolis Software.
|
||||
// Copyright (c) UPMC 2017-2018, All Rights Reserved
|
||||
//
|
||||
// +-----------------------------------------------------------------+
|
||||
// | C O R I O L I S |
|
||||
// | Alliance / Hurricane Interface |
|
||||
// | |
|
||||
// | Author : Jean-Paul CHAPUT |
|
||||
// | E-mail : Jean-Paul.Chaput@lip6.fr |
|
||||
// | =============================================================== |
|
||||
// | C++ Module : "./PyDefImport.cpp" |
|
||||
// +-----------------------------------------------------------------+
|
||||
|
||||
|
||||
#include "crlcore/PyDefImport.h"
|
||||
#include "hurricane/isobar/PyCell.h"
|
||||
#include <string>
|
||||
#include <sstream>
|
||||
|
||||
|
||||
namespace CRL {
|
||||
|
||||
using std::cerr;
|
||||
using std::endl;
|
||||
using std::hex;
|
||||
using std::string;
|
||||
using std::ostringstream;
|
||||
using Hurricane::tab;
|
||||
using Hurricane::Exception;
|
||||
using Hurricane::Bug;
|
||||
using Hurricane::Error;
|
||||
using Hurricane::Warning;
|
||||
using Hurricane::Cell;
|
||||
using Isobar::ProxyProperty;
|
||||
using Isobar::ProxyError;
|
||||
using Isobar::ConstructorError;
|
||||
using Isobar::HurricaneError;
|
||||
using Isobar::HurricaneWarning;
|
||||
using Isobar::ParseOneArg;
|
||||
using Isobar::ParseTwoArg;
|
||||
using Isobar::__cs;
|
||||
using Isobar::PyCell_Link;
|
||||
|
||||
|
||||
extern "C" {
|
||||
|
||||
|
||||
#if defined(__PYTHON_MODULE__)
|
||||
|
||||
// +=================================================================+
|
||||
// | "PyDefImport" Python Module Code Part |
|
||||
// +=================================================================+
|
||||
|
||||
|
||||
static PyObject* PyDefImport_load ( PyObject*, PyObject* args )
|
||||
{
|
||||
cdebug_log(30,0) << "PyDefImport_load()" << endl;
|
||||
|
||||
Cell* cell = NULL;
|
||||
|
||||
HTRY
|
||||
char* defFile = NULL;
|
||||
|
||||
if (PyArg_ParseTuple( args, "s:DefImport.load", &defFile )) {
|
||||
cell = DefImport::load( defFile, 0 );
|
||||
} else {
|
||||
PyErr_SetString ( ConstructorError, "DefImport.load(): Bad type or bad number of parameters." );
|
||||
return NULL;
|
||||
}
|
||||
HCATCH
|
||||
|
||||
return (PyObject*)PyCell_Link( cell );
|
||||
}
|
||||
|
||||
|
||||
static PyObject* PyDefImport_reset ( PyObject*, PyObject* )
|
||||
{
|
||||
cdebug_log(30,0) << "PyDefImport_reset()" << endl;
|
||||
HTRY
|
||||
DefImport::reset();
|
||||
HCATCH
|
||||
Py_RETURN_NONE;
|
||||
}
|
||||
|
||||
|
||||
// Standart Destroy (Attribute).
|
||||
|
||||
|
||||
PyMethodDef PyDefImport_Methods[] =
|
||||
{ { "load" , (PyCFunction)PyDefImport_load , METH_VARARGS|METH_STATIC
|
||||
, "Load a complete Cadence LEF library." }
|
||||
, { "reset" , (PyCFunction)PyDefImport_reset , METH_NOARGS|METH_STATIC
|
||||
, "Reset the Cadence LEF parser (clear technology)." }
|
||||
//, { "destroy" , (PyCFunction)PyDefImport_destroy , METH_VARARGS
|
||||
// , "Destroy the associated hurricane object. The python object remains." }
|
||||
, {NULL, NULL, 0, NULL} /* sentinel */
|
||||
};
|
||||
|
||||
|
||||
NoObjectDeleteMethod(DefImport)
|
||||
PyTypeObjectLinkPyTypeWithoutObject(DefImport,DefImport)
|
||||
|
||||
|
||||
#else // End of Python Module Code Part.
|
||||
|
||||
|
||||
// +=================================================================+
|
||||
// | "PyDefImport" Shared Library Code Part |
|
||||
// +=================================================================+
|
||||
|
||||
// Type Definition.
|
||||
PyTypeObjectDefinitionsOfModule(CRL,DefImport)
|
||||
|
||||
|
||||
#endif // End of Shared Library Code Part.
|
||||
|
||||
} // extern "C".
|
||||
|
||||
} // CRL namespace.
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue