# -*- Mode:Python; explicit-buffer-name: "technology.conf<common>" -*-
#
# Those settings are common to all the symbolic technologies.

from Hurricane                  import BasicLayer
from helpers.SymbolicTechnology import TypeRegular
from helpers.SymbolicTechnology import TypeDiffusion
from helpers.SymbolicTechnology import TypeTransistor
from helpers.SymbolicTechnology import TypeContact
from helpers.SymbolicTechnology import TypeVia


viewerConfig = { 'precision':2, 'gridstep':1.0 }

# The informations here are extracted from the Alliance ".rds" file,
# and must be coherent with it.
#
# Format of <realLayerTable>:
#     The third parameter must be present only for blockage material.
#     ('layer_name'   , MATERIAL                    , ASSOCIATED ROUTING)
#
# Note: concerning the LayerMask, real layers are implementeds as BasicLayer,
#       and are associated to exactly one bit of the mask. Symbolic layers
#       then combine BasicLayer to create composite objects, an thus can have
#       a mask which have multiple bits set. Getting the mask from a layer
#       is straigthforward, but the reverse is not true. One mask may match
#       multiple symbolic layers. To overcome this ambiguity we introduce the
#       concept of "working layer", which, for one given mask tells the layer
#       that will be returned (generally the symbolic one).

realLayersTable = \
    ( ('nWell'        , BasicLayer.Material.nWell   )  # Non-Routing Layers.
    , ('pWell'        , BasicLayer.Material.pWell   )
    , ('nImplant'     , BasicLayer.Material.nImplant)
    , ('pImplant'     , BasicLayer.Material.pImplant)
    , ('active'       , BasicLayer.Material.active  )
    , ('poly'         , BasicLayer.Material.poly    )
    , ('poly2'        , BasicLayer.Material.poly    )
    , ('cut0'         , BasicLayer.Material.cut     )  # Routing Layers & VIA Cuts.
    , ('metal1'       , BasicLayer.Material.metal   )  # WARNING: order *is* meaningful.
    , ('cut1'         , BasicLayer.Material.cut     )
    , ('metal2'       , BasicLayer.Material.metal   )
    , ('metcap'       , BasicLayer.Material.other   )
    , ('cut2'         , BasicLayer.Material.cut     )
    , ('metal3'       , BasicLayer.Material.metal   )
    , ('cut3'         , BasicLayer.Material.cut     )
    , ('metal4'       , BasicLayer.Material.metal   )
    , ('cut4'         , BasicLayer.Material.cut     )
    , ('metal5'       , BasicLayer.Material.metal   )
    , ('cut5'         , BasicLayer.Material.cut     )
    , ('metal6'       , BasicLayer.Material.metal   )
    , ('cut6'         , BasicLayer.Material.cut     )
    , ('metal7'       , BasicLayer.Material.metal   )
    , ('cut7'         , BasicLayer.Material.cut     )
    , ('metal8'       , BasicLayer.Material.metal   )
   #, ('topmim6'      , BasicLayer.Material.other   )  # For Capacitances & Pads.
   #, ('metbot'       , BasicLayer.Material.other   )
   #, ('padopen'      , BasicLayer.Material.other   )
   #, ('alucap'       , BasicLayer.Material.other   )
    
    , ('text.cell'    , BasicLayer.Material.other   )  # Misc. non-physical layers.
    , ('text.instance', BasicLayer.Material.other   )  # Used by the software for visualization
    , ('SPL1'         , BasicLayer.Material.other   )  # purposes only.
    , ('AutoLayer'    , BasicLayer.Material.other   )
    , ('blockage1'    , BasicLayer.Material.blockage, 'metal1')  # Blockages
    , ('blockage2'    , BasicLayer.Material.blockage, 'metal2')
    , ('blockage3'    , BasicLayer.Material.blockage, 'metal3')
    , ('blockage4'    , BasicLayer.Material.blockage, 'metal4')
    , ('blockage5'    , BasicLayer.Material.blockage, 'metal5')
    , ('blockage6'    , BasicLayer.Material.blockage, 'metal6')
    , ('blockage7'    , BasicLayer.Material.blockage, 'metal7')
    , ('blockage8'    , BasicLayer.Material.blockage, 'metal8')
    , ('gmetalh'      , BasicLayer.Material.metal   )  # Special BasicLayers for Knik & Kite Routers.
    , ('gcut'         , BasicLayer.Material.cut     )  # *Must be after all others*
    , ('gmetalv'      , BasicLayer.Material.metal   )
    )


# Format of <symbolicLayersTable>:
#     The length of the list of real layers depends on the type.
#     In some case, the last of the list may be optional, it must be
#     sets to None and not left empty.
#
#     ('SYMB_LAYER' , Type          , (LIST_OF_REAL_LAYERS) )

