Various bug corrections to pass the alliance-check-toolkit reference benchs.
* New: In Isobar::PyCell, export the isRouted() and setRouted() to the Python interface. * Bug: In CRL::Entity::parseEntity(), check that the closing parenthesis is the last character of the net name. Issue a more relevant error message. * In Anabatic::NetBuilder::_do_xG() and all other unimplemented methods, throw an error if called from a derived classes instead of just issuing a message in the debug stream. Avoid later core dumps... * In Anabatic::NetBuilderHV, implement the builders for GCells with one pin. Needed to support chip/corona routing. * Bug: In Cumulus/plugins/Chip.py, check that coronaCk exists before using it. * New: In Cumulus/plugins/PadsCorona/Side._placePad(), when routing a design with symbolic pads, export the chip external "pad" connectors to be able to perform a lvx (otherwise cougar do not create external nets). In Corona._createCoreWire(), set the minimal gap between the pads and the corona to 6 pitches. Empirical value to avoid DRC errors with symbolic pads (pxlib). When successufully done, mark the Corona cell as routed. * Bug: In Cumulus/plugins/Core2Chip.IoNet, the regex for vectorizet net was wrong, it was allowing only one digit in the index. * Bug: In Cumulus/plugins/Core2Chip.cmos, correct management of pad & corona clock nets. Correct connexion between vdde/vddi. * Bug: In Unicorn/cgt.py, forgot to execute scripts when in text mode.
This commit is contained in:
parent
3fb746fbef
commit
4cd0bcb009
|
@ -37,3 +37,6 @@ documentation/RDS/RDS.pdf
|
||||||
documentation/RDS/RDS.tex
|
documentation/RDS/RDS.tex
|
||||||
documentation/RDS/RDS.toc
|
documentation/RDS/RDS.toc
|
||||||
|
|
||||||
|
cumulus/src/plugins/CoreToChip_c35b4.py
|
||||||
|
cumulus/src/plugins/core2chip/c35b4.py
|
||||||
|
|
||||||
|
|
|
@ -389,7 +389,10 @@ namespace Anabatic {
|
||||||
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;
|
||||||
|
|
||||||
if (not _fromHook) return *this;
|
if (not _fromHook) {
|
||||||
|
cdebug_tabw(145,-1);
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
Segment* fromSegment = static_cast<Segment*>( _fromHook->getComponent() );
|
Segment* fromSegment = static_cast<Segment*>( _fromHook->getComponent() );
|
||||||
_net = fromSegment->getNet();
|
_net = fromSegment->getNet();
|
||||||
|
@ -933,70 +936,70 @@ namespace Anabatic {
|
||||||
|
|
||||||
bool NetBuilder::_do_xG ()
|
bool NetBuilder::_do_xG ()
|
||||||
{
|
{
|
||||||
cdebug_log(145,0) << getTypeName() << "::_do_xG() method *not* reimplemented from base class." << endl;
|
throw Error( "%::_do_xG() method *not* reimplemented from base class.", getTypeName().c_str() );
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
bool NetBuilder::_do_2G ()
|
bool NetBuilder::_do_2G ()
|
||||||
{
|
{
|
||||||
cdebug_log(145,0) << getTypeName() << "::_do_2G() method *not* reimplemented from base class." << endl;
|
throw Error ( "%s::_do_2G() method *not* reimplemented from base class.", getTypeName().c_str() );
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
bool NetBuilder::_do_xG_1Pad ()
|
bool NetBuilder::_do_xG_1Pad ()
|
||||||
{
|
{
|
||||||
cdebug_log(145,0) << getTypeName() << "::_do_xG_1Pad() method *not* reimplemented from base class." << endl;
|
throw Error ( "%s::_do_xG_1Pad() method *not* reimplemented from base class.", getTypeName().c_str() );
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
bool NetBuilder::_do_1G_1PinM2 ()
|
bool NetBuilder::_do_1G_1PinM2 ()
|
||||||
{
|
{
|
||||||
cdebug_log(145,0) << getTypeName() << "::_do_1G_1PinM2() method *not* reimplemented from base class." << endl;
|
throw Error ( "%s::_do_1G_1PinM2() method *not* reimplemented from base class.", getTypeName().c_str() );
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
bool NetBuilder::_do_xG_1PinM2 ()
|
bool NetBuilder::_do_xG_1PinM2 ()
|
||||||
{
|
{
|
||||||
cdebug_log(145,0) << getTypeName() << "::_do_xG_1PinM2() method *not* reimplemented from base class." << endl;
|
throw Error ( "%s::_do_xG_1PinM2() method *not* reimplemented from base class.", getTypeName().c_str() );
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
bool NetBuilder::_do_1G_1PinM3 ()
|
bool NetBuilder::_do_1G_1PinM3 ()
|
||||||
{
|
{
|
||||||
cdebug_log(145,0) << getTypeName() << "::_do_1G_1PinM3() method *not* reimplemented from base class." << endl;
|
throw Error ( "%s::_do_1G_1PinM3() method *not* reimplemented from base class.", getTypeName().c_str() );
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
bool NetBuilder::_do_xG_1PinM3 ()
|
bool NetBuilder::_do_xG_1PinM3 ()
|
||||||
{
|
{
|
||||||
cdebug_log(145,0) << getTypeName() << "::_do_xG_1PinM3() method *not* reimplemented from base class." << endl;
|
throw Error( "%s::_do_xG_1PinM3() method *not* reimplemented from base class.", getTypeName().c_str() );
|
||||||
return false;
|
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;
|
throw Error ( "%s::_do_1G_1M1() method *not* reimplemented from base class.", getTypeName().c_str() );
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
bool NetBuilder::_do_2G_1M1 ()
|
bool NetBuilder::_do_2G_1M1 ()
|
||||||
{
|
{
|
||||||
cdebug_log(145,0) << getTypeName() << "::_do_2G_1M1() method *not* reimplemented from base class." << endl;
|
throw Error ( "%s::_do_2G_1M1() method *not* reimplemented from base class.", getTypeName().c_str() );
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
bool NetBuilder::_do_1G_xM1 ()
|
bool NetBuilder::_do_1G_xM1 ()
|
||||||
{
|
{
|
||||||
cdebug_log(145,0) << getTypeName() << "::_do_1G_xM1() method *not* reimplemented from base class." << endl;
|
throw Error ( "%s::_do_1G_xM1() method *not* reimplemented from base class.", getTypeName().c_str() );
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1010,49 +1013,49 @@ namespace Anabatic {
|
||||||
|
|
||||||
bool NetBuilder::_do_xG_xM1_xM3 ()
|
bool NetBuilder::_do_xG_xM1_xM3 ()
|
||||||
{
|
{
|
||||||
cdebug_log(145,0) << getTypeName() << "::_do_xG_xM1_xM3() method *not* reimplemented from base class." << endl;
|
throw Error ( "%s::_do_xG_xM1_xM3() method *not* reimplemented from base class.", getTypeName().c_str() );
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
bool NetBuilder::_do_xG_1M1_1M2 ()
|
bool NetBuilder::_do_xG_1M1_1M2 ()
|
||||||
{
|
{
|
||||||
cdebug_log(145,0) << getTypeName() << "::_do_xG_1M1_1M2() method *not* reimplemented from base class." << endl;
|
throw Error ( "%s::_do_xG_1M1_1M2() method *not* reimplemented from base class.", getTypeName().c_str() );
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
bool NetBuilder::_do_4G_1M2 ()
|
bool NetBuilder::_do_4G_1M2 ()
|
||||||
{
|
{
|
||||||
cdebug_log(145,0) << getTypeName() << "::_do_4G_1M2() method *not* reimplemented from base class." << endl;
|
throw Error ( "%s::_do_4G_1M2() method *not* reimplemented from base class.", getTypeName().c_str() );
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
bool NetBuilder::_do_xG_xM2 ()
|
bool NetBuilder::_do_xG_xM2 ()
|
||||||
{
|
{
|
||||||
cdebug_log(145,0) << getTypeName() << "::_do_xG_xM2() method *not* reimplemented from base class." << endl;
|
throw Error ( "%s::_do_xG_xM2() method *not* reimplemented from base class.", getTypeName().c_str() );
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
bool NetBuilder::_do_1G_1M3 ()
|
bool NetBuilder::_do_1G_1M3 ()
|
||||||
{
|
{
|
||||||
cdebug_log(145,0) << getTypeName() << "::_do_1G_1M3() method *not* reimplemented from base class." << endl;
|
throw Error ( "%s::_do_1G_1M3() method *not* reimplemented from base class.", getTypeName().c_str() );
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
bool NetBuilder::_do_xG_xM3 ()
|
bool NetBuilder::_do_xG_xM3 ()
|
||||||
{
|
{
|
||||||
cdebug_log(145,0) << getTypeName() << "::_do_xG_xM3() method *not* reimplemented from base class." << endl;
|
throw Error ( "%s::_do_xG_xM3() method *not* reimplemented from base class.", getTypeName().c_str() );
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
bool NetBuilder::_do_globalSegment ()
|
bool NetBuilder::_do_globalSegment ()
|
||||||
{
|
{
|
||||||
cdebug_log(145,0) << getTypeName() << "::_do_globalSegment() method *not* reimplemented from base class." << endl;
|
throw Error ( "%s::_do_globalSegment() method *not* reimplemented from base class.", getTypeName().c_str() );
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -165,32 +165,32 @@ namespace Anabatic {
|
||||||
{
|
{
|
||||||
cdebug_log(145,1) << getTypeName() << "::doRp_Access() - flags:" << flags << endl;
|
cdebug_log(145,1) << getTypeName() << "::doRp_Access() - flags:" << flags << endl;
|
||||||
|
|
||||||
AutoContact* rpContactSource;
|
AutoContact* rpSourceContact;
|
||||||
AutoContact* rpContactTarget;
|
AutoContact* rpContactTarget;
|
||||||
|
|
||||||
flags |= checkRoutingPadSize( rp );
|
flags |= checkRoutingPadSize( rp );
|
||||||
|
|
||||||
doRp_AutoContacts( gcell, rp, rpContactSource, rpContactTarget, flags );
|
doRp_AutoContacts( gcell, rp, rpSourceContact, rpContactTarget, flags );
|
||||||
|
|
||||||
if (flags & HAccess) {
|
if (flags & HAccess) {
|
||||||
if (flags & VSmall) {
|
if (flags & VSmall) {
|
||||||
AutoContact* subContact1 = AutoContactTurn::create( gcell, rp->getNet(), Session::getContactLayer(1) );
|
AutoContact* subContact1 = AutoContactTurn::create( gcell, rp->getNet(), Session::getContactLayer(1) );
|
||||||
AutoContact* subContact2 = AutoContactTurn::create( gcell, rp->getNet(), Session::getContactLayer(1) );
|
AutoContact* subContact2 = AutoContactTurn::create( gcell, rp->getNet(), Session::getContactLayer(1) );
|
||||||
AutoSegment::create( rpContactSource, subContact1, Flags::Horizontal );
|
AutoSegment::create( rpSourceContact, subContact1, Flags::Horizontal );
|
||||||
AutoSegment::create( subContact1, subContact2, Flags::Vertical );
|
AutoSegment::create( subContact1, subContact2, Flags::Vertical );
|
||||||
rpContactSource = subContact2;
|
rpSourceContact = subContact2;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if (flags & HSmall) {
|
if (flags & HSmall) {
|
||||||
AutoContact* subContact1 = AutoContactTurn::create( gcell, rp->getNet(), Session::getContactLayer(1) );
|
AutoContact* subContact1 = AutoContactTurn::create( gcell, rp->getNet(), Session::getContactLayer(1) );
|
||||||
AutoSegment::create( rpContactSource, subContact1, Flags::Horizontal );
|
AutoSegment::create( rpSourceContact, subContact1, Flags::Horizontal );
|
||||||
rpContactSource = subContact1;
|
rpSourceContact = subContact1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
cdebug_tabw(145,-1);
|
cdebug_tabw(145,-1);
|
||||||
|
|
||||||
return rpContactSource;
|
return rpSourceContact;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -416,13 +416,13 @@ namespace Anabatic {
|
||||||
{
|
{
|
||||||
cdebug_log(145,1) << getTypeName() << "::_do_1G_1PinM2() [Managed Configuration - Optimized] " << getTopology() << endl;
|
cdebug_log(145,1) << getTypeName() << "::_do_1G_1PinM2() [Managed Configuration - Optimized] " << getTopology() << endl;
|
||||||
|
|
||||||
AutoContact* rpContactSource = NULL;
|
AutoContact* rpSourceContact = NULL;
|
||||||
AutoContact* rpContactTarget = NULL;
|
AutoContact* rpContactTarget = NULL;
|
||||||
|
|
||||||
doRp_AutoContacts( getGCell(), getRoutingPads()[0], rpContactSource, rpContactTarget, NoFlags );
|
doRp_AutoContacts( getGCell(), getRoutingPads()[0], rpSourceContact, rpContactTarget, NoFlags );
|
||||||
|
|
||||||
AutoContact* turn1 = AutoContactTurn::create( getGCell(), getNet(), Session::getContactLayer(1) );
|
AutoContact* turn1 = AutoContactTurn::create( getGCell(), getNet(), Session::getContactLayer(1) );
|
||||||
AutoSegment::create( rpContactSource, turn1, Flags::Horizontal );
|
AutoSegment::create( rpSourceContact, turn1, Flags::Horizontal );
|
||||||
|
|
||||||
if (east() or west()) {
|
if (east() or west()) {
|
||||||
AutoContact* turn2 = AutoContactTurn::create( getGCell(), getNet(), Session::getContactLayer(1) );
|
AutoContact* turn2 = AutoContactTurn::create( getGCell(), getNet(), Session::getContactLayer(1) );
|
||||||
|
@ -436,17 +436,84 @@ namespace Anabatic {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool NetBuilderHV::_do_xG_1PinM2 ()
|
||||||
|
{
|
||||||
|
cdebug_log(145,1) << getTypeName() << "::_do_xG_1PinM2() [Managed Configuration - Optimized] " << getTopology() << endl;
|
||||||
|
|
||||||
|
AutoContact* rpSourceContact = NULL;
|
||||||
|
AutoContact* rpContactTarget = NULL;
|
||||||
|
|
||||||
|
doRp_AutoContacts( getGCell(), getRoutingPads()[0], rpSourceContact, rpContactTarget, NoFlags );
|
||||||
|
|
||||||
|
if (getConnexity().fields.globals == 2) {
|
||||||
|
if (west() and south()) {
|
||||||
|
AutoContact* turn1 = AutoContactTurn::create( getGCell(), getNet(), Session::getContactLayer(1) );
|
||||||
|
AutoSegment::create( rpSourceContact, turn1, Flags::Horizontal );
|
||||||
|
|
||||||
|
AutoContact* vtee1 = AutoContactVTee::create( getGCell(), getNet(), Session::getContactLayer(1) );
|
||||||
|
AutoSegment::create( turn1, vtee1, Flags::Vertical );
|
||||||
|
|
||||||
|
setBothCornerContacts( vtee1 );
|
||||||
|
} else if (west() and north()) {
|
||||||
|
AutoContact* vtee1 = AutoContactVTee::create( getGCell(), getNet(), Session::getContactLayer(1) );
|
||||||
|
AutoSegment::create( rpSourceContact, vtee1, Flags::Horizontal );
|
||||||
|
|
||||||
|
AutoContact* turn1 = AutoContactTurn::create( getGCell(), getNet(), Session::getContactLayer(1) );
|
||||||
|
AutoSegment::create( vtee1, turn1, Flags::Vertical );
|
||||||
|
|
||||||
|
setSouthWestContact( turn1 );
|
||||||
|
setNorthEastContact( vtee1 );
|
||||||
|
} else if (south() and north()) {
|
||||||
|
AutoContact* vtee1 = AutoContactVTee::create( getGCell(), getNet(), Session::getContactLayer(1) );
|
||||||
|
AutoSegment::create( rpSourceContact, vtee1, Flags::Horizontal );
|
||||||
|
|
||||||
|
setBothCornerContacts( vtee1 );
|
||||||
|
} else if (east() and north()) {
|
||||||
|
AutoContact* htee1 = AutoContactHTee::create( getGCell(), getNet(), Session::getContactLayer(1) );
|
||||||
|
AutoSegment::create( rpSourceContact, htee1, Flags::Horizontal );
|
||||||
|
|
||||||
|
setBothCornerContacts( htee1 );
|
||||||
|
} else if (east() and south()) {
|
||||||
|
AutoContact* htee1 = AutoContactHTee::create( getGCell(), getNet(), Session::getContactLayer(1) );
|
||||||
|
AutoSegment::create( rpSourceContact, htee1, Flags::Horizontal );
|
||||||
|
|
||||||
|
setBothCornerContacts( htee1 );
|
||||||
|
} else if (east() and west()) {
|
||||||
|
AutoContact* turn1 = AutoContactTurn::create( getGCell(), getNet(), Session::getContactLayer(1) );
|
||||||
|
AutoSegment::create( rpSourceContact, turn1, Flags::Horizontal );
|
||||||
|
|
||||||
|
AutoContact* htee1 = AutoContactHTee::create( getGCell(), getNet(), Session::getContactLayer(1) );
|
||||||
|
AutoSegment::create( turn1, htee1, Flags::Vertical );
|
||||||
|
|
||||||
|
setBothCornerContacts( htee1 );
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
AutoContact* htee1 = AutoContactHTee::create( getGCell(), getNet(), Session::getContactLayer(1) );
|
||||||
|
AutoSegment::create( rpSourceContact, htee1, Flags::Horizontal );
|
||||||
|
|
||||||
|
AutoContact* htee2 = AutoContactHTee::create( getGCell(), getNet(), Session::getContactLayer(1) );
|
||||||
|
AutoSegment::create( htee1, htee2, Flags::Horizontal );
|
||||||
|
|
||||||
|
setSouthWestContact( htee1 );
|
||||||
|
setNorthEastContact( htee2 );
|
||||||
|
}
|
||||||
|
|
||||||
|
cdebug_tabw(145,-1);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
bool NetBuilderHV::_do_1G_1PinM3 ()
|
bool NetBuilderHV::_do_1G_1PinM3 ()
|
||||||
{
|
{
|
||||||
cdebug_log(145,1) << getTypeName() << "::_do_1G_1PinM3() [Managed Configuration - Optimized] " << getTopology() << endl;
|
cdebug_log(145,1) << getTypeName() << "::_do_1G_1PinM3() [Managed Configuration - Optimized] " << getTopology() << endl;
|
||||||
|
|
||||||
AutoContact* rpContactSource = NULL;
|
AutoContact* rpSourceContact = NULL;
|
||||||
AutoContact* rpContactTarget = NULL;
|
AutoContact* rpContactTarget = NULL;
|
||||||
|
|
||||||
doRp_AutoContacts( getGCell(), getRoutingPads()[0], rpContactSource, rpContactTarget, NoFlags );
|
doRp_AutoContacts( getGCell(), getRoutingPads()[0], rpSourceContact, rpContactTarget, NoFlags );
|
||||||
|
|
||||||
AutoContact* turn1 = AutoContactTurn::create( getGCell(), getNet(), Session::getContactLayer(1) );
|
AutoContact* turn1 = AutoContactTurn::create( getGCell(), getNet(), Session::getContactLayer(1) );
|
||||||
AutoSegment::create( rpContactSource, turn1, Flags::Vertical );
|
AutoSegment::create( rpSourceContact, turn1, Flags::Vertical );
|
||||||
|
|
||||||
if (north() or south()) {
|
if (north() or south()) {
|
||||||
AutoContact* turn2 = AutoContactTurn::create( getGCell(), getNet(), Session::getContactLayer(1) );
|
AutoContact* turn2 = AutoContactTurn::create( getGCell(), getNet(), Session::getContactLayer(1) );
|
||||||
|
@ -460,6 +527,73 @@ namespace Anabatic {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool NetBuilderHV::_do_xG_1PinM3 ()
|
||||||
|
{
|
||||||
|
cdebug_log(145,1) << getTypeName() << "::_do_xG_1PinM3() [Managed Configuration - Optimized] " << getTopology() << endl;
|
||||||
|
|
||||||
|
AutoContact* rpSourceContact = NULL;
|
||||||
|
AutoContact* rpContactTarget = NULL;
|
||||||
|
|
||||||
|
doRp_AutoContacts( getGCell(), getRoutingPads()[0], rpSourceContact, rpContactTarget, NoFlags );
|
||||||
|
|
||||||
|
if (getConnexity().fields.globals == 2) {
|
||||||
|
if (west() and south()) {
|
||||||
|
AutoContact* turn1 = AutoContactTurn::create( getGCell(), getNet(), Session::getContactLayer(1) );
|
||||||
|
AutoSegment::create( rpSourceContact, turn1, Flags::Vertical );
|
||||||
|
|
||||||
|
AutoContact* htee1 = AutoContactHTee::create( getGCell(), getNet(), Session::getContactLayer(1) );
|
||||||
|
AutoSegment::create( turn1, htee1, Flags::Horizontal );
|
||||||
|
|
||||||
|
setBothCornerContacts( htee1 );
|
||||||
|
} else if (west() and north()) {
|
||||||
|
AutoContact* htee1 = AutoContactHTee::create( getGCell(), getNet(), Session::getContactLayer(1) );
|
||||||
|
AutoSegment::create( rpSourceContact, htee1, Flags::Vertical );
|
||||||
|
|
||||||
|
AutoContact* turn1 = AutoContactTurn::create( getGCell(), getNet(), Session::getContactLayer(1) );
|
||||||
|
AutoSegment::create( turn1, htee1, Flags::Horizontal );
|
||||||
|
|
||||||
|
setSouthWestContact( htee1 );
|
||||||
|
setNorthEastContact( turn1 );
|
||||||
|
} else if (east() and north()) {
|
||||||
|
AutoContact* vtee1 = AutoContactVTee::create( getGCell(), getNet(), Session::getContactLayer(1) );
|
||||||
|
AutoSegment::create( rpSourceContact, vtee1, Flags::Vertical );
|
||||||
|
|
||||||
|
setBothCornerContacts( vtee1 );
|
||||||
|
} else if (east() and south()) {
|
||||||
|
AutoContact* htee1 = AutoContactHTee::create( getGCell(), getNet(), Session::getContactLayer(1) );
|
||||||
|
AutoSegment::create( rpSourceContact, htee1, Flags::Vertical );
|
||||||
|
|
||||||
|
AutoContact* turn1 = AutoContactTurn::create( getGCell(), getNet(), Session::getContactLayer(1) );
|
||||||
|
AutoSegment::create( htee1, turn1, Flags::Horizontal );
|
||||||
|
|
||||||
|
setSouthWestContact( turn1 );
|
||||||
|
setNorthEastContact( htee1 );
|
||||||
|
} else {
|
||||||
|
AutoContact* vtee1 = AutoContactVTee::create( getGCell(), getNet(), Session::getContactLayer(1) );
|
||||||
|
AutoSegment::create( rpSourceContact, vtee1, Flags::Vertical );
|
||||||
|
|
||||||
|
AutoContact* turn1 = AutoContactTurn::create( getGCell(), getNet(), Session::getContactLayer(1) );
|
||||||
|
AutoSegment::create( vtee1, turn1, Flags::Vertical );
|
||||||
|
|
||||||
|
setSouthWestContact( vtee1 );
|
||||||
|
setNorthEastContact( turn1 );
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
AutoContact* vtee1 = AutoContactVTee::create( getGCell(), getNet(), Session::getContactLayer(1) );
|
||||||
|
AutoSegment::create( rpSourceContact, vtee1, Flags::Vertical );
|
||||||
|
|
||||||
|
AutoContact* vtee2 = AutoContactVTee::create( getGCell(), getNet(), Session::getContactLayer(1) );
|
||||||
|
AutoSegment::create( vtee1, vtee2, Flags::Vertical );
|
||||||
|
|
||||||
|
setSouthWestContact( vtee1 );
|
||||||
|
setNorthEastContact( vtee2 );
|
||||||
|
}
|
||||||
|
|
||||||
|
cdebug_tabw(145,-1);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
bool NetBuilderHV::_do_2G_1M1 ()
|
bool NetBuilderHV::_do_2G_1M1 ()
|
||||||
{
|
{
|
||||||
return _do_xG_1M1();
|
return _do_xG_1M1();
|
||||||
|
|
|
@ -39,7 +39,9 @@ namespace Anabatic {
|
||||||
virtual bool _do_2G_1M1 ();
|
virtual bool _do_2G_1M1 ();
|
||||||
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_1G_1PinM3 ();
|
||||||
|
virtual bool _do_xG_1PinM3 ();
|
||||||
virtual bool _do_xG_1M1 ();
|
virtual bool _do_xG_1M1 ();
|
||||||
virtual bool _do_xG_1M1_1M2 ();
|
virtual bool _do_xG_1M1_1M2 ();
|
||||||
virtual bool _do_xG_xM1_xM3 ();
|
virtual bool _do_xG_xM1_xM3 ();
|
||||||
|
|
|
@ -108,7 +108,7 @@ def textPythonTrace ( scriptPath=None, e=None, tryContinue=True ):
|
||||||
s += textStackTrace( traceback.extract_tb( trace ) )
|
s += textStackTrace( traceback.extract_tb( trace ) )
|
||||||
|
|
||||||
if e:
|
if e:
|
||||||
s += ' Error was:'
|
s += ' Error was:\n'
|
||||||
s += ' %s\n' % e
|
s += ' %s\n' % e
|
||||||
|
|
||||||
if tryContinue:
|
if tryContinue:
|
||||||
|
|
|
@ -182,6 +182,8 @@ namespace Vhdl {
|
||||||
error = "multiple right parenthesis";
|
error = "multiple right parenthesis";
|
||||||
else if (leftpar >= rightpar)
|
else if (leftpar >= rightpar)
|
||||||
error = "left parenthesis *after* the right one";
|
error = "left parenthesis *after* the right one";
|
||||||
|
else if (rightpar + 1 != name.size())
|
||||||
|
error = "malformed net name, right parenthesis is *not* the last character";
|
||||||
else {
|
else {
|
||||||
size_t endindex = 0;
|
size_t endindex = 0;
|
||||||
int value = stoi( name.substr(leftpar+1), &endindex );
|
int value = stoi( name.substr(leftpar+1), &endindex );
|
||||||
|
|
|
@ -15,7 +15,6 @@
|
||||||
# +-----------------------------------------------------------------+
|
# +-----------------------------------------------------------------+
|
||||||
|
|
||||||
import sys
|
import sys
|
||||||
import re
|
|
||||||
import helpers
|
import helpers
|
||||||
from helpers.io import ErrorMessage
|
from helpers.io import ErrorMessage
|
||||||
from helpers.io import WarningMessage
|
from helpers.io import WarningMessage
|
||||||
|
|
|
@ -141,11 +141,12 @@ class PlaceRoute ( object ):
|
||||||
if not checkUnplaced.check(): return
|
if not checkUnplaced.check(): return
|
||||||
|
|
||||||
coreCk = None
|
coreCk = None
|
||||||
for plug in self.conf.coronaCk.getPlugs():
|
if self.conf.coronaCk:
|
||||||
if plug.getInstance() == self.conf.icore:
|
for plug in self.conf.coronaCk.getPlugs():
|
||||||
coreCk = plug.getMasterNet()
|
if plug.getInstance() == self.conf.icore:
|
||||||
if not coreCk:
|
coreCk = plug.getMasterNet()
|
||||||
print WarningMessage( 'Core <%s> is not connected to chip clock.' % self.conf.icore.getName() )
|
if not coreCk:
|
||||||
|
print WarningMessage( 'Core <%s> is not connected to chip clock.' % self.conf.icore.getName() )
|
||||||
|
|
||||||
if self.conf.useClockTree and coreCk:
|
if self.conf.useClockTree and coreCk:
|
||||||
ht = clocktree.ClockTree.HTree.create( self.conf, coreCell, coreCk, coreCell.getAbutmentBox() )
|
ht = clocktree.ClockTree.HTree.create( self.conf, coreCell, coreCk, coreCell.getAbutmentBox() )
|
||||||
|
|
|
@ -564,6 +564,9 @@ class ChipConf ( object ):
|
||||||
@property
|
@property
|
||||||
def core ( self ): return self.cores[0].getMasterCell()
|
def core ( self ): return self.cores[0].getMasterCell()
|
||||||
|
|
||||||
|
@property
|
||||||
|
def chip ( self ): return self.cell
|
||||||
|
|
||||||
|
|
||||||
def getInstanceAb ( self, instance ):
|
def getInstanceAb ( self, instance ):
|
||||||
ab = instance.getMasterCell().getAbutmentBox()
|
ab = instance.getMasterCell().getAbutmentBox()
|
||||||
|
|
|
@ -15,6 +15,7 @@
|
||||||
|
|
||||||
|
|
||||||
import sys
|
import sys
|
||||||
|
import re
|
||||||
from operator import itemgetter
|
from operator import itemgetter
|
||||||
import Cfg
|
import Cfg
|
||||||
from Hurricane import DbU
|
from Hurricane import DbU
|
||||||
|
@ -33,6 +34,7 @@ from Hurricane import Contact
|
||||||
from Hurricane import Segment
|
from Hurricane import Segment
|
||||||
from Hurricane import Horizontal
|
from Hurricane import Horizontal
|
||||||
from Hurricane import Vertical
|
from Hurricane import Vertical
|
||||||
|
from Hurricane import RoutingPad
|
||||||
from Hurricane import Instance
|
from Hurricane import Instance
|
||||||
import CRL
|
import CRL
|
||||||
from CRL import RoutingLayerGauge
|
from CRL import RoutingLayerGauge
|
||||||
|
@ -426,6 +428,24 @@ class Side ( object ):
|
||||||
padInstance.setPlacementStatus( Instance.PlacementStatus.FIXED )
|
padInstance.setPlacementStatus( Instance.PlacementStatus.FIXED )
|
||||||
|
|
||||||
self.u += padInstance.getMasterCell().getAbutmentBox().getWidth()
|
self.u += padInstance.getMasterCell().getAbutmentBox().getWidth()
|
||||||
|
|
||||||
|
if self.conf.getIoPadGauge().getName() == 'pxlib':
|
||||||
|
p = re.compile( r'p(?P<power>v[sd]{2}[ei])ck_px' )
|
||||||
|
m = p.match( padInstance.getMasterCell().getName() )
|
||||||
|
|
||||||
|
padName = 'pad'
|
||||||
|
if m: padName = m.group( 'power' )
|
||||||
|
|
||||||
|
padNet = padInstance.getMasterCell().getNet( padName )
|
||||||
|
if padNet:
|
||||||
|
plug = padInstance.getPlug( padNet )
|
||||||
|
chipNet = plug.getNet()
|
||||||
|
|
||||||
|
if not chipNet and padNet.isGlobal():
|
||||||
|
chipNet = padInstance.getCell().getNet( padNet.getName() )
|
||||||
|
|
||||||
|
if chipNet:
|
||||||
|
rp = RoutingPad.create( chipNet, Occurrence(plug), RoutingPad.BiggestArea )
|
||||||
return
|
return
|
||||||
|
|
||||||
|
|
||||||
|
@ -800,7 +820,6 @@ class CoreWire ( object ):
|
||||||
|
|
||||||
class Corona ( object ):
|
class Corona ( object ):
|
||||||
|
|
||||||
|
|
||||||
def __init__ ( self, conf ):
|
def __init__ ( self, conf ):
|
||||||
def _cmpPad ( pad1, pad2):
|
def _cmpPad ( pad1, pad2):
|
||||||
width1 = pad1.getAbutmentBox().getWidth()
|
width1 = pad1.getAbutmentBox().getWidth()
|
||||||
|
@ -966,7 +985,6 @@ class Corona ( object ):
|
||||||
if bb.intersect(innerBb):
|
if bb.intersect(innerBb):
|
||||||
lg = rg.getLayerGauge( component.getLayer() )
|
lg = rg.getLayerGauge( component.getLayer() )
|
||||||
depth = lg.getDepth()
|
depth = lg.getDepth()
|
||||||
print 'depth:', depth, 'topLayerDepth:', self.conf.gaugeConf.topLayerDepth
|
|
||||||
if depth > self.conf.gaugeConf.topLayerDepth: continue
|
if depth > self.conf.gaugeConf.topLayerDepth: continue
|
||||||
|
|
||||||
if lg.getDirection() == RoutingLayerGauge.Vertical:
|
if lg.getDirection() == RoutingLayerGauge.Vertical:
|
||||||
|
@ -1022,7 +1040,7 @@ class Corona ( object ):
|
||||||
|
|
||||||
coronaSouthGap = 0
|
coronaSouthGap = 0
|
||||||
for layerGauge in rg.getLayerGauges():
|
for layerGauge in rg.getLayerGauges():
|
||||||
self.southSide.gap = max( self.southSide.gap, layerGauge.getPitch() * 2 )
|
self.southSide.gap = max( self.southSide.gap, layerGauge.getPitch() * 6 )
|
||||||
self.northSide.gap = self.southSide.gap
|
self.northSide.gap = self.southSide.gap
|
||||||
self.eastSide.gap = self.southSide.gap
|
self.eastSide.gap = self.southSide.gap
|
||||||
self.westSide.gap = self.southSide.gap
|
self.westSide.gap = self.southSide.gap
|
||||||
|
@ -1039,7 +1057,6 @@ class Corona ( object ):
|
||||||
padConnected = 0
|
padConnected = 0
|
||||||
doneInstances = []
|
doneInstances = []
|
||||||
for chipPlug in chipIntNet.getPlugs():
|
for chipPlug in chipIntNet.getPlugs():
|
||||||
print 'plug:', chipPlug
|
|
||||||
doneInstances.append( chipPlug.getInstance() )
|
doneInstances.append( chipPlug.getInstance() )
|
||||||
padNet = chipPlug.getMasterNet()
|
padNet = chipPlug.getMasterNet()
|
||||||
padWires = self._createCoreWire( chipIntNet, padNet, doneInstances[-1], padConnected )
|
padWires = self._createCoreWire( chipIntNet, padNet, doneInstances[-1], padConnected )
|
||||||
|
@ -1047,7 +1064,6 @@ class Corona ( object ):
|
||||||
coreWires += padWires
|
coreWires += padWires
|
||||||
padConnected += len(padWires)
|
padConnected += len(padWires)
|
||||||
|
|
||||||
print 'chipInNet:', chipIntNet
|
|
||||||
if chipIntNet.isGlobal():
|
if chipIntNet.isGlobal():
|
||||||
for instance in self.conf.cell.getInstances():
|
for instance in self.conf.cell.getInstances():
|
||||||
if instance in doneInstances: continue
|
if instance in doneInstances: continue
|
||||||
|
@ -1165,6 +1181,7 @@ class Corona ( object ):
|
||||||
self.eastSide.doLayout()
|
self.eastSide.doLayout()
|
||||||
self.westSide.doLayout()
|
self.westSide.doLayout()
|
||||||
self._placeInnerCorona()
|
self._placeInnerCorona()
|
||||||
|
self.conf.chip.setRouted( True )
|
||||||
|
|
||||||
UpdateSession.close()
|
UpdateSession.close()
|
||||||
return
|
return
|
||||||
|
|
|
@ -11,33 +11,16 @@
|
||||||
# | Author : Jean-Paul CHAPUT |
|
# | Author : Jean-Paul CHAPUT |
|
||||||
# | E-mail : Jean-Paul.Chaput@asim.lip6.fr |
|
# | E-mail : Jean-Paul.Chaput@asim.lip6.fr |
|
||||||
# | =============================================================== |
|
# | =============================================================== |
|
||||||
# | Python : "./plugins/coreToChip/Core2Chip.py" |
|
# | Python : "./plugins/core2chip/Core2Chip.py" |
|
||||||
# +-----------------------------------------------------------------+
|
# +-----------------------------------------------------------------+
|
||||||
|
|
||||||
import sys
|
|
||||||
import re
|
import re
|
||||||
import traceback
|
|
||||||
import os
|
|
||||||
import os.path
|
|
||||||
import optparse
|
|
||||||
import Cfg
|
|
||||||
import Hurricane
|
|
||||||
from Hurricane import DbU
|
|
||||||
from Hurricane import DataBase
|
|
||||||
from Hurricane import UpdateSession
|
from Hurricane import UpdateSession
|
||||||
from Hurricane import Breakpoint
|
|
||||||
from Hurricane import Transformation
|
|
||||||
from Hurricane import Instance
|
|
||||||
from Hurricane import Net
|
from Hurricane import Net
|
||||||
import Viewer
|
from Hurricane import Instance
|
||||||
import CRL
|
|
||||||
from CRL import Catalog
|
from CRL import Catalog
|
||||||
from CRL import AllianceFramework
|
from CRL import AllianceFramework
|
||||||
from helpers.io import ErrorMessage
|
from helpers.io import ErrorMessage
|
||||||
import Etesian
|
|
||||||
import Anabatic
|
|
||||||
import Katana
|
|
||||||
import Unicorn
|
|
||||||
|
|
||||||
|
|
||||||
# -------------------------------------------------------------------
|
# -------------------------------------------------------------------
|
||||||
|
@ -46,7 +29,7 @@ import Unicorn
|
||||||
|
|
||||||
class IoNet ( object ):
|
class IoNet ( object ):
|
||||||
|
|
||||||
reVHDLVector = re.compile( r'(?P<name>[^(]*)\((?P<index>[\d+])\)$' )
|
reVHDLVector = re.compile( r'(?P<name>[^(]*)\((?P<index>[\d]+)\)$' )
|
||||||
|
|
||||||
def __init__ ( self, coreToChip, coreNet ):
|
def __init__ ( self, coreToChip, coreNet ):
|
||||||
self.coreToChip = coreToChip
|
self.coreToChip = coreToChip
|
||||||
|
|
|
@ -14,26 +14,18 @@
|
||||||
# | Python : "./plugins/core2chip/cmos.py" |
|
# | Python : "./plugins/core2chip/cmos.py" |
|
||||||
# +-----------------------------------------------------------------+
|
# +-----------------------------------------------------------------+
|
||||||
|
|
||||||
import sys
|
|
||||||
import re
|
import re
|
||||||
import traceback
|
from Hurricane import DbU
|
||||||
import os
|
from Hurricane import DataBase
|
||||||
import os.path
|
from Hurricane import UpdateSession
|
||||||
import optparse
|
from Hurricane import Breakpoint
|
||||||
import Cfg
|
from Hurricane import Transformation
|
||||||
import Hurricane
|
from Hurricane import Instance
|
||||||
from Hurricane import DbU
|
from Hurricane import Net
|
||||||
from Hurricane import DataBase
|
|
||||||
from Hurricane import UpdateSession
|
|
||||||
from Hurricane import Breakpoint
|
|
||||||
from Hurricane import Transformation
|
|
||||||
from Hurricane import Instance
|
|
||||||
from Hurricane import Net
|
|
||||||
import Viewer
|
import Viewer
|
||||||
import CRL
|
from CRL import Catalog
|
||||||
from CRL import Catalog
|
from CRL import AllianceFramework
|
||||||
from CRL import AllianceFramework
|
from helpers.io import ErrorMessage
|
||||||
from helpers.io import ErrorMessage
|
|
||||||
from core2chip.CoreToChip import CoreToChip
|
from core2chip.CoreToChip import CoreToChip
|
||||||
|
|
||||||
|
|
||||||
|
@ -60,6 +52,7 @@ class cmos ( CoreToChip ):
|
||||||
def getNetType ( self, netName ):
|
def getNetType ( self, netName ):
|
||||||
if netName.startswith('vss'): return Net.Type.GROUND
|
if netName.startswith('vss'): return Net.Type.GROUND
|
||||||
if netName.startswith('vdd'): return Net.Type.POWER
|
if netName.startswith('vdd'): return Net.Type.POWER
|
||||||
|
if netName in ('cki', 'ck'): return Net.Type.CLOCK
|
||||||
return Net.Type.LOGICAL
|
return Net.Type.LOGICAL
|
||||||
|
|
||||||
def isGlobal ( self, netName ):
|
def isGlobal ( self, netName ):
|
||||||
|
@ -76,9 +69,19 @@ class cmos ( CoreToChip ):
|
||||||
|
|
||||||
def _buildGroundPads ( self, ioNet ):
|
def _buildGroundPads ( self, ioNet ):
|
||||||
vssi = self.chip.getNet( 'vssi' )
|
vssi = self.chip.getNet( 'vssi' )
|
||||||
|
vssi.setExternal( True )
|
||||||
|
vssi.setGlobal ( True )
|
||||||
|
vssi.setType ( Net.Type.GROUND )
|
||||||
vssi.merge( ioNet.chipIntNet )
|
vssi.merge( ioNet.chipIntNet )
|
||||||
ioNet.chipIntNet = vssi
|
ioNet.chipIntNet = vssi
|
||||||
|
|
||||||
|
vsse = self.chip.getNet( 'vsse' )
|
||||||
|
vsse.setExternal( True )
|
||||||
|
vsse.setGlobal ( True )
|
||||||
|
vsse.setType ( Net.Type.GROUND )
|
||||||
|
vsse.merge( ioNet.chipExtNet )
|
||||||
|
ioNet.chipExtNet = vsse
|
||||||
|
|
||||||
ioNet.pads.append( Instance.create( self.chip
|
ioNet.pads.append( Instance.create( self.chip
|
||||||
, ioNet.padInstanceName + '_i_%d' % self.groundPadCount
|
, ioNet.padInstanceName + '_i_%d' % self.groundPadCount
|
||||||
, self.getCell('pvssick_px') ) )
|
, self.getCell('pvssick_px') ) )
|
||||||
|
@ -96,9 +99,19 @@ class cmos ( CoreToChip ):
|
||||||
|
|
||||||
def _buildPowerPads ( self, ioNet ):
|
def _buildPowerPads ( self, ioNet ):
|
||||||
vddi = self.chip.getNet( 'vddi' )
|
vddi = self.chip.getNet( 'vddi' )
|
||||||
|
vddi.setExternal( True )
|
||||||
|
vddi.setGlobal ( True )
|
||||||
|
vddi.setType ( Net.Type.POWER )
|
||||||
vddi.merge( ioNet.chipIntNet )
|
vddi.merge( ioNet.chipIntNet )
|
||||||
ioNet.chipIntNet = vddi
|
ioNet.chipIntNet = vddi
|
||||||
|
|
||||||
|
vdde = self.chip.getNet( 'vdde' )
|
||||||
|
vdde.setExternal( True )
|
||||||
|
vdde.setGlobal ( True )
|
||||||
|
vdde.setType ( Net.Type.POWER )
|
||||||
|
vdde.merge( ioNet.chipExtNet )
|
||||||
|
ioNet.chipExtNet = vdde
|
||||||
|
|
||||||
ioNet.pads.append( Instance.create( self.chip
|
ioNet.pads.append( Instance.create( self.chip
|
||||||
, ioNet.padInstanceName + '_i_%d' % self.powerPadCount
|
, ioNet.padInstanceName + '_i_%d' % self.powerPadCount
|
||||||
, self.getCell('pvddick_px') ) )
|
, self.getCell('pvddick_px') ) )
|
||||||
|
|
|
@ -507,6 +507,7 @@ class Cell : public Entity {
|
||||||
public: void setFlattenLeaf(bool isFlattenLeaf) {_flags.set(Flags::FlattenLeaf,isFlattenLeaf);};
|
public: void setFlattenLeaf(bool isFlattenLeaf) {_flags.set(Flags::FlattenLeaf,isFlattenLeaf);};
|
||||||
public: void setPad(bool isPad) {_flags.set(Flags::Pad,isPad);};
|
public: void setPad(bool isPad) {_flags.set(Flags::Pad,isPad);};
|
||||||
public: void setFeed(bool isFeed) {_flags.set(Flags::Feed,isFeed);};
|
public: void setFeed(bool isFeed) {_flags.set(Flags::Feed,isFeed);};
|
||||||
|
public: void setRouted(bool isRouted) {_flags.set(Flags::Routed,isRouted);};
|
||||||
public: void flattenNets(uint64_t flags=Flags::BuildRings);
|
public: void flattenNets(uint64_t flags=Flags::BuildRings);
|
||||||
public: void flattenNets(const Instance* instance, uint64_t flags=Flags::BuildRings);
|
public: void flattenNets(const Instance* instance, uint64_t flags=Flags::BuildRings);
|
||||||
public: void createRoutingPadRings(uint64_t flags=Flags::BuildRings);
|
public: void createRoutingPadRings(uint64_t flags=Flags::BuildRings);
|
||||||
|
|
|
@ -695,6 +695,8 @@ extern "C" {
|
||||||
DirectGetBoolAttribute(PyCell_isUnique , isUnique ,PyCell,Cell)
|
DirectGetBoolAttribute(PyCell_isUnique , isUnique ,PyCell,Cell)
|
||||||
DirectGetBoolAttribute(PyCell_isUniquified , isUniquified ,PyCell,Cell)
|
DirectGetBoolAttribute(PyCell_isUniquified , isUniquified ,PyCell,Cell)
|
||||||
DirectGetBoolAttribute(PyCell_isUniquifyMaster, isUniquifyMaster ,PyCell,Cell)
|
DirectGetBoolAttribute(PyCell_isUniquifyMaster, isUniquifyMaster ,PyCell,Cell)
|
||||||
|
DirectGetBoolAttribute(PyCell_isRouted , isRouted ,PyCell,Cell)
|
||||||
|
DirectSetBoolAttribute(PyCell_setRouted , setRouted ,PyCell,Cell)
|
||||||
|
|
||||||
GetBoundStateAttribute(PyCell_isPyBound ,PyCell,Cell)
|
GetBoundStateAttribute(PyCell_isPyBound ,PyCell,Cell)
|
||||||
|
|
||||||
|
@ -733,10 +735,12 @@ extern "C" {
|
||||||
, { "isUnique" , (PyCFunction)PyCell_isUnique , METH_NOARGS , "Returns true if the cell has one or less instance." }
|
, { "isUnique" , (PyCFunction)PyCell_isUnique , METH_NOARGS , "Returns true if the cell has one or less instance." }
|
||||||
, { "isUniquified" , (PyCFunction)PyCell_isUniquified , METH_NOARGS , "Returns true if the cell is the result of an uniquification." }
|
, { "isUniquified" , (PyCFunction)PyCell_isUniquified , METH_NOARGS , "Returns true if the cell is the result of an uniquification." }
|
||||||
, { "isUniquifyMaster" , (PyCFunction)PyCell_isUniquifyMaster , METH_NOARGS , "Returns true if the cell is the reference for an uniquification." }
|
, { "isUniquifyMaster" , (PyCFunction)PyCell_isUniquifyMaster , METH_NOARGS , "Returns true if the cell is the reference for an uniquification." }
|
||||||
|
, { "isRouted" , (PyCFunction)PyCell_isRouted , METH_NOARGS , "Returns true if the cell is flagged as routed." }
|
||||||
, { "isBound" , (PyCFunction)PyCell_isPyBound , METH_NOARGS , "Returns true if the cell is bounded to the hurricane cell" }
|
, { "isBound" , (PyCFunction)PyCell_isPyBound , METH_NOARGS , "Returns true if the cell is bounded to the hurricane cell" }
|
||||||
, { "setName" , (PyCFunction)PyCell_setName , METH_VARARGS, "Allows to change the cell name." }
|
, { "setName" , (PyCFunction)PyCell_setName , METH_VARARGS, "Allows to change the cell name." }
|
||||||
, { "setAbutmentBox" , (PyCFunction)PyCell_setAbutmentBox , METH_VARARGS, "Sets the cell abutment box." }
|
, { "setAbutmentBox" , (PyCFunction)PyCell_setAbutmentBox , METH_VARARGS, "Sets the cell abutment box." }
|
||||||
, { "setTerminal" , (PyCFunction)PyCell_setTerminal , METH_VARARGS, "Sets the cell terminal status." }
|
, { "setTerminal" , (PyCFunction)PyCell_setTerminal , METH_VARARGS, "Sets the cell terminal status." }
|
||||||
|
, { "setRouted" , (PyCFunction)PyCell_setRouted , METH_VARARGS, "Sets the cell routed status." }
|
||||||
, { "uniquify" , (PyCFunction)PyCell_uniquify , METH_VARARGS, "Uniquify the Cell and it's instances up to <depth>." }
|
, { "uniquify" , (PyCFunction)PyCell_uniquify , METH_VARARGS, "Uniquify the Cell and it's instances up to <depth>." }
|
||||||
, { "getClone" , (PyCFunction)PyCell_getClone , METH_NOARGS , "Return a copy of the Cell (placement only)." }
|
, { "getClone" , (PyCFunction)PyCell_getClone , METH_NOARGS , "Return a copy of the Cell (placement only)." }
|
||||||
, { "destroy" , (PyCFunction)PyCell_destroy , METH_NOARGS
|
, { "destroy" , (PyCFunction)PyCell_destroy , METH_NOARGS
|
||||||
|
|
|
@ -308,10 +308,10 @@ def ResizeAb ( dx1, dy1, dx2, dy2 ) :
|
||||||
global CELLS
|
global CELLS
|
||||||
from st_model import CELLS
|
from st_model import CELLS
|
||||||
|
|
||||||
print "ResizeAb()", DbU.getValueString(dx1) \
|
#print "ResizeAb()", DbU.getValueString(dx1) \
|
||||||
, DbU.getValueString(dy1) \
|
# , DbU.getValueString(dy1) \
|
||||||
, DbU.getValueString(dx2) \
|
# , DbU.getValueString(dx2) \
|
||||||
, DbU.getValueString(dy2)
|
# , DbU.getValueString(dy2)
|
||||||
|
|
||||||
global MYSLICE, MYPITCH
|
global MYSLICE, MYPITCH
|
||||||
|
|
||||||
|
|
|
@ -66,7 +66,8 @@ def credits ():
|
||||||
|
|
||||||
def runScript ( scriptPath, editor ):
|
def runScript ( scriptPath, editor ):
|
||||||
try:
|
try:
|
||||||
kw = { 'editor':editor }
|
kw = { }
|
||||||
|
if editor: kw[ 'editor' ] = editor
|
||||||
sys.path.append(os.path.dirname(scriptPath))
|
sys.path.append(os.path.dirname(scriptPath))
|
||||||
|
|
||||||
module = __import__( os.path.basename(scriptPath), globals(), locals() )
|
module = __import__( os.path.basename(scriptPath), globals(), locals() )
|
||||||
|
@ -209,7 +210,9 @@ if __name__ == '__main__':
|
||||||
ha.qtExec()
|
ha.qtExec()
|
||||||
else:
|
else:
|
||||||
# Run in command line mode.
|
# Run in command line mode.
|
||||||
kiteSuccess = False
|
if options.script: runScript(options.script,None)
|
||||||
|
|
||||||
|
kiteSuccess = True
|
||||||
|
|
||||||
if runEtesianTool:
|
if runEtesianTool:
|
||||||
etesian = Etesian.EtesianEngine.create(cell)
|
etesian = Etesian.EtesianEngine.create(cell)
|
||||||
|
|
Loading…
Reference in New Issue