Merge branch 'devel_anabatic' of ssh://bop/users/largo2/git/coriolis into devel_anabatic

This commit is contained in:
Marie-Minerve Louërat 2019-05-03 16:14:26 +02:00
commit 16bd5270f7
319 changed files with 6687 additions and 1519 deletions

View File

@ -1,15 +1,16 @@
UNAME_S = $(shell uname -s)
UNAME_R = $(shell uname -r)
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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -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();
@ -424,7 +427,13 @@ namespace Anabatic {
cdebug_tabw(112,-1);
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
}

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -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,13 +255,151 @@ 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;
uint64_t flags = NoFlags;
if (east() ) { flags |= HAccess|VSmall; }
else if (west() ) { flags |= HAccess|VSmall; }
if (east()) { flags |= HAccess|VSmall; }
else if (west()) { flags |= HAccess|VSmall; }
setBothCornerContacts( doRp_Access(getGCell(),getRoutingPads()[0],flags) );

View File

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

View File

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

View File

@ -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::setGlobalRouted ( bool state ) { _flags.set(Flags::GlobalRouted,state); }
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; }

View File

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

View File

@ -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()); }

View File

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

View File

@ -414,40 +414,50 @@ namespace Anabatic {
class PriorityQueue {
public:
inline PriorityQueue ();
inline ~PriorityQueue ();
inline bool empty () const;
inline size_t size () const;
inline void push ( Vertex* );
inline void erase ( Vertex* );
inline Vertex* top ();
inline void pop ();
inline void clear ();
inline void dump () const;
inline PriorityQueue ();
inline ~PriorityQueue ();
inline bool empty () const;
inline size_t size () const;
inline void push ( Vertex* );
inline void erase ( Vertex* );
inline Vertex* top ();
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 () { }
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 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(); _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 ()
{
@ -512,7 +522,7 @@ namespace Anabatic {
void run ( Mode mode=Mode::Standart );
inline const VertexSet& getSources () const;
private:
Dijkstra ( const Dijkstra& );
Dijkstra ( const Dijkstra& );
Dijkstra& operator= ( const Dijkstra& );
static DbU::Unit _distance ( const Vertex*, const Vertex*, const Edge* );
Point _getPonderedPoint () const;

View File

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

View File

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

View File

@ -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;
@ -324,58 +330,62 @@ namespace Anabatic {
};
inline bool GCell::isHFlat () const { return getYMin() == getYMax(); }
inline bool GCell::isVFlat () const { return getXMin() == getXMax(); }
inline bool GCell::isFlat () const { return isHFlat() or isVFlat(); }
inline bool GCell::isDevice () const { return _flags & Flags::DeviceGCell; }
inline bool GCell::isHChannel () const { return _flags & Flags::HChannelGCell; }
inline bool GCell::isVChannel () const { return _flags & Flags::VChannelGCell; }
inline bool GCell::isStrut () const { return _flags & Flags::StrutGCell; }
inline bool GCell::isAnalog () const { return _flags & Flags::AnalogGCellMask; }
inline bool GCell::isMatrix () const { return _flags & Flags::MatrixGCell; }
inline bool GCell::isRow () const { return _flags & Flags::RowGCellMask; }
inline bool GCell::isIoPad () const { return _flags & Flags::IoPadGCell; }
inline bool GCell::isHRail () const { return _flags & Flags::HRailGCell; }
inline bool GCell::isVRail () const { return _flags & Flags::VRailGCell; }
inline bool GCell::isStdCellRow () const { return _flags & Flags::StdCellRow; }
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 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 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; }
inline const vector<Edge*>& GCell::getNorthEdges () const { return _northEdges; }
inline const vector<Edge*>& GCell::getSouthEdges () const { return _southEdges; }
inline GCell* GCell::getWest () const { return _westEdges.empty() ? NULL : _westEdges[0]->getOpposite(this); }
inline GCell* GCell::getEast () const { return _eastEdges.empty() ? NULL : _eastEdges[0]->getOpposite(this); }
inline GCell* GCell::getSouth () const { return _southEdges.empty() ? NULL : _southEdges[0]->getOpposite(this); }
inline GCell* GCell::getNorth () const { return _northEdges.empty() ? NULL : _northEdges[0]->getOpposite(this); }
inline bool GCell::isHFlat () const { return getYMin() == getYMax(); }
inline bool GCell::isVFlat () const { return getXMin() == getXMax(); }
inline bool GCell::isFlat () const { return isHFlat() or isVFlat(); }
inline bool GCell::isDevice () const { return _flags & Flags::DeviceGCell; }
inline bool GCell::isHChannel () const { return _flags & Flags::HChannelGCell; }
inline bool GCell::isVChannel () const { return _flags & Flags::VChannelGCell; }
inline bool GCell::isStrut () const { return _flags & Flags::StrutGCell; }
inline bool GCell::isAnalog () const { return _flags & Flags::AnalogGCellMask; }
inline bool GCell::isMatrix () const { return _flags & Flags::MatrixGCell; }
inline bool GCell::isRow () const { return _flags & Flags::RowGCellMask; }
inline bool GCell::isIoPad () const { return _flags & Flags::IoPadGCell; }
inline bool GCell::isHRail () const { return _flags & Flags::HRailGCell; }
inline bool GCell::isVRail () const { return _flags & Flags::VRailGCell; }
inline bool GCell::isStdCellRow () const { return _flags & Flags::StdCellRow; }
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; }
inline const vector<Edge*>& GCell::getNorthEdges () const { return _northEdges; }
inline const vector<Edge*>& GCell::getSouthEdges () const { return _southEdges; }
inline GCell* GCell::getWest () const { return _westEdges.empty() ? NULL : _westEdges[0]->getOpposite(this); }
inline GCell* GCell::getEast () const { return _eastEdges.empty() ? NULL : _eastEdges[0]->getOpposite(this); }
inline GCell* GCell::getSouth () const { return _southEdges.empty() ? NULL : _southEdges[0]->getOpposite(this); }
inline GCell* GCell::getNorth () const { return _northEdges.empty() ? NULL : _northEdges[0]->getOpposite(this); }
inline Edge* GCell::getWestEdge () const { return _westEdges.empty() ? NULL : _westEdges[0]; }
inline Edge* GCell::getEastEdge () const { return _eastEdges.empty() ? NULL : _eastEdges[0]; }
inline Edge* GCell::getSouthEdge () const { return _southEdges.empty() ? NULL : _southEdges[0]; }
inline Edge* GCell::getNorthEdge () const { return _northEdges.empty() ? NULL : _northEdges[0]; }
inline Edge* GCell::getWestEdge () const { return _westEdges.empty() ? NULL : _westEdges[0]; }
inline Edge* GCell::getEastEdge () const { return _eastEdges.empty() ? NULL : _eastEdges[0]; }
inline Edge* GCell::getSouthEdge () const { return _southEdges.empty() ? NULL : _southEdges[0]; }
inline Edge* GCell::getNorthEdge () const { return _northEdges.empty() ? NULL : _northEdges[0]; }
inline GCell* GCell::getUnder ( Point p ) const { return getUnder(p.getX(),p.getY()); }
inline const vector<Contact*>& GCell::getGContacts () const { return _gcontacts; }
inline size_t GCell::getDepth () const { return _depth; }
const vector<AutoSegment*>& GCell::getVSegments () const { return _vsegments; }
inline const vector<AutoSegment*>& GCell::getHSegments () const { return _hsegments; }
inline const vector<AutoContact*>& GCell::getContacts () const { return _contacts; }
inline DbU::Unit GCell::getWidth () const { return (getXMax()-getXMin()); }
inline DbU::Unit GCell::getHeight () const { return (getYMax()-getYMin()); }
inline float GCell::getDensity ( size_t depth ) const { return (depth<_depth) ? _densities[depth] : 0.0; }
inline const GCell::Key& GCell::getKey () const { return _key; }
inline void GCell::setType ( Flags type ) { _flags.reset(Flags::GCellTypeMask); _flags |= (type&Flags::GCellTypeMask); };
inline void GCell::updateKey ( size_t depth ) { _key.update(depth); }
inline const Flags& GCell::flags () const { return _flags; }
inline Flags& GCell::flags () { return _flags; }
inline GCell* GCell::getUnder ( Point p ) const { return getUnder(p.getX(),p.getY()); }
inline const vector<Contact*>& GCell::getGContacts () const { return _gcontacts; }
inline size_t GCell::getDepth () const { return _depth; }
const vector<AutoSegment*>& GCell::getVSegments () const { return _vsegments; }
inline const vector<AutoSegment*>& GCell::getHSegments () const { return _hsegments; }
inline const vector<AutoContact*>& GCell::getContacts () const { return _contacts; }
inline DbU::Unit GCell::getWidth () const { return (getXMax()-getXMin()); }
inline DbU::Unit GCell::getHeight () const { return (getYMax()-getYMin()); }
inline float GCell::getDensity ( size_t depth ) const { return (depth<_depth) ? _densities[depth] : 0.0; }
inline const GCell::Key& GCell::getKey () const { return _key; }
inline void GCell::setType ( Flags type ) { _flags.reset(Flags::GCellTypeMask); _flags |= (type&Flags::GCellTypeMask); };
inline void GCell::updateKey ( size_t depth ) { _key.update(depth); }
inline const Flags& GCell::flags () const { return _flags; }
inline Flags& GCell::flags () { return _flags; }
inline DbU::Unit GCell::getXMax ( int shrink ) const
{ return _eastEdges.empty() ? getCell()->getAbutmentBox().getXMax() - shrink

View File

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

View File

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

View File

@ -38,12 +38,13 @@ build: FORCE
esac; \
case "$${X_SCLS}" in \
*"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"; \
export BOOST_INCLUDEDIR BOOST_LIBRARYDIR; \
echo "** Using $${X_SCLS}."; \
;; \
version="`echo $${X_SCLS} | sed 's,devtoolset-,,'`"; \
cmakeArgs="$${cmakeArgs} -D Boost_NO_SYSTEM_PATHS:STRING=TRUE"; \
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}."; \
;; \
esac; \
for tool in $(tools); do \
echo "** Building tool $${tool}"; \

View File

@ -14,6 +14,7 @@ projects = [
, { 'name' : "coriolis"
, 'tools' : [ "bootstrap"
, "lefdef"
, "flute"
, "vlsisapd"
, "hurricane"
, "crlcore"

View File

@ -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" ]
@ -182,7 +186,7 @@ class Builder:
#, "-D", "BUILD_SHARED_LIBS:STRING=%s" % self.enableShared
, "-D", "CMAKE_INSTALL_PREFIX:STRING=%s" % self.installDir
, "-D", "CMAKE_INSTALL_DIR:STRING=%s" % cmakeInstallDir
#, "-D", "CMAKE_MODULE_PATH:STRING=%s" % cmakeModules
#, "-D", "CMAKE_MODULE_PATH:STRING=%s" % cmakeModules
, toolSourceDir ]
if not os.path.isdir(toolBuildDir):
@ -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" )

View File

@ -139,14 +139,14 @@ class CompileWidget ( QWidget ):
if self.conf.rootDir: command += [ '--root=%s'%self.conf.rootDir ]
#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.qt5: command += [ '--qt5' ]
if self.options.noCache: command += [ '--no-cache' ]
if self.options.rmBuild: command += [ '--rm-build' ]
if self.options.verbose: command += [ '--verbose' ]
#if self.options.svnUpdate: command += [ '--svn-update' ]
#if self.options.svnStatus: command += [ '--svn-update' ]
if self.options.enableDoc: command += [ '--doc' ]
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' ]
if self.options.verbose: command += [ '--verbose' ]
if self.options.make:
makeArguments='install '+self.options.threads
command += [ '--make=%s'%makeArguments ]

View File

@ -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() )
@ -176,17 +176,17 @@ class OptionsWidget ( QWidget ):
def saveSettings ( self ):
settings = QSettings()
#settings.setValue('builder/svnUpdate' , self._svnUpdate .isChecked() )
#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/qt5' , self._qt5 .isChecked() )
settings.setValue('builder/buildMode' , self._buildMode .currentText() )
settings.setValue('builder/noCache' , self._noCache .isChecked() )
settings.setValue('builder/rmBuild' , self._rmBuild .isChecked() )
settings.setValue('builder/verbose' , self._verbose .isChecked() )
settings.setValue('builder/threads' , self._threads .currentText() )
#settings.setValue('builder/svnUpdate' , self._svnUpdate .isChecked() )
#settings.setValue('builder/svnStatus' , self._svnStatus .isChecked() )
settings.setValue('builder/make' , self._make .isChecked() )
settings.setValue('builder/enableDoc' , self._enableDoc .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() )
settings.setValue('builder/rmBuild' , self._rmBuild .isChecked() )
settings.setValue('builder/verbose' , self._verbose .isChecked() )
settings.setValue('builder/threads' , self._threads .currentText() )
for project in self._projects: project.saveToSettings()
return

View File

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

View File

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

View File

@ -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,26 +235,29 @@ 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"
sysconfDir = scriptDir
shellMessage = "Using system-wide devtoolset-2 Coriolis 2 (/opt/rh/devtoolset-2/root/usr)"
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 )
sysconfDir = scriptDir
shellMessage = "Using Nightly build Coriolis 2 (%s)" % coriolisTop
elif scriptDir.startswith("/users/outil/coriolis/coriolis-2.x/") \
or scriptDir.startswith("/soc/coriolis2/"):
coriolisTop = "/soc/coriolis2"
sysconfDir = coriolisTop + "/etc/coriolis2"
shellMessage = "Using SoC network-wide Coriolis 2 (/soc/coriolis2)"
else:
if not rootDir:
rootDir = os.getenv("HOME") + "/coriolis-2.x"
coriolisTop = "%s/%s/%s/install" % ( rootDir, osType, buildDir )
sysconfDir = coriolisTop + "/etc/coriolis2"
shellMessage = "Using user-selected Coriolis 2 (%s)" % rootDir
m = reDevtoolset.match( scriptDir )
if m:
coriolisTop = "/opt/rh/devtoolset-%d/root/usr" % m.group('version')
sysconfDir = scriptDir
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 )
sysconfDir = scriptDir
shellMessage = "Using Nightly build Coriolis 2 (%s)" % coriolisTop
elif scriptDir.startswith("/users/outil/coriolis/coriolis-2.x/") \
or scriptDir.startswith("/soc/coriolis2/"):
coriolisTop = "/soc/coriolis2"
sysconfDir = coriolisTop + "/etc/coriolis2"
shellMessage = "Using SoC network-wide Coriolis 2 (/soc/coriolis2)"
else:
if not rootDir:
rootDir = os.getenv("HOME") + "/coriolis-2.x"
coriolisTop = "%s/%s/%s/install" % ( rootDir, osType, buildDir )
sysconfDir = coriolisTop + "/etc/coriolis2"
shellMessage = "Using user-selected Coriolis 2 (%s)" % rootDir
if osType.startswith("Cygwin"):
strippedPath = "%s/%s:%s" % ( coriolisTop, libDir, strippedPath )
@ -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

View File

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

View File

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

View File

@ -85,6 +85,7 @@
${CONFIGURATION_LIBRARY}
${CIF_LIBRARY}
${AGDS_LIBRARY}
${FLUTE_LIBRARIES}
${LEFDEF_LIBRARIES}
${OA_LIBRARIES}
${QWT_LIBRARY}

View File

@ -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");
}
}
}

