158 lines
6.8 KiB
Python
158 lines
6.8 KiB
Python
|
#!/usr/bin/python
|
||
|
|
||
|
import sys
|
||
|
from coriolis.Hurricane import DataBase, Net, \
|
||
|
DbU, Point, Box, Pad, Rectilinear
|
||
|
from coriolis import Cfg
|
||
|
from coriolis.CRL import AllianceFramework, Catalog, Gds
|
||
|
from coriolis.helpers import l, u
|
||
|
from coriolis.helpers.overlay import CfgCache, UpdateSession
|
||
|
|
||
|
|
||
|
def testRectilinear ( editor ):
|
||
|
"""Check Hurricane.Rectilinear class."""
|
||
|
with CfgCache(priority=Cfg.Parameter.Priority.UserFile) as cfg:
|
||
|
cfg.misc.minTraceLevel = 17000
|
||
|
cfg.misc.maxTraceLevel = 18000
|
||
|
with UpdateSession():
|
||
|
cell = AllianceFramework.get().createCell( 'Rectilinear' )
|
||
|
cell.setTerminalNetlist( True )
|
||
|
cell.setAbutmentBox( Box( l(-5.0), l(-5.0), l(400.0), l(200.0) ) )
|
||
|
#cell.setAbutmentBox( Box( l(-5.0), l(-5.0), l(21.0), l(35.0) ) )
|
||
|
if editor:
|
||
|
editor.setCell( cell )
|
||
|
editor.fit()
|
||
|
|
||
|
technology = DataBase.getDB().getTechnology()
|
||
|
metal1 = technology.getLayer( "METAL1" )
|
||
|
metal2 = technology.getLayer( "METAL2" )
|
||
|
metal3 = technology.getLayer( "METAL3" )
|
||
|
metal4 = technology.getLayer( "METAL4" )
|
||
|
poly = technology.getLayer( "POLY" )
|
||
|
ptrans = technology.getLayer( "PTRANS" )
|
||
|
ntrans = technology.getLayer( "NTRANS" )
|
||
|
pdif = technology.getLayer( "PDIF" )
|
||
|
ndif = technology.getLayer( "NDIF" )
|
||
|
contdifn = technology.getLayer( "CONT_DIF_N" )
|
||
|
contdifp = technology.getLayer( "CONT_DIF_P" )
|
||
|
nwell = technology.getLayer( "NWELL" )
|
||
|
contpoly = technology.getLayer( "CONT_POLY" )
|
||
|
ntie = technology.getLayer( "NTIE" )
|
||
|
|
||
|
with UpdateSession():
|
||
|
net = Net.create( cell, 'my_net' )
|
||
|
net.setExternal( True )
|
||
|
|
||
|
points = [ Point( l( 0.0), l( 0.0) )
|
||
|
, Point( l( 0.0), l( 10.0) )
|
||
|
, Point( l( 20.0), l( 30.0) )
|
||
|
, Point( l( 30.0), l( 30.0) )
|
||
|
, Point( l( 30.0), l( 20.0) )
|
||
|
, Point( l( 10.0), l( 0.0) ) ]
|
||
|
r = Rectilinear.create( net, metal2, points )
|
||
|
|
||
|
#print( 'Normalized and manhattanized contour:' )
|
||
|
#i = 0
|
||
|
#for point in p.getMContour():
|
||
|
# print( '| %d '%i, point, '[%fum %fum]' % ( u(point.getX()), u(point.getY()) ))
|
||
|
# i += 1
|
||
|
|
||
|
#points = [ Point( l( 0.0), l( 40.0) ) # 0
|
||
|
# , Point( l( 30.0), l( 40.0) ) # 1
|
||
|
# , Point( l( 30.0), l( 60.0) ) # 2
|
||
|
# , Point( l( 50.0), l( 60.0) ) # 3
|
||
|
# , Point( l( 50.0), l( 80.0) ) # 4
|
||
|
# , Point( l( 90.0), l( 80.0) ) # 5
|
||
|
# , Point( l( 90.0), l( 50.0) ) # 6
|
||
|
# , Point( l( 60.0), l( 50.0) ) # 7
|
||
|
# , Point( l( 60.0), l( 30.0) ) # 8
|
||
|
# , Point( l( 70.0), l( 30.0) ) # 9
|
||
|
# , Point( l( 70.0), l( 20.0) ) # 10
|
||
|
# , Point( l( 90.0), l( 20.0) ) # 11
|
||
|
# , Point( l( 90.0), l( 0.0) ) # 12
|
||
|
# , Point( l( 20.0), l( 0.0) ) # 13
|
||
|
# , Point( l( 20.0), l( 20.0) ) # 14
|
||
|
# , Point( l( 0.0), l( 20.0) ) ] # 15
|
||
|
points = [ Point( l( 0.0), l( 0.0) ) # 0
|
||
|
, Point( l( 0.0), l( 20.0) ) # 1
|
||
|
, Point( l( 10.0), l( 20.0) ) # 2
|
||
|
, Point( l( 10.0), l( 30.0) ) # 3
|
||
|
, Point( l( 20.0), l( 30.0) ) # 4
|
||
|
, Point( l( 20.0), l( 40.0) ) # 5
|
||
|
, Point( l( 40.0), l( 40.0) ) # 6
|
||
|
, Point( l( 40.0), l( 80.0) ) # 7
|
||
|
, Point( l( 20.0), l( 80.0) ) # 8
|
||
|
, Point( l( 20.0), l( 70.0) ) # 9
|
||
|
|
||
|
, Point( l( 10.0), l( 70.0) ) # 10
|
||
|
, Point( l( 10.0), l( 60.0) ) # 11
|
||
|
, Point( l( 0.0), l( 60.0) ) # 12
|
||
|
, Point( l( 0.0), l(120.0) ) # 13
|
||
|
, Point( l( 10.0), l(120.0) ) # 14
|
||
|
, Point( l( 10.0), l(110.0) ) # 15
|
||
|
, Point( l( 20.0), l(110.0) ) # 16
|
||
|
, Point( l( 20.0), l(100.0) ) # 17
|
||
|
, Point( l( 40.0), l(100.0) ) # 18
|
||
|
, Point( l( 40.0), l(140.0) ) # 19
|
||
|
|
||
|
, Point( l( 20.0), l(140.0) ) # 20
|
||
|
, Point( l( 20.0), l(150.0) ) # 21
|
||
|
, Point( l( 10.0), l(150.0) ) # 22
|
||
|
, Point( l( 10.0), l(160.0) ) # 23
|
||
|
, Point( l( 0.0), l(160.0) ) # 24
|
||
|
, Point( l( 0.0), l(180.0) ) # 25
|
||
|
, Point( l( 40.0), l(180.0) ) # 26
|
||
|
, Point( l( 40.0), l(170.0) ) # 27
|
||
|
, Point( l( 50.0), l(170.0) ) # 28
|
||
|
, Point( l( 50.0), l(160.0) ) # 29
|
||
|
|
||
|
, Point( l(150.0), l(160.0) ) # 30
|
||
|
, Point( l(150.0), l(150.0) ) # 31
|
||
|
, Point( l(130.0), l(150.0) ) # 32
|
||
|
, Point( l(130.0), l(140.0) ) # 33
|
||
|
, Point( l(120.0), l(140.0) ) # 34
|
||
|
, Point( l(120.0), l(130.0) ) # 35
|
||
|
, Point( l(110.0), l(130.0) ) # 36
|
||
|
, Point( l(110.0), l(110.0) ) # 37
|
||
|
, Point( l(120.0), l(110.0) ) # 38
|
||
|
, Point( l(120.0), l(100.0) ) # 39
|
||
|
|
||
|
, Point( l(130.0), l(100.0) ) # 40
|
||
|
, Point( l(130.0), l( 90.0) ) # 41
|
||
|
, Point( l(150.0), l( 90.0) ) # 42
|
||
|
, Point( l(150.0), l( 80.0) ) # 43
|
||
|
, Point( l(120.0), l( 80.0) ) # 44
|
||
|
, Point( l(120.0), l( 70.0) ) # 45
|
||
|
, Point( l(110.0), l( 70.0) ) # 46
|
||
|
, Point( l(110.0), l( 50.0) ) # 47
|
||
|
, Point( l(120.0), l( 50.0) ) # 48
|
||
|
, Point( l(120.0), l( 40.0) ) # 49
|
||
|
|
||
|
, Point( l(130.0), l( 40.0) ) # 50
|
||
|
, Point( l(130.0), l( 30.0) ) # 51
|
||
|
, Point( l(150.0), l( 30.0) ) # 52
|
||
|
, Point( l(150.0), l( 20.0) ) # 53
|
||
|
, Point( l( 50.0), l( 20.0) ) # 54
|
||
|
, Point( l( 50.0), l( 10.0) ) # 55
|
||
|
, Point( l( 40.0), l( 10.0) ) # 56
|
||
|
, Point( l( 40.0), l( 0.0) ) ] # 57
|
||
|
r = Rectilinear.create( net, metal2, points )
|
||
|
|
||
|
boxes = []
|
||
|
r.getAsRectangles( boxes )
|
||
|
#print( 'boxes={}'.format( boxes ))
|
||
|
for box in boxes:
|
||
|
box.translate( l(180.0), l(0.0) )
|
||
|
Pad.create( net, metal3, box )
|
||
|
|
||
|
Gds.save( cell )
|
||
|
|
||
|
|
||
|
def scriptMain ( **kw ):
|
||
|
"""The mandatory function to be called by Coriolis CGT/Unicorn."""
|
||
|
editor = None
|
||
|
if 'editor' in kw and kw['editor']:
|
||
|
editor = kw['editor']
|
||
|
testRectilinear( editor )
|
||
|
return True
|