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, '-' )
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 ):
"""
In ``cell``, fill a *one* row gap starting at ``transf`` position and

View File

@ -17,29 +17,15 @@ import sys
import os.path
import Cfg
from operator import itemgetter
from Hurricane import Breakpoint
from Hurricane import DbU
from Hurricane import Box
from Hurricane import Transformation
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
from Hurricane import Breakpoint, DbU, Box, Transformation, Box, \
Path, Layer, Occurrence, Net, RoutingPad, \
Horizontal, Vertical, Contact, Pin, Plug, \
Instance
import CRL
from CRL import RoutingLayerGauge
from helpers import trace
from helpers import trace, l, u, n
from helpers import dots
from helpers.io import ErrorMessage
from helpers.io import WarningMessage
from helpers.io import catch
from helpers.io import ErrorMessage, WarningMessage, catch
from helpers.overlay import UpdateSession
from plugins import getParameter
from plugins.alpha import utils
@ -176,6 +162,46 @@ class BufferPool ( object ):
, trBufAb.getXMax(), trBufAb.getYMax() )
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 ):
conf = self.quadTree.spares.conf
for i in range(self.rows*self.columns):
@ -439,6 +465,7 @@ class QuadTree ( object ):
aspectRatio = float(self.area.getWidth()) / float(self.area.getHeight())
if self.area.getHeight() < side*2.0 or self.area.getWidth () < side*2.0:
#self.pool._createTies()
trace( 540, '-' )
return False
@ -782,7 +809,7 @@ class Spares ( object ):
if self.conf.isCoreBlock:
offset = self.conf.icore.getTransformation().getTy()
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
return y - modulo