View File

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

View File

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

View File

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

View File

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

View File

@ -0,0 +1,5 @@
# -*- Mode:Python; explicit-buffer-name: "hMetis.conf<ispd18>" -*-
import helpers
execfile( helpers.sysConfDir+'/common/hMetis.conf' )

View File

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

View File

@ -0,0 +1,5 @@
# -*- Mode:Python; explicit-buffer-name: "mauka.conf<ispd18>" -*-
import helpers
execfile( helpers.sysConfDir+'/common/mauka.conf' )

View File

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

View File

@ -0,0 +1,5 @@
# -*- Mode:Python; explicit-buffer-name: "nimbus.conf<ispd18>" -*-
import helpers
execfile( helpers.sysConfDir+'/common/nimbus.conf' )

View File

@ -0,0 +1,5 @@
# -*- Mode:Python; explicit-buffer-name: "patterns.conf<ispd18>" -*-
import helpers
execfile( helpers.sysConfDir+'/common/patterns.conf' )

View File

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

View File

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

View File

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

View File

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

View File

@ -1,4 +1,4 @@
# -*- Mode:Python; explicit-buffer-name: "analog.conf<common>" -*-
# -*- Mode:Python; explicit-buffer-name: "analog.conf<cmos>" -*-
import helpers

View File

