First attempt at inserting bulks, fail.

* New: In cumulus/plugins.block.spares, added creation of vertical
    stacks of feed cells, for their N/P tie contacts, to ensure
    correct bulk polarization. Fail, because the placer cannot
    cope with such massive obstacles, the vertical columns are
    too close to manage.
* New: In cumulus/plugins.block.configuration, add support to
    FeedsConf so lone instances can be created (for the first
    bulk trial).
This commit is contained in:
Jean-Paul Chaput 2020-12-09 00:15:30 +01:00
parent 945b9a24fa
commit 172bdd9240
2 changed files with 53 additions and 21 deletions

View File

@ -840,6 +840,11 @@ class FeedsConf ( object ):
trace( 550, '-' ) trace( 550, '-' )
return return
def createFeed ( self, cell ):
instance = Instance.create( cell, 'spare_feed_{}'.format(self.count), self.feeds[0][1] )
self.count += 1
return instance
def fillAt ( self, cell, transf, gapWidth ): def fillAt ( self, cell, transf, gapWidth ):
""" """
In ``cell``, fill a *one* row gap starting at ``transf`` position and In ``cell``, fill a *one* row gap starting at ``transf`` position and

View File

@ -17,29 +17,15 @@ import sys
import os.path import os.path
import Cfg import Cfg
from operator import itemgetter from operator import itemgetter
from Hurricane import Breakpoint from Hurricane import Breakpoint, DbU, Box, Transformation, Box, \
from Hurricane import DbU Path, Layer, Occurrence, Net, RoutingPad, \
from Hurricane import Box Horizontal, Vertical, Contact, Pin, Plug, \
from Hurricane import Transformation Instance
from Hurricane import Box
from Hurricane import Path
from Hurricane import Layer
from Hurricane import Occurrence
from Hurricane import Net
from Hurricane import RoutingPad
from Hurricane import Horizontal
from Hurricane import Vertical
from Hurricane import Contact
from Hurricane import Pin
from Hurricane import Plug
from Hurricane import Instance
import CRL import CRL
from CRL import RoutingLayerGauge from CRL import RoutingLayerGauge
from helpers import trace from helpers import trace, l, u, n
from helpers import dots from helpers import dots
from helpers.io import ErrorMessage from helpers.io import ErrorMessage, WarningMessage, catch
from helpers.io import WarningMessage
from helpers.io import catch
from helpers.overlay import UpdateSession from helpers.overlay import UpdateSession
from plugins import getParameter from plugins import getParameter
from plugins.alpha import utils from plugins.alpha import utils
@ -176,6 +162,46 @@ class BufferPool ( object ):
, trBufAb.getXMax(), trBufAb.getYMax() ) , trBufAb.getXMax(), trBufAb.getYMax() )
trace( 540, '-' ) trace( 540, '-' )
def _getTransformation ( self, spareX, spareY ):
"""Transform (spareX,spareY) into sliced coordinates relatives to the corona."""
conf = self.quadTree.spares.conf
yoffset = 0
if conf.isCoreBlock:
yoffset = conf.icore.getTransformation().getTy()
sliceHeight = conf.sliceHeight
x = self.quadTree.spares.toXPitch( spareX )
y = self.quadTree.spares.toYSlice( spareY )
slice = (y - yoffset) / sliceHeight
orientation = Transformation.Orientation.ID
y = slice * sliceHeight + yoffset
if slice % 2:
orientation = Transformation.Orientation.MY
y += sliceHeight
transf = Transformation( x, y, orientation )
return transf
def _createTies ( self ):
trace( 540, ',+', '\tQuadTree._createTies()\n' )
conf = self.quadTree.spares.conf
sliceHeight = conf.sliceHeight
columns = self.quadTree.area.getWidth() / u(60.0)
if columns % 2: columns += 1
stepX = self.quadTree.area.getWidth() / columns
trace( 540, '\tcolumns:{}, stepX:{}\n' \
.format( columns, DbU.getValueString(stepX) ))
y = self.quadTree.area.getYMin()
while y < self.quadTree.area.getYMax():
for column in range(columns):
feed = conf.feedsConf.createFeed( conf.corona )
transf = self._getTransformation \
( self.quadTree.area.getXMin() + stepX/2 + column*stepX, y )
feed.setTransformation( transf )
feed.setPlacementStatus( Instance.PlacementStatus.FIXED )
trace( 540, '\tBulk tie: {}\n'.format(feed) )
trace( 540, '\ttransf:{}\n'.format(transf) )
y += sliceHeight
trace( 540, ',-' )
def _removeUnuseds ( self ): def _removeUnuseds ( self ):
conf = self.quadTree.spares.conf conf = self.quadTree.spares.conf
for i in range(self.rows*self.columns): for i in range(self.rows*self.columns):
@ -439,6 +465,7 @@ class QuadTree ( object ):
aspectRatio = float(self.area.getWidth()) / float(self.area.getHeight()) aspectRatio = float(self.area.getWidth()) / float(self.area.getHeight())
if self.area.getHeight() < side*2.0 or self.area.getWidth () < side*2.0: if self.area.getHeight() < side*2.0 or self.area.getWidth () < side*2.0:
#self.pool._createTies()
trace( 540, '-' ) trace( 540, '-' )
return False return False
@ -782,7 +809,7 @@ class Spares ( object ):
if self.conf.isCoreBlock: if self.conf.isCoreBlock:
offset = self.conf.icore.getTransformation().getTy() offset = self.conf.icore.getTransformation().getTy()
self.conf.icore.getTransformation().applyOn( area ) self.conf.icore.getTransformation().applyOn( area )
trace( 540, '\toffset:\n'.format(DbU.getValueString(offset)) ) trace( 540, '\toffset:{}\n'.format(DbU.getValueString(offset)) )
modulo = (y - offset - area.getYMin()) % self.conf.sliceHeight modulo = (y - offset - area.getYMin()) % self.conf.sliceHeight
return y - modulo return y - modulo