diff --git a/crlcore/etc/180/scn6m_deep_09/kite.conf b/crlcore/etc/180/scn6m_deep_09/kite.conf index 64ebd8ba..d3bf7717 100644 --- a/crlcore/etc/180/scn6m_deep_09/kite.conf +++ b/crlcore/etc/180/scn6m_deep_09/kite.conf @@ -1,6 +1,7 @@ # -*- Mode:Python; explicit-buffer-name: "kite.conf" -*- import helpers +from helpers import l, u, n # Contains the layout (shared by all technologies). execfile( helpers.sysConfDir+'/common/kite.conf' ) @@ -43,17 +44,17 @@ parametersTable = \ routingGaugesTable = {} routingGaugesTable['msxlib'] = \ - ( ( 'METAL1' , ( Gauge.Vertical , Gauge.PinOnly, 0, 0.0, 0, 10, 2, 2, 7 ) ) - , ( 'METAL2' , ( Gauge.Horizontal, Gauge.Default, 1, 0.0, 0, 10, 4, 2, 8 ) ) - , ( 'METAL3' , ( Gauge.Vertical , Gauge.Default, 2, 0.0, 0, 10, 4, 2, 8 ) ) - , ( 'METAL4' , ( Gauge.Horizontal, Gauge.Default, 3, 0.0, 0, 10, 4, 2, 8 ) ) - , ( 'METAL5' , ( Gauge.Vertical , Gauge.Default, 4, 0.0, 0, 10, 4, 2, 8 ) ) - #, ( 'METAL6' , ( Gauge.Horizontal, Gauge.Default, 5, 0.0, 0, 10,10, 2, 8 ) ) + ( ( 'METAL1' , ( Gauge.Vertical , Gauge.PinOnly, 0, 0.0, l(0), l(10), l( 2), l(2), l(7) ) ) + , ( 'METAL2' , ( Gauge.Horizontal, Gauge.Default, 1, 0.0, l(0), l(10), l( 4), l(2), l(8) ) ) + , ( 'METAL3' , ( Gauge.Vertical , Gauge.Default, 2, 0.0, l(0), l(10), l( 4), l(2), l(8) ) ) + , ( 'METAL4' , ( Gauge.Horizontal, Gauge.Default, 3, 0.0, l(0), l(10), l( 4), l(2), l(8) ) ) + , ( 'METAL5' , ( Gauge.Vertical , Gauge.Default, 4, 0.0, l(0), l(10), l( 4), l(2), l(8) ) ) + #, ( 'METAL6' , ( Gauge.Horizontal, Gauge.Default, 5, 0.0, l(0), l(10), l(10), l(2), l(8) ) ) ) routingGaugesTable['msxlib-2M'] = \ - ( ( 'METAL1', ( Gauge.Horizontal, Gauge.Default, 0, 0.0, 0, 10, 2, 2, 7 ) ) - , ( 'METAL2', ( Gauge.Vertical , Gauge.Default, 1, 0.0, 0, 10, 4, 2, 8 ) ) + ( ( 'METAL1', ( Gauge.Horizontal, Gauge.Default, 0, 0.0, l(0), l(10), l(2), l(2), l(7) ) ) + , ( 'METAL2', ( Gauge.Vertical , Gauge.Default, 1, 0.0, l(0), l(10), l(4), l(2), l(8) ) ) ) @@ -62,5 +63,5 @@ routingGaugesTable['msxlib-2M'] = \ # ( METAL_PIN, xy_common_pitch, slice_height, slice_step ) cellGaugesTable = {} -cellGaugesTable['msxlib'] = ('metal2', 10, 100, 10) +cellGaugesTable['msxlib'] = ('metal2', l(10), l(100), l(10)) diff --git a/crlcore/etc/180/scn6m_deep_09/technology.conf b/crlcore/etc/180/scn6m_deep_09/technology.conf index 070c8e57..83b4459d 100644 --- a/crlcore/etc/180/scn6m_deep_09/technology.conf +++ b/crlcore/etc/180/scn6m_deep_09/technology.conf @@ -1,7 +1,9 @@ # -*- Mode:Python; explicit-buffer-name: "technology.conf" -*- -import helpers -from Hurricane import DbU +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. @@ -12,8 +14,6 @@ from Hurricane import DbU # - # - -execfile( helpers.sysConfDir+'/common/technology.conf' ) - # 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 @@ -22,14 +22,16 @@ execfile( helpers.sysConfDir+'/common/technology.conf' ) # # We set the foundry grid to .005um and set the gridsPerLambda to 18. -technoConfig = { 'name' : 'scn6m_deep' - , 'precision' : 2 - , 'gridValue' : 0.005 - , 'gridUnit' : DbU.UnitPowerMicro - , 'gridsPerLambda' : 18 - , 'symbolicGridStep': 1.0 - , 'polygonStep' : 9.0 - } +initTechno( { 'name' : 'scn6m_deep' + , 'precision' : 2 + , 'gridValue' : 0.005 + , 'gridUnit' : DbU.UnitPowerMicro + , 'gridsPerLambda' : 18 + , 'symbolicGridStep': 1.0 + , 'polygonStep' : 9.0 + } ) + +execfile( sysConfDir+'/common/technology.conf' ) # Format of : @@ -37,165 +39,187 @@ technoConfig = { 'name' : 'scn6m_deep' # * 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. If the main layer is symbolic it -# must be expressed in lambda, if it is for a real layers it -# must be expressed in microns. +# * 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' , 6.0) - , ('METAL2.minimalSpacing' , 6.0) - , ('METAL3.minimalSpacing' , 6.0) - , ('METAL4.minimalSpacing' , 6.0) - , ('METAL5.minimalSpacing' , 6.0) - , ('METAL6.minimalSpacing' , 6.0) + ( ('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' , 4.0) - , ('PWELL.pWell.extention.cap' , 4.0) + , ('NWELL.nWell.extention.cap' , l( 4.0)) + , ('PWELL.pWell.extention.cap' , l( 4.0)) - , ('NTIE.minimum.width' , 3.0) - , ('NTIE.nWell.extention.cap' , 3.0) - , ('NTIE.nWell.extention.width' , 2.0) - , ('NTIE.nImplant.extention.cap' , 2.5) - , ('NTIE.nImplant.extention.width' , 1.5) - , ('NTIE.active.extention.cap' , 0.5) - , ('NTIE.active.extention.width' , -0.5) + , ('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' , 3.0) - , ('PTIE.pWell.extention.cap' , 3.0) - , ('PTIE.pWell.extention.width' , 2.0) - , ('PTIE.pImplant.extention.cap' , 2.5) - , ('PTIE.pImplant.extention.width' , 1.5) - , ('PTIE.active.extention.cap' , 0.5) - , ('PTIE.active.extention.width' , -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' , 3.0) - , ('NDIF.nImplant.extention.cap' , 4.0) - , ('NDIF.nImplant.extention.width' , 2.0) - , ('NDIF.active.extention.cap' , 2.0) - , ('NDIF.active.extention.width' , 0.0) + , ('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' , 3.0) - , ('PDIF.pImplant.extention.cap' , 4.0) - , ('PDIF.pImplant.extention.width' , 2.0) - , ('PDIF.active.extention.cap' , 2.0) - , ('PDIF.active.extention.width' , 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' , 2.0) - , ('GATE.poly.extention.cap' , 2.5) + , ('GATE.minimum.width' , l( 2.0)) + , ('GATE.poly.extention.cap' , l( 2.5)) - , ('NTRANS.minimum.width' , 2.0) - , ('NTRANS.nImplant.extention.cap' , 2.0) - , ('NTRANS.nImplant.extention.width' , 7.0) - , ('NTRANS.active.extention.cap' , 0.0) - , ('NTRANS.active.extention.width' , 3.0) - , ('NTRANS.poly.extention.cap' , 3.0) - , ('NTRANS.poly.extention.width' , 0.0) + , ('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' , 2.0) - , ('PTRANS.nWell.extention.cap' , 2.5) - , ('PTRANS.nWell.extention.width' , 7.5) - , ('PTRANS.pImplant.extention.cap' , 2.0) - , ('PTRANS.pImplant.extention.width' , 7.0) - , ('PTRANS.active.extention.cap' , 0.0) - , ('PTRANS.active.extention.width' , 3.0) - , ('PTRANS.poly.extention.cap' , 3.0) - , ('PTRANS.poly.extention.width' , 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' , 2.0) - , ('POLY.poly.extention.cap' , 1.0) - , ('POLY2.minimum.width' , 2.0) - , ('POLY2.poly2.extention.cap' , 2.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' , 2.0) - , ('METAL1.metal1.extention.cap' , 2.0) - , ('METAL1.metal1.extention.width' , 1.0) - , ('METAL2.minimum.width' , 4.0) - , ('METAL2.metal2.extention.cap' , 2.0) - , ('METAL3.minimum.width' , 4.0) - , ('METAL3.metal3.extention.cap' , 2.0) - , ('METAL4.minimum.width' , 4.0) - , ('METAL4.metal4.extention.cap' , 2.0) - , ('METAL5.minimum.width' , 4.0) - , ('METAL5.metal5.extention.cap' , 2.0) - , ('METAL6.minimum.width' , 10.0) - , ('METAL6.metal6.extention.cap' , 5.0) - #, ('METAL7.minimum.width' , 2.0) - #, ('METAL7.metal7.extention.cap' , 2.5) - #, ('METAL8.minimum.width' , 2.0) - #, ('METAL8.metal8.extention.cap' , 2.5) + , ('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' , 4.0) - , ('BLOCKAGE1.blockage1.extention.cap' , 2.0) - , ('BLOCKAGE1.blockage1.extention.width', 0.5) - , ('BLOCKAGE2.minimum.width' , 4.0) - , ('BLOCKAGE2.blockage2.extention.cap' , 2.0) - , ('BLOCKAGE3.minimum.width' , 4.0) - , ('BLOCKAGE3.blockage3.extention.cap' , 2.0) - , ('BLOCKAGE4.minimum.width' , 4.0) - , ('BLOCKAGE4.blockage4.extention.cap' , 2.0) - , ('BLOCKAGE5.minimum.width' , 4.0) - , ('BLOCKAGE5.blockage5.extention.cap' , 2.0) - , ('BLOCKAGE6.minimum.width' , 8.0) - , ('BLOCKAGE6.blockage6.extention.cap' , 2.5) - #, ('BLOCKAGE7.minimum.width' , 2.0) - #, ('BLOCKAGE7.blockage6.extention.cap' , 4.0) - #, ('BLOCKAGE8.minimum.width' , 2.0) - #, ('BLOCKAGE8.blockage6.extention.cap' , 4.0) + , ('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' , 2.0) - , ('CONT_BODY_N.nWell.enclosure' , 4.0) - , ('CONT_BODY_N.nImplant.enclosure' , 3.5) - , ('CONT_BODY_N.active.enclosure' , 1.5) - , ('CONT_BODY_N.metal1.enclosure' , 1.0) + , ('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' , 2.0) - , ('CONT_BODY_P.pWell.enclosure' , 4.0) - , ('CONT_BODY_P.pImplant.enclosure' , 3.5) - , ('CONT_BODY_P.active.enclosure' , 1.5) - , ('CONT_BODY_P.metal1.enclosure' , 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' , 2.0) - , ('CONT_DIF_N.nImplant.enclosure' , 4.0) - , ('CONT_DIF_N.active.enclosure' , 2.0) - , ('CONT_DIF_N.metal1.enclosure' , 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' , 2.0) - , ('CONT_DIF_P.pImplant.enclosure' , 4.0) - , ('CONT_DIF_P.active.enclosure' , 2.0) - , ('CONT_DIF_P.metal1.enclosure' , 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' , 2.0) - , ('CONT_POLY.poly.enclosure' , 2.0) - , ('CONT_POLY.metal1.enclosure' , 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' , 2.0) - , ('VIA12.metal1.enclosure' , 1.0) - , ('VIA12.metal2.enclosure' , 1.0) - , ('VIA23.minimum.side' , 2.0) - , ('VIA23.metal2.enclosure' , 1.0) - , ('VIA23.metal3.enclosure' , 1.0) - , ('VIA34.minimum.side' , 2.0) - , ('VIA34.metal3.enclosure' , 1.0) - , ('VIA34.metal4.enclosure' , 1.0) - , ('VIA45.minimum.side' , 2.0) - , ('VIA45.metal4.enclosure' , 1.0) - , ('VIA45.metal5.enclosure' , 1.0) - , ('VIA56.minimum.side' , 5.0) - , ('VIA56.metal5.enclosure' , 1.0) - , ('VIA56.metal6.enclosure' , 1.5) - #, ('VIA67.minimum.side' , 2.0) - #, ('VIA67.metal6.enclosure' , 3.0) - #, ('VIA67.metal7.enclosure' , 3.0) - #, ('VIA78.minimum.side' , 2.0) - #, ('VIA78.metal7.enclosure' , 3.0) - #, ('VIA78.metal8.enclosure' , 3.0) + , ('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)) ) +for entry in layersExtensionsTable: + print entry + # Format of an entry in the table: # (Symbolic_Name, CIF_Name, GDSII_Number) gdsLayersTable = \ diff --git a/crlcore/etc/45/freepdk_45/kite.conf b/crlcore/etc/45/freepdk_45/kite.conf index 824a1a5c..0c1cdad5 100644 --- a/crlcore/etc/45/freepdk_45/kite.conf +++ b/crlcore/etc/45/freepdk_45/kite.conf @@ -1,12 +1,11 @@ # -*- Mode:Python; explicit-buffer-name: "kite.conf" -*- import helpers +from helpers import l, u, n # Contains the layout (shared by all technologies). execfile( helpers.sysConfDir+'/common/kite.conf' ) -helpers.micronsMode() - parametersTable = \ ( ('lefImport.minTerminalWidth' ,TypeDouble ,0.065 ) @@ -48,16 +47,16 @@ routingGaugesTable = {} routingGaugesTable['gscl45'] = \ ( ( 'symbolic', False ) - , ( 'metal1' , ( Gauge.Horizontal, Gauge.PinOnly, 0, 0.0, 0, 0.190, 0.065, 0.065, 7 ) ) - , ( 'metal2' , ( Gauge.Vertical , Gauge.Default, 1, 0.0, 0, 0.190, 0.070, 0.070, 8 ) ) - , ( 'metal3' , ( Gauge.Horizontal, Gauge.Default, 2, 0.0, 0, 0.190, 0.070, 0.070, 8 ) ) - , ( 'metal4' , ( Gauge.Vertical , Gauge.Default, 3, 0.0, 0, 0.285, 0.140, 0.140, 8 ) ) - , ( 'metal5' , ( Gauge.Horizontal, Gauge.Default, 4, 0.0, 0, 0.285, 0.140, 0.140, 8 ) ) - , ( 'metal6' , ( Gauge.Vertical , Gauge.Default, 5, 0.0, 0, 0.285, 0.140, 0.140, 8 ) ) - , ( 'metal7' , ( Gauge.Horizontal, Gauge.Default, 6, 0.0, 0, 0.855, 0.400, 0.400, 8 ) ) - , ( 'metal8' , ( Gauge.Vertical , Gauge.Default, 7, 0.0, 0, 0.855, 0.400, 0.400, 8 ) ) - , ( 'metal9' , ( Gauge.Horizontal, Gauge.Default, 8, 0.0, 0, 1.710, 0.800, 0.800, 8 ) ) - , ( 'metal10' , ( Gauge.Vertical , Gauge.Default, 9, 0.0, 0, 1.710, 0.800, 0.800, 8 ) ) + , ( 'metal1' , ( Gauge.Horizontal, Gauge.PinOnly, 0, 0.0, u(0), u(0.190), u(0.065), u(0.065), u(7) ) ) + , ( 'metal2' , ( Gauge.Vertical , Gauge.Default, 1, 0.0, u(0), u(0.190), u(0.070), u(0.070), u(8) ) ) + , ( 'metal3' , ( Gauge.Horizontal, Gauge.Default, 2, 0.0, u(0), u(0.190), u(0.070), u(0.070), u(8) ) ) + , ( 'metal4' , ( Gauge.Vertical , Gauge.Default, 3, 0.0, u(0), u(0.285), u(0.140), u(0.140), u(8) ) ) + , ( 'metal5' , ( Gauge.Horizontal, Gauge.Default, 4, 0.0, u(0), u(0.285), u(0.140), u(0.140), u(8) ) ) + , ( 'metal6' , ( Gauge.Vertical , Gauge.Default, 5, 0.0, u(0), u(0.285), u(0.140), u(0.140), u(8) ) ) + , ( 'metal7' , ( Gauge.Horizontal, Gauge.Default, 6, 0.0, u(0), u(0.855), u(0.400), u(0.400), u(8) ) ) + , ( 'metal8' , ( Gauge.Vertical , Gauge.Default, 7, 0.0, u(0), u(0.855), u(0.400), u(0.400), u(8) ) ) + , ( 'metal9' , ( Gauge.Horizontal, Gauge.Default, 8, 0.0, u(0), u(1.710), u(0.800), u(0.800), u(8) ) ) + , ( 'metal10' , ( Gauge.Vertical , Gauge.Default, 9, 0.0, u(0), u(1.710), u(0.800), u(0.800), u(8) ) ) ) @@ -66,5 +65,5 @@ routingGaugesTable['gscl45'] = \ # ( METAL_PIN, xy_common_pitch, slice_height, slice_step ) cellGaugesTable = {} -cellGaugesTable['gscl45'] = ('metal2', 0.38, 2.47, 0.38) +cellGaugesTable['gscl45'] = ('metal2', u(0.38), u(2.47), u(0.38)) diff --git a/crlcore/etc/45/freepdk_45/technology.conf b/crlcore/etc/45/freepdk_45/technology.conf index bc537d9f..f6ab62e9 100644 --- a/crlcore/etc/45/freepdk_45/technology.conf +++ b/crlcore/etc/45/freepdk_45/technology.conf @@ -8,229 +8,79 @@ # - # - -from Hurricane import DbU +from Hurricane import DbU +from helpers import sysConfDir +from helpers import l, u, n +from helpers.Technology import initTechno + +initTechno( { 'name' : 'freepdk_45' + , 'precision' : 2 + , 'gridValue' : 0.0025 + , 'gridUnit' : DbU.UnitPowerMicro + , 'gridsPerLambda' : 18 + , 'symbolicGridStep' : 1.0 + , 'polygonStep' : 1.0 + } ) # Contains the layers execfile( helpers.sysConfDir+'/common/technology.conf' ) -helpers.micronsMode() - - -technoConfig = { 'name' : 'freepdk_45' - , 'precision' : 2 - , 'gridValue' : 0.0025 - , 'gridUnit' : DbU.UnitPowerMicro - , 'gridsPerLambda' : 18 - , 'symbolicGridStep' : 1.0 - , 'polygonStep' : 1.0 - } - # 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. If the main layer is symbolic it -# must be expressed in lambda, if it is for a real layers it -# must be expressed in microns. +# * 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. -layersExtensionsTable = \ - ( ('metal1.minimalSpacing' , 0.065) - , ('metal2.minimalSpacing' , 0.075) - , ('metal3.minimalSpacing' , 0.07 ) - , ('metal4.minimalSpacing' , 0.14 ) - , ('metal5.minimalSpacing' , 0.14 ) - , ('metal6.minimalSpacing' , 0.14 ) - , ('metal7.minimalSpacing' , 0.4 ) - , ('metal8.minimalSpacing' , 0.4 ) - , ('metal9.minimalSpacing' , 0.8 ) - , ('metal10.minimalSpacing' , 0.8 ) - - , ('NWELL.nWell.extention.cap' , 0.0) - , ('PWELL.pWell.extention.cap' , 0.0) - - , ('NTIE.minimum.width' , 3.0) - , ('NTIE.nWell.extention.cap' , 1.5) - , ('NTIE.nWell.extention.width' , 0.5) - , ('NTIE.nImplant.extention.cap' , 1.0) - , ('NTIE.nImplant.extention.width' , 0.5) - , ('NTIE.active.extention.cap' , 0.5) - , ('NTIE.active.extention.width' , 0.0) - - , ('PTIE.minimum.width' , 3.0) - , ('PTIE.pWell.extention.cap' , 1.5) - , ('PTIE.pWell.extention.width' , 0.5) - , ('PTIE.pImplant.extention.cap' , 1.0) - , ('PTIE.pImplant.extention.width' , 0.5) - , ('PTIE.active.extention.cap' , 0.5) - , ('PTIE.active.extention.width' , 0.0) - - , ('NDIF.minimum.width' , 3.0) - , ('NDIF.nImplant.extention.cap' , 1.0) - , ('NDIF.nImplant.extention.width' , 0.5) - , ('NDIF.active.extention.cap' , 0.5) - , ('NDIF.active.extention.width' , 0.0) - - , ('PDIF.minimum.width' , 3.0) - , ('PDIF.pImplant.extention.cap' , 1.0) - , ('PDIF.pImplant.extention.width' , 0.5) - , ('PDIF.active.extention.cap' , 0.5) - , ('PDIF.active.extention.width' , 0.0) - - , ('GATE.minimum.width' , 1.0) - , ('GATE.poly.extention.cap' , 1.5) - - , ('NTRANS.minimum.width' , 1.0) - , ('NTRANS.nImplant.extention.cap' , -1.0) - , ('NTRANS.nImplant.extention.width' , 2.5) - , ('NTRANS.active.extention.cap' , -1.5) - , ('NTRANS.active.extention.width' , 2.0) - - , ('PTRANS.minimum.width' , 1.0) - , ('PTRANS.nWell.extention.cap' , -1.0) - , ('PTRANS.nWell.extention.width' , 4.5) - , ('PTRANS.pImplant.extention.cap' , -1.0) - , ('PTRANS.pImplant.extention.width' , 4.0) - , ('PTRANS.active.extention.cap' , -1.5) - , ('PTRANS.active.extention.width' , 3.0) - - , ('POLY.minimum.width' , 1.0) - , ('POLY.poly.extention.cap' , 0.5) - , ('POLY2.minimum.width' , 1.0) - , ('POLY2.poly.extention.cap' , 0.5) - - # Routing Layers (symbolic). - , ('METAL1.minimum.width' , 1.0) - , ('METAL1.metal1.extention.cap' , 0.5) - , ('METAL2.minimum.width' , 1.0) - , ('METAL2.metal2.extention.cap' , 1.0) - , ('METAL3.minimum.width' , 1.0) - , ('METAL3.metal3.extention.cap' , 1.0) - , ('METAL4.minimum.width' , 1.0) - , ('METAL4.metal4.extention.cap' , 1.0) - , ('METAL5.minimum.width' , 2.0) - , ('METAL5.metal5.extention.cap' , 1.0) - , ('METAL6.minimum.width' , 2.0) - , ('METAL6.metal6.extention.cap' , 1.0) - , ('METAL7.minimum.width' , 2.0) - , ('METAL7.metal7.extention.cap' , 1.0) - , ('METAL8.minimum.width' , 2.0) - , ('METAL8.metal8.extention.cap' , 1.0) - , ('METAL9.minimum.width' , 2.0) - , ('METAL9.metal9.extention.cap' , 1.0) - , ('METAL10.minimum.width' , 2.0) - , ('METAL10.metal10.extention.cap' , 1.0) - - # Contacts (i.e. Active <--> Metal) (symbolic). - , ('CONT_BODY_N.minimum.side' , 1.0) - , ('CONT_BODY_N.nWell.enclosure' , 1.5) - , ('CONT_BODY_N.nImplant.enclosure' , 1.5) - , ('CONT_BODY_N.active.enclosure' , 1.0) - , ('CONT_BODY_N.metal1.enclosure' , 0.5) - - , ('CONT_BODY_P.minimum.side' , 1.0) - , ('CONT_BODY_P.pWell.enclosure' , 1.5) - , ('CONT_BODY_P.pImplant.enclosure' , 1.5) - , ('CONT_BODY_P.active.enclosure' , 1.0) - , ('CONT_BODY_P.metal1.enclosure' , 0.5) - - , ('CONT_DIF_N.minimum.side' , 1.0) - , ('CONT_DIF_N.nImplant.enclosure' , 1.0) - , ('CONT_DIF_N.active.enclosure' , 0.5) - , ('CONT_DIF_N.metal1.enclosure' , 0.5) - - , ('CONT_DIF_P.minimum.side' , 1.0) - , ('CONT_DIF_P.pImplant.enclosure' , 1.0) - , ('CONT_DIF_P.active.enclosure' , 0.5) - , ('CONT_DIF_P.metal1.enclosure' , 0.5) - - , ('CONT_POLY.minimum.width' , 1.0) - , ('CONT_POLY.poly.enclosure' , 0.5) - , ('CONT_POLY.metal1.enclosure' , 0.5) - - # VIAs (i.e. Metal <--> Metal) (symbolic). - , ('VIA12.minimum.side' , 1.0) - , ('VIA12.metal1.enclosure' , 0.5) - , ('VIA12.metal2.enclosure' , 0.5) - , ('VIA23.minimum.side' , 1.0) - , ('VIA23.metal2.enclosure' , 0.5) - , ('VIA23.metal3.enclosure' , 0.5) - , ('VIA34.minimum.side' , 1.0) - , ('VIA34.metal3.enclosure' , 0.5) - , ('VIA34.metal4.enclosure' , 0.5) - , ('VIA45.minimum.side' , 1.0) - , ('VIA45.metal4.enclosure' , 0.5) - , ('VIA45.metal5.enclosure' , 0.5) - , ('VIA56.minimum.side' , 1.0) - , ('VIA56.metal5.enclosure' , 0.5) - , ('VIA56.metal6.enclosure' , 0.5) - , ('VIA67.minimum.side' , 1.0) - , ('VIA67.metal6.enclosure' , 0.5) - , ('VIA67.metal7.enclosure' , 0.5) - , ('VIA78.minimum.side' , 1.0) - , ('VIA78.metal7.enclosure' , 0.5) - , ('VIA78.metal8.enclosure' , 0.5) - , ('VIA89.minimum.side' , 1.0) - , ('VIA89.metal8.enclosure' , 0.5) - , ('VIA89.metal9.enclosure' , 0.5) - , ('VIA910.minimum.side' , 1.0) - , ('VIA910.metal9.enclosure' , 0.5) - , ('VIA910.metal10.enclosure' , 0.5) +layersExtensionsTable = symbolicLayersExtensionsTable + \ + [ ('metal1.minimalSpacing' , u( 0.065)) + , ('metal2.minimalSpacing' , u( 0.075)) + , ('metal3.minimalSpacing' , u( 0.07 )) + , ('metal4.minimalSpacing' , u( 0.14 )) + , ('metal5.minimalSpacing' , u( 0.14 )) + , ('metal6.minimalSpacing' , u( 0.14 )) + , ('metal7.minimalSpacing' , u( 0.4 )) + , ('metal8.minimalSpacing' , u( 0.4 )) + , ('metal9.minimalSpacing' , u( 0.8 )) + , ('metal10.minimalSpacing' , u( 0.8 )) # VIAs (i.e. Metal <--> Metal) (real). - , ('via12.minimum.side' , 0.065) + , ('via12.minimum.side' , u( 0.065)) # This is the rule as defined in LEF, but seems wrong to me. - #, ('via12.metal1.enclosure' , (0.035 , 0.0 ) ) - , ('via12.metal1.enclosure' , (0.0 , 0.035) ) - , ('via12.metal2.enclosure' , (0.0025, 0.035) ) - , ('via23.minimum.side' , 0.070) - , ('via23.metal2.enclosure' , (0.0 , 0.035) ) - , ('via23.metal3.enclosure' , (0.035 , 0.0 ) ) - , ('via34.minimum.side' , 0.070) - , ('via34.metal3.enclosure' , (0.035, 0.0 ) ) - , ('via34.metal4.enclosure' , 0.035) - , ('via45.minimum.side' , 0.140) - , ('via45.metal4.enclosure' , 0.0 ) - , ('via45.metal5.enclosure' , 0.0 ) - , ('via56.minimum.side' , 0.140) - , ('via56.metal5.enclosure' , 0.0 ) - , ('via56.metal6.enclosure' , 0.0 ) - , ('via67.minimum.side' , 0.140) - , ('via67.metal6.enclosure' , 0.0 ) - , ('via67.metal7.enclosure' , 0.130) - , ('via78.minimum.side' , 0.200) - , ('via78.metal7.enclosure' , 0.0 ) - , ('via78.metal8.enclosure' , 0.0 ) - , ('via89.minimum.side' , 0.200) - , ('via89.metal8.enclosure' , 0.0 ) - , ('via89.metal9.enclosure' , 0.200) - , ('via910.minimum.side' , 0.400) - , ('via910.metal9.enclosure' , 0.0 ) - , ('via910.metal10.enclosure' , 0.0 ) - - # Blockages (symbolic). - , ('BLOCKAGE1.minimum.width' , 1.0) - , ('BLOCKAGE1.blockage1.extention.cap' , 0.5) - , ('BLOCKAGE2.minimum.width' , 2.0) - , ('BLOCKAGE2.blockage2.extention.cap' , 0.5) - , ('BLOCKAGE3.minimum.width' , 2.0) - , ('BLOCKAGE3.blockage3.extention.cap' , 0.5) - , ('BLOCKAGE4.minimum.width' , 2.0) - , ('BLOCKAGE4.blockage4.extention.cap' , 0.5) - , ('BLOCKAGE5.minimum.width' , 2.0) - , ('BLOCKAGE5.blockage5.extention.cap' , 1.0) - , ('BLOCKAGE6.minimum.width' , 2.0) - , ('BLOCKAGE6.blockage6.extention.cap' , 1.0) - , ('BLOCKAGE7.minimum.width' , 2.0) - , ('BLOCKAGE7.blockage7.extention.cap' , 1.0) - , ('BLOCKAGE8.minimum.width' , 2.0) - , ('BLOCKAGE8.blockage8.extention.cap' , 1.0) - , ('BLOCKAGE9.minimum.width' , 2.0) - , ('BLOCKAGE9.blockage9.extention.cap' , 1.0) - , ('BLOCKAGE10.minimum.width' , 2.0) - , ('BLOCKAGE10.blockage10.extention.cap', 1.0) - ) + #, ('via12.metal1.enclosure' , (u(0.035 ), u(0.0 )) ) + , ('via12.metal1.enclosure' , (u(0.0 ), u(0.035)) ) + , ('via12.metal2.enclosure' , (u(0.0025), u(0.035)) ) + , ('via23.minimum.side' , u(0.070 )) + , ('via23.metal2.enclosure' , (u(0.0 ), u(0.035)) ) + , ('via23.metal3.enclosure' , (u(0.035 ), u(0.0 )) ) + , ('via34.minimum.side' , u(0.070 )) + , ('via34.metal3.enclosure' , (u(0.035 ), u(0.0 )) ) + , ('via34.metal4.enclosure' , u(0.035 )) + , ('via45.minimum.side' , u(0.140 )) + , ('via45.metal4.enclosure' , u(0.0 )) + , ('via45.metal5.enclosure' , u(0.0 )) + , ('via56.minimum.side' , u(0.140 )) + , ('via56.metal5.enclosure' , u(0.0 )) + , ('via56.metal6.enclosure' , u(0.0 )) + , ('via67.minimum.side' , u(0.140 )) + , ('via67.metal6.enclosure' , u(0.0 )) + , ('via67.metal7.enclosure' , u(0.130 )) + , ('via78.minimum.side' , u(0.200 )) + , ('via78.metal7.enclosure' , u(0.0 )) + , ('via78.metal8.enclosure' , u(0.0 )) + , ('via89.minimum.side' , u(0.200 )) + , ('via89.metal8.enclosure' , u(0.0 )) + , ('via89.metal9.enclosure' , u(0.200 )) + , ('via910.minimum.side' , u(0.400 )) + , ('via910.metal9.enclosure' , u(0.0 )) + , ('via910.metal10.enclosure' , u(0.0 )) + ] # Table guessed from the Cadence configuration files: diff --git a/crlcore/etc/common/technology.conf b/crlcore/etc/common/technology.conf index 3d258542..7c62d042 100644 --- a/crlcore/etc/common/technology.conf +++ b/crlcore/etc/common/technology.conf @@ -3,6 +3,7 @@ # Those settings are common to all the symbolic technologies. from Hurricane import BasicLayer +from helpers import l, u, n from helpers.Technology import TypeRegular from helpers.Technology import TypeDiffusion from helpers.Technology import TypeTransistor @@ -163,3 +164,171 @@ symbolicLayersTable = \ , 'VIA12' , 'VIA23' , 'VIA34' , 'VIA45' , 'VIA56' , 'VIA67' , 'VIA78' , 'VIA89' , 'VIA910' , 'gcut' , 'gmetalh' , 'gmetalv' , 'gcontact' ] + + +# 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. + +symbolicLayersExtensionsTable = \ + [ ('NWELL.nWell.extention.cap' , l( 0.0)) + , ('PWELL.pWell.extention.cap' , l( 0.0)) + + , ('NTIE.minimum.width' , l( 3.0)) + , ('NTIE.nWell.extention.cap' , l( 1.5)) + , ('NTIE.nWell.extention.width' , l( 0.5)) + , ('NTIE.nImplant.extention.cap' , l( 1.0)) + , ('NTIE.nImplant.extention.width' , l( 0.5)) + , ('NTIE.active.extention.cap' , l( 0.5)) + , ('NTIE.active.extention.width' , l( 0.0)) + + , ('PTIE.minimum.width' , l( 3.0)) + , ('PTIE.pWell.extention.cap' , l( 1.5)) + , ('PTIE.pWell.extention.width' , l( 0.5)) + , ('PTIE.pImplant.extention.cap' , l( 1.0)) + , ('PTIE.pImplant.extention.width' , l( 0.5)) + , ('PTIE.active.extention.cap' , l( 0.5)) + , ('PTIE.active.extention.width' , l( 0.0)) + + , ('NDIF.minimum.width' , l( 3.0)) + , ('NDIF.nImplant.extention.cap' , l( 1.0)) + , ('NDIF.nImplant.extention.width' , l( 0.5)) + , ('NDIF.active.extention.cap' , l( 0.5)) + , ('NDIF.active.extention.width' , l( 0.0)) + + , ('PDIF.minimum.width' , l( 3.0)) + , ('PDIF.pImplant.extention.cap' , l( 1.0)) + , ('PDIF.pImplant.extention.width' , l( 0.5)) + , ('PDIF.active.extention.cap' , l( 0.5)) + , ('PDIF.active.extention.width' , l( 0.0)) + + , ('GATE.minimum.width' , l( 1.0)) + , ('GATE.poly.extention.cap' , l( 1.5)) + + , ('NTRANS.minimum.width' , l( 1.0)) + , ('NTRANS.nImplant.extention.cap' , l(-1.0)) + , ('NTRANS.nImplant.extention.width' , l( 2.5)) + , ('NTRANS.active.extention.cap' , l(-1.5)) + , ('NTRANS.active.extention.width' , l( 2.0)) + + , ('PTRANS.minimum.width' , l( 1.0)) + , ('PTRANS.nWell.extention.cap' , l(-1.0)) + , ('PTRANS.nWell.extention.width' , l( 4.5)) + , ('PTRANS.pImplant.extention.cap' , l(-1.0)) + , ('PTRANS.pImplant.extention.width' , l( 4.0)) + , ('PTRANS.active.extention.cap' , l(-1.5)) + , ('PTRANS.active.extention.width' , l( 3.0)) + + , ('POLY.minimum.width' , l( 1.0)) + , ('POLY.poly.extention.cap' , l( 0.5)) + , ('POLY2.minimum.width' , l( 1.0)) + , ('POLY2.poly.extention.cap' , l( 0.5)) + + # Routing Layers (symbolic). + , ('METAL1.minimum.width' , l( 1.0)) + , ('METAL1.metal1.extention.cap' , l( 0.5)) + , ('METAL2.minimum.width' , l( 1.0)) + , ('METAL2.metal2.extention.cap' , l( 1.0)) + , ('METAL3.minimum.width' , l( 1.0)) + , ('METAL3.metal3.extention.cap' , l( 1.0)) + , ('METAL4.minimum.width' , l( 1.0)) + , ('METAL4.metal4.extention.cap' , l( 1.0)) + , ('METAL5.minimum.width' , l( 2.0)) + , ('METAL5.metal5.extention.cap' , l( 1.0)) + , ('METAL6.minimum.width' , l( 2.0)) + , ('METAL6.metal6.extention.cap' , l( 1.0)) + , ('METAL7.minimum.width' , l( 2.0)) + , ('METAL7.metal7.extention.cap' , l( 1.0)) + , ('METAL8.minimum.width' , l( 2.0)) + , ('METAL8.metal8.extention.cap' , l( 1.0)) + , ('METAL9.minimum.width' , l( 2.0)) + , ('METAL9.metal9.extention.cap' , l( 1.0)) + , ('METAL10.minimum.width' , l( 2.0)) + , ('METAL10.metal10.extention.cap' , l( 1.0)) + + # Contacts (i.e. Active <--> Metal) (symbolic). + , ('CONT_BODY_N.minimum.side' , l( 1.0)) + , ('CONT_BODY_N.nWell.enclosure' , l( 1.5)) + , ('CONT_BODY_N.nImplant.enclosure' , l( 1.5)) + , ('CONT_BODY_N.active.enclosure' , l( 1.0)) + , ('CONT_BODY_N.metal1.enclosure' , l( 0.5)) + + , ('CONT_BODY_P.minimum.side' , l( 1.0)) + , ('CONT_BODY_P.pWell.enclosure' , l( 1.5)) + , ('CONT_BODY_P.pImplant.enclosure' , l( 1.5)) + , ('CONT_BODY_P.active.enclosure' , l( 1.0)) + , ('CONT_BODY_P.metal1.enclosure' , l( 0.5)) + + , ('CONT_DIF_N.minimum.side' , l( 1.0)) + , ('CONT_DIF_N.nImplant.enclosure' , l( 1.0)) + , ('CONT_DIF_N.active.enclosure' , l( 0.5)) + , ('CONT_DIF_N.metal1.enclosure' , l( 0.5)) + + , ('CONT_DIF_P.minimum.side' , l( 1.0)) + , ('CONT_DIF_P.pImplant.enclosure' , l( 1.0)) + , ('CONT_DIF_P.active.enclosure' , l( 0.5)) + , ('CONT_DIF_P.metal1.enclosure' , l( 0.5)) + + , ('CONT_POLY.minimum.width' , l( 1.0)) + , ('CONT_POLY.poly.enclosure' , l( 0.5)) + , ('CONT_POLY.metal1.enclosure' , l( 0.5)) + + # VIAs (i.e. Metal <--> Metal) (symbolic). + , ('VIA12.minimum.side' , l( 1.0)) + , ('VIA12.metal1.enclosure' , l( 0.5)) + , ('VIA12.metal2.enclosure' , l( 0.5)) + , ('VIA23.minimum.side' , l( 1.0)) + , ('VIA23.metal2.enclosure' , l( 0.5)) + , ('VIA23.metal3.enclosure' , l( 0.5)) + , ('VIA34.minimum.side' , l( 1.0)) + , ('VIA34.metal3.enclosure' , l( 0.5)) + , ('VIA34.metal4.enclosure' , l( 0.5)) + , ('VIA45.minimum.side' , l( 1.0)) + , ('VIA45.metal4.enclosure' , l( 0.5)) + , ('VIA45.metal5.enclosure' , l( 0.5)) + , ('VIA56.minimum.side' , l( 1.0)) + , ('VIA56.metal5.enclosure' , l( 0.5)) + , ('VIA56.metal6.enclosure' , l( 0.5)) + , ('VIA67.minimum.side' , l( 1.0)) + , ('VIA67.metal6.enclosure' , l( 0.5)) + , ('VIA67.metal7.enclosure' , l( 0.5)) + , ('VIA78.minimum.side' , l( 1.0)) + , ('VIA78.metal7.enclosure' , l( 0.5)) + , ('VIA78.metal8.enclosure' , l( 0.5)) + , ('VIA89.minimum.side' , l( 1.0)) + , ('VIA89.metal8.enclosure' , l( 0.5)) + , ('VIA89.metal9.enclosure' , l( 0.5)) + , ('VIA910.minimum.side' , l( 1.0)) + , ('VIA910.metal9.enclosure' , l( 0.5)) + , ('VIA910.metal10.enclosure' , l( 0.5)) + + # Blockages (symbolic). + , ('BLOCKAGE1.minimum.width' , l(1.0)) + , ('BLOCKAGE1.blockage1.extention.cap' , l(0.5)) + , ('BLOCKAGE2.minimum.width' , l(2.0)) + , ('BLOCKAGE2.blockage2.extention.cap' , l(0.5)) + , ('BLOCKAGE3.minimum.width' , l(2.0)) + , ('BLOCKAGE3.blockage3.extention.cap' , l(0.5)) + , ('BLOCKAGE4.minimum.width' , l(2.0)) + , ('BLOCKAGE4.blockage4.extention.cap' , l(0.5)) + , ('BLOCKAGE5.minimum.width' , l(2.0)) + , ('BLOCKAGE5.blockage5.extention.cap' , l(1.0)) + , ('BLOCKAGE6.minimum.width' , l(2.0)) + , ('BLOCKAGE6.blockage6.extention.cap' , l(1.0)) + , ('BLOCKAGE7.minimum.width' , l(2.0)) + , ('BLOCKAGE7.blockage7.extention.cap' , l(1.0)) + , ('BLOCKAGE8.minimum.width' , l(2.0)) + , ('BLOCKAGE8.blockage8.extention.cap' , l(1.0)) + , ('BLOCKAGE9.minimum.width' , l(2.0)) + , ('BLOCKAGE9.blockage9.extention.cap' , l(1.0)) + , ('BLOCKAGE10.minimum.width' , l(2.0)) + , ('BLOCKAGE10.blockage10.extention.cap', l(1.0)) + ] diff --git a/crlcore/etc/symbolic/cmos/kite.conf b/crlcore/etc/symbolic/cmos/kite.conf index 6c6821ed..e9c70335 100644 --- a/crlcore/etc/symbolic/cmos/kite.conf +++ b/crlcore/etc/symbolic/cmos/kite.conf @@ -1,6 +1,7 @@ # -*- Mode:Python; explicit-buffer-name: "kite.conf" -*- import helpers +from helpers import l, n, u # Contains the layout (shared by all technologies). execfile( helpers.sysConfDir+'/common/kite.conf' ) @@ -43,18 +44,18 @@ parametersTable = \ routingGaugesTable = {} routingGaugesTable['sxlib'] = \ - ( ( 'METAL1', ( Gauge.Vertical , Gauge.PinOnly, 0, 0.0, 0, 5, 2, 1, 4 ) ) - , ( 'METAL2', ( Gauge.Horizontal, Gauge.Default, 1, 7.0, 0, 5, 2, 1, 4 ) ) - , ( 'METAL3', ( Gauge.Vertical , Gauge.Default, 2, 0.0, 0, 5, 2, 1, 4 ) ) - , ( 'METAL4', ( Gauge.Horizontal, Gauge.Default, 3, 0.0, 0, 5, 2, 1, 4 ) ) - , ( 'METAL5', ( Gauge.Vertical , Gauge.Default, 4, 0.0, 0, 5, 2, 1, 4 ) ) - #, ( 'METAL6', ( Gauge.Horizontal, Gauge.Default, 5, 0.0, 0, 5, 2, 1, 4 ) ) - #, ( 'METAL7', ( Gauge.Vertical , Gauge.Default, 6, 0.0, 0, 5, 2, 1, 4 ) ) + ( ( 'METAL1', ( Gauge.Vertical , Gauge.PinOnly, 0, 0.0, l(0), l(5), l(2), l(1), l(4) ) ) + , ( 'METAL2', ( Gauge.Horizontal, Gauge.Default, 1, 7.0, l(0), l(5), l(2), l(1), l(4) ) ) + , ( 'METAL3', ( Gauge.Vertical , Gauge.Default, 2, 0.0, l(0), l(5), l(2), l(1), l(4) ) ) + , ( 'METAL4', ( Gauge.Horizontal, Gauge.Default, 3, 0.0, l(0), l(5), l(2), l(1), l(4) ) ) + , ( 'METAL5', ( Gauge.Vertical , Gauge.Default, 4, 0.0, l(0), l(5), l(2), l(1), l(4) ) ) + #, ( 'METAL6', ( Gauge.Horizontal, Gauge.Default, 5, 0.0, l(0), l(5), l(2), l(1), l(4) ) ) + #, ( 'METAL7', ( Gauge.Vertical , Gauge.Default, 6, 0.0, l(0), l(5), l(2), l(1), l(4) ) ) ) routingGaugesTable['sxlib-2M'] = \ - ( ( 'METAL1', ( Gauge.Horizontal, Gauge.Default, 0, 0.0, 0, 5, 2, 1, 4 ) ) - , ( 'METAL2', ( Gauge.Vertical , Gauge.Default, 1, 0.0, 0, 5, 2, 1, 4 ) ) + ( ( 'METAL1', ( Gauge.Horizontal, Gauge.Default, 0, 0.0, l(0), l(5), l(2), l(1), l(4) ) ) + , ( 'METAL2', ( Gauge.Vertical , Gauge.Default, 1, 0.0, l(0), l(5), l(2), l(1), l(4) ) ) ) @@ -63,4 +64,4 @@ routingGaugesTable['sxlib-2M'] = \ # ( METAL_PIN, xy_common_pitch, slice_height, slice_step ) cellGaugesTable = {} -cellGaugesTable['sxlib'] = ('metal2', 5.0, 50.0, 5.0) +cellGaugesTable['sxlib'] = ('metal2', l(5.0), l(50.0), l(5.0)) diff --git a/crlcore/etc/symbolic/cmos/technology.conf b/crlcore/etc/symbolic/cmos/technology.conf index dd0e59cb..032ea1b7 100644 --- a/crlcore/etc/symbolic/cmos/technology.conf +++ b/crlcore/etc/symbolic/cmos/technology.conf @@ -1,7 +1,9 @@ # -*- Mode:Python; explicit-buffer-name: "technology.conf" -*- -import helpers -from Hurricane import DbU +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 coherent with it. @@ -12,17 +14,16 @@ from Hurricane import DbU # - # - -execfile( helpers.sysConfDir+'/common/technology.conf' ) +initTechno( { 'name' : 'cmos' + , 'precision' : 2 + , 'gridValue' : 0.005 + , 'gridUnit' : DbU.UnitPowerMicro + , 'gridsPerLambda' : 24 + , 'symbolicGridStep' : 1.0 + , 'polygonStep' : 24.0 + } ) - -technoConfig = { 'name' : 'hcmos9gp' - , 'precision' : 2 - , 'gridValue' : 0.005 - , 'gridUnit' : DbU.UnitPowerMicro - , 'gridsPerLambda' : 24 - , 'symbolicGridStep' : 1.0 - , 'polygonStep' : 24.0 - } +execfile( sysConfDir+'/common/technology.conf' ) # Format of : @@ -30,150 +31,14 @@ technoConfig = { 'name' : 'hcmos9gp' # * 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. If the main layer is symbolic it -# must be expressed in lambda, if it is for a real layers it -# must be expressed in microns. +# * 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. -layersExtensionsTable = \ - ( ('NWELL.nWell.extention.cap' , 0.0) - , ('PWELL.pWell.extention.cap' , 0.0) - - , ('NTIE.minimum.width' , 3.0) - , ('NTIE.nWell.extention.cap' , 1.5) - , ('NTIE.nWell.extention.width' , 0.5) - , ('NTIE.nImplant.extention.cap' , 1.0) - , ('NTIE.nImplant.extention.width' , 0.5) - , ('NTIE.active.extention.cap' , 0.5) - , ('NTIE.active.extention.width' , 0.0) - - , ('PTIE.minimum.width' , 3.0) - , ('PTIE.pWell.extention.cap' , 1.5) - , ('PTIE.pWell.extention.width' , 0.5) - , ('PTIE.pImplant.extention.cap' , 1.0) - , ('PTIE.pImplant.extention.width' , 0.5) - , ('PTIE.active.extention.cap' , 0.5) - , ('PTIE.active.extention.width' , 0.0) - - , ('NDIF.minimum.width' , 3.0) - , ('NDIF.nImplant.extention.cap' , 1.0) - , ('NDIF.nImplant.extention.width' , 0.5) - , ('NDIF.active.extention.cap' , 0.5) - , ('NDIF.active.extention.width' , 0.0) - - , ('PDIF.minimum.width' , 3.0) - , ('PDIF.pImplant.extention.cap' , 1.0) - , ('PDIF.pImplant.extention.width' , 0.5) - , ('PDIF.active.extention.cap' , 0.5) - , ('PDIF.active.extention.width' , 0.0) - - , ('GATE.minimum.width' , 1.0) - , ('GATE.poly.extention.cap' , 1.5) - - , ('NTRANS.minimum.width' , 1.0) - , ('NTRANS.nImplant.extention.cap' , -1.0) - , ('NTRANS.nImplant.extention.width' , 2.5) - , ('NTRANS.active.extention.cap' , -1.5) - , ('NTRANS.active.extention.width' , 2.0) - - , ('PTRANS.minimum.width' , 1.0) - , ('PTRANS.nWell.extention.cap' , -1.0) - , ('PTRANS.nWell.extention.width' , 4.5) - , ('PTRANS.pImplant.extention.cap' , -1.0) - , ('PTRANS.pImplant.extention.width' , 4.0) - , ('PTRANS.active.extention.cap' , -1.5) - , ('PTRANS.active.extention.width' , 3.0) - - , ('POLY.minimum.width' , 1.0) - , ('POLY.poly.extention.cap' , 0.5) - , ('POLY2.minimum.width' , 1.0) - , ('POLY2.poly.extention.cap' , 0.5) - - # Routing Layers. - , ('METAL1.minimum.width' , 1.0) - , ('METAL1.metal1.extention.cap' , 0.5) - , ('METAL2.minimum.width' , 2.0) - , ('METAL2.metal2.extention.cap' , 1.0) - , ('METAL3.minimum.width' , 2.0) - , ('METAL3.metal3.extention.cap' , 1.0) - , ('METAL4.minimum.width' , 2.0) - , ('METAL4.metal4.extention.cap' , 1.0) - , ('METAL5.minimum.width' , 2.0) - , ('METAL5.metal5.extention.cap' , 1.0) - , ('METAL6.minimum.width' , 2.0) - , ('METAL6.metal6.extention.cap' , 1.0) - , ('METAL7.minimum.width' , 2.0) - , ('METAL7.metal6.extention.cap' , 1.0) - , ('METAL8.minimum.width' , 2.0) - , ('METAL8.metal6.extention.cap' , 1.0) - - # Contacts (i.e. Active <--> Metal) (symbolic). - , ('CONT_BODY_N.minimum.side' , 1.0) - , ('CONT_BODY_N.nWell.enclosure' , 1.5) - , ('CONT_BODY_N.nImplant.enclosure' , 1.5) - , ('CONT_BODY_N.active.enclosure' , 1.0) - , ('CONT_BODY_N.metal1.enclosure' , 0.5) - - , ('CONT_BODY_P.minimum.side' , 1.0) - , ('CONT_BODY_P.pWell.enclosure' , 1.5) - , ('CONT_BODY_P.pImplant.enclosure' , 1.5) - , ('CONT_BODY_P.active.enclosure' , 1.0) - , ('CONT_BODY_P.metal1.enclosure' , 0.5) - - , ('CONT_DIF_N.minimum.side' , 1.0) - , ('CONT_DIF_N.nImplant.enclosure' , 1.0) - , ('CONT_DIF_N.active.enclosure' , 0.5) - , ('CONT_DIF_N.metal1.enclosure' , 0.5) - - , ('CONT_DIF_P.minimum.side' , 1.0) - , ('CONT_DIF_P.pImplant.enclosure' , 1.0) - , ('CONT_DIF_P.active.enclosure' , 0.5) - , ('CONT_DIF_P.metal1.enclosure' , 0.5) - - , ('CONT_POLY.minimum.width' , 1.0) - , ('CONT_POLY.poly.enclosure' , 0.5) - , ('CONT_POLY.metal1.enclosure' , 0.5) - - # VIAs (i.e. Metal <--> Metal) (symbolic). - , ('VIA12.minimum.side' , 1.0) - , ('VIA12.metal1.enclosure' , 0.5) - , ('VIA12.metal2.enclosure' , 0.5) - , ('VIA23.minimum.side' , 1.0) - , ('VIA23.metal2.enclosure' , 0.5) - , ('VIA23.metal3.enclosure' , 0.5) - , ('VIA34.minimum.side' , 1.0) - , ('VIA34.metal3.enclosure' , 0.5) - , ('VIA34.metal4.enclosure' , 0.5) - , ('VIA45.minimum.side' , 1.0) - , ('VIA45.metal4.enclosure' , 0.5) - , ('VIA45.metal5.enclosure' , 0.5) - , ('VIA56.minimum.side' , 1.0) - , ('VIA56.metal5.enclosure' , 0.5) - , ('VIA56.metal6.enclosure' , 0.5) - , ('VIA67.minimum.side' , 1.0) - , ('VIA67.metal6.enclosure' , 0.5) - , ('VIA67.metal7.enclosure' , 0.5) - , ('VIA78.minimum.side' , 1.0) - , ('VIA78.metal7.enclosure' , 0.5) - , ('VIA78.metal8.enclosure' , 0.5) - - # Blockages (symbolic). - , ('BLOCKAGE1.minimum.width' , 1.0) - , ('BLOCKAGE1.blockage1.extention.cap' , 0.5) - , ('BLOCKAGE2.minimum.width' , 2.0) - , ('BLOCKAGE2.blockage2.extention.cap' , 0.5) - , ('BLOCKAGE3.minimum.width' , 2.0) - , ('BLOCKAGE3.blockage3.extention.cap' , 0.5) - , ('BLOCKAGE4.minimum.width' , 2.0) - , ('BLOCKAGE4.blockage4.extention.cap' , 0.5) - , ('BLOCKAGE5.minimum.width' , 2.0) - , ('BLOCKAGE5.blockage5.extention.cap' , 1.0) - , ('BLOCKAGE6.minimum.width' , 2.0) - , ('BLOCKAGE6.blockage6.extention.cap' , 1.0) - , ('BLOCKAGE7.minimum.width' , 2.0) - , ('BLOCKAGE7.blockage6.extention.cap' , 1.0) - , ('BLOCKAGE8.minimum.width' , 2.0) - , ('BLOCKAGE8.blockage6.extention.cap' , 1.0) - ) +layersExtensionsTable = symbolicLayersExtensionsTable gdsLayersTable = \ diff --git a/crlcore/python/coriolisInit.py b/crlcore/python/coriolisInit.py index 299308b2..e6b91d25 100644 --- a/crlcore/python/coriolisInit.py +++ b/crlcore/python/coriolisInit.py @@ -75,8 +75,7 @@ SystemMandatory = 0x0100 def coriolisConfigure(): - confHelpers = ( ('technoConfig' , Technology.loadTechnoConfig , SystemMandatory|TechnologyHelper) - , ('allianceConfig' , Alliance.loadAllianceConfig , SystemMandatory|AllianceHelper) + confHelpers = ( ('allianceConfig' , Alliance.loadAllianceConfig , SystemMandatory|AllianceHelper) , ('routingGaugesTable' , Alliance.loadRoutingGaugesTable, SystemMandatory|KiteHelper) , ('cellGaugesTable' , Alliance.loadCellGaugesTable , SystemMandatory|KiteHelper) , ('realLayersTable' , Technology.loadRealLayers , SystemMandatory|TechnologyHelper) @@ -91,6 +90,8 @@ def coriolisConfigure(): , ('layoutTable' , Configuration.loadLayout , ConfigurationHelper) ) + # ('technoConfig' , Technology.loadTechnoConfig , SystemMandatory|TechnologyHelper) + print ' o Running configuration hook: coriolisConfigure().' #print ' - sysConfDir: <%s>' % helpers.sysConfDir diff --git a/crlcore/python/helpers/Alliance.py b/crlcore/python/helpers/Alliance.py index 21f8f96d..058af2a4 100644 --- a/crlcore/python/helpers/Alliance.py +++ b/crlcore/python/helpers/Alliance.py @@ -151,11 +151,11 @@ def loadRoutingGaugesTable ( routingGaugesTable, fromFile ): , Gauge.toRlGauge(entry[1][1]) # Type. , entry[1][2] # Depth. , entry[1][3] # Density. - , helpers.toDbU(entry[1][4]) # Offset. - , helpers.toDbU(entry[1][5]) # Pitch. - , helpers.toDbU(entry[1][6]) # Wire width. - , helpers.toDbU(entry[1][7]) # Via width. - , helpers.toDbU(entry[1][8]) # Obstacle dW. + , entry[1][4] # Offset. + , entry[1][5] # Pitch. + , entry[1][6] # Wire width. + , entry[1][7] # Via width. + , entry[1][8] # Obstacle dW. ) ) except Exception, e: @@ -183,10 +183,10 @@ def loadCellGaugesTable ( cellGaugesTable, fromFile ): ,str(gaugeDatas) ]) gauge = CellGauge.create( gaugeName - , gaugeDatas[0] # pinLayerName. - , helpers.toDbU(gaugeDatas[1]) # pitch. - , helpers.toDbU(gaugeDatas[2]) # sliceHeight. - , helpers.toDbU(gaugeDatas[3]) # sliceStep. + , gaugeDatas[0] # pinLayerName. + , gaugeDatas[1] # pitch. + , gaugeDatas[2] # sliceHeight. + , gaugeDatas[3] # sliceStep. ) except Exception, e: ErrorMessage.wrapPrint(e,'In %s: at index %d.' % (allianceFile,gaugeDatasNo)) diff --git a/crlcore/python/helpers/Technology.py b/crlcore/python/helpers/Technology.py index bf5b5cc7..75821399 100644 --- a/crlcore/python/helpers/Technology.py +++ b/crlcore/python/helpers/Technology.py @@ -17,7 +17,6 @@ from Hurricane import ContactLayer from Hurricane import ViaLayer from CRL import AllianceFramework from helpers import ErrorMessage -from helpers import toDbU technologyFile = '' @@ -217,7 +216,8 @@ def loadLayersExtensions ( layersExtensionsTable, confFile ): ,'Must contains exactly two fields: ( rule_path, value ).' ,str(rule) ]) - if not isinstance(rule[1],int) \ + if not isinstance(rule[1],int ) \ + and not isinstance(rule[1],long ) \ and not isinstance(rule[1],float) \ and not isinstance(rule[1],tuple): raise ErrorMessage(1,['Invalid entry in .' @@ -240,16 +240,8 @@ def loadLayersExtensions ( layersExtensionsTable, confFile ): ,str(rule) ]) - if elements[0].startswith('via') or elements[0].startswith('metal'): - if isinstance(rule[1],tuple): - value = ( toDbU(rule[1][0]), toDbU(rule[1][1]) ) - else: - value = toDbU(rule[1]) - else: - if isinstance(rule[1],tuple): - value = ( DbU.fromLambda(rule[1][0]), DbU.fromLambda(rule[1][1]) ) - else: - value = DbU.fromLambda(rule[1]) + if isinstance(rule[1],tuple): value = ( rule[1][0], rule[1][1] ) + else: value = rule[1] if subLayer: ruleTag = string.join(elements[2:],'.') else: ruleTag = string.join(elements[1:],'.') @@ -343,8 +335,7 @@ def loadGdsLayers ( realLayersTable, confFile ): return -def loadTechnoConfig ( technoConfig, confFile ): - technologyFile = confFile +def initTechno ( technoConfig ): technology = DataBase.getDB().getTechnology() if not technology: name = 'Unknown' diff --git a/crlcore/python/helpers/__init__.py b/crlcore/python/helpers/__init__.py index cc92e645..6df1e186 100644 --- a/crlcore/python/helpers/__init__.py +++ b/crlcore/python/helpers/__init__.py @@ -295,23 +295,9 @@ def overload ( defaultParameters, parameters ): return tuple(overloadParameters) - -def lambdaMode (): - global unitsLambda - unitsLambda = true - return - - -def micronsMode (): - global unitsLambda - unitsLambda = False - return - - -def toDbU ( value ): - global unitsLambda - if unitsLambda: return Hurricane.DbU.fromLambda( value ) - return Hurricane.DbU.fromPhysical( value, Hurricane.DbU.UnitPowerMicro ) +def l ( value ): return Hurricane.DbU.fromLambda( value ) +def u ( value ): return Hurricane.DbU.fromPhysical( value, Hurricane.DbU.UnitPowerMicro ) +def n ( value ): return Hurricane.DbU.fromPhysical( value, Hurricane.DbU.UnitPowerNano ) def initTechno ( argQuiet ):