@ -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' )
)
@ -64,4 +77,5 @@ routingGaugesTable['sxlib-2M'] = \
# ( METAL_PIN, xy_common_pitch, slice_height, slice_step )
cellGaugesTable = {}
cellGaugesTable['sxlib'] = ('metal2', l(5.0), l(50.0), l(5.0))
cellGaugesTable['sxlib'] = ('metal2', l(5.0), l( 50.0), l( 5.0))
cellGaugesTable['pxlib'] = ('metal2', l(5.0), l(400.0), l(200.0))

View File

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

View File

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

View File

@ -0,0 +1,6 @@
# -*- Mode:Python; explicit-buffer-name: "analog.conf<cmos45>" -*-
import helpers
execfile( helpers.ndaConfDir+'/common/analog.conf' )

View File

@ -0,0 +1,6 @@
# -*- Mode:Python; explicit-buffer-name: "devices.conf<cmos45>" -*-
import helpers
execfile( helpers.ndaConfDir+'/common/devices.conf' )

View File

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

View File

@ -0,0 +1,5 @@
# -*- Mode:Python; explicit-buffer-name: "etesian.conf<cmos45>" -*-
import helpers
execfile( helpers.sysConfDir+'/common/etesian.conf' )

View File

@ -0,0 +1,5 @@
# -*- Mode:Python; explicit-buffer-name: "hMetis.conf<cmos45>" -*-
import helpers
execfile( helpers.sysConfDir+'/common/hMetis.conf' )

