Support for multiple M1 connectors in GCells with M3 pins.
* Change: In Anabatic::NetBuilderHV(), in 2-3 globals plus one M3 pins, support up to 3 M1 connectors.
This commit is contained in:
parent
8978074fe7
commit
0a664fed36
|
@ -649,8 +649,12 @@ namespace Anabatic {
|
||||||
case Conn_1G_2M1_1PinM2: _do_1G_xM1_1PinM2(); break;
|
case Conn_1G_2M1_1PinM2: _do_1G_xM1_1PinM2(); break;
|
||||||
case Conn_2G_1M1_1PinM2:
|
case Conn_2G_1M1_1PinM2:
|
||||||
case Conn_2G_2M1_1PinM2: _do_2G_xM1_1PinM2(); break;
|
case Conn_2G_2M1_1PinM2: _do_2G_xM1_1PinM2(); break;
|
||||||
case Conn_2G_1M1_1PinM3: _do_2G_1M1_1PinM3(); break;
|
case Conn_2G_1M1_1PinM3:
|
||||||
case Conn_3G_1M1_1PinM3: _do_3G_1M1_1PinM3(); break;
|
case Conn_2G_2M1_1PinM3:
|
||||||
|
case Conn_2G_3M1_1PinM3: _do_2G_xM1_1PinM3(); break;
|
||||||
|
case Conn_3G_1M1_1PinM3:
|
||||||
|
case Conn_3G_2M1_1PinM3:
|
||||||
|
case Conn_3G_3M1_1PinM3: _do_3G_xM1_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;
|
||||||
|
@ -1117,16 +1121,16 @@ namespace Anabatic {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
bool NetBuilder::_do_2G_1M1_1PinM3 ()
|
bool NetBuilder::_do_2G_xM1_1PinM3 ()
|
||||||
{
|
{
|
||||||
throw Error ( "%s::_do_2G_1M1_1PinM3() method *not* reimplemented from base class.", getTypeName().c_str() );
|
throw Error ( "%s::_do_2G_xM1_1PinM3() method *not* reimplemented from base class.", getTypeName().c_str() );
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
bool NetBuilder::_do_3G_1M1_1PinM3 ()
|
bool NetBuilder::_do_3G_xM1_1PinM3 ()
|
||||||
{
|
{
|
||||||
throw Error ( "%s::_do_3G_1M1_1PinM3() method *not* reimplemented from base class.", getTypeName().c_str() );
|
throw Error ( "%s::_do_3G_xM1_1PinM3() method *not* reimplemented from base class.", getTypeName().c_str() );
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -906,23 +906,71 @@ namespace Anabatic {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
bool NetBuilderHV::_do_3G_1M1_1PinM3 ()
|
bool NetBuilderHV::_do_2G_xM1_1PinM3 ()
|
||||||
{
|
{
|
||||||
cdebug_log(145,1) << getTypeName() << "::_do_3G_1M1_1PinM3() [Managed Configuration - Optimized] " << getTopology() << endl;
|
cdebug_log(145,1) << getTypeName() << "::_do_2G_xM1_1PinM3() [Managed Configuration - Optimized] " << getTopology() << endl;
|
||||||
|
|
||||||
RoutingPad* rpM1 = NULL;
|
|
||||||
RoutingPad* pinM3 = NULL;
|
RoutingPad* pinM3 = NULL;
|
||||||
AutoContact* pinContact = NULL;
|
AutoContact* pinContact = NULL;
|
||||||
AutoContact* dummy = NULL;
|
AutoContact* dummy = NULL;
|
||||||
|
|
||||||
|
sortRpByX( getRoutingPads(), NoFlags ); // increasing X.
|
||||||
|
|
||||||
|
vector<RoutingPad*> rpsM1;
|
||||||
for ( RoutingPad* rp : getRoutingPads() ) {
|
for ( RoutingPad* rp : getRoutingPads() ) {
|
||||||
if (dynamic_cast<Pin*>(rp->getOccurrence().getEntity())) pinM3 = rp;
|
if (dynamic_cast<Pin*>(rp->getOccurrence().getEntity())) pinM3 = rp;
|
||||||
else rpM1 = rp;
|
else rpsM1.push_back( rp );
|
||||||
|
}
|
||||||
|
|
||||||
|
for ( size_t i=1 ; i<rpsM1.size() ; ++i ) {
|
||||||
|
AutoContact* leftContact = doRp_Access( getGCell(), getRoutingPads()[i-1], HAccess );
|
||||||
|
AutoContact* rightContact = doRp_Access( getGCell(), getRoutingPads()[i ], HAccess );
|
||||||
|
AutoSegment::create( leftContact, rightContact, Flags::Horizontal );
|
||||||
}
|
}
|
||||||
|
|
||||||
doRp_AutoContacts( getGCell(), pinM3, pinContact, dummy, NoFlags );
|
doRp_AutoContacts( getGCell(), pinM3, pinContact, dummy, NoFlags );
|
||||||
|
|
||||||
AutoContact* m1contact = doRp_Access( getGCell(), rpM1, HAccess );
|
AutoContact* m1contact = doRp_Access( getGCell(), rpsM1.back(), HAccess );
|
||||||
|
|
||||||
|
AutoContact* vtee1 = AutoContactVTee::create( getGCell(), getNet(), Session::getContactLayer(1) );
|
||||||
|
AutoSegment::create( m1contact , vtee1, Flags::Horizontal );
|
||||||
|
AutoSegment::create( pinContact, vtee1, Flags::Vertical );
|
||||||
|
|
||||||
|
AutoContact* vtee2 = AutoContactVTee::create( getGCell(), getNet(), Session::getContactLayer(1) );
|
||||||
|
AutoSegment::create( vtee1, vtee2, Flags::Vertical );
|
||||||
|
|
||||||
|
setBothCornerContacts( vtee2 );
|
||||||
|
|
||||||
|
cdebug_tabw(145,-1);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool NetBuilderHV::_do_3G_xM1_1PinM3 ()
|
||||||
|
{
|
||||||
|
cdebug_log(145,1) << getTypeName() << "::_do_3G_1M1_1PinM3() [Managed Configuration - Optimized] " << getTopology() << endl;
|
||||||
|
|
||||||
|
RoutingPad* pinM3 = NULL;
|
||||||
|
AutoContact* pinContact = NULL;
|
||||||
|
AutoContact* dummy = NULL;
|
||||||
|
|
||||||
|
sortRpByX( getRoutingPads(), NoFlags ); // increasing X.
|
||||||
|
|
||||||
|
vector<RoutingPad*> rpsM1;
|
||||||
|
for ( RoutingPad* rp : getRoutingPads() ) {
|
||||||
|
if (dynamic_cast<Pin*>(rp->getOccurrence().getEntity())) pinM3 = rp;
|
||||||
|
else rpsM1.push_back( rp );
|
||||||
|
}
|
||||||
|
|
||||||
|
for ( size_t i=1 ; i<rpsM1.size() ; ++i ) {
|
||||||
|
AutoContact* leftContact = doRp_Access( getGCell(), getRoutingPads()[i-1], HAccess );
|
||||||
|
AutoContact* rightContact = doRp_Access( getGCell(), getRoutingPads()[i ], HAccess );
|
||||||
|
AutoSegment::create( leftContact, rightContact, Flags::Horizontal );
|
||||||
|
}
|
||||||
|
|
||||||
|
doRp_AutoContacts( getGCell(), pinM3, pinContact, dummy, NoFlags );
|
||||||
|
|
||||||
|
AutoContact* m1contact = doRp_Access( getGCell(), rpsM1.back(), HAccess );
|
||||||
|
|
||||||
AutoContact* vtee1 = AutoContactVTee::create( getGCell(), getNet(), Session::getContactLayer(1) );
|
AutoContact* vtee1 = AutoContactVTee::create( getGCell(), getNet(), Session::getContactLayer(1) );
|
||||||
AutoSegment::create( m1contact , vtee1, Flags::Horizontal );
|
AutoSegment::create( m1contact , vtee1, Flags::Horizontal );
|
||||||
|
@ -960,38 +1008,6 @@ namespace Anabatic {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
bool NetBuilderHV::_do_2G_1M1_1PinM3 ()
|
|
||||||
{
|
|
||||||
cdebug_log(145,1) << getTypeName() << "::_do_2G_1M1_1PinM3() [Managed Configuration - Optimized] " << getTopology() << endl;
|
|
||||||
|
|
||||||
RoutingPad* rpM1 = NULL;
|
|
||||||
RoutingPad* pinM3 = NULL;
|
|
||||||
AutoContact* pinContact = NULL;
|
|
||||||
AutoContact* dummy = NULL;
|
|
||||||
|
|
||||||
for ( RoutingPad* rp : getRoutingPads() ) {
|
|
||||||
if (dynamic_cast<Pin*>(rp->getOccurrence().getEntity())) pinM3 = rp;
|
|
||||||
else rpM1 = rp;
|
|
||||||
}
|
|
||||||
|
|
||||||
doRp_AutoContacts( getGCell(), pinM3, pinContact, dummy, NoFlags );
|
|
||||||
|
|
||||||
AutoContact* m1contact = doRp_Access( getGCell(), rpM1, HAccess );
|
|
||||||
|
|
||||||
AutoContact* vtee1 = AutoContactVTee::create( getGCell(), getNet(), Session::getContactLayer(1) );
|
|
||||||
AutoSegment::create( m1contact , vtee1, Flags::Horizontal );
|
|
||||||
AutoSegment::create( pinContact, vtee1, Flags::Vertical );
|
|
||||||
|
|
||||||
AutoContact* vtee2 = AutoContactVTee::create( getGCell(), getNet(), Session::getContactLayer(1) );
|
|
||||||
AutoSegment::create( vtee1, vtee2, Flags::Vertical );
|
|
||||||
|
|
||||||
setBothCornerContacts( vtee2 );
|
|
||||||
|
|
||||||
cdebug_tabw(145,-1);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
bool NetBuilderHV::_do_1G_xM1_1PinM2 ()
|
bool NetBuilderHV::_do_1G_xM1_1PinM2 ()
|
||||||
{
|
{
|
||||||
cdebug_log(145,1) << getTypeName() << "::_do_1G_xM1_1PinM2() [Managed Configuration - Optimized] " << getTopology() << endl;
|
cdebug_log(145,1) << getTypeName() << "::_do_1G_xM1_1PinM2() [Managed Configuration - Optimized] " << getTopology() << endl;
|
||||||
|
@ -1005,6 +1021,12 @@ namespace Anabatic {
|
||||||
else rpsM1.push_back( rp );
|
else rpsM1.push_back( rp );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
for ( size_t i=1 ; i<rpsM1.size() ; ++i ) {
|
||||||
|
AutoContact* leftContact = doRp_Access( getGCell(), getRoutingPads()[i-1], HAccess );
|
||||||
|
AutoContact* rightContact = doRp_Access( getGCell(), getRoutingPads()[i ], HAccess );
|
||||||
|
AutoSegment::create( leftContact, rightContact, Flags::Horizontal );
|
||||||
|
}
|
||||||
|
|
||||||
AutoContact* turn = NULL;
|
AutoContact* turn = NULL;
|
||||||
AutoContact* tee = NULL;
|
AutoContact* tee = NULL;
|
||||||
AutoContact* pinM2Contact = NULL;
|
AutoContact* pinM2Contact = NULL;
|
||||||
|
|
|
@ -224,8 +224,8 @@ namespace Anabatic {
|
||||||
virtual bool _do_1G_xM1_1PinM2 ();
|
virtual bool _do_1G_xM1_1PinM2 ();
|
||||||
virtual bool _do_2G_xM1_1PinM2 ();
|
virtual bool _do_2G_xM1_1PinM2 ();
|
||||||
virtual bool _do_1G_1M1_1PinM3 ();
|
virtual bool _do_1G_1M1_1PinM3 ();
|
||||||
virtual bool _do_2G_1M1_1PinM3 ();
|
virtual bool _do_2G_xM1_1PinM3 ();
|
||||||
virtual bool _do_3G_1M1_1PinM3 ();
|
virtual bool _do_3G_xM1_1PinM3 ();
|
||||||
virtual bool _do_globalSegment ();
|
virtual bool _do_globalSegment ();
|
||||||
virtual void singleGCell ( AnabaticEngine*, Net* );
|
virtual void singleGCell ( AnabaticEngine*, Net* );
|
||||||
AutoContact* _doHChannel ();
|
AutoContact* _doHChannel ();
|
||||||
|
@ -321,7 +321,11 @@ namespace Anabatic {
|
||||||
, Conn_3G_1PinM3 = CONNEXITY_VALUE( 3, 0, 0, 1, 0 , 1 )
|
, Conn_3G_1PinM3 = CONNEXITY_VALUE( 3, 0, 0, 1, 0 , 1 )
|
||||||
, Conn_1G_1M1_1PinM3 = CONNEXITY_VALUE( 1, 1, 0, 1, 0 , 1 )
|
, Conn_1G_1M1_1PinM3 = CONNEXITY_VALUE( 1, 1, 0, 1, 0 , 1 )
|
||||||
, Conn_2G_1M1_1PinM3 = CONNEXITY_VALUE( 2, 1, 0, 1, 0 , 1 )
|
, Conn_2G_1M1_1PinM3 = CONNEXITY_VALUE( 2, 1, 0, 1, 0 , 1 )
|
||||||
|
, Conn_2G_2M1_1PinM3 = CONNEXITY_VALUE( 2, 2, 0, 1, 0 , 1 )
|
||||||
|
, Conn_2G_3M1_1PinM3 = CONNEXITY_VALUE( 2, 3, 0, 1, 0 , 1 )
|
||||||
, Conn_3G_1M1_1PinM3 = CONNEXITY_VALUE( 3, 1, 0, 1, 0 , 1 )
|
, Conn_3G_1M1_1PinM3 = CONNEXITY_VALUE( 3, 1, 0, 1, 0 , 1 )
|
||||||
|
, Conn_3G_2M1_1PinM3 = CONNEXITY_VALUE( 3, 2, 0, 1, 0 , 1 )
|
||||||
|
, Conn_3G_3M1_1PinM3 = CONNEXITY_VALUE( 3, 3, 0, 1, 0 , 1 )
|
||||||
};
|
};
|
||||||
|
|
||||||
#undef CONNEXITY_VALUE
|
#undef CONNEXITY_VALUE
|
||||||
|
|
|
@ -57,8 +57,8 @@ namespace Anabatic {
|
||||||
virtual bool _do_1G_xM1_1PinM2 ();
|
virtual bool _do_1G_xM1_1PinM2 ();
|
||||||
virtual bool _do_2G_xM1_1PinM2 ();
|
virtual bool _do_2G_xM1_1PinM2 ();
|
||||||
virtual bool _do_1G_1M1_1PinM3 ();
|
virtual bool _do_1G_1M1_1PinM3 ();
|
||||||
virtual bool _do_2G_1M1_1PinM3 ();
|
virtual bool _do_2G_xM1_1PinM3 ();
|
||||||
virtual bool _do_3G_1M1_1PinM3 ();
|
virtual bool _do_3G_xM1_1PinM3 ();
|
||||||
virtual bool _do_globalSegment ();
|
virtual bool _do_globalSegment ();
|
||||||
virtual void singleGCell ( AnabaticEngine*, Net* );
|
virtual void singleGCell ( AnabaticEngine*, Net* );
|
||||||
public:
|
public:
|
||||||
|
|
Loading…
Reference in New Issue