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:
Jean-Paul Chaput 2019-05-24 23:57:22 +02:00
parent 3fb746fbef
commit 4cd0bcb009
16 changed files with 256 additions and 88 deletions

3
.gitignore vendored
View File

@ -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

View File

@ -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;
} }

View File

@ -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();

View File

@ -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 ();

View File

@ -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:

View File

@ -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 );

View File

@ -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

View File

@ -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() )

View File

@ -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()

View File

@ -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

View File

@ -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

View File

@ -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') ) )

View File

@ -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);

View File

@ -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

View File

@ -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

View File

@ -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)