# -*- Mode:Python; explicit-buffer-name: "technology.conf" -*- from Hurricane import DbU from helpers import sysConfDir from helpers import l, u, n from helpers.Technology import initTechno # The informations here are extracted from the Alliance ".rds" file, # and must be consistent with it. # # Provides standard settings for: # - # - # - # - # MOSIS SCN6M_DEEP is a portable technology where lengths are expresseds # in symbolic unit (lambda). We only know that the lambda is equal to half # the value of the technology, that is 180nm gives 90nm. We have no information # about the foundry grid. # # We set the foundry grid to .0025um and set the gridsPerLambda to 10. initTechno( { 'name' : 'cmos45' , 'precision' : 2 , 'gridValue' : 0.0025 , 'gridUnit' : DbU.UnitPowerMicro , 'gridsPerLambda' : 10 , 'symbolicGridStep': 1.0 , 'polygonStep' : 10.0 } ) execfile( sysConfDir+'/common/technology.conf' ) # Format of : # Each entry is a pair of (string, value). # * string: a synthetic way to designate the real or symbolic layer on # which it applies, an optional sub layer (BasicLayer) in case # where there is more than one, and the dimension name. # * value : the rule (dimension) value. # Values/dimensions must be given using one of the following conversion # function: # * l(value) : value expressed in lambda (symbolic). # * u(value) : value is expressed in microns. # * n(value) : value is expressed in nanometers. def scaleUp ( extensionsTable ): scaled = [] for entry in extensionsTable: scaled.append( ( entry[0], 2*entry[1] ) ) return scaled #layersExtensionsTable = \ # [ ('METAL1.minimalSpacing' , l( 6.0)) # , ('METAL2.minimalSpacing' , l( 6.0)) # , ('METAL3.minimalSpacing' , l( 6.0)) # , ('METAL4.minimalSpacing' , l( 6.0)) # , ('METAL5.minimalSpacing' , l( 6.0)) # , ('METAL6.minimalSpacing' , l( 6.0)) # ] + \ # scaleUp( symbolicLayersExtensionsTable ) layersExtensionsTable = \ ( ('METAL1.minimalSpacing' , l( 6.0)) , ('METAL2.minimalSpacing' , l( 6.0)) , ('METAL3.minimalSpacing' , l( 6.0)) , ('METAL4.minimalSpacing' , l( 6.0)) , ('METAL5.minimalSpacing' , l( 6.0)) , ('METAL6.minimalSpacing' , l( 6.0)) , ('NWELL.nWell.extention.cap' , l( 4.0)) , ('PWELL.pWell.extention.cap' , l( 4.0)) , ('NTIE.minimum.width' , l( 3.0)) , ('NTIE.nWell.extention.cap' , l( 3.0)) , ('NTIE.nWell.extention.width' , l( 2.0)) , ('NTIE.nImplant.extention.cap' , l( 2.5)) , ('NTIE.nImplant.extention.width' , l( 1.5)) , ('NTIE.active.extention.cap' , l( 0.5)) , ('NTIE.active.extention.width' , l(-0.5)) , ('PTIE.minimum.width' , l( 3.0)) , ('PTIE.pWell.extention.cap' , l( 3.0)) , ('PTIE.pWell.extention.width' , l( 2.0)) , ('PTIE.pImplant.extention.cap' , l( 2.5)) , ('PTIE.pImplant.extention.width' , l( 1.5)) , ('PTIE.active.extention.cap' , l( 0.5)) , ('PTIE.active.extention.width' , l(-0.5)) , ('NDIF.minimum.width' , l( 3.0)) , ('NDIF.nImplant.extention.cap' , l( 4.0)) , ('NDIF.nImplant.extention.width' , l( 2.0)) , ('NDIF.active.extention.cap' , l( 2.0)) , ('NDIF.active.extention.width' , l( 0.0)) , ('PDIF.minimum.width' , l( 3.0)) , ('PDIF.pImplant.extention.cap' , l( 4.0)) , ('PDIF.pImplant.extention.width' , l( 2.0)) , ('PDIF.active.extention.cap' , l( 2.0)) , ('PDIF.active.extention.width' , l( 0.0)) , ('GATE.minimum.width' , l( 2.0)) , ('GATE.poly.extention.cap' , l( 2.5)) , ('NTRANS.minimum.width' , l( 2.0)) , ('NTRANS.nImplant.extention.cap' , l( 2.0)) , ('NTRANS.nImplant.extention.width' , l( 7.0)) , ('NTRANS.active.extention.cap' , l( 0.0)) , ('NTRANS.active.extention.width' , l( 3.0)) , ('NTRANS.poly.extention.cap' , l( 3.0)) , ('NTRANS.poly.extention.width' , l( 0.0)) , ('PTRANS.minimum.width' , l( 2.0)) , ('PTRANS.nWell.extention.cap' , l( 2.5)) , ('PTRANS.nWell.extention.width' , l( 7.5)) , ('PTRANS.pImplant.extention.cap' , l( 2.0)) , ('PTRANS.pImplant.extention.width' , l( 7.0)) , ('PTRANS.active.extention.cap' , l( 0.0)) , ('PTRANS.active.extention.width' , l( 3.0)) , ('PTRANS.poly.extention.cap' , l( 3.0)) , ('PTRANS.poly.extention.width' , l( 0.0)) , ('POLY.minimum.width' , l( 2.0)) , ('POLY.poly.extention.cap' , l( 1.0)) , ('POLY2.minimum.width' , l( 2.0)) , ('POLY2.poly2.extention.cap' , l( 2.0)) # Routing Layers (symbolic). , ('METAL1.minimum.width' , l( 2.0)) , ('METAL1.metal1.extention.cap' , l( 2.0)) , ('METAL1.metal1.extention.width' , l( 1.0)) , ('METAL2.minimum.width' , l( 4.0)) , ('METAL2.metal2.extention.cap' , l( 2.0)) , ('METAL3.minimum.width' , l( 4.0)) , ('METAL3.metal3.extention.cap' , l( 2.0)) , ('METAL4.minimum.width' , l( 4.0)) , ('METAL4.metal4.extention.cap' , l( 2.0)) , ('METAL5.minimum.width' , l( 4.0)) , ('METAL5.metal5.extention.cap' , l( 2.0)) , ('METAL6.minimum.width' , l(10.0)) , ('METAL6.metal6.extention.cap' , l( 5.0)) #, ('METAL7.minimum.width' , l( 2.0)) #, ('METAL7.metal7.extention.cap' , l( 2.5)) #, ('METAL8.minimum.width' , l( 2.0)) #, ('METAL8.metal8.extention.cap' , l( 2.5)) # Blockages (symbolic). , ('BLOCKAGE1.minimum.width' , l( 4.0)) , ('BLOCKAGE1.blockage1.extention.cap' , l( 2.0)) , ('BLOCKAGE1.blockage1.extention.width', l( 0.5)) , ('BLOCKAGE2.minimum.width' , l( 4.0)) , ('BLOCKAGE2.blockage2.extention.cap' , l( 2.0)) , ('BLOCKAGE3.minimum.width' , l( 4.0)) , ('BLOCKAGE3.blockage3.extention.cap' , l( 2.0)) , ('BLOCKAGE4.minimum.width' , l( 4.0)) , ('BLOCKAGE4.blockage4.extention.cap' , l( 2.0)) , ('BLOCKAGE5.minimum.width' , l( 4.0)) , ('BLOCKAGE5.blockage5.extention.cap' , l( 2.0)) , ('BLOCKAGE6.minimum.width' , l( 8.0)) , ('BLOCKAGE6.blockage6.extention.cap' , l( 2.5)) #, ('BLOCKAGE7.minimum.width' , l( 2.0)) #, ('BLOCKAGE7.blockage6.extention.cap' , l( 4.0)) #, ('BLOCKAGE8.minimum.width' , l( 2.0)) #, ('BLOCKAGE8.blockage6.extention.cap' , l( 4.0)) # Contacts (i.e. Active <--> Metal) (symbolic). , ('CONT_BODY_N.minimum.side' , l( 2.0)) , ('CONT_BODY_N.nWell.enclosure' , l( 4.0)) , ('CONT_BODY_N.nImplant.enclosure' , l( 3.5)) , ('CONT_BODY_N.active.enclosure' , l( 1.5)) , ('CONT_BODY_N.metal1.enclosure' , l( 1.0)) , ('CONT_BODY_P.minimum.side' , l( 2.0)) , ('CONT_BODY_P.pWell.enclosure' , l( 4.0)) , ('CONT_BODY_P.pImplant.enclosure' , l( 3.5)) , ('CONT_BODY_P.active.enclosure' , l( 1.5)) , ('CONT_BODY_P.metal1.enclosure' , l( 1.0)) , ('CONT_DIF_N.minimum.side' , l( 2.0)) , ('CONT_DIF_N.nImplant.enclosure' , l( 4.0)) , ('CONT_DIF_N.active.enclosure' , l( 2.0)) , ('CONT_DIF_N.metal1.enclosure' , l( 1.0)) , ('CONT_DIF_P.minimum.side' , l( 2.0)) , ('CONT_DIF_P.pImplant.enclosure' , l( 4.0)) , ('CONT_DIF_P.active.enclosure' , l( 2.0)) , ('CONT_DIF_P.metal1.enclosure' , l( 1.0)) , ('CONT_POLY.minimum.width' , l( 2.0)) , ('CONT_POLY.poly.enclosure' , l( 2.0)) , ('CONT_POLY.metal1.enclosure' , l( 1.0)) # VIAs (i.e. Metal <--> Metal) (symbolic). , ('VIA12.minimum.side' , l( 2.0)) , ('VIA12.metal1.enclosure' , l( 1.0)) , ('VIA12.metal2.enclosure' , l( 1.0)) , ('VIA23.minimum.side' , l( 2.0)) , ('VIA23.metal2.enclosure' , l( 1.0)) , ('VIA23.metal3.enclosure' , l( 1.0)) , ('VIA34.minimum.side' , l( 2.0)) , ('VIA34.metal3.enclosure' , l( 1.0)) , ('VIA34.metal4.enclosure' , l( 1.0)) , ('VIA45.minimum.side' , l( 2.0)) , ('VIA45.metal4.enclosure' , l( 1.0)) , ('VIA45.metal5.enclosure' , l( 1.0)) , ('VIA56.minimum.side' , l( 5.0)) , ('VIA56.metal5.enclosure' , l( 1.0)) , ('VIA56.metal6.enclosure' , l( 1.5)) #, ('VIA67.minimum.side' , l( 2.0)) #, ('VIA67.metal6.enclosure' , l( 3.0)) #, ('VIA67.metal7.enclosure' , l( 3.0)) #, ('VIA78.minimum.side' , l( 2.0)) #, ('VIA78.metal7.enclosure' , l( 3.0)) #, ('VIA78.metal8.enclosure' , l( 3.0)) ) # Format of an entry in the table: # (Symbolic_Name, CIF_Name, GDSII_Number) gdsLayersTable = \ ( ("pWell" , "CWN" , 41, 0) , ("nWell" , "CWP" , 42, 0) , ("active" , "CAA" , 43, 0) , ("pImplant", "CSP" , 44, 0) , ("nImplant", "CSN" , 45, 0) , ("poly" , "CPG" , 46, 0) , ("poly2" , "CM1" , 49, 0) # poly2 is in fact metal1. , ("cut0" , "CCC" , 25, 0) , ("metal1" , "CM1" , 49, 0) , ("cut1" , "CV1" , 50, 0) , ("metal2" , "CM2" , 51, 0) , ("cut2" , "CV2" , 61, 0) , ("metal3" , "CM3" , 62, 0) , ("cut3" , "CV3" , 30, 0) , ("metal4" , "CM4" , 31, 0) , ("cut4" , "CV4" , 32, 0) , ("metal5" , "CM5" , 33, 0) , ("cut5" , "CV5" , 36, 0) , ("metal6" , "CM6" , 37, 0) )