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

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;

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;

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;

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;

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;

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

View File

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

View File

@ -148,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);
@ -328,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;
@ -365,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;
@ -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) ) {

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

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

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

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

@ -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<Instance*>(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<int_t>( xsize, ysize );
instances[instanceId].list_index = instanceId;
instances[instanceId].area = static_cast<capacity_t>(xsize) * static_cast<capacity_t>(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()){

View File

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

View File

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

View File

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