coriolis/oroshi/python/MultiCapacitor.py

176 lines
5.6 KiB
Python

# -*- coding: utf-8 -*-
from Hurricane import DataBase
from Hurricane import UpdateSession
from Hurricane import DbU
from Hurricane import Box
from Hurricane import Net
import helpers
import helpers.io
from helpers import trace
#helpers.setTraceLevel( 100 )
import Analog
import ParamsMatrix
import oroshi
from Analog import Device
from CapacitorUnit import CapacitorUnit
from CapacitorMatrix import CapacitorStack
from CapacitorVRTracks import VerticalRoutingTracks
from CapacitorRouted import RoutMatchedCapacitor
from CapacitorRoutedSingle import RouteCapacitorSingle
def toMatrixArgs ( matrix ):
valid = True
rows = matrix.getRows ()
columns = matrix.getColumns()
lol = []
for row in range(rows):
lol.append( [] )
for column in range(columns):
lol[-1].append( matrix.getValue(row,column) )
return [rows,columns], lol
def checkCoherency ( device, bbMode ):
message = 'CapacitorMatrix.checkCoherency(): device "%s".\n' % device.getName()
techno = DataBase.getDB().getTechnology()
rules = oroshi.getRules()
capacities = device.getParameter( 'capacities' )
if capacities is None:
message += ' Missing "capacities" parameter on %s' % str(device)
return (False, message)
pmatrix = device.getParameter( 'matrix' )
if pmatrix is None:
message += ' Missing "matrix" parameter on %s' % str(device)
return (False, message)
valid = True
if pmatrix:
rows = pmatrix.getRows ()
columns = pmatrix.getColumns()
for row in range(rows):
#print ' [',
for column in range(columns):
capaIndex = pmatrix.getValue(row,column)
#print '%2d' % capaIndex,
if capaIndex >= capacities.getCount():
valid = False
message += ' element [%d,%d] == %d is out of range, must be in [0..%d]\n' \
% (row,column,capaIndex,capacities.getCount()-1)
#print ']'
if not valid: return (False, message)
return (True, "")
def addDummyNets ( device ):
if not device.hasDummy(): return
i = device.getParameter( 'capacities' ).getCount()
topName = 't%d'%i
botName = 'b%d'%i
topNet = device.getNet( topName )
if not topNet:
topNet = Net.create( device, topName )
topNet.setExternal( True )
botNet = device.getNet( botName )
if not botNet:
botNet = Net.create( device, botName )
botNet.setExternal( True )
return
def layout ( device, bbMode ):
trace( 100, ',+', '\tMultiCapacitor.layout() called for "%s".\n' % device.getName())
paramsMatrix = ParamsMatrix.ParamsMatrix()
try:
capacities = device.getParameter( 'capacities' )
dummyArg = device.hasDummy()
capaValuesArg = []
vTrackNetsArg = []
addDummyNets( device )
for i in range(capacities.getCount()):
capaValuesArg.append( capacities.getValue(i)*1000.0 )
vTrackNetsArg.append( [ device.getNet('t%d'%i), device.getNet("b%d"%i) ] )
if dummyArg:
i = device.getParameter( 'capacities' ).getCount()
vTrackNetsArg.append( [ device.getNet('t%d'%i), device.getNet("b%d"%i) ] )
matrixSizeArg, matchingSchemeArg = toMatrixArgs( device.getParameter('matrix') )
typeArg = 'UnknownType'
if device.isPIP(): typeArg = 'PIPCap'
if device.isMIM(): typeArg = 'MIMCap'
if device.isMOM(): typeArg = 'MOMCap'
if len(capaValuesArg) == 1:
# One capa, multiple units.
capaGenerator = CapacitorStack( device
, capaValuesArg # (fF).
, typeArg
, [0,0] # AB position.
, vTrackNetsArg
, matrixDim =matrixSizeArg
, dummyRing =dummyArg
)
capaMatrix = capaGenerator.create()
capaSingle = RouteCapacitorSingle( capaGenerator
, capaMatrix
, topPlateWSpec=[1,0]
, bottomPlateWSpec=[0,1] )
capaSingle.route()
else:
# Two capa, multiple units.
capaGenerator = CapacitorStack( device
, capaValuesArg # [ 240, 720 ] # capaValuesArg (fF).
, typeArg
, [0,0] # AB position.
, vTrackNetsArg
, matrixDim =matrixSizeArg
, matchingMode =True
, matchingScheme=matchingSchemeArg
, dummyRing =dummyArg
)
capaMatrix = capaGenerator.create()
capaTracks = VerticalRoutingTracks( capaGenerator, capaMatrix, True )
capaTracks.create()
capaRouted = RoutMatchedCapacitor( capaTracks )
capaRouted.route()
for pair in vTrackNetsArg:
for net in pair:
device.setRestrictions( net, Device.NorthBlocked|Device.SouthBlocked )
paramsMatrix.setGlobalCapacitorParams( device.getAbutmentBox() )
trace( 100, '++' )
#paramsMatrix.trace()
except Exception, e:
helpers.io.catch( e )
trace( 100, '---' )
return paramsMatrix.getMatrix()