From 44f716c4a23f61bbeac6598aa0287ea9aeaead58 Mon Sep 17 00:00:00 2001 From: Jean-Paul Chaput Date: Wed, 28 Apr 2021 23:38:32 +0200 Subject: [PATCH] Perform only one connexion to the power supplies and the corona ring. * Bug: In cumulus/plugins.chip.pads, we were connecting the ground and power supplies to all the horizontal wires in the corona ring. But, when there are more than one and especially at the outer border of the pad, the vertical connecting wire will create various shorts over the pad. Now we connect only to the innermost horizontal wire only. Had to chech if the core side of the pad is north or south. --- cumulus/src/plugins/alpha/chip/configuration.py | 5 +++++ cumulus/src/plugins/alpha/chip/pads.py | 16 ++++++++++++++++ 2 files changed, 21 insertions(+) diff --git a/cumulus/src/plugins/alpha/chip/configuration.py b/cumulus/src/plugins/alpha/chip/configuration.py index e25afd18..81bc18a6 100644 --- a/cumulus/src/plugins/alpha/chip/configuration.py +++ b/cumulus/src/plugins/alpha/chip/configuration.py @@ -94,6 +94,7 @@ class ChipConf ( BlockConf ): # trace( 550, '\tONE LAMBDA = %s\n' % DbU.getValueString(DbU.fromLambda(1.0)) ) self.validated = True # Block Corona parameters (triggers loading from disk). + self.cfg.chip.padCoreSide = None self.cfg.chip.supplyRailWidth = None self.cfg.chip.supplyRailPitch = None self.cfg.chip.block.rails.count = None @@ -112,6 +113,10 @@ class ChipConf ( BlockConf ): self.padsHavePosition = False trace( 550, '-' ) + @property + def padCoreSide ( self ): + return self.cfg.chip.padCoreSide + @property def railsCount ( self ): return self._railsCount diff --git a/cumulus/src/plugins/alpha/chip/pads.py b/cumulus/src/plugins/alpha/chip/pads.py index 53815756..e8fa53c9 100644 --- a/cumulus/src/plugins/alpha/chip/pads.py +++ b/cumulus/src/plugins/alpha/chip/pads.py @@ -16,6 +16,7 @@ from __future__ import print_function import sys import re +import copy from operator import itemgetter from Hurricane import DbU, Point, Transformation, Interval, Box, \ Path, Occurrence, UpdateSession, Layer, \ @@ -952,6 +953,7 @@ class Corona ( object ): , component.getLayer() , axis , width ) ) + self.padRails.sort( key=itemgetter(2) ) def _createCoreWire ( self, chipIntNet, padNet, padInstance, count ): trace( 550, ',+', '\tCorona._createCoreWire()\n' ) @@ -1136,8 +1138,13 @@ class Corona ( object ): chipLayer = self.conf.getRoutingLayer( self.conf.routingGauge.getPowerSupplyGauge().getDepth() - 1 ) coronaAb = self.conf.icorona.getAbutmentBox() chipAxis = coronaAxis + self.conf.icorona.getTransformation().getTx() + rails = [] trace( 550, '\tchipLayer={}\n'.format(chipLayer) ) for rail in self.padRails: + rails.append( [ rail[0], rail[1], rail[2], rail[3] ] ) + if self.conf.padCoreSide == 'North': + rails.reverse() + for rail in rails: net = rail[0] layer = rail[1] railAxis = rail[2] @@ -1145,6 +1152,7 @@ class Corona ( object ): if net != chipNet or chipLayer.getMask() != layer.getMask(): continue if side == North: + trace( 550, '\tNorth side supply\n' ) trace( 550, '\tcoronaAb={}\n'.format(coronaAb) ) trace( 550, '\tcoronaAxis={}\n'.format(DbU.getValueString(coronaAxis)) ) trace( 550, '\tchipAxis={}\n'.format(DbU.getValueString(chipAxis)) ) @@ -1180,7 +1188,14 @@ class Corona ( object ): ) trace( 550, '\tpin={}\n'.format(pin) ) self.powerCount += 1 + break elif side == South: + trace( 550, '\tSouth side supply\n' ) + trace( 550, '\tcoronaAb={}\n'.format(coronaAb) ) + trace( 550, '\tcoronaAxis={}\n'.format(DbU.getValueString(coronaAxis)) ) + trace( 550, '\tchipAxis={}\n'.format(DbU.getValueString(chipAxis)) ) + trace( 550, '\trailNet={} <-> {}\n'.format(net,chipNet) ) + trace( 550, '\trailAxis={}\n'.format(DbU.getValueString(railAxis)) ) Vertical.create( chipNet , supplyLayer , chipAxis @@ -1209,6 +1224,7 @@ class Corona ( object ): , DbU.fromLambda( 1.0 ) ) self.powerCount += 1 + break trace( 550, '-' ) def doLayout ( self ):