176 lines
7.0 KiB
Python
176 lines
7.0 KiB
Python
#!/usr/bin/python
|
|
|
|
import sys
|
|
from Hurricane import DataBase, Instance, Box, Net, Horizontal, Vertical, Contact, \
|
|
RoutingPad, Transformation, Occurrence, \
|
|
Breakpoint
|
|
from CRL import AllianceFramework, Catalog, Gds
|
|
from helpers import l
|
|
from helpers.overlay import UpdateSession
|
|
|
|
|
|
def doBreak ( level, message ):
|
|
Breakpoint.stop( level, message )
|
|
|
|
|
|
def buildFulladder ( editor ):
|
|
"""
|
|
Build a full adder, place it, add filler cells and create routing
|
|
for the "a" net.
|
|
"""
|
|
# Get the Framework and all the master cells.
|
|
af = AllianceFramework.get()
|
|
xr2_x2 = af.getCell( 'xr2_x1', Catalog.State.Views )
|
|
a2_x2 = af.getCell( 'a2_x2' , Catalog.State.Views )
|
|
o2_x2 = af.getCell( 'o2_x2' , Catalog.State.Views )
|
|
|
|
with UpdateSession():
|
|
fulladder = af.createCell( 'fulladder' )
|
|
fulladder.setAbutmentBox( Box( l(0.0), l(0.0), l(90.0), l(100.0) ) )
|
|
if editor:
|
|
editor.setCell( fulladder )
|
|
editor.fit()
|
|
|
|
with UpdateSession():
|
|
# Create Instances.
|
|
a2_1 = Instance.create( fulladder, 'a2_1', a2_x2 )
|
|
a2_2 = Instance.create( fulladder, 'a2_2', a2_x2 )
|
|
xr2_1 = Instance.create( fulladder, 'xr2_1', xr2_x2 )
|
|
xr2_2 = Instance.create( fulladder, 'xr2_2', xr2_x2 )
|
|
o2_1 = Instance.create( fulladder, 'o2_1', o2_x2 )
|
|
|
|
# Create Nets.
|
|
vss = Net.create( fulladder, "vss" )
|
|
vss.setExternal( True )
|
|
vss.setGlobal ( True )
|
|
|
|
vdd = Net.create( fulladder, "vdd" )
|
|
vdd.setExternal( True )
|
|
vdd.setGlobal ( True )
|
|
|
|
cin = Net.create( fulladder, "cin" )
|
|
cin.setExternal( True )
|
|
xr2_2.getPlug( xr2_x2.getNet('i0') ).setNet( cin )
|
|
a2_2 .getPlug( a2_x2.getNet('i0') ).setNet( cin )
|
|
|
|
a = Net.create( fulladder, 'a' )
|
|
a.setExternal( True )
|
|
xr2_1.getPlug( xr2_x2.getNet('i0') ).setNet( a )
|
|
a2_1 .getPlug( a2_x2.getNet('i0') ).setNet( a )
|
|
|
|
b = Net.create( fulladder, 'b' )
|
|
b.setExternal( True )
|
|
xr2_1.getPlug( xr2_x2.getNet('i1') ).setNet( b )
|
|
a2_1 .getPlug( a2_x2.getNet('i1') ).setNet( b )
|
|
|
|
sout_1 = Net.create( fulladder, 'sout_1' )
|
|
xr2_1.getPlug( xr2_x2.getNet('q' ) ).setNet( sout_1 )
|
|
xr2_2.getPlug( xr2_x2.getNet('i1') ).setNet( sout_1 )
|
|
a2_2 .getPlug( a2_x2.getNet('i1') ).setNet( sout_1 )
|
|
|
|
carry_1 = Net.create( fulladder, 'carry_1' )
|
|
a2_1.getPlug( a2_x2.getNet('q' ) ).setNet( carry_1 )
|
|
o2_1.getPlug( o2_x2.getNet('i1') ).setNet( carry_1 )
|
|
|
|
carry_2 = Net.create( fulladder, 'carry_2' )
|
|
a2_2.getPlug( a2_x2.getNet('q' ) ).setNet( carry_2 )
|
|
o2_1.getPlug( o2_x2.getNet('i0') ).setNet( carry_2 )
|
|
|
|
sout = Net.create( fulladder, 'sout' )
|
|
sout.setExternal( True )
|
|
xr2_2.getPlug( xr2_x2.getNet('q') ).setNet( sout )
|
|
|
|
cout = Net.create( fulladder, 'cout' )
|
|
cout.setExternal( True )
|
|
o2_1.getPlug( o2_x2.getNet('q') ).setNet( cout )
|
|
|
|
with UpdateSession():
|
|
# Instances placement.
|
|
a2_1.setTransformation( Transformation( l(0.0)
|
|
, l(0.0)
|
|
, Transformation.Orientation.ID ) )
|
|
a2_1.setPlacementStatus( Instance.PlacementStatus.PLACED )
|
|
#doBreak( 1, 'Placed a2_1' )
|
|
|
|
with UpdateSession():
|
|
xr2_1.setTransformation( Transformation( l( 0.0)
|
|
, l(100.0)
|
|
, Transformation.Orientation.MY ) )
|
|
xr2_1.setPlacementStatus( Instance.PlacementStatus.PLACED )
|
|
#doBreak( 1, 'Placed xr2_1' )
|
|
|
|
with UpdateSession():
|
|
a2_2.setTransformation( Transformation( l(25.0)
|
|
, l( 0.0)
|
|
, Transformation.Orientation.ID ) )
|
|
a2_2.setPlacementStatus( Instance.PlacementStatus.PLACED )
|
|
#doBreak( 1, 'Placed a2_2' )
|
|
|
|
with UpdateSession():
|
|
xr2_2.setTransformation( Transformation( l( 45.0)
|
|
, l(100.0)
|
|
, Transformation.Orientation.MY ) )
|
|
xr2_2.setPlacementStatus( Instance.PlacementStatus.PLACED )
|
|
#doBreak( 1, 'Placed xr2_2' )
|
|
|
|
with UpdateSession():
|
|
o2_1.setTransformation( Transformation( l(65.0)
|
|
, l( 0.0)
|
|
, Transformation.Orientation.ID ) )
|
|
o2_1.setPlacementStatus( Instance.PlacementStatus.PLACED )
|
|
#doBreak( 1, 'Placed o2_1' )
|
|
|
|
with UpdateSession():
|
|
# Add filler cells.
|
|
tie_x0 = af.getCell( 'tie_x0', Catalog.State.Views )
|
|
rowend_x0 = af.getCell( 'rowend_x0', Catalog.State.Views )
|
|
filler_1 = Instance.create( fulladder, 'filler_1', tie_x0 )
|
|
filler_2 = Instance.create( fulladder, 'filler_2', rowend_x0 )
|
|
|
|
filler_1.setTransformation( Transformation( l(50.0)
|
|
, l( 0.0)
|
|
, Transformation.Orientation.ID ) )
|
|
filler_1.setPlacementStatus( Instance.PlacementStatus.PLACED )
|
|
|
|
filler_2.setTransformation( Transformation( l(60.0)
|
|
, l( 0.0)
|
|
, Transformation.Orientation.ID ) )
|
|
filler_2.setPlacementStatus( Instance.PlacementStatus.PLACED )
|
|
#doBreak( 1, 'Filler cell placeds' )
|
|
|
|
# Getting the layers.
|
|
technology = DataBase.getDB().getTechnology()
|
|
metal2 = technology.getLayer( "METAL2" )
|
|
metal3 = technology.getLayer( "METAL3" )
|
|
via12 = technology.getLayer( "VIA12" )
|
|
via23 = technology.getLayer( "VIA23" )
|
|
|
|
with UpdateSession():
|
|
# Build wiring for a.
|
|
# Create RoutingPads first.
|
|
rp1 = RoutingPad.create( a
|
|
, Occurrence( xr2_1.getPlug( xr2_x2.getNet("i0")) )
|
|
, RoutingPad.BiggestArea )
|
|
rp2 = RoutingPad.create( a
|
|
, Occurrence( a2_1.getPlug( a2_x2.getNet("i0")) )
|
|
, RoutingPad.BiggestArea )
|
|
|
|
# Then regular wiring.
|
|
contact1 = Contact.create( rp1, via12, l( 0.0), l(-15.0) )
|
|
contact2 = Contact.create( rp2, via12, l( 0.0), l( 10.0) )
|
|
turn = Contact.create( a , via23, l(10.0), l( 35.0) )
|
|
Horizontal.create( contact2, turn , metal2, l(35.0), l(2.0) )
|
|
Vertical .create( turn , contact1, metal3, l(10.0), l(2.0) )
|
|
|
|
af.saveCell( fulladder, Catalog.State.Views )
|
|
Gds.save( fulladder )
|
|
|
|
|
|
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']
|
|
buildFulladder( editor )
|
|
return True
|