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:
parent
945b9a24fa
commit
172bdd9240
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue