From 4cd0bcb0099386bfcab6b06ec209a8ba1cac7140 Mon Sep 17 00:00:00 2001 From: Jean-Paul Chaput Date: Fri, 24 May 2019 23:57:22 +0200 Subject: [PATCH] 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. --- .gitignore | 3 + anabatic/src/NetBuilder.cpp | 39 +++-- anabatic/src/NetBuilderHV.cpp | 160 ++++++++++++++++-- anabatic/src/anabatic/NetBuilderHV.h | 2 + crlcore/python/helpers/__init__.py | 2 +- crlcore/src/ccore/alliance/vst/VhdlEntity.cpp | 2 + cumulus/src/plugins/CoreToChip_cmos.py | 1 - cumulus/src/plugins/chip/Chip.py | 11 +- cumulus/src/plugins/chip/Configuration.py | 3 + cumulus/src/plugins/chip/PadsCorona.py | 27 ++- cumulus/src/plugins/core2chip/CoreToChip.py | 23 +-- cumulus/src/plugins/core2chip/cmos.py | 51 +++--- hurricane/src/hurricane/hurricane/Cell.h | 1 + hurricane/src/isobar/PyCell.cpp | 4 + stratus1/src/stratus/st_placement.py | 8 +- unicorn/src/cgt.py | 7 +- 16 files changed, 256 insertions(+), 88 deletions(-) diff --git a/.gitignore b/.gitignore index 49569275..37f78573 100644 --- a/.gitignore +++ b/.gitignore @@ -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 + diff --git a/anabatic/src/NetBuilder.cpp b/anabatic/src/NetBuilder.cpp index 6947fad6..6707ed8f 100644 --- a/anabatic/src/NetBuilder.cpp +++ b/anabatic/src/NetBuilder.cpp @@ -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( _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; } diff --git a/anabatic/src/NetBuilderHV.cpp b/anabatic/src/NetBuilderHV.cpp index f6dddcd5..5e55bb4e 100644 --- a/anabatic/src/NetBuilderHV.cpp +++ b/anabatic/src/NetBuilderHV.cpp @@ -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(); diff --git a/anabatic/src/anabatic/NetBuilderHV.h b/anabatic/src/anabatic/NetBuilderHV.h index 5aba4779..a2dcf829 100644 --- a/anabatic/src/anabatic/NetBuilderHV.h +++ b/anabatic/src/anabatic/NetBuilderHV.h @@ -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 (); diff --git a/crlcore/python/helpers/__init__.py b/crlcore/python/helpers/__init__.py index 7aed46b2..c8cbd5df 100644 --- a/crlcore/python/helpers/__init__.py +++ b/crlcore/python/helpers/__init__.py @@ -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: diff --git a/crlcore/src/ccore/alliance/vst/VhdlEntity.cpp b/crlcore/src/ccore/alliance/vst/VhdlEntity.cpp index e613e6b9..8ee28c1d 100644 --- a/crlcore/src/ccore/alliance/vst/VhdlEntity.cpp +++ b/crlcore/src/ccore/alliance/vst/VhdlEntity.cpp @@ -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 ); diff --git a/cumulus/src/plugins/CoreToChip_cmos.py b/cumulus/src/plugins/CoreToChip_cmos.py index 4c757f0d..168a030c 100644 --- a/cumulus/src/plugins/CoreToChip_cmos.py +++ b/cumulus/src/plugins/CoreToChip_cmos.py @@ -15,7 +15,6 @@ # +-----------------------------------------------------------------+ import sys -import re import helpers from helpers.io import ErrorMessage from helpers.io import WarningMessage diff --git a/cumulus/src/plugins/chip/Chip.py b/cumulus/src/plugins/chip/Chip.py index 2fc0b947..46e62b2e 100644 --- a/cumulus/src/plugins/chip/Chip.py +++ b/cumulus/src/plugins/chip/Chip.py @@ -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() ) diff --git a/cumulus/src/plugins/chip/Configuration.py b/cumulus/src/plugins/chip/Configuration.py index 79cab7af..3d953597 100644 --- a/cumulus/src/plugins/chip/Configuration.py +++ b/cumulus/src/plugins/chip/Configuration.py @@ -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() diff --git a/cumulus/src/plugins/chip/PadsCorona.py b/cumulus/src/plugins/chip/PadsCorona.py index 6d8e6e16..991a346b 100644 --- a/cumulus/src/plugins/chip/PadsCorona.py +++ b/cumulus/src/plugins/chip/PadsCorona.py @@ -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(?Pv[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 diff --git a/cumulus/src/plugins/core2chip/CoreToChip.py b/cumulus/src/plugins/core2chip/CoreToChip.py index 69408614..a87e1492 100644 --- a/cumulus/src/plugins/core2chip/CoreToChip.py +++ b/cumulus/src/plugins/core2chip/CoreToChip.py @@ -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[^(]*)\((?P[\d+])\)$' ) + reVHDLVector = re.compile( r'(?P[^(]*)\((?P[\d]+)\)$' ) def __init__ ( self, coreToChip, coreNet ): self.coreToChip = coreToChip diff --git a/cumulus/src/plugins/core2chip/cmos.py b/cumulus/src/plugins/core2chip/cmos.py index b07177a0..ecf09334 100644 --- a/cumulus/src/plugins/core2chip/cmos.py +++ b/cumulus/src/plugins/core2chip/cmos.py @@ -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') ) ) diff --git a/hurricane/src/hurricane/hurricane/Cell.h b/hurricane/src/hurricane/hurricane/Cell.h index 7aecbe10..b046dcaa 100644 --- a/hurricane/src/hurricane/hurricane/Cell.h +++ b/hurricane/src/hurricane/hurricane/Cell.h @@ -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); diff --git a/hurricane/src/isobar/PyCell.cpp b/hurricane/src/isobar/PyCell.cpp index f8fb5ecf..a2b99a43 100644 --- a/hurricane/src/isobar/PyCell.cpp +++ b/hurricane/src/isobar/PyCell.cpp @@ -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 ." } , { "getClone" , (PyCFunction)PyCell_getClone , METH_NOARGS , "Return a copy of the Cell (placement only)." } , { "destroy" , (PyCFunction)PyCell_destroy , METH_NOARGS diff --git a/stratus1/src/stratus/st_placement.py b/stratus1/src/stratus/st_placement.py index f1882635..ece77337 100644 --- a/stratus1/src/stratus/st_placement.py +++ b/stratus1/src/stratus/st_placement.py @@ -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 diff --git a/unicorn/src/cgt.py b/unicorn/src/cgt.py index 85537c5e..fdf01336 100755 --- a/unicorn/src/cgt.py +++ b/unicorn/src/cgt.py @@ -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)