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.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) << "* _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;
}

View File

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

View File

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

View File

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

View File

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

View File

@ -15,7 +15,6 @@
# +-----------------------------------------------------------------+
import sys
import re
import helpers
from helpers.io import ErrorMessage
from helpers.io import WarningMessage

View File

@ -141,6 +141,7 @@ class PlaceRoute ( object ):
if not checkUnplaced.check(): return
coreCk = None
if self.conf.coronaCk:
for plug in self.conf.coronaCk.getPlugs():
if plug.getInstance() == self.conf.icore:
coreCk = plug.getMasterNet()

View File

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

View File

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

View File

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

View File

@ -14,14 +14,7 @@
# | 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
@ -30,7 +23,6 @@ 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
@ -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') ) )

View File

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

View File

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

View File

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

View File

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