From 94044992ef3fbf1868f4b5e83a7302c301f081eb Mon Sep 17 00:00:00 2001 From: Jean-Paul Chaput Date: Sun, 10 Mar 2019 13:25:43 +0100 Subject: [PATCH] Pin management implemented for NetBuilderHV. * Bug: In Katana::Track::expandFreeInterval(), the OutsideElement case was not handled correctly, the end index must be increased in that case. As a result, this function was returning too short an interval. This was affecting the computation of perpandicular free interval in DataNegociate::update() for perpandicular fixed but not in a track. * New: In Anabatic::NetBuilder and NetBuilderVH, now manage GCells with one Pin, and up to three globals. Used to put terminals at the edge of a block. * New: In EtesianEngine, now manage placed Pins. (done through extractInstanceName()) * Change: In CRL::RoutingGauge::getHorizontalGauge() no longer skip PinOnly gauges to find the reference one (same goes for vertical). --- anabatic/src/AnabaticEngine.cpp | 8 +- anabatic/src/AutoContact.cpp | 2 +- anabatic/src/AutoContactHTee.cpp | 6 +- anabatic/src/AutoContactTerminal.cpp | 8 +- anabatic/src/AutoContactTurn.cpp | 6 +- anabatic/src/AutoContactVTee.cpp | 6 +- anabatic/src/AutoHorizontal.cpp | 2 +- anabatic/src/Configuration.cpp | 9 +- anabatic/src/LayerAssign.cpp | 8 +- anabatic/src/NetBuilder.cpp | 29 +++++- anabatic/src/NetBuilderVH.cpp | 144 ++++++++++++++++++++++++++- anabatic/src/NetConstraints.cpp | 2 +- anabatic/src/NetOptimals.cpp | 2 +- anabatic/src/anabatic/NetBuilder.h | 15 ++- anabatic/src/anabatic/NetBuilderVH.h | 4 + coloquinte/src/legalizer.cxx | 6 +- crlcore/src/ccore/RoutingGauge.cpp | 6 +- etesian/src/EtesianEngine.cpp | 60 ++++++++--- katana/src/ProtectRoutingPads.cpp | 2 +- katana/src/SymmetricRoute.cpp | 2 +- katana/src/Track.cpp | 9 +- 21 files changed, 277 insertions(+), 59 deletions(-) diff --git a/anabatic/src/AnabaticEngine.cpp b/anabatic/src/AnabaticEngine.cpp index bee3b171..f56c29ec 100644 --- a/anabatic/src/AnabaticEngine.cpp +++ b/anabatic/src/AnabaticEngine.cpp @@ -1046,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); @@ -1087,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); @@ -1145,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); @@ -1164,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); diff --git a/anabatic/src/AutoContact.cpp b/anabatic/src/AutoContact.cpp index 18e0ca60..77b23abd 100644 --- a/anabatic/src/AutoContact.cpp +++ b/anabatic/src/AutoContact.cpp @@ -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() - " << endl; diff --git a/anabatic/src/AutoContactHTee.cpp b/anabatic/src/AutoContactHTee.cpp index 776d9e5e..baf0cdf1 100644 --- a/anabatic/src/AutoContactHTee.cpp +++ b/anabatic/src/AutoContactHTee.cpp @@ -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; diff --git a/anabatic/src/AutoContactTerminal.cpp b/anabatic/src/AutoContactTerminal.cpp index 2fa7dbd2..c93ea0fa 100644 --- a/anabatic/src/AutoContactTerminal.cpp +++ b/anabatic/src/AutoContactTerminal.cpp @@ -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; diff --git a/anabatic/src/AutoContactTurn.cpp b/anabatic/src/AutoContactTurn.cpp index 58cca378..1d502e6f 100644 --- a/anabatic/src/AutoContactTurn.cpp +++ b/anabatic/src/AutoContactTurn.cpp @@ -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; diff --git a/anabatic/src/AutoContactVTee.cpp b/anabatic/src/AutoContactVTee.cpp index fb530bb5..24ed5ea0 100644 --- a/anabatic/src/AutoContactVTee.cpp +++ b/anabatic/src/AutoContactVTee.cpp @@ -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; diff --git a/anabatic/src/AutoHorizontal.cpp b/anabatic/src/AutoHorizontal.cpp index afadb8f5..c1744fab 100644 --- a/anabatic/src/AutoHorizontal.cpp +++ b/anabatic/src/AutoHorizontal.cpp @@ -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); diff --git a/anabatic/src/Configuration.cpp b/anabatic/src/Configuration.cpp index 698b2061..e2305d03 100644 --- a/anabatic/src/Configuration.cpp +++ b/anabatic/src/Configuration.cpp @@ -424,7 +424,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 +512,7 @@ namespace Anabatic { cdebug_tabw(112,-1); return false; +#endif } diff --git a/anabatic/src/LayerAssign.cpp b/anabatic/src/LayerAssign.cpp index e8ff7fb0..2b616f40 100644 --- a/anabatic/src/LayerAssign.cpp +++ b/anabatic/src/LayerAssign.cpp @@ -148,7 +148,7 @@ namespace Anabatic { void AnabaticEngine::_layerAssignByTrunk ( Net* net, set& 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); @@ -328,7 +328,7 @@ namespace Anabatic { void AnabaticEngine::moveULeft ( AutoSegment* seed, set& 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; @@ -365,7 +365,7 @@ namespace Anabatic { void AnabaticEngine::moveURight ( AutoSegment* seed, set& 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; @@ -405,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) ) { diff --git a/anabatic/src/NetBuilder.cpp b/anabatic/src/NetBuilder.cpp index cb092993..6947fad6 100644 --- a/anabatic/src/NetBuilder.cpp +++ b/anabatic/src/NetBuilder.cpp @@ -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; diff --git a/anabatic/src/NetBuilderVH.cpp b/anabatic/src/NetBuilderVH.cpp index 9d895e5d..3919e4b5 100644 --- a/anabatic/src/NetBuilderVH.cpp +++ b/anabatic/src/NetBuilderVH.cpp @@ -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( 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( 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( 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( 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) ); diff --git a/anabatic/src/NetConstraints.cpp b/anabatic/src/NetConstraints.cpp index bf94f88a..0e500090 100644 --- a/anabatic/src/NetConstraints.cpp +++ b/anabatic/src/NetConstraints.cpp @@ -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); diff --git a/anabatic/src/NetOptimals.cpp b/anabatic/src/NetOptimals.cpp index d08b2f3b..66c17ce2 100644 --- a/anabatic/src/NetOptimals.cpp +++ b/anabatic/src/NetOptimals.cpp @@ -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); diff --git a/anabatic/src/anabatic/NetBuilder.h b/anabatic/src/anabatic/NetBuilder.h index 6721a546..8cf01331 100644 --- a/anabatic/src/anabatic/NetBuilder.h +++ b/anabatic/src/anabatic/NetBuilder.h @@ -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 diff --git a/anabatic/src/anabatic/NetBuilderVH.h b/anabatic/src/anabatic/NetBuilderVH.h index 90a4a713..43a628b0 100644 --- a/anabatic/src/anabatic/NetBuilderVH.h +++ b/anabatic/src/anabatic/NetBuilderVH.h @@ -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 (); diff --git a/coloquinte/src/legalizer.cxx b/coloquinte/src/legalizer.cxx index 31485144..439296e3 100644 --- a/coloquinte/src/legalizer.cxx +++ b/coloquinte/src/legalizer.cxx @@ -2,6 +2,7 @@ #include "coloquinte/legalizer.hxx" #include "coloquinte/optimization_subproblems.hxx" +#include #include #include #include @@ -272,7 +273,8 @@ std::vector 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 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"); } } } diff --git a/crlcore/src/ccore/RoutingGauge.cpp b/crlcore/src/ccore/RoutingGauge.cpp index a8497280..53166a6c 100644 --- a/crlcore/src/ccore/RoutingGauge.cpp +++ b/crlcore/src/ccore/RoutingGauge.cpp @@ -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; diff --git a/etesian/src/EtesianEngine.cpp b/etesian/src/EtesianEngine.cpp index cf16728c..204dacc6 100644 --- a/etesian/src/EtesianEngine.cpp +++ b/etesian/src/EtesianEngine.cpp @@ -83,7 +83,10 @@ namespace { if (not rp->getOccurrence().getPath().getHeadPath().isEmpty()) name << getString(rp->getOccurrence().getPath().getHeadPath().getName()) << ":"; - name << "I." << getString(rp->getOccurrence().getPath().getTailInstance()->getName()); + if (rp->getOccurrence().getPath().getTailInstance()) + name << "I." << getString(rp->getOccurrence().getPath().getTailInstance()->getName()); + else + name << "C"; return name.str(); } @@ -129,6 +132,7 @@ namespace { { Cell* masterCell = rp->getOccurrence().getMasterCell(); Component* component = rp->_getEntityAsComponent(); + // TODO: verify that it doesn't assume that the orientation is North Box masterBox = masterCell->getAbutmentBox(); @@ -373,12 +377,6 @@ namespace Etesian { double rows = std::ceil( sqrt( gcellLength/aspectRatio ) ); double columns = std::ceil( gcellLength / rows ); - cmess1 << " o Creating abutment box (margin:" << (spaceMargin*100.0) - << "% aspect ratio:" << (aspectRatio*100.0) - << "% g-length:" << (cellLength/DbU::toLambda(getSliceHeight())) - << ")" << endl; - cmess1 << " - GCell grid: [" << (int)columns << "x" << (int)rows << "]" << endl; - UpdateSession::open(); for ( auto ioccurrence : feedOccurrences ) { static_cast(ioccurrence.getEntity())->destroy(); @@ -395,6 +393,13 @@ namespace Etesian { ) ); UpdateSession::close(); if (_viewer) _viewer->getCellWidget()->fitToContents(); + + cmess1 << " o Creating abutment box (margin:" << (spaceMargin*100.0) + << "% aspect ratio:" << (aspectRatio*100.0) + << "% g-length:" << (cellLength/DbU::toLambda(getSliceHeight())) + << ")" << endl; + cmess1 << " - " << getCell()->getAbutmentBox() << endl; + cmess1 << " - GCell grid: [" << (int)columns << "x" << (int)rows << "]" << endl; } @@ -445,15 +450,17 @@ namespace Etesian { void EtesianEngine::toColoquinte () { - cmess1 << " o Converting <" << getCell()->getName() << "> into Coloquinte." << endl; - - resetPlacement(); - - Dots dots ( cmess2, " ", 80, 1000 ); AllianceFramework* af = AllianceFramework::get(); DbU::Unit hpitch = getHorizontalPitch(); DbU::Unit vpitch = getVerticalPitch(); + cmess1 << " o Converting <" << getCell()->getName() << "> into Coloquinte." << endl; + cmess1 << ::Dots::asString(" - H-pitch" , DbU::getValueString(hpitch)) << endl; + cmess1 << ::Dots::asString(" - V-pitch" , DbU::getValueString(vpitch)) << endl; + + resetPlacement(); + + Dots dots ( cmess2, " ", 80, 1000 ); if (not cmess2.enabled()) dots.disable(); size_t instancesNb = 0; @@ -544,6 +551,13 @@ namespace Etesian { int_t xpos = instanceAb.getXMin() / vpitch; int_t ypos = instanceAb.getYMin() / hpitch; + // if ( (ysize != 1) and not instance->isFixed() ) { + // cerr << Error( "EtesianEngine::toColoquinte(): Instance \"%s\" of \"%s\" is a block (height: %d)." + // , instanceName.c_str() + // , getString(masterCell->getName()).c_str() + // , ysize ) << endl; + // } + instances[instanceId].size = point( xsize, ysize ); instances[instanceId].list_index = instanceId; instances[instanceId].area = static_cast(xsize) * static_cast(ysize); @@ -644,7 +658,9 @@ namespace Etesian { _progressReport2(" [---]" ); } - void EtesianEngine::roughLegalize( float minDisruption, unsigned options ){ + + void EtesianEngine::roughLegalize ( float minDisruption, unsigned options ) + { using namespace coloquinte::gp; // Create a legalizer and bipartition it until we have sufficient precision auto legalizer = (options & ForceUniformDensity) != 0 ? @@ -669,7 +685,9 @@ namespace Etesian { get_rough_legalization( _circuit, _placementUB, legalizer ); } - void EtesianEngine::feedRoutingBack(){ + + void EtesianEngine::feedRoutingBack () + { using namespace Katabatic; using namespace Kite; /* @@ -712,7 +730,14 @@ namespace Etesian { // Expand areas: TODO } - void EtesianEngine::globalPlace ( float initPenalty, float minDisruption, float targetImprovement, float minInc, float maxInc, unsigned options ){ + + void EtesianEngine::globalPlace ( float initPenalty + , float minDisruption + , float targetImprovement + , float minInc + , float maxInc + , unsigned options ) + { using namespace coloquinte::gp; float_t penaltyIncrease = minInc; @@ -781,7 +806,9 @@ namespace Etesian { _updatePlacement( _placementUB ); } - void EtesianEngine::detailedPlace ( int iterations, int effort, unsigned options ){ + + void EtesianEngine::detailedPlace ( int iterations, int effort, unsigned options ) + { using namespace coloquinte::gp; using namespace coloquinte::dp; @@ -841,6 +868,7 @@ namespace Etesian { _updatePlacement( _placementUB ); } + void EtesianEngine::place () { if(getCell()->isPlaced()){ diff --git a/katana/src/ProtectRoutingPads.cpp b/katana/src/ProtectRoutingPads.cpp index a3ec57f3..ffa29f2d 100644 --- a/katana/src/ProtectRoutingPads.cpp +++ b/katana/src/ProtectRoutingPads.cpp @@ -178,7 +178,7 @@ namespace Katana { for ( Net* net : getCell()->getNets() ) { if (net->isSupply()) continue; - DebugSession::open( net, 140, 150 ); + DebugSession::open( net, 145, 150 ); NetData* data = getNetData( net ); if (data and data->isFixed()) continue; diff --git a/katana/src/SymmetricRoute.cpp b/katana/src/SymmetricRoute.cpp index e7168907..fc0ff782 100644 --- a/katana/src/SymmetricRoute.cpp +++ b/katana/src/SymmetricRoute.cpp @@ -137,7 +137,7 @@ namespace { if (not _data) return false; if (not _data->isValid()) return _data->isValid(); - DebugSession::open( _data->getNet(), 144, 146 ); + DebugSession::open( _data->getNet(), 145, 146 ); // Temporary. //_data->setSymAxis( _katana->getCell()->getAbutmentBox().getCenter().getX() ); diff --git a/katana/src/Track.cpp b/katana/src/Track.cpp index 6c1b8c52..56ba691b 100644 --- a/katana/src/Track.cpp +++ b/katana/src/Track.cpp @@ -392,9 +392,9 @@ namespace Katana { Interval Track::getFreeInterval ( DbU::Unit position, Net* net ) const { - uint32_t state; - size_t begin; - size_t end; + uint32_t state = 0; + size_t begin = 0; + size_t end = 0; if (_segments.empty()) return Interval(_min,_max); @@ -429,6 +429,8 @@ namespace Katana { } if (not (state & EndIsTrackMax) ) { + if (state & EndIsNextSegmentMin) ++end; + if (_segments[end]->getNet() == net) { getNext( end, net ); @@ -439,6 +441,7 @@ namespace Katana { setMaximalFlags( state, EndIsSegmentMin ); } } + cdebug_log(155,0) << "end:" << end << " state:" << state << endl; } cdebug_tabw(155,-1);