View File

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

View File

@ -0,0 +1,5 @@
# -*- Mode:Python; explicit-buffer-name: "mauka.conf<cmos45>" -*-
import helpers
execfile( helpers.sysConfDir+'/common/mauka.conf' )

View File

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

View File

@ -0,0 +1,5 @@
# -*- Mode:Python; explicit-buffer-name: "nimbus.conf<cmos45>" -*-
import helpers
execfile( helpers.sysConfDir+'/common/nimbus.conf' )

View File

@ -0,0 +1,5 @@
# -*- Mode:Python; explicit-buffer-name: "patterns.conf<cmos45>" -*-
import helpers
execfile( helpers.sysConfDir+'/common/patterns.conf' )

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -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,168 +10,33 @@ from Hurricane import DbU
# - <compositeLayersTable>
# - <symbolicLayersTable>
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' )
technoConfig = { 'name' : 'ISPD05/symbolic'
, 'precision' : 2
, 'gridValue' : 0.005
, 'gridUnit' : DbU.UnitPowerMicro
, 'gridsPerLambda' : 24
, 'symbolicGridStep' : 1.0
, 'polygonStep' : 24.0
}
# 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. 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 = \

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -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="" );

View File

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

View File

@ -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 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 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; }
// -------------------------------------------------------------------

