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 )
|
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);
|
||||||
|
|
|
@ -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;
|
||||||
|
|
||||||
|
|
|
@ -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;
|
||||||
|
|
||||||
|
|
|
@ -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;
|
||||||
|
|
||||||
|
|
|
@ -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;
|
||||||
|
|
||||||
|
|
|
@ -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;
|
||||||
|
|
||||||
|
|
|
@ -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);
|
||||||
|
|
||||||
|
|
|
@ -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
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -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) ) {
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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) );
|
||||||
|
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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);
|
||||||
|
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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 ();
|
||||||
|
|
|
@ -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");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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()){
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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() );
|
||||||
|
|
|
@ -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);
|
||||||
|
|
Loading…
Reference in New Issue