coriolis/cumulus/src/ref.py

158 lines
4.5 KiB
Python

import CRL
from Hurricane import *
import re
###########
## GetXY ##
###########
def pyGetXY ( masterCell, pathname, refname ) :
'''This function returns the coordinates of a reference thanks to its name and the path of the instance it belongs to'''
## MasterCell ##
if pathname != "" :
myPath = Path ( masterCell, pathname )
tInst = myPath.getTailInstance()
masterCell = tInst.getMasterCell()
## Reference ##
myRef = None
for el in masterCell.getReferences():
if str(el.getName()) == refname :
myRef = el
break
# Error : if no reference found in mastercell
if myRef == None :
err = "\n[Stratus ERROR] GetRefXY : No reference found with name " + refname + " in masterCell " + str(masterCell.getName()) + ".\n"
raise err
## Occurrence of the Reference ##
myOccurrence = Occurrence ( myRef, myPath )
bb = myOccurrence.getBoundingBox()
return ( getValue(bb.getXCenter()), getValue(bb.getYCenter()) )
##############
## PlaceRef ##
##############
def pyPlaceRef ( cell, name, x, y ) :
'''This function creates a reference thanks to its coordinates'''
UpdateSession.open()
Reference ( cell
, name
, DbU_lambda ( x ), DbU_lambda ( y )
)
UpdateSession.close()
##################
## PlaceContact ##
##################
def pyPlaceContact ( net, layer, x, y, width, height ) :
'''This function creates a contact'''
UpdateSession.open()
Contact ( net, layer, DbU_lambda(x), DbU_lambda(y), DbU_lambda(width), DbU_lambda(height) )
UpdateSession.close()
##############
## PlacePin ##
##############
def pyPlacePin ( net, direct, placementStatus, layer, x, y, width, height ) :
'''This function creates a pin'''
size = 0
for loc in net.getPins():
size += 1
UpdateSession.open()
Pin ( net, str(net.getName()) + "." + str(size)
, direct
, placementStatus
, layer
, DbU_lambda(x), DbU_lambda(y)
, DbU_lambda(width), DbU_lambda(height)
)
if ( not net.IsSupply() ) :
CRL.createPartRing ( net.getCell(), net.getName() )
UpdateSession.close()
##################
## PlaceSegment ##
##################
def pyPlaceSegment ( net, layer, x1, y1, x2, y2, width ) :
'''This function creates a segment'''
UpdateSession.open()
if x1 == x2 : Vertical ( net, layer, DbU_lambda(x1), DbU_lambda(width), DbU_lambda(y1), DbU_lambda(y2) )
elif y1 == y2 : Horizontal ( net, layer, DbU_lambda(y1), DbU_lambda(width), DbU_lambda(x1), DbU_lambda(x2) )
UpdateSession.close()
###################
## CopyUpSegment ##
###################
def pyCopyUpSegment ( masterCell, pathname, netname, newnet ) :
'''This function copies the segment of an instance in the current cell'''
## MasterCell ##
if pathname != "" :
myPath = Path ( masterCell, pathname )
transformation = myPath.getTransformation()
tInst = myPath.getTailInstance()
masterCell = tInst.getMasterCell()
## Net ##
myNet = None
for el in masterCell.getNets():
if str(el.getName()) == netname :
myNet = el
break
# Error : if no net found in mastercell
if myNet == None :
err = "\n[Stratus ERROR] CopyUpSegment : No net found with name " + netname + " in masterCell " + str(masterCell.getName()) + ".\n"
raise err
mySegment = None
for mySegment in myNet.getSegments():
# Error : copy only of CALU segments
if str ( mySegment.getLayer().getName() ) not in ( "CALU1", "CALU2", "CALU3", "CALU4", "CALU5", "CALU6" ) :
err = "\n[Stratus ERROR] CopyUpSegment : The segments of net " + netname + " are not of type CALU.\n"
raise err
myLayer = mySegment.getLayer()
myWidth = mySegment.getWidth()
pointSource = mySegment.getSourcePosition()
pointTarget = mySegment.getTargetPosition()
transformation.ApplyOn ( pointSource )
transformation.ApplyOn ( pointTarget )
## Occurrence of the segment ##
myOccurrence = Occurrence ( mySegment, myPath )
if pointSource.getY() == pointTarget.getY() :
Horizontal ( newnet, myLayer, pointSource.getY(), myWidth, pointSource.getX(), pointTarget.getX() )
elif pointSource.getX() == pointTarget.getX() :
Vertical ( newnet, myLayer, pointSource.getX(), myWidth, pointSource.getY(), pointTarget.getY() )
# Error : if no segment found
if not mySegment:
err = "\n[Stratus ERROR] CopyUpSegment : No segment found with net " + netname + " in masterCell " + str(masterCell.getName()) + ".\n"
raise err