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.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) << "* _sourceContact:" << sourceContact << endl;
|
||||
|
||||
if (not _fromHook) return *this;
|
||||
if (not _fromHook) {
|
||||
cdebug_tabw(145,-1);
|
||||
return *this;
|
||||
}
|
||||
|
||||
Segment* fromSegment = static_cast<Segment*>( _fromHook->getComponent() );
|
||||
_net = fromSegment->getNet();
|
||||
|
@ -933,70 +936,70 @@ namespace Anabatic {
|
|||
|
||||
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;
|
||||
}
|
||||
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
|
@ -1010,49 +1013,49 @@ namespace Anabatic {
|
|||
|
||||
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;
|
||||
}
|
||||
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
|
|
|
@ -165,32 +165,32 @@ namespace Anabatic {
|
|||
{
|
||||
cdebug_log(145,1) << getTypeName() << "::doRp_Access() - flags:" << flags << endl;
|
||||
|
||||
AutoContact* rpContactSource;
|
||||
AutoContact* rpSourceContact;
|
||||
AutoContact* rpContactTarget;
|
||||
|
||||
flags |= checkRoutingPadSize( rp );
|
||||
|
||||
doRp_AutoContacts( gcell, rp, rpContactSource, rpContactTarget, flags );
|
||||
doRp_AutoContacts( gcell, rp, rpSourceContact, rpContactTarget, flags );
|
||||
|
||||
if (flags & HAccess) {
|
||||
if (flags & VSmall) {
|
||||
AutoContact* subContact1 = 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 );
|
||||
rpContactSource = subContact2;
|
||||
rpSourceContact = subContact2;
|
||||
}
|
||||
} else {
|
||||
if (flags & HSmall) {
|
||||
AutoContact* subContact1 = AutoContactTurn::create( gcell, rp->getNet(), Session::getContactLayer(1) );
|
||||
AutoSegment::create( rpContactSource, subContact1, Flags::Horizontal );
|
||||
rpContactSource = subContact1;
|
||||
AutoSegment::create( rpSourceContact, subContact1, Flags::Horizontal );
|
||||
rpSourceContact = subContact1;
|
||||
}
|
||||
}
|
||||
|
||||
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;
|
||||
|
||||
AutoContact* rpContactSource = NULL;
|
||||
AutoContact* rpSourceContact = 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) );
|
||||
AutoSegment::create( rpContactSource, turn1, Flags::Horizontal );
|
||||
AutoSegment::create( rpSourceContact, turn1, Flags::Horizontal );
|
||||
|
||||
if (east() or west()) {
|
||||
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 ()
|
||||
{
|
||||
cdebug_log(145,1) << getTypeName() << "::_do_1G_1PinM3() [Managed Configuration - Optimized] " << getTopology() << endl;
|
||||
|
||||
AutoContact* rpContactSource = NULL;
|
||||
AutoContact* rpSourceContact = 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) );
|
||||
AutoSegment::create( rpContactSource, turn1, Flags::Vertical );
|
||||
AutoSegment::create( rpSourceContact, turn1, Flags::Vertical );
|
||||
|
||||
if (north() or south()) {
|
||||
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 ()
|
||||
{
|
||||
return _do_xG_1M1();
|
||||
|
|
|
@ -39,7 +39,9 @@ namespace Anabatic {
|
|||
virtual bool _do_2G_1M1 ();
|
||||
virtual bool _do_xG_1Pad ();
|
||||
virtual bool _do_1G_1PinM2 ();
|
||||
virtual bool _do_xG_1PinM2 ();
|
||||
virtual bool _do_1G_1PinM3 ();
|
||||
virtual bool _do_xG_1PinM3 ();
|
||||
virtual bool _do_xG_1M1 ();
|
||||
virtual bool _do_xG_1M1_1M2 ();
|
||||
virtual bool _do_xG_xM1_xM3 ();
|
||||
|
|
|
@ -108,7 +108,7 @@ def textPythonTrace ( scriptPath=None, e=None, tryContinue=True ):
|
|||
s += textStackTrace( traceback.extract_tb( trace ) )
|
||||
|
||||
if e:
|
||||
s += ' Error was:'
|
||||
s += ' Error was:\n'
|
||||
s += ' %s\n' % e
|
||||
|
||||
if tryContinue:
|
||||
|
|
|
@ -182,6 +182,8 @@ namespace Vhdl {
|
|||
error = "multiple right parenthesis";
|
||||
else if (leftpar >= rightpar)
|
||||
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 {
|
||||
size_t endindex = 0;
|
||||
int value = stoi( name.substr(leftpar+1), &endindex );
|
||||
|
|
|
@ -15,7 +15,6 @@
|
|||
# +-----------------------------------------------------------------+
|
||||
|
||||
import sys
|
||||
import re
|
||||
import helpers
|
||||
from helpers.io import ErrorMessage
|
||||
from helpers.io import WarningMessage
|
||||
|
|
|
@ -141,11 +141,12 @@ class PlaceRoute ( object ):
|
|||
if not checkUnplaced.check(): return
|
||||
|
||||
coreCk = None
|
||||
for plug in self.conf.coronaCk.getPlugs():
|
||||
if plug.getInstance() == self.conf.icore:
|
||||
coreCk = plug.getMasterNet()
|
||||
if not coreCk:
|
||||
print WarningMessage( 'Core <%s> is not connected to chip clock.' % self.conf.icore.getName() )
|
||||
if self.conf.coronaCk:
|
||||
for plug in self.conf.coronaCk.getPlugs():
|
||||
if plug.getInstance() == self.conf.icore:
|
||||
coreCk = plug.getMasterNet()
|
||||
if not coreCk:
|
||||
print WarningMessage( 'Core <%s> is not connected to chip clock.' % self.conf.icore.getName() )
|
||||
|
||||
if self.conf.useClockTree and coreCk:
|
||||
ht = clocktree.ClockTree.HTree.create( self.conf, coreCell, coreCk, coreCell.getAbutmentBox() )
|
||||
|
|
|
@ -564,6 +564,9 @@ class ChipConf ( object ):
|
|||
@property
|
||||
def core ( self ): return self.cores[0].getMasterCell()
|
||||
|
||||
@property
|
||||
def chip ( self ): return self.cell
|
||||
|
||||
|
||||
def getInstanceAb ( self, instance ):
|
||||
ab = instance.getMasterCell().getAbutmentBox()
|
||||
|
|
|
@ -15,6 +15,7 @@
|
|||
|
||||
|
||||
import sys
|
||||
import re
|
||||
from operator import itemgetter
|
||||
import Cfg
|
||||
from Hurricane import DbU
|
||||
|
@ -33,6 +34,7 @@ from Hurricane import Contact
|
|||
from Hurricane import Segment
|
||||
from Hurricane import Horizontal
|
||||
from Hurricane import Vertical
|
||||
from Hurricane import RoutingPad
|
||||
from Hurricane import Instance
|
||||
import CRL
|
||||
from CRL import RoutingLayerGauge
|
||||
|
@ -426,6 +428,24 @@ class Side ( object ):
|
|||
padInstance.setPlacementStatus( Instance.PlacementStatus.FIXED )
|
||||
|
||||
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
|
||||
|
||||
|
||||
|
@ -800,7 +820,6 @@ class CoreWire ( object ):
|
|||
|
||||
class Corona ( object ):
|
||||
|
||||
|
||||
def __init__ ( self, conf ):
|
||||
def _cmpPad ( pad1, pad2):
|
||||
width1 = pad1.getAbutmentBox().getWidth()
|
||||
|
@ -966,7 +985,6 @@ class Corona ( object ):
|
|||
if bb.intersect(innerBb):
|
||||
lg = rg.getLayerGauge( component.getLayer() )
|
||||
depth = lg.getDepth()
|
||||
print 'depth:', depth, 'topLayerDepth:', self.conf.gaugeConf.topLayerDepth
|
||||
if depth > self.conf.gaugeConf.topLayerDepth: continue
|
||||
|
||||
if lg.getDirection() == RoutingLayerGauge.Vertical:
|
||||
|
@ -1022,7 +1040,7 @@ class Corona ( object ):
|
|||
|
||||
coronaSouthGap = 0
|
||||
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.eastSide.gap = self.southSide.gap
|
||||
self.westSide.gap = self.southSide.gap
|
||||
|
@ -1039,7 +1057,6 @@ class Corona ( object ):
|
|||
padConnected = 0
|
||||
doneInstances = []
|
||||
for chipPlug in chipIntNet.getPlugs():
|
||||
print 'plug:', chipPlug
|
||||
doneInstances.append( chipPlug.getInstance() )
|
||||
padNet = chipPlug.getMasterNet()
|
||||
padWires = self._createCoreWire( chipIntNet, padNet, doneInstances[-1], padConnected )
|
||||
|
@ -1047,7 +1064,6 @@ class Corona ( object ):
|
|||
coreWires += padWires
|
||||
padConnected += len(padWires)
|
||||
|
||||
print 'chipInNet:', chipIntNet
|
||||
if chipIntNet.isGlobal():
|
||||
for instance in self.conf.cell.getInstances():
|
||||
if instance in doneInstances: continue
|
||||
|
@ -1165,6 +1181,7 @@ class Corona ( object ):
|
|||
self.eastSide.doLayout()
|
||||
self.westSide.doLayout()
|
||||
self._placeInnerCorona()
|
||||
self.conf.chip.setRouted( True )
|
||||
|
||||
UpdateSession.close()
|
||||
return
|
||||
|
|
|
@ -11,33 +11,16 @@
|
|||
# | Author : Jean-Paul CHAPUT |
|
||||
# | E-mail : Jean-Paul.Chaput@asim.lip6.fr |
|
||||
# | =============================================================== |
|
||||
# | Python : "./plugins/coreToChip/Core2Chip.py" |
|
||||
# | Python : "./plugins/core2chip/Core2Chip.py" |
|
||||
# +-----------------------------------------------------------------+
|
||||
|
||||
import sys
|
||||
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 Breakpoint
|
||||
from Hurricane import Transformation
|
||||
from Hurricane import Instance
|
||||
from Hurricane import Net
|
||||
import Viewer
|
||||
import CRL
|
||||
from Hurricane import Instance
|
||||
from CRL import Catalog
|
||||
from CRL import AllianceFramework
|
||||
from helpers.io import ErrorMessage
|
||||
import Etesian
|
||||
import Anabatic
|
||||
import Katana
|
||||
import Unicorn
|
||||
|
||||
|
||||
# -------------------------------------------------------------------
|
||||
|
@ -46,7 +29,7 @@ import Unicorn
|
|||
|
||||
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 ):
|
||||
self.coreToChip = coreToChip
|
||||
|
|
|
@ -14,26 +14,18 @@
|
|||
# | Python : "./plugins/core2chip/cmos.py" |
|
||||
# +-----------------------------------------------------------------+
|
||||
|
||||
import sys
|
||||
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 Breakpoint
|
||||
from Hurricane import Transformation
|
||||
from Hurricane import Instance
|
||||
from Hurricane import Net
|
||||
import Viewer
|
||||
import CRL
|
||||
from CRL import Catalog
|
||||
from CRL import AllianceFramework
|
||||
from helpers.io import ErrorMessage
|
||||
from Hurricane import DbU
|
||||
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
|
||||
from CRL import Catalog
|
||||
from CRL import AllianceFramework
|
||||
from helpers.io import ErrorMessage
|
||||
from core2chip.CoreToChip import CoreToChip
|
||||
|
||||
|
||||
|
@ -60,6 +52,7 @@ class cmos ( CoreToChip ):
|
|||
def getNetType ( self, netName ):
|
||||
if netName.startswith('vss'): return Net.Type.GROUND
|
||||
if netName.startswith('vdd'): return Net.Type.POWER
|
||||
if netName in ('cki', 'ck'): return Net.Type.CLOCK
|
||||
return Net.Type.LOGICAL
|
||||
|
||||
def isGlobal ( self, netName ):
|
||||
|
@ -76,9 +69,19 @@ class cmos ( CoreToChip ):
|
|||
|
||||
def _buildGroundPads ( self, ioNet ):
|
||||
vssi = self.chip.getNet( 'vssi' )
|
||||
vssi.setExternal( True )
|
||||
vssi.setGlobal ( True )
|
||||
vssi.setType ( Net.Type.GROUND )
|
||||
vssi.merge( ioNet.chipIntNet )
|
||||
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.padInstanceName + '_i_%d' % self.groundPadCount
|
||||
, self.getCell('pvssick_px') ) )
|
||||
|
@ -96,9 +99,19 @@ class cmos ( CoreToChip ):
|
|||
|
||||
def _buildPowerPads ( self, ioNet ):
|
||||
vddi = self.chip.getNet( 'vddi' )
|
||||
vddi.setExternal( True )
|
||||
vddi.setGlobal ( True )
|
||||
vddi.setType ( Net.Type.POWER )
|
||||
vddi.merge( ioNet.chipIntNet )
|
||||
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.padInstanceName + '_i_%d' % self.powerPadCount
|
||||
, self.getCell('pvddick_px') ) )
|
||||
|
|
|
@ -507,6 +507,7 @@ class Cell : public Entity {
|
|||
public: void setFlattenLeaf(bool isFlattenLeaf) {_flags.set(Flags::FlattenLeaf,isFlattenLeaf);};
|
||||
public: void setPad(bool isPad) {_flags.set(Flags::Pad,isPad);};
|
||||
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(const Instance* instance, 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_isUniquified , isUniquified ,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)
|
||||
|
||||
|
@ -733,10 +735,12 @@ extern "C" {
|
|||
, { "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." }
|
||||
, { "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" }
|
||||
, { "setName" , (PyCFunction)PyCell_setName , METH_VARARGS, "Allows to change the cell name." }
|
||||
, { "setAbutmentBox" , (PyCFunction)PyCell_setAbutmentBox , METH_VARARGS, "Sets the cell abutment box." }
|
||||
, { "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>." }
|
||||
, { "getClone" , (PyCFunction)PyCell_getClone , METH_NOARGS , "Return a copy of the Cell (placement only)." }
|
||||
, { "destroy" , (PyCFunction)PyCell_destroy , METH_NOARGS
|
||||
|
|
|
@ -308,10 +308,10 @@ def ResizeAb ( dx1, dy1, dx2, dy2 ) :
|
|||
global CELLS
|
||||
from st_model import CELLS
|
||||
|
||||
print "ResizeAb()", DbU.getValueString(dx1) \
|
||||
, DbU.getValueString(dy1) \
|
||||
, DbU.getValueString(dx2) \
|
||||
, DbU.getValueString(dy2)
|
||||
#print "ResizeAb()", DbU.getValueString(dx1) \
|
||||
# , DbU.getValueString(dy1) \
|
||||
# , DbU.getValueString(dx2) \
|
||||
# , DbU.getValueString(dy2)
|
||||
|
||||
global MYSLICE, MYPITCH
|
||||
|
||||
|
|
|
@ -66,7 +66,8 @@ def credits ():
|
|||
|
||||
def runScript ( scriptPath, editor ):
|
||||
try:
|
||||
kw = { 'editor':editor }
|
||||
kw = { }
|
||||
if editor: kw[ 'editor' ] = editor
|
||||
sys.path.append(os.path.dirname(scriptPath))
|
||||
|
||||
module = __import__( os.path.basename(scriptPath), globals(), locals() )
|
||||
|
@ -209,7 +210,9 @@ if __name__ == '__main__':
|
|||
ha.qtExec()
|
||||
else:
|
||||
# Run in command line mode.
|
||||
kiteSuccess = False
|
||||
if options.script: runScript(options.script,None)
|
||||
|
||||
kiteSuccess = True
|
||||
|
||||
if runEtesianTool:
|
||||
etesian = Etesian.EtesianEngine.create(cell)
|
||||
|
|
Loading…
Reference in New Issue