99 lines
4.1 KiB
Python
99 lines
4.1 KiB
Python
#!/usr/bin/python
|
|
|
|
import sys
|
|
from Hurricane import DataBase, NetExternalComponents, Net, \
|
|
DbU, Point, Box, Horizontal, Vertical, Contact, RoutingPad, \
|
|
Breakpoint
|
|
from CRL import AllianceFramework, Catalog
|
|
from helpers import l
|
|
from helpers.overlay import UpdateSession
|
|
|
|
|
|
def doBreak ( level, message ):
|
|
"""Put a breakpoint into the script."""
|
|
Breakpoint.stop( level, message )
|
|
|
|
|
|
def buildInvertor ( editor ):
|
|
"""Build step by step an invertor standard cell."""
|
|
with UpdateSession():
|
|
cell = AllianceFramework.get().createCell( 'invertor' )
|
|
cell.setTerminalNetlist( True )
|
|
cell.setAbutmentBox( Box( l(0.0), l(0.0), l(15.0), l(50.0) ) )
|
|
if editor:
|
|
editor.setCell( cell )
|
|
editor.fit()
|
|
|
|
technology = DataBase.getDB().getTechnology()
|
|
metal1 = technology.getLayer( "METAL1" )
|
|
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, "nwell" )
|
|
Vertical.create( net, nwell, l(7.5), l(15.0), l(27.0), l(51.0) )
|
|
|
|
vdd = Net.create( cell, "vdd" )
|
|
vdd.setExternal( True )
|
|
vdd.setGlobal ( True )
|
|
h = Horizontal.create(vdd, metal1, l(47.0), l(6.0), l(0.0), l(15.0) )
|
|
NetExternalComponents.setExternal( h )
|
|
Contact.create ( vdd, contdifn, l(10.0), l(47.0), l( 1.0), l( 1.0) )
|
|
Contact.create ( vdd, contdifp, l( 4.0), l(45.0), l( 1.0), l( 1.0) )
|
|
Vertical.create( vdd, pdif , l( 3.5), l( 4.0), l(28.0), l(46.0) )
|
|
Vertical.create( vdd, ntie , l(10.0), l( 3.0), l(43.0), l(48.0) )
|
|
doBreak( 1, 'Done building vdd.' )
|
|
|
|
with UpdateSession():
|
|
vss = Net.create( cell, "vss" )
|
|
vss.setExternal( True )
|
|
vss.setGlobal ( True )
|
|
h = Horizontal.create(vss, metal1, l(3.0), l(6.0), l(0.0), l(15.0))
|
|
NetExternalComponents.setExternal( h )
|
|
Vertical.create( vss, ndif , l(3.5), l(4.0), l(4.0), l(12.0) )
|
|
Contact.create ( vss, contdifn, l(4.0), l(5.0), l(1.0), l( 1.0) )
|
|
doBreak( 1, 'Done building vss.' )
|
|
|
|
with UpdateSession():
|
|
i = Net.create( cell, "i" )
|
|
i.setExternal( True )
|
|
v = Vertical.create ( i, metal1, l(5.0), l(2.0), l(10.0), l(40.0) )
|
|
NetExternalComponents.setExternal( v )
|
|
Vertical.create ( i, ptrans , l( 7.0), l( 1.0), l(26.0), l(39.0) )
|
|
Vertical.create ( i, ntrans , l( 7.0), l( 1.0), l( 6.0), l(14.0) )
|
|
Vertical.create ( i, poly , l( 7.0), l( 1.0), l(14.0), l(26.0) )
|
|
Horizontal.create( i, poly , l(20.0), l( 3.0), l( 4.0), l( 7.0) )
|
|
Contact.create ( i, contpoly, l( 5.0), l(20.0), l( 1.0), l( 1.0) )
|
|
doBreak( 1, 'Done building i.' )
|
|
|
|
with UpdateSession():
|
|
nq = Net.create ( cell, "nq" )
|
|
nq.setExternal( True )
|
|
v = Vertical.create( nq, metal1, l(10.0), l(2.0), l(10.0), l(40.0) )
|
|
NetExternalComponents.setExternal( v )
|
|
Vertical.create( nq, pdif , l(10.0), l( 3.0), l(28.0), l(37.0) )
|
|
Vertical.create( nq, ndif , l(10.0), l( 3.0), l( 8.0), l(12.0) )
|
|
Contact.create ( nq, contdifp, l(10.0), l(35.0), l( 1.0), l( 1.0) )
|
|
Contact.create ( nq, contdifp, l(10.0), l(30.5), l( 1.0), l( 1.0) )
|
|
Contact.create ( nq, contdifn, l(10.0), l(10.0), l( 1.0), l( 1.0) )
|
|
doBreak( 1, 'Done building q.' )
|
|
|
|
AllianceFramework.get().saveCell( cell, Catalog.State.Views )
|
|
|
|
|
|
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']
|
|
buildInvertor( editor )
|
|
return True
|