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:
parent
0b605000ed
commit
94044992ef
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
|
@ -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
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -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) ) {
|
||||
|
|
|
@ -385,7 +385,7 @@ namespace Anabatic {
|
|||
_sourceContact = sourceContact;
|
||||
_fromHook = fromHook;
|
||||
|
||||
cdebug_log(145,1) << "NetBuilder::NetBuilder()" << endl;
|
||||
cdebug_log(145,1) << "NetBuilder::setStartHook()" << endl;
|
||||
cdebug_log(145,0) << "* _fromHook: " << fromHook << endl;
|
||||
cdebug_log(145,0) << "* _sourceContact:" << sourceContact << endl;
|
||||
|
||||
|
@ -614,10 +614,14 @@ namespace Anabatic {
|
|||
// End xG cascaded cases.
|
||||
// Optimized specific cases.
|
||||
case Conn_1G_1PinM2: _do_1G_1PinM2 (); break;
|
||||
case Conn_2G_1PinM2:
|
||||
case Conn_3G_1PinM2: _do_xG_1PinM2 (); break;
|
||||
case Conn_1G_1PinM3: _do_1G_1PinM3 (); break;
|
||||
case Conn_2G_1PinM3:
|
||||
case Conn_3G_1PinM3: _do_xG_1PinM3 (); break;
|
||||
case Conn_1G_1M1_1M2: _do_xG_1M1_1M2(); break;
|
||||
case Conn_1G_1M1_1M3: _do_1G_xM1 (); break;
|
||||
case Conn_2G_1M1_1M2: _do_xG_1M1_1M2(); break;
|
||||
case Conn_2G_1PinM2: _do_xG_xM2 (); break;
|
||||
default:
|
||||
if (not isTwoMetals())
|
||||
throw Bug( "Unmanaged Configuration [%d] = [%d+%d+%d+%d,%d+%d] %s in %s\n"
|
||||
|
@ -955,6 +959,27 @@ namespace Anabatic {
|
|||
}
|
||||
|
||||
|
||||
bool NetBuilder::_do_xG_1PinM2 ()
|
||||
{
|
||||
cdebug_log(145,0) << getTypeName() << "::_do_xG_1PinM2() method *not* reimplemented from base class." << endl;
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
bool NetBuilder::_do_1G_1PinM3 ()
|
||||
{
|
||||
cdebug_log(145,0) << getTypeName() << "::_do_1G_1PinM3() method *not* reimplemented from base class." << endl;
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
bool NetBuilder::_do_xG_1PinM3 ()
|
||||
{
|
||||
cdebug_log(145,0) << getTypeName() << "::_do_xG_1PinM3() method *not* reimplemented from base class." << endl;
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
bool NetBuilder::_do_1G_1M1 ()
|
||||
{
|
||||
cdebug_log(145,0) << getTypeName() << "::_do_1G_1M1() method *not* reimplemented from base class." << endl;
|
||||
|
|
|
@ -32,6 +32,7 @@
|
|||
#include "hurricane/RoutingPad.h"
|
||||
#include "hurricane/RoutingPads.h"
|
||||
#include "hurricane/Pad.h"
|
||||
#include "hurricane/Pin.h"
|
||||
#include "hurricane/Plug.h"
|
||||
#include "hurricane/Cell.h"
|
||||
#include "hurricane/Instance.h"
|
||||
|
@ -55,6 +56,7 @@ namespace Anabatic {
|
|||
using Hurricane::Transformation;
|
||||
using Hurricane::Warning;
|
||||
using Hurricane::Error;
|
||||
using Hurricane::Pin;
|
||||
|
||||
|
||||
NetBuilderVH::NetBuilderVH ()
|
||||
|
@ -253,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) );
|
||||
|
||||
|
|
|
@ -161,7 +161,7 @@ namespace Anabatic {
|
|||
|
||||
void AnabaticEngine::computeNetConstraints ( Net* net )
|
||||
{
|
||||
DebugSession::open( net, 140, 150);
|
||||
DebugSession::open( net, 145, 150);
|
||||
|
||||
cdebug_log(149,0) << "Anabatic::computeNetConstraints( " << net << " )" << endl;
|
||||
cdebug_tabw(145,1);
|
||||
|
|
|
@ -61,7 +61,7 @@ namespace Anabatic {
|
|||
|
||||
void AnabaticEngine::toOptimals ( Net* net )
|
||||
{
|
||||
DebugSession::open( net, 140, 150 );
|
||||
DebugSession::open( net, 145, 150 );
|
||||
cdebug_log(149,0) << "Anabatic::_toOptimals( " << net << " )" << endl;
|
||||
cdebug_tabw(145,1);
|
||||
|
||||
|
|
|
@ -203,6 +203,9 @@ namespace Anabatic {
|
|||
virtual bool _do_2G ();
|
||||
virtual bool _do_xG_1Pad ();
|
||||
virtual bool _do_1G_1PinM2 ();
|
||||
virtual bool _do_xG_1PinM2 ();
|
||||
virtual bool _do_1G_1PinM3 ();
|
||||
virtual bool _do_xG_1PinM3 ();
|
||||
virtual bool _do_1G_1M1 ();
|
||||
virtual bool _do_2G_1M1 ();
|
||||
virtual bool _do_1G_xM1 ();
|
||||
|
@ -234,7 +237,7 @@ namespace Anabatic {
|
|||
+ ((pads) << (GlobalBSize+Metal1BSize+Metal2BSize+Metal3BSize)) \
|
||||
+ ((pins) << (GlobalBSize+Metal1BSize+Metal2BSize+Metal3BSize+PadsBSize))
|
||||
|
||||
// Connexity Name | G|M1|M2|M2|Pad|Pin|
|
||||
// Connexity Name | G|M1|M2|M3|Pad|Pin|
|
||||
enum ConnexityFlag { Conn_0G = CONNEXITY_VALUE( 0, 0, 0, 0, 0 , 0 )
|
||||
, Conn_2G = CONNEXITY_VALUE( 2, 0, 0, 0, 0 , 0 )
|
||||
, Conn_3G = CONNEXITY_VALUE( 3, 0, 0, 0, 0 , 0 )
|
||||
|
@ -257,7 +260,7 @@ namespace Anabatic {
|
|||
, Conn_1G_4M3 = CONNEXITY_VALUE( 1, 0, 0, 4, 0 , 0 )
|
||||
, Conn_1G_1M1_1M2 = CONNEXITY_VALUE( 1, 1, 1, 0, 0 , 0 )
|
||||
, Conn_1G_1M1_1M3 = CONNEXITY_VALUE( 1, 1, 0, 1, 0 , 0 )
|
||||
// Connexity Name | G|M1|M2|M2|Pad|Pin|
|
||||
// Connexity Name | G|M1|M2|M3|Pad|Pin|
|
||||
, Conn_2G_1M1 = CONNEXITY_VALUE( 2, 1, 0, 0, 0 , 0 )
|
||||
, Conn_2G_2M1 = CONNEXITY_VALUE( 2, 2, 0, 0, 0 , 0 )
|
||||
, Conn_2G_3M1 = CONNEXITY_VALUE( 2, 3, 0, 0, 0 , 0 )
|
||||
|
@ -272,7 +275,7 @@ namespace Anabatic {
|
|||
, Conn_2G_3M3 = CONNEXITY_VALUE( 2, 0, 0, 3, 0 , 0 )
|
||||
, Conn_2G_4M3 = CONNEXITY_VALUE( 2, 0, 0, 4, 0 , 0 )
|
||||
, Conn_2G_1M1_1M2 = CONNEXITY_VALUE( 2, 1, 1, 0, 0 , 0 )
|
||||
// Connexity Name | G|M1|M2|M2|Pad|Pin|
|
||||
// Connexity Name | G|M1|M2|M3|Pad|Pin|
|
||||
, Conn_3G_1M1 = CONNEXITY_VALUE( 3, 1, 0, 0, 0 , 0 )
|
||||
, Conn_3G_2M1 = CONNEXITY_VALUE( 3, 2, 0, 0, 0 , 0 )
|
||||
, Conn_3G_3M1 = CONNEXITY_VALUE( 3, 3, 0, 0, 0 , 0 )
|
||||
|
@ -283,7 +286,7 @@ namespace Anabatic {
|
|||
, Conn_3G_2M3 = CONNEXITY_VALUE( 3, 0, 0, 2, 0 , 0 )
|
||||
, Conn_3G_3M3 = CONNEXITY_VALUE( 3, 0, 0, 3, 0 , 0 )
|
||||
, Conn_3G_4M3 = CONNEXITY_VALUE( 3, 0, 0, 4, 0 , 0 )
|
||||
// Connexity Name | G|M1|M2|M2|Pad|Pin|
|
||||
// Connexity Name | G|M1|M2|M3|Pad|Pin|
|
||||
, Conn_4G_1M1 = CONNEXITY_VALUE( 4, 1, 0, 0, 0 , 0 )
|
||||
, Conn_4G_2M1 = CONNEXITY_VALUE( 4, 2, 0, 0, 0 , 0 )
|
||||
, Conn_4G_3M1 = CONNEXITY_VALUE( 4, 3, 0, 0, 0 , 0 )
|
||||
|
@ -295,6 +298,10 @@ namespace Anabatic {
|
|||
, Conn_3G_1Pad = CONNEXITY_VALUE( 3, 0, 0, 0, 1 , 0 )
|
||||
, Conn_1G_1PinM2 = CONNEXITY_VALUE( 1, 0, 1, 0, 0 , 1 )
|
||||
, Conn_2G_1PinM2 = CONNEXITY_VALUE( 2, 0, 1, 0, 0 , 1 )
|
||||
, Conn_3G_1PinM2 = CONNEXITY_VALUE( 3, 0, 1, 0, 0 , 1 )
|
||||
, Conn_1G_1PinM3 = CONNEXITY_VALUE( 1, 0, 0, 1, 0 , 1 )
|
||||
, Conn_2G_1PinM3 = CONNEXITY_VALUE( 2, 0, 0, 1, 0 , 1 )
|
||||
, Conn_3G_1PinM3 = CONNEXITY_VALUE( 3, 0, 0, 1, 0 , 1 )
|
||||
};
|
||||
|
||||
#undef CONNEXITY_VALUE
|
||||
|
|
|
@ -32,6 +32,10 @@ namespace Anabatic {
|
|||
virtual void doRp_AutoContacts ( GCell*, Component*, AutoContact*& source, AutoContact*& target, uint64_t flags );
|
||||
virtual AutoContact* doRp_Access ( GCell*, Component*, uint64_t flags );
|
||||
private:
|
||||
virtual bool _do_1G_1PinM2 ();
|
||||
virtual bool _do_xG_1PinM2 ();
|
||||
virtual bool _do_1G_1PinM3 ();
|
||||
virtual bool _do_xG_1PinM3 ();
|
||||
virtual bool _do_1G_1M1 ();
|
||||
virtual bool _do_1G_xM1 ();
|
||||
virtual bool _do_2G_1M1 ();
|
||||
|
|
|
@ -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");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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()){
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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() );
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Reference in New Issue