View File

@ -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,7 +31,8 @@ namespace CRL {
public:
enum Flags { FitAbOnCells=0x1 };
public:
static Hurricane::Cell* load ( std::string design, unsigned int flags );
static void reset ();
static Hurricane::Cell* load ( std::string design, unsigned int flags );
};

View File

@ -608,23 +608,33 @@ namespace {
}
}
} else {
Diagonal* diagonal = dynamic_cast<Diagonal*>(component);
if (diagonal) {
Rectilinear* rectilinear = dynamic_cast<Rectilinear*>(component);
if (rectilinear) {
for ( const BasicLayer* layer : component->getLayer()->getBasicLayers() ) {
(*this) << BOUNDARY;
(*this) << layer;
(*this) << diagonal->getContour();
(*this) << rectilinear->getPoints();
(*this) << ENDEL;
}
} else if ( dynamic_cast<Horizontal*>(component)
or dynamic_cast<Vertical *>(component)
or dynamic_cast<Contact *>(component)
or dynamic_cast<Pad *>(component)) {
for ( const BasicLayer* layer : component->getLayer()->getBasicLayers() ) {
(*this) << BOUNDARY;
(*this) << layer;
(*this) << component->getBoundingBox(layer);
(*this) << ENDEL;
} else {
Diagonal* diagonal = dynamic_cast<Diagonal*>(component);
if (diagonal) {
for ( const BasicLayer* layer : component->getLayer()->getBasicLayers() ) {
(*this) << BOUNDARY;
(*this) << layer;
(*this) << diagonal->getContour();
(*this) << ENDEL;
}
} else if ( dynamic_cast<Horizontal*>(component)
or dynamic_cast<Vertical *>(component)
or dynamic_cast<Contact *>(component)
or dynamic_cast<Pad *>(component)) {
for ( const BasicLayer* layer : component->getLayer()->getBasicLayers() ) {
(*this) << BOUNDARY;
(*this) << layer;
(*this) << component->getBoundingBox(layer);
(*this) << ENDEL;
}
}
}
}

View File

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

View File

@ -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;
@ -125,8 +129,9 @@ namespace {
};
double DefParser::_defUnits = 0.01;
AllianceFramework* DefParser::_framework = NULL;
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.

View File

@ -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,17 +105,18 @@ 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:
static int _unitsCbk ( lefrCallbackType_e, lefiUnits* , lefiUserData );
static int _layerCbk ( lefrCallbackType_e, lefiLayer* , lefiUserData );
static int _siteCbk ( lefrCallbackType_e, lefiSite* , lefiUserData );
static int _obstructionCbk ( lefrCallbackType_e, lefiObstruction*, lefiUserData );
static int _macroCbk ( lefrCallbackType_e, lefiMacro* , lefiUserData );
static int _pinCbk ( lefrCallbackType_e, lefiPin* , lefiUserData );
void _pinPostProcess ();
static int _unitsCbk ( lefrCallbackType_e, lefiUnits* , lefiUserData );
static int _layerCbk ( lefrCallbackType_e, lefiLayer* , lefiUserData );
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 _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 );
}
@ -341,27 +346,48 @@ namespace {
int LefParser::_siteCbk ( lefrCallbackType_e c, lefiSite* site, lefiUserData ud )
{
LefParser* parser = (LefParser*)ud;
LefParser* parser = (LefParser*)ud;
AllianceFramework* af = AllianceFramework::get();
if (site->hasClass()) {
string siteClass = site->siteClass();
boost::to_upper( siteClass );
if (siteClass == "CORE") {
CellGauge* gauge = parser->getCellGauge();
DbU::Unit lefSiteWidth = DbU::fromPhysical( site->sizeX(), DbU::Micro );
DbU::Unit lefSiteHeight = DbU::fromPhysical( site->sizeY(), DbU::Micro );
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 (siteClass == "CORE") {
CellGauge* gauge = parser->getCellGauge();
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,7 +447,10 @@ namespace {
int LefParser::_macroCbk ( lefrCallbackType_e c, lefiMacro* macro, lefiUserData ud )
{
LefParser* parser = (LefParser*)ud;
AllianceFramework* af = AllianceFramework::get();
LefParser* parser = (LefParser*)ud;
parser->setCellGauge( NULL );
string cellName = macro->name();
DbU::Unit width = 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;

View File

@ -21,9 +21,9 @@
link_directories ( ${CRLCORE_BINARY_DIR}/src/ccore )
if(NOT WITH_QT5)
if(NOT WITH_QT5)
list ( APPEND cpps ${mocCpps} )
endif()
endif()
add_executable ( cyclop ${cpps} )
target_link_libraries ( cyclop crlcore

View File

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

View File

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

View File

@ -87,10 +87,13 @@ extern "C" {
Cell* cell = NULL;
HTRY
char* benchName = NULL;
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;

View File

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

View File

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

Some files were not shown because too many files have changed in this diff Show More