symbolicLayersTable  = \
    ( ('NWELL'      , TypeRegular   , ('nWell'    ,))
    , ('PWELL'      , TypeRegular   , ('pWell'    ,))
    , ('NTIE'       , TypeDiffusion , ('nImplant' , 'active', 'nWell'))
    , ('PTIE'       , TypeDiffusion , ('pImplant' , 'active', 'pWell'))
    , ('NDIF'       , TypeDiffusion , ('nImplant' , 'active', None   ))
    , ('PDIF'       , TypeDiffusion , ('pImplant' , 'active', None   ))
    , ('GATE'       , TypeDiffusion , ('poly'     , 'active', None   ))
    , ('NTRANS'     , TypeTransistor, ('nImplant' , 'active', 'poly', None   ))
    , ('PTRANS'     , TypeTransistor, ('pImplant' , 'active', 'poly', 'nWell'))
    , ('POLY'       , TypeRegular   , ('poly'     ,))
    , ('POLY2'      , TypeRegular   , ('poly2'    ,))
    , ('METAL1'     , TypeRegular   , ('metal1'   ,))
    , ('METAL2'     , TypeRegular   , ('metal2'   ,))
    , ('metcapdum'  , TypeRegular   , ('metcap'   ,))
    , ('metbot'     , TypeRegular   , ('metal2'   ,))
    , ('METAL3'     , TypeRegular   , ('metal3'   ,))
    , ('METAL4'     , TypeRegular   , ('metal4'   ,))
    , ('METAL5'     , TypeRegular   , ('metal5'   ,))
    , ('METAL6'     , TypeRegular   , ('metal6'   ,))
    , ('METAL7'     , TypeRegular   , ('metal7'   ,))
    , ('METAL8'     , TypeRegular   , ('metal8'   ,))
    , ('CONT_BODY_N', TypeContact   , ('nImplant' , 'active', 'cut0', 'metal1', 'nWell'))
    , ('CONT_BODY_P', TypeContact   , ('pImplant' , 'active', 'cut0', 'metal1', 'pWell'))
    , ('CONT_DIF_N' , TypeContact   , ('nImplant' , 'active', 'cut0', 'metal1', None   ))
    , ('CONT_DIF_P' , TypeContact   , ('pImplant' , 'active', 'cut0', 'metal1', None   ))
    , ('CONT_POLY'  , TypeVia       , (             'poly'  , 'cut0', 'metal1'))
    , ('VIA12'      , TypeVia       , (             'metal1', 'cut1', 'metal2'))
    , ('VIA23'      , TypeVia       , (             'metal2', 'cut2', 'metal3'))
    , ('VIA23cap'   , TypeVia       , (             'metcap', 'cut2', 'metal3'))
    , ('VIA34'      , TypeVia       , (             'metal3', 'cut3', 'metal4'))
    , ('VIA45'      , TypeVia       , (             'metal4', 'cut4', 'metal5'))
    , ('VIA56'      , TypeVia       , (             'metal5', 'cut5', 'metal6'))
    , ('VIA67'      , TypeVia       , (             'metal6', 'cut6', 'metal7'))
    , ('VIA78'      , TypeVia       , (             'metal7', 'cut7', 'metal8'))
    , ('BLOCKAGE1'  , TypeRegular   , ('blockage1', ))
    , ('BLOCKAGE2'  , TypeRegular   , ('blockage2', ))
    , ('BLOCKAGE3'  , TypeRegular   , ('blockage3', ))
    , ('BLOCKAGE4'  , TypeRegular   , ('blockage4', ))
    , ('BLOCKAGE5'  , TypeRegular   , ('blockage5', ))
    , ('BLOCKAGE6'  , TypeRegular   , ('blockage6', ))
    , ('BLOCKAGE7'  , TypeRegular   , ('blockage7', ))
    , ('BLOCKAGE8'  , TypeRegular   , ('blockage8', ))
    , ('gcontact'   , TypeVia       , ('gmetalh'  , 'gcut', 'gmetalv'))
    )


# Format of <workingLayersTable>:
#     This is a simple list of Real & Symbolic layers.

workingLayersTable = \
    [ 'cut0', 'cut1'     , 'cut2'     , 'cut3'     , 'cut4'     , 'cut5'     , 'cut6'
    , 'POLY', 'POLY2'
            , 'METAL1'   , 'METAL2'   , 'METAL3'   , 'METAL4'   , 'METAL5'   , 'METAL6'   , 'METAL7'   , 'METAL8'
            , 'BLOCKAGE1', 'BLOCKAGE2', 'BLOCKAGE3', 'BLOCKAGE4', 'BLOCKAGE5', 'BLOCKAGE6', 'BLOCKAGE7', 'BLOCKAGE8'
            , 'VIA12'    , 'VIA23'    , 'VIA34'    , 'VIA45'    , 'VIA56'
            , 'gcut'     , 'gmetalh'  , 'gmetalv'  , 'gcontact'
    ]
