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).
This commit is contained in:
Jean-Paul Chaput 2019-03-10 13:25:43 +01:00
parent 0b605000ed
commit 94044992ef
21 changed files with 277 additions and 59 deletions

View File

@ -1046,7 +1046,7 @@ namespace Anabatic {
void AnabaticEngine::updateNetTopology ( Net* net ) void AnabaticEngine::updateNetTopology ( Net* net )
{ {
DebugSession::open( net, 140, 150 ); DebugSession::open( net, 145, 150 );
cdebug_log(149,0) << "Anabatic::updateNetTopology( " << net << " )" << endl; cdebug_log(149,0) << "Anabatic::updateNetTopology( " << net << " )" << endl;
cdebug_tabw(145,1); cdebug_tabw(145,1);
@ -1087,7 +1087,7 @@ namespace Anabatic {
void AnabaticEngine::_alignate ( Net* net ) void AnabaticEngine::_alignate ( Net* net )
{ {
DebugSession::open( net, 140, 150 ); DebugSession::open( net, 145, 150 );
cdebug_log(149,0) << "Anabatic::_alignate( " << net << " )" << endl; cdebug_log(149,0) << "Anabatic::_alignate( " << net << " )" << endl;
cdebug_tabw(145,1); cdebug_tabw(145,1);
@ -1145,7 +1145,7 @@ namespace Anabatic {
void AnabaticEngine::_computeNetTerminals ( Net* net ) void AnabaticEngine::_computeNetTerminals ( Net* net )
{ {
DebugSession::open( net, 140, 150 ); DebugSession::open( net, 145, 150 );
cdebug_log(149,0) << "Anabatic::_computeNetTerminals( " << net << " )" << endl; cdebug_log(149,0) << "Anabatic::_computeNetTerminals( " << net << " )" << endl;
cdebug_tabw(145,1); cdebug_tabw(145,1);
@ -1164,7 +1164,7 @@ namespace Anabatic {
void AnabaticEngine::_saveNet ( Net* net ) void AnabaticEngine::_saveNet ( Net* net )
{ {
DebugSession::open( net, 140, 150 ); DebugSession::open( net, 145, 150 );
cdebug_log(145,0) << "Anabatic::_saveNet() " << net << endl; cdebug_log(145,0) << "Anabatic::_saveNet() " << net << endl;
cdebug_tabw(145,1); cdebug_tabw(145,1);

View File

@ -110,7 +110,7 @@ namespace Anabatic {
void AutoContact::_preDestroy () 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; cdebug_log(145,0) << "AutoContact::_preDestroy() - <AutoContact id:" << _id << ">" << endl;

View File

@ -200,7 +200,7 @@ namespace Anabatic {
void AutoContactHTee::updateCache () void AutoContactHTee::updateCache ()
{ {
DebugSession::open( getNet(), 140, 150 ); DebugSession::open( getNet(), 145, 150 );
cdebug_log(145,1) << _getTypeName() << "::updateCache() " << this << endl; cdebug_log(145,1) << _getTypeName() << "::updateCache() " << this << endl;
@ -249,7 +249,7 @@ namespace Anabatic {
void AutoContactHTee::updateGeometry () void AutoContactHTee::updateGeometry ()
{ {
DebugSession::open( getNet(), 140, 150 ); DebugSession::open( getNet(), 145, 150 );
cdebug_log(145,1) << _getTypeName() << "::updateGeometry() " << this << endl; cdebug_log(145,1) << _getTypeName() << "::updateGeometry() " << this << endl;
@ -277,7 +277,7 @@ namespace Anabatic {
void AutoContactHTee::updateTopology () void AutoContactHTee::updateTopology ()
{ {
DebugSession::open( getNet(), 140, 150 ); DebugSession::open( getNet(), 145, 150 );
cdebug_log(145,1) << _getTypeName() << "::updateTopology() " << this << endl; cdebug_log(145,1) << _getTypeName() << "::updateTopology() " << this << endl;

View File

@ -347,7 +347,7 @@ namespace Anabatic {
void AutoContactTerminal::cacheAttach ( AutoSegment* segment ) void AutoContactTerminal::cacheAttach ( AutoSegment* segment )
{ {
DebugSession::open( getNet(), 140, 150 ); DebugSession::open( getNet(), 145, 150 );
cdebug_log(145,1) << _getTypeName() << "::cacheAttach() " << this << endl; cdebug_log(145,1) << _getTypeName() << "::cacheAttach() " << this << endl;
@ -379,7 +379,7 @@ namespace Anabatic {
void AutoContactTerminal::updateCache () void AutoContactTerminal::updateCache ()
{ {
DebugSession::open( getNet(), 140, 150 ); DebugSession::open( getNet(), 145, 150 );
cdebug_log(145,1) << _getTypeName() << "::updateCache() " << this << endl; cdebug_log(145,1) << _getTypeName() << "::updateCache() " << this << endl;
@ -438,7 +438,7 @@ namespace Anabatic {
void AutoContactTerminal::updateGeometry () void AutoContactTerminal::updateGeometry ()
{ {
DebugSession::open( getNet(), 140, 150 ); DebugSession::open( getNet(), 145, 150 );
cdebug_log(145,1) << _getTypeName() << "::updateGeometry() " << this << endl; cdebug_log(145,1) << _getTypeName() << "::updateGeometry() " << this << endl;
@ -522,7 +522,7 @@ namespace Anabatic {
void AutoContactTerminal::updateTopology () void AutoContactTerminal::updateTopology ()
{ {
DebugSession::open( getNet(), 140, 150 ); DebugSession::open( getNet(), 145, 150 );
cdebug_log(145,1) << _getTypeName() << "::updateTopology() " << this << endl; cdebug_log(145,1) << _getTypeName() << "::updateTopology() " << this << endl;

View File

@ -154,7 +154,7 @@ namespace Anabatic {
void AutoContactTurn::updateCache () void AutoContactTurn::updateCache ()
{ {
DebugSession::open( getNet(), 140, 150 ); DebugSession::open( getNet(), 145, 150 );
cdebug_log(145,1) << _getTypeName() << "::updateCache() " << this << endl; cdebug_log(145,1) << _getTypeName() << "::updateCache() " << this << endl;
@ -195,7 +195,7 @@ namespace Anabatic {
void AutoContactTurn::updateGeometry () void AutoContactTurn::updateGeometry ()
{ {
DebugSession::open( getNet(), 140, 150 ); DebugSession::open( getNet(), 145, 150 );
cdebug_log(145,1) << _getTypeName() << "::updateGeometry() " << this << endl; cdebug_log(145,1) << _getTypeName() << "::updateGeometry() " << this << endl;
@ -223,7 +223,7 @@ namespace Anabatic {
void AutoContactTurn::updateTopology () void AutoContactTurn::updateTopology ()
{ {
DebugSession::open ( getNet(), 140, 150 ); DebugSession::open ( getNet(), 145, 150 );
cdebug_log(145,1) << _getTypeName() << "::updateTopology() " << this << endl; cdebug_log(145,1) << _getTypeName() << "::updateTopology() " << this << endl;

View File

@ -169,7 +169,7 @@ namespace Anabatic {
void AutoContactVTee::updateCache () void AutoContactVTee::updateCache ()
{ {
DebugSession::open( getNet(), 140, 150 ); DebugSession::open( getNet(), 145, 150 );
cdebug_log(145,1) << "AutoContactVTee::updateCache() " << this << endl; cdebug_log(145,1) << "AutoContactVTee::updateCache() " << this << endl;
@ -215,7 +215,7 @@ namespace Anabatic {
void AutoContactVTee::updateGeometry () void AutoContactVTee::updateGeometry ()
{ {
DebugSession::open( getNet(), 140, 150 ); DebugSession::open( getNet(), 145, 150 );
cdebug_log(145,1) << "AutoContactVTee::updateGeometry() " << this << endl; cdebug_log(145,1) << "AutoContactVTee::updateGeometry() " << this << endl;
@ -243,7 +243,7 @@ namespace Anabatic {
void AutoContactVTee::updateTopology () void AutoContactVTee::updateTopology ()
{ {
DebugSession::open ( getNet(), 140, 150 ); DebugSession::open ( getNet(), 145, 150 );
cdebug_log(145,1) << "AutoContactVTee::updateTopology() " << this << endl; cdebug_log(145,1) << "AutoContactVTee::updateTopology() " << this << endl;

View File

@ -762,7 +762,7 @@ namespace Anabatic {
Flags AutoHorizontal::_makeDogleg ( GCell* doglegGCell, Flags flags ) 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_log(149,0) << "AutoHorizontal::_makeDogleg(GCell*) in " << doglegGCell << endl;
cdebug_tabw(149,1); cdebug_tabw(149,1);

View File

@ -424,7 +424,13 @@ namespace Anabatic {
cdebug_tabw(112,-1); cdebug_tabw(112,-1);
return true; 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(); Box ab = rp->getCell()->getAbutmentBox();
const Layer* metal1 = getLayerGauge( 0 )->getLayer(); const Layer* metal1 = getLayerGauge( 0 )->getLayer();
RoutingLayerGauge* gauge = getLayerGauge( 1 ); RoutingLayerGauge* gauge = getLayerGauge( 1 );
@ -506,6 +512,7 @@ namespace Anabatic {
cdebug_tabw(112,-1); cdebug_tabw(112,-1);
return false; return false;
#endif
} }

View File

@ -148,7 +148,7 @@ namespace Anabatic {
void AnabaticEngine::_layerAssignByTrunk ( Net* net, set<Net*>& globalNets, unsigned long& total, unsigned long& global ) 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_log(149,0) << "Anabatic::_layerAssignByTrunk ( " << net << " )" << endl;
cdebug_tabw(145,1); cdebug_tabw(145,1);
@ -328,7 +328,7 @@ namespace Anabatic {
void AnabaticEngine::moveULeft ( AutoSegment* seed, set<Net*>& globalNets, GCell::Set& invalidateds ) void AnabaticEngine::moveULeft ( AutoSegment* seed, set<Net*>& globalNets, GCell::Set& invalidateds )
{ {
Net* net = seed->getNet(); Net* net = seed->getNet();
DebugSession::open( net, 140, 150 ); DebugSession::open( net, 145, 150 );
cdebug_log(9000,0) << "Deter| Move left: " << seed << endl; cdebug_log(9000,0) << "Deter| Move left: " << seed << endl;
@ -365,7 +365,7 @@ namespace Anabatic {
void AnabaticEngine::moveURight ( AutoSegment* seed, set<Net*>& globalNets, GCell::Set& invalidateds ) void AnabaticEngine::moveURight ( AutoSegment* seed, set<Net*>& globalNets, GCell::Set& invalidateds )
{ {
Net* net = seed->getNet(); Net* net = seed->getNet();
DebugSession::open( net, 140, 150 ); DebugSession::open( net, 145, 150 );
cdebug_log(9000,0) << "Deter| Move right: " << seed << endl; cdebug_log(9000,0) << "Deter| Move right: " << seed << endl;
@ -405,7 +405,7 @@ namespace Anabatic {
Net* net = seed->getNet(); Net* net = seed->getNet();
unsigned int seedDepth = Session::getRoutingGauge()->getLayerDepth(seed->getLayer()); 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; cdebug_log(9000,0) << "Deter| moveUpNetTrunk() depth:" << seedDepth << " " << seed << endl;
if (not seed->canMoveUp( 1.0, Flags::Propagate|Flags::AllowTerminal|Flags::NoCheckLayer) ) { if (not seed->canMoveUp( 1.0, Flags::Propagate|Flags::AllowTerminal|Flags::NoCheckLayer) ) {

View File

@ -385,7 +385,7 @@ namespace Anabatic {
_sourceContact = sourceContact; _sourceContact = sourceContact;
_fromHook = fromHook; _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) << "* _fromHook: " << fromHook << endl;
cdebug_log(145,0) << "* _sourceContact:" << sourceContact << endl; cdebug_log(145,0) << "* _sourceContact:" << sourceContact << endl;
@ -614,10 +614,14 @@ namespace Anabatic {
// End xG cascaded cases. // End xG cascaded cases.
// Optimized specific cases. // Optimized specific cases.
case Conn_1G_1PinM2: _do_1G_1PinM2 (); break; 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_1M2: _do_xG_1M1_1M2(); break;
case Conn_1G_1M1_1M3: _do_1G_xM1 (); break; case Conn_1G_1M1_1M3: _do_1G_xM1 (); break;
case Conn_2G_1M1_1M2: _do_xG_1M1_1M2(); break; case Conn_2G_1M1_1M2: _do_xG_1M1_1M2(); break;
case Conn_2G_1PinM2: _do_xG_xM2 (); break;
default: default:
if (not isTwoMetals()) if (not isTwoMetals())
throw Bug( "Unmanaged Configuration [%d] = [%d+%d+%d+%d,%d+%d] %s in %s\n" 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 () bool NetBuilder::_do_1G_1M1 ()
{ {
cdebug_log(145,0) << getTypeName() << "::_do_1G_1M1() method *not* reimplemented from base class." << endl; 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/RoutingPad.h"
#include "hurricane/RoutingPads.h" #include "hurricane/RoutingPads.h"
#include "hurricane/Pad.h" #include "hurricane/Pad.h"
#include "hurricane/Pin.h"
#include "hurricane/Plug.h" #include "hurricane/Plug.h"
#include "hurricane/Cell.h" #include "hurricane/Cell.h"
#include "hurricane/Instance.h" #include "hurricane/Instance.h"
@ -55,6 +56,7 @@ namespace Anabatic {
using Hurricane::Transformation; using Hurricane::Transformation;
using Hurricane::Warning; using Hurricane::Warning;
using Hurricane::Error; using Hurricane::Error;
using Hurricane::Pin;
NetBuilderVH::NetBuilderVH () 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 () bool NetBuilderVH::_do_1G_1M1 ()
{ {
cdebug_log(145,1) << getTypeName() << "::_do_1G_1M1() [Managed Configuration - Optimized] " << getTopology() << endl; cdebug_log(145,1) << getTypeName() << "::_do_1G_1M1() [Managed Configuration - Optimized] " << getTopology() << endl;
uint64_t flags = NoFlags; uint64_t flags = NoFlags;
if (east() ) { flags |= HAccess|VSmall; } if (east()) { flags |= HAccess|VSmall; }
else if (west() ) { flags |= HAccess|VSmall; } else if (west()) { flags |= HAccess|VSmall; }
setBothCornerContacts( doRp_Access(getGCell(),getRoutingPads()[0],flags) ); setBothCornerContacts( doRp_Access(getGCell(),getRoutingPads()[0],flags) );

View File

@ -161,7 +161,7 @@ namespace Anabatic {
void AnabaticEngine::computeNetConstraints ( Net* net ) void AnabaticEngine::computeNetConstraints ( Net* net )
{ {
DebugSession::open( net, 140, 150); DebugSession::open( net, 145, 150);
cdebug_log(149,0) << "Anabatic::computeNetConstraints( " << net << " )" << endl; cdebug_log(149,0) << "Anabatic::computeNetConstraints( " << net << " )" << endl;
cdebug_tabw(145,1); cdebug_tabw(145,1);

View File

@ -61,7 +61,7 @@ namespace Anabatic {
void AnabaticEngine::toOptimals ( Net* net ) void AnabaticEngine::toOptimals ( Net* net )
{ {
DebugSession::open( net, 140, 150 ); DebugSession::open( net, 145, 150 );
cdebug_log(149,0) << "Anabatic::_toOptimals( " << net << " )" << endl; cdebug_log(149,0) << "Anabatic::_toOptimals( " << net << " )" << endl;
cdebug_tabw(145,1); cdebug_tabw(145,1);

View File

@ -203,6 +203,9 @@ namespace Anabatic {
virtual bool _do_2G (); virtual bool _do_2G ();
virtual bool _do_xG_1Pad (); virtual bool _do_xG_1Pad ();
virtual bool _do_1G_1PinM2 (); 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_1M1 ();
virtual bool _do_2G_1M1 (); virtual bool _do_2G_1M1 ();
virtual bool _do_1G_xM1 (); virtual bool _do_1G_xM1 ();
@ -234,7 +237,7 @@ namespace Anabatic {
+ ((pads) << (GlobalBSize+Metal1BSize+Metal2BSize+Metal3BSize)) \ + ((pads) << (GlobalBSize+Metal1BSize+Metal2BSize+Metal3BSize)) \
+ ((pins) << (GlobalBSize+Metal1BSize+Metal2BSize+Metal3BSize+PadsBSize)) + ((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 ) enum ConnexityFlag { Conn_0G = CONNEXITY_VALUE( 0, 0, 0, 0, 0 , 0 )
, Conn_2G = CONNEXITY_VALUE( 2, 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 ) , 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_4M3 = CONNEXITY_VALUE( 1, 0, 0, 4, 0 , 0 )
, Conn_1G_1M1_1M2 = CONNEXITY_VALUE( 1, 1, 1, 0, 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 ) , 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_1M1 = CONNEXITY_VALUE( 2, 1, 0, 0, 0 , 0 )
, Conn_2G_2M1 = CONNEXITY_VALUE( 2, 2, 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 ) , 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_3M3 = CONNEXITY_VALUE( 2, 0, 0, 3, 0 , 0 )
, Conn_2G_4M3 = CONNEXITY_VALUE( 2, 0, 0, 4, 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 ) , 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_1M1 = CONNEXITY_VALUE( 3, 1, 0, 0, 0 , 0 )
, Conn_3G_2M1 = CONNEXITY_VALUE( 3, 2, 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 ) , 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_2M3 = CONNEXITY_VALUE( 3, 0, 0, 2, 0 , 0 )
, Conn_3G_3M3 = CONNEXITY_VALUE( 3, 0, 0, 3, 0 , 0 ) , Conn_3G_3M3 = CONNEXITY_VALUE( 3, 0, 0, 3, 0 , 0 )
, Conn_3G_4M3 = CONNEXITY_VALUE( 3, 0, 0, 4, 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_1M1 = CONNEXITY_VALUE( 4, 1, 0, 0, 0 , 0 )
, Conn_4G_2M1 = CONNEXITY_VALUE( 4, 2, 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 ) , 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_3G_1Pad = CONNEXITY_VALUE( 3, 0, 0, 0, 1 , 0 )
, Conn_1G_1PinM2 = CONNEXITY_VALUE( 1, 0, 1, 0, 0 , 1 ) , Conn_1G_1PinM2 = CONNEXITY_VALUE( 1, 0, 1, 0, 0 , 1 )
, Conn_2G_1PinM2 = CONNEXITY_VALUE( 2, 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 #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 void doRp_AutoContacts ( GCell*, Component*, AutoContact*& source, AutoContact*& target, uint64_t flags );
virtual AutoContact* doRp_Access ( GCell*, Component*, uint64_t flags ); virtual AutoContact* doRp_Access ( GCell*, Component*, uint64_t flags );
private: 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_1M1 ();
virtual bool _do_1G_xM1 (); virtual bool _do_1G_xM1 ();
virtual bool _do_2G_1M1 (); virtual bool _do_2G_1M1 ();

View File

@ -2,6 +2,7 @@
#include "coloquinte/legalizer.hxx" #include "coloquinte/legalizer.hxx"
#include "coloquinte/optimization_subproblems.hxx" #include "coloquinte/optimization_subproblems.hxx"
#include <iostream>
#include <algorithm> #include <algorithm>
#include <cmath> #include <cmath>
#include <queue> #include <queue>
@ -272,7 +273,8 @@ std::vector<cell_leg_properties> good_legalize(
} }
else{ else{
// If it is a fixed cell, we use fixed locations // 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{ 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

@ -123,7 +123,8 @@ namespace CRL {
RoutingLayerGauge* RoutingGauge::getHorizontalGauge () const RoutingLayerGauge* RoutingGauge::getHorizontalGauge () const
{ {
for ( RoutingLayerGauge* gauge : _layerGauges ) { 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 gauge;
} }
return NULL; return NULL;
@ -133,7 +134,8 @@ namespace CRL {
RoutingLayerGauge* RoutingGauge::getVerticalGauge () const RoutingLayerGauge* RoutingGauge::getVerticalGauge () const
{ {
for ( RoutingLayerGauge* gauge : _layerGauges ) { 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 gauge;
} }
return NULL; return NULL;

View File

@ -83,7 +83,10 @@ namespace {
if (not rp->getOccurrence().getPath().getHeadPath().isEmpty()) if (not rp->getOccurrence().getPath().getHeadPath().isEmpty())
name << getString(rp->getOccurrence().getPath().getHeadPath().getName()) << ":"; 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(); return name.str();
} }
@ -129,6 +132,7 @@ namespace {
{ {
Cell* masterCell = rp->getOccurrence().getMasterCell(); Cell* masterCell = rp->getOccurrence().getMasterCell();
Component* component = rp->_getEntityAsComponent(); Component* component = rp->_getEntityAsComponent();
// TODO: verify that it doesn't assume that the orientation is North // TODO: verify that it doesn't assume that the orientation is North
Box masterBox = masterCell->getAbutmentBox(); Box masterBox = masterCell->getAbutmentBox();
@ -373,12 +377,6 @@ namespace Etesian {
double rows = std::ceil( sqrt( gcellLength/aspectRatio ) ); double rows = std::ceil( sqrt( gcellLength/aspectRatio ) );
double columns = std::ceil( gcellLength / rows ); 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(); UpdateSession::open();
for ( auto ioccurrence : feedOccurrences ) { for ( auto ioccurrence : feedOccurrences ) {
static_cast<Instance*>(ioccurrence.getEntity())->destroy(); static_cast<Instance*>(ioccurrence.getEntity())->destroy();
@ -395,6 +393,13 @@ namespace Etesian {
) ); ) );
UpdateSession::close(); UpdateSession::close();
if (_viewer) _viewer->getCellWidget()->fitToContents(); 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 () void EtesianEngine::toColoquinte ()
{ {
cmess1 << " o Converting <" << getCell()->getName() << "> into Coloquinte." << endl;
resetPlacement();
Dots dots ( cmess2, " ", 80, 1000 );
AllianceFramework* af = AllianceFramework::get(); AllianceFramework* af = AllianceFramework::get();
DbU::Unit hpitch = getHorizontalPitch(); DbU::Unit hpitch = getHorizontalPitch();
DbU::Unit vpitch = getVerticalPitch(); 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(); if (not cmess2.enabled()) dots.disable();
size_t instancesNb = 0; size_t instancesNb = 0;
@ -544,6 +551,13 @@ namespace Etesian {
int_t xpos = instanceAb.getXMin() / vpitch; int_t xpos = instanceAb.getXMin() / vpitch;
int_t ypos = instanceAb.getYMin() / hpitch; 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<int_t>( xsize, ysize ); instances[instanceId].size = point<int_t>( xsize, ysize );
instances[instanceId].list_index = instanceId; instances[instanceId].list_index = instanceId;
instances[instanceId].area = static_cast<capacity_t>(xsize) * static_cast<capacity_t>(ysize); instances[instanceId].area = static_cast<capacity_t>(xsize) * static_cast<capacity_t>(ysize);
@ -644,7 +658,9 @@ namespace Etesian {
_progressReport2(" [---]" ); _progressReport2(" [---]" );
} }
void EtesianEngine::roughLegalize( float minDisruption, unsigned options ){
void EtesianEngine::roughLegalize ( float minDisruption, unsigned options )
{
using namespace coloquinte::gp; using namespace coloquinte::gp;
// Create a legalizer and bipartition it until we have sufficient precision // Create a legalizer and bipartition it until we have sufficient precision
auto legalizer = (options & ForceUniformDensity) != 0 ? auto legalizer = (options & ForceUniformDensity) != 0 ?
@ -669,7 +685,9 @@ namespace Etesian {
get_rough_legalization( _circuit, _placementUB, legalizer ); get_rough_legalization( _circuit, _placementUB, legalizer );
} }
void EtesianEngine::feedRoutingBack(){
void EtesianEngine::feedRoutingBack ()
{
using namespace Katabatic; using namespace Katabatic;
using namespace Kite; using namespace Kite;
/* /*
@ -712,7 +730,14 @@ namespace Etesian {
// Expand areas: TODO // 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; using namespace coloquinte::gp;
float_t penaltyIncrease = minInc; float_t penaltyIncrease = minInc;
@ -781,7 +806,9 @@ namespace Etesian {
_updatePlacement( _placementUB ); _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::gp;
using namespace coloquinte::dp; using namespace coloquinte::dp;
@ -841,6 +868,7 @@ namespace Etesian {
_updatePlacement( _placementUB ); _updatePlacement( _placementUB );
} }
void EtesianEngine::place () void EtesianEngine::place ()
{ {
if(getCell()->isPlaced()){ if(getCell()->isPlaced()){

View File

@ -178,7 +178,7 @@ namespace Katana {
for ( Net* net : getCell()->getNets() ) { for ( Net* net : getCell()->getNets() ) {
if (net->isSupply()) continue; if (net->isSupply()) continue;
DebugSession::open( net, 140, 150 ); DebugSession::open( net, 145, 150 );
NetData* data = getNetData( net ); NetData* data = getNetData( net );
if (data and data->isFixed()) continue; if (data and data->isFixed()) continue;

View File

@ -137,7 +137,7 @@ namespace {
if (not _data) return false; if (not _data) return false;
if (not _data->isValid()) return _data->isValid(); if (not _data->isValid()) return _data->isValid();
DebugSession::open( _data->getNet(), 144, 146 ); DebugSession::open( _data->getNet(), 145, 146 );
// Temporary. // Temporary.
//_data->setSymAxis( _katana->getCell()->getAbutmentBox().getCenter().getX() ); //_data->setSymAxis( _katana->getCell()->getAbutmentBox().getCenter().getX() );

View File

@ -392,9 +392,9 @@ namespace Katana {
Interval Track::getFreeInterval ( DbU::Unit position, Net* net ) const Interval Track::getFreeInterval ( DbU::Unit position, Net* net ) const
{ {
uint32_t state; uint32_t state = 0;
size_t begin; size_t begin = 0;
size_t end; size_t end = 0;
if (_segments.empty()) return Interval(_min,_max); if (_segments.empty()) return Interval(_min,_max);
@ -429,6 +429,8 @@ namespace Katana {
} }
if (not (state & EndIsTrackMax) ) { if (not (state & EndIsTrackMax) ) {
if (state & EndIsNextSegmentMin) ++end;
if (_segments[end]->getNet() == net) { if (_segments[end]->getNet() == net) {
getNext( end, net ); getNext( end, net );
@ -439,6 +441,7 @@ namespace Katana {
setMaximalFlags( state, EndIsSegmentMin ); setMaximalFlags( state, EndIsSegmentMin );
} }
} }
cdebug_log(155,0) << "end:" << end << " state:" << state << endl;
} }
cdebug_tabw(155,-1); cdebug_tabw(155,-1);