New DataBase::getCell() and bug in Technology::getNthMetal().
* New: Hurricane::DataBase::getCell() method to search a cell through all the libraries of *all* the frameworks, not just Alliance. Also exported in Python interface. * Bug: In Technology::getNthMetal() the function was not returning the right metal, there was an offset of one. And when the offset was 0, no metal was even returned. Same fix goes for getNthCut(). The fault was in Mask<>::nthbit(). * Change: In Hurricane::CellWidget, the initial window size is too tiny. Increase the size from 250 to 500 pixels.
This commit is contained in:
parent
4e8ac63408
commit
bed79c0156
|
@ -1,30 +0,0 @@
|
|||
# -*- Mode:Python; explicit-buffer-name: "technology.conf<hcmos9>" -*-
|
||||
|
||||
from Hurricane import DbU
|
||||
|
||||
|
||||
technoConfig = { 'name' : 'hcmos9'
|
||||
, 'gridValue' : 0.005
|
||||
, 'gridUnit' : DbU.UnitPowerMicro
|
||||
, 'gridsPerLambda': 24
|
||||
}
|
||||
|
||||
gdsLayersTable = \
|
||||
( ("nWell" , "NWELL" , 3)
|
||||
, ("nImplant", "NPLUS" , 26)
|
||||
, ("pImplant", "PPLUS" , 25)
|
||||
, ("active" , "ACTIVE" , 6)
|
||||
, ("poly" , "POLY" , 17)
|
||||
, ("cut0" , "CONTACT", 30)
|
||||
, ("metal1" , "METAL1" , 31)
|
||||
, ("cut1" , "VIA1" , 51)
|
||||
, ("metal2" , "METAL2" , 32)
|
||||
, ("cut2" , "VIA2" , 52)
|
||||
, ("metal3" , "METAL3" , 33)
|
||||
, ("cut3" , "VIA3" , 53)
|
||||
, ("metal4" , "METAL4" , 34)
|
||||
, ("cut4" , "VIA4" , 54)
|
||||
, ("metal5" , "METAL5" , 35)
|
||||
, ("cut5" , "VIA5" , 55)
|
||||
, ("metal6" , "METAL6" , 36)
|
||||
)
|
|
@ -1,40 +1,169 @@
|
|||
# -*- Mode:Python; explicit-buffer-name: "technology.conf<scn6m_deep>" -*-
|
||||
# -*- Mode:Python; explicit-buffer-name: "technology.conf<scmos_deep_018>" -*-
|
||||
|
||||
from Hurricane import DbU
|
||||
import helpers
|
||||
|
||||
# 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.
|
||||
# The informations here are extracted from the Alliance ".rds" file,
|
||||
# and must be consistent with it.
|
||||
#
|
||||
# We set the foundry grid to .005um and set the gridsPerLambda to 18.
|
||||
# Provides standard settings for:
|
||||
# - <viewerConfig>
|
||||
# - <realLayersTable>
|
||||
# - <symbolicLayersTable>
|
||||
# - <workingLayersTable>
|
||||
|
||||
technoConfig = { 'name' : 'scn6m_deep'
|
||||
, 'gridValue' : 0.005
|
||||
, 'gridUnit' : DbU.UnitPowerMicro
|
||||
, 'gridsPerLambda': 18
|
||||
}
|
||||
execfile( helpers.sysConfDir+'/common/technology.conf' )
|
||||
|
||||
# Format of an entry in the table:
|
||||
# (Symbolic_Name, CIF_Name, GDSII_Number)
|
||||
gdsLayersTable = \
|
||||
( ("pWell" , "CWN" , 41)
|
||||
, ("nWell" , "CWP" , 42)
|
||||
, ("active" , "CAA" , 43)
|
||||
, ("pImplant", "CSP" , 44)
|
||||
, ("nImplant", "CSN" , 45)
|
||||
, ("poly" , "CPG" , 46)
|
||||
, ("poly2" , "CM1" , 49) # poly2 is in fact metal1.
|
||||
, ("cut0" , "CCC" , 25)
|
||||
, ("metal1" , "CM1" , 49)
|
||||
, ("cut1" , "CV1" , 50)
|
||||
, ("metal2" , "CM2" , 51)
|
||||
, ("cut2" , "CV2" , 61)
|
||||
, ("metal3" , "CM3" , 62)
|
||||
, ("cut3" , "CV3" , 30)
|
||||
, ("metal4" , "CM4" , 31)
|
||||
, ("cut4" , "CV4" , 32)
|
||||
, ("metal5" , "CM5" , 33)
|
||||
, ("cut5" , "CV5" , 36)
|
||||
, ("metal6" , "CM6" , 37)
|
||||
|
||||
# Format of <symbolicRulesTable>:
|
||||
# Each entry is a pair of (string, value).
|
||||
# * string: a synthetic way to designate the symbolic layer on which
|
||||
# it applies, an optional real layer in case where there is
|
||||
# more than one, and the dimension name.
|
||||
# * value : the rule (dimension) value expressed in lambda.
|
||||
|
||||
symbolicRulesTable = \
|
||||
( ('NWELL.nWell.extention.cap' , 4.0)
|
||||
, ('PWELL.pWell.extention.cap' , 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)
|
||||
|
||||
, ('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)
|
||||
|
||||
, ('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)
|
||||
|
||||
, ('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)
|
||||
|
||||
, ('GATE.minimum.width' , 2.0)
|
||||
, ('GATE.poly.extention.cap' , 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)
|
||||
|
||||
, ('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)
|
||||
|
||||
, ('POLY.minimum.width' , 2.0)
|
||||
, ('POLY.poly.extention.cap' , 1.0)
|
||||
, ('POLY2.minimum.width' , 2.0)
|
||||
, ('POLY2.poly2.extention.cap' , 2.0)
|
||||
|
||||
# Routing Layers.
|
||||
, ('METAL1.minimum.width' , 2.0)
|
||||
, ('METAL1.metal1.extention.cap' , 2.0)
|
||||
, ('METAL1.metal1.extention.width' , 0.5)
|
||||
, ('METAL2.minimum.width' , 3.0)
|
||||
, ('METAL2.metal2.extention.cap' , 1.5)
|
||||
, ('METAL3.minimum.width' , 3.0)
|
||||
, ('METAL3.metal3.extention.cap' , 1.5)
|
||||
, ('METAL4.minimum.width' , 3.0)
|
||||
, ('METAL4.metal4.extention.cap' , 1.5)
|
||||
, ('METAL5.minimum.width' , 3.0)
|
||||
, ('METAL5.metal5.extention.cap' , 1.5)
|
||||
, ('METAL6.minimum.width' , 5.0)
|
||||
, ('METAL6.metal6.extention.cap' , 2.5)
|
||||
#, ('METAL7.minimum.width' , 2.0)
|
||||
#, ('METAL7.metal7.extention.cap' , 2.5)
|
||||
#, ('METAL8.minimum.width' , 2.0)
|
||||
#, ('METAL8.metal8.extention.cap' , 2.5)
|
||||
|
||||
# Blockages.
|
||||
, ('BLOCKAGE1.minimum.width' , 3.0)
|
||||
, ('BLOCKAGE1.blockage1.extention.cap' , 2.0)
|
||||
, ('BLOCKAGE1.blockage1.extention.width', 0.5)
|
||||
, ('BLOCKAGE2.minimum.width' , 3.0)
|
||||
, ('BLOCKAGE2.blockage2.extention.cap' , 2.0)
|
||||
, ('BLOCKAGE3.minimum.width' , 3.0)
|
||||
, ('BLOCKAGE3.blockage3.extention.cap' , 2.0)
|
||||
, ('BLOCKAGE4.minimum.width' , 3.0)
|
||||
, ('BLOCKAGE4.blockage4.extention.cap' , 2.0)
|
||||
, ('BLOCKAGE5.minimum.width' , 3.0)
|
||||
, ('BLOCKAGE5.blockage5.extention.cap' , 2.0)
|
||||
, ('BLOCKAGE6.minimum.width' , 4.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)
|
||||
|
||||
# Contacts (i.e. Active <--> Metal).
|
||||
, ('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_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_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_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_POLY.minimum.width' , 2.0)
|
||||
, ('CONT_POLY.poly.enclosure' , 2.0)
|
||||
, ('CONT_POLY.metal1.enclosure' , 1.0)
|
||||
|
||||
# VIAs (i.e. Metal <--> Metal).
|
||||
, ('VIA12.minimum.side' , 3.0)
|
||||
, ('VIA12.metal1.enclosure' , 1.0)
|
||||
, ('VIA12.metal2.enclosure' , 1.0)
|
||||
, ('VIA23.minimum.side' , 3.0)
|
||||
, ('VIA23.metal2.enclosure' , 1.0)
|
||||
, ('VIA23.metal3.enclosure' , 1.0)
|
||||
, ('VIA34.minimum.side' , 3.0)
|
||||
, ('VIA34.metal3.enclosure' , 1.0)
|
||||
, ('VIA34.metal4.enclosure' , 1.0)
|
||||
, ('VIA45.minimum.side' , 3.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)
|
||||
)
|
||||
|
|
|
@ -1,169 +0,0 @@
|
|||
# -*- Mode:Python; explicit-buffer-name: "technology.conf<scmos_deep_018>" -*-
|
||||
|
||||
import helpers
|
||||
|
||||
# The informations here are extracted from the Alliance ".rds" file,
|
||||
# and must be consistent with it.
|
||||
#
|
||||
# Provides standard settings for:
|
||||
# - <viewerConfig>
|
||||
# - <realLayersTable>
|
||||
# - <symbolicLayersTable>
|
||||
# - <workingLayersTable>
|
||||
|
||||
execfile( helpers.sysConfDir+'/common/technology.conf' )
|
||||
|
||||
|
||||
# Format of <symbolicRulesTable>:
|
||||
# Each entry is a pair of (string, value).
|
||||
# * string: a synthetic way to designate the symbolic layer on which
|
||||
# it applies, an optional real layer in case where there is
|
||||
# more than one, and the dimension name.
|
||||
# * value : the rule (dimension) value expressed in lambda.
|
||||
|
||||
symbolicRulesTable = \
|
||||
( ('NWELL.nWell.extention.cap' , 4.0)
|
||||
, ('PWELL.pWell.extention.cap' , 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)
|
||||
|
||||
, ('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)
|
||||
|
||||
, ('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)
|
||||
|
||||
, ('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)
|
||||
|
||||
, ('GATE.minimum.width' , 2.0)
|
||||
, ('GATE.poly.extention.cap' , 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)
|
||||
|
||||
, ('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)
|
||||
|
||||
, ('POLY.minimum.width' , 2.0)
|
||||
, ('POLY.poly.extention.cap' , 1.0)
|
||||
, ('POLY2.minimum.width' , 2.0)
|
||||
, ('POLY2.poly2.extention.cap' , 2.0)
|
||||
|
||||
# Routing Layers.
|
||||
, ('METAL1.minimum.width' , 2.0)
|
||||
, ('METAL1.metal1.extention.cap' , 2.0)
|
||||
, ('METAL1.metal1.extention.width' , 0.5)
|
||||
, ('METAL2.minimum.width' , 3.0)
|
||||
, ('METAL2.metal2.extention.cap' , 1.5)
|
||||
, ('METAL3.minimum.width' , 3.0)
|
||||
, ('METAL3.metal3.extention.cap' , 1.5)
|
||||
, ('METAL4.minimum.width' , 3.0)
|
||||
, ('METAL4.metal4.extention.cap' , 1.5)
|
||||
, ('METAL5.minimum.width' , 3.0)
|
||||
, ('METAL5.metal5.extention.cap' , 1.5)
|
||||
, ('METAL6.minimum.width' , 5.0)
|
||||
, ('METAL6.metal6.extention.cap' , 2.5)
|
||||
#, ('METAL7.minimum.width' , 2.0)
|
||||
#, ('METAL7.metal7.extention.cap' , 2.5)
|
||||
#, ('METAL8.minimum.width' , 2.0)
|
||||
#, ('METAL8.metal8.extention.cap' , 2.5)
|
||||
|
||||
# Blockages.
|
||||
, ('BLOCKAGE1.minimum.width' , 3.0)
|
||||
, ('BLOCKAGE1.blockage1.extention.cap' , 2.0)
|
||||
, ('BLOCKAGE1.blockage1.extention.width', 0.5)
|
||||
, ('BLOCKAGE2.minimum.width' , 3.0)
|
||||
, ('BLOCKAGE2.blockage2.extention.cap' , 2.0)
|
||||
, ('BLOCKAGE3.minimum.width' , 3.0)
|
||||
, ('BLOCKAGE3.blockage3.extention.cap' , 2.0)
|
||||
, ('BLOCKAGE4.minimum.width' , 3.0)
|
||||
, ('BLOCKAGE4.blockage4.extention.cap' , 2.0)
|
||||
, ('BLOCKAGE5.minimum.width' , 3.0)
|
||||
, ('BLOCKAGE5.blockage5.extention.cap' , 2.0)
|
||||
, ('BLOCKAGE6.minimum.width' , 4.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)
|
||||
|
||||
# Contacts (i.e. Active <--> Metal).
|
||||
, ('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_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_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_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_POLY.minimum.width' , 2.0)
|
||||
, ('CONT_POLY.poly.enclosure' , 2.0)
|
||||
, ('CONT_POLY.metal1.enclosure' , 1.0)
|
||||
|
||||
# VIAs (i.e. Metal <--> Metal).
|
||||
, ('VIA12.minimum.side' , 3.0)
|
||||
, ('VIA12.metal1.enclosure' , 1.0)
|
||||
, ('VIA12.metal2.enclosure' , 1.0)
|
||||
, ('VIA23.minimum.side' , 3.0)
|
||||
, ('VIA23.metal2.enclosure' , 1.0)
|
||||
, ('VIA23.metal3.enclosure' , 1.0)
|
||||
, ('VIA34.minimum.side' , 3.0)
|
||||
, ('VIA34.metal3.enclosure' , 1.0)
|
||||
, ('VIA34.metal4.enclosure' , 1.0)
|
||||
, ('VIA45.minimum.side' , 3.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)
|
||||
)
|
|
@ -253,6 +253,26 @@ Cell* DataBase::getCell(string rpath, unsigned int flags)
|
|||
|
||||
}
|
||||
|
||||
Cell* DataBase::getCell(string name)
|
||||
// *********************************
|
||||
{
|
||||
vector<Library*> libStack;
|
||||
libStack.push_back( getRootLibrary() );
|
||||
|
||||
while ( not libStack.empty() ) {
|
||||
Library* library = libStack.back();
|
||||
libStack.pop_back();
|
||||
|
||||
Cell* cell = library->getCell( name );
|
||||
if (cell) return cell;
|
||||
|
||||
for ( Library* child : library->getLibraries() )
|
||||
libStack.push_back( child );
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
void DataBase::_toJson(JsonWriter* w) const
|
||||
// ****************************************
|
||||
{
|
||||
|
|
|
@ -290,9 +290,11 @@ ViaLayers Technology::getViaLayers() const
|
|||
|
||||
|
||||
Layer* Technology::getNthMetal ( int nth ) const
|
||||
{
|
||||
return getLayer ( _metalMask.nthbit(nth) );
|
||||
}
|
||||
{ return getLayer ( _metalMask.nthbit(nth) ); }
|
||||
|
||||
|
||||
Layer* Technology::getNthCut ( int nth ) const
|
||||
{ return getLayer ( _cutMask.nthbit(nth) ); }
|
||||
|
||||
|
||||
void Technology::_onDbuChange ( float scale )
|
||||
|
|
|
@ -86,6 +86,7 @@ class DataBase : public DBo {
|
|||
public: Library* getRootLibrary() const {return _rootLibrary;};
|
||||
public: Library* getLibrary(string,unsigned int flags);
|
||||
public: Cell* getCell(string, unsigned int flags);
|
||||
public: Cell* getCell(string);
|
||||
public: static DataBase* getDB();
|
||||
|
||||
};
|
||||
|
|
|
@ -109,10 +109,11 @@ namespace Hurricane {
|
|||
template<typename IntType>
|
||||
inline Mask<IntType> Mask<IntType>::nthbit ( unsigned int nth ) const
|
||||
{
|
||||
++nth;
|
||||
IntType select = 1;
|
||||
for ( ; select ; select=select<<1 ) {
|
||||
if ( _mask & select ) nth--;
|
||||
if ( !nth ) break;
|
||||
if (_mask & select) nth--;
|
||||
if (not nth) break;
|
||||
}
|
||||
return select;
|
||||
}
|
||||
|
|
|
@ -97,6 +97,7 @@ namespace Hurricane {
|
|||
Layer* getCutBelow ( const Layer*, bool useWorking=true ) const;
|
||||
Layer* getViaBetween ( const Layer*, const Layer* ) const;
|
||||
Layer* getNthMetal ( int ) const;
|
||||
Layer* getNthCut ( int ) const;
|
||||
// Updators.
|
||||
void setName ( const Name& );
|
||||
bool setWorkingLayer ( const Name& );
|
||||
|
|
|
@ -17,6 +17,7 @@
|
|||
#include "hurricane/isobar/PyDataBase.h"
|
||||
#include "hurricane/isobar/PyTechnology.h"
|
||||
#include "hurricane/isobar/PyLibrary.h"
|
||||
#include "hurricane/isobar/PyCell.h"
|
||||
|
||||
|
||||
namespace Isobar {
|
||||
|
@ -96,6 +97,26 @@ extern "C" {
|
|||
return PyLibrary_Link(library);
|
||||
}
|
||||
|
||||
|
||||
static PyObject* PyDataBase_getCell ( PyDataBase* self, PyObject* args ) {
|
||||
cdebug_log(20,0) << "PyDataBase_getCell ()" << endl;
|
||||
|
||||
Cell* cell = NULL;
|
||||
|
||||
HTRY
|
||||
METHOD_HEAD("DataBase.getCell()")
|
||||
char* name = NULL;
|
||||
if (PyArg_ParseTuple(args,"s:DataBase.getCell", &name)) {
|
||||
cell = db->getCell( name );
|
||||
} else {
|
||||
PyErr_SetString ( ConstructorError, "invalid number of parameters for DataBase.getCell." );
|
||||
return NULL;
|
||||
}
|
||||
HCATCH
|
||||
|
||||
return PyCell_Link( cell );
|
||||
}
|
||||
|
||||
|
||||
// Standart Accessors (Attributes).
|
||||
// Standart Destroy (Attribute).
|
||||
|
@ -110,8 +131,9 @@ extern "C" {
|
|||
, "Create the DataBase (only the first call created it)" }
|
||||
, { "getDB" , (PyCFunction)PyDataBase_getDB , METH_NOARGS|METH_STATIC
|
||||
, "Get the DataBase" }
|
||||
, { "getTechnology" , (PyCFunction)PyDataBase_getTechnology , METH_NOARGS, "Return the Technology" }
|
||||
, { "getRootLibrary", (PyCFunction)PyDataBase_getRootLibrary, METH_NOARGS, "Return the root library" }
|
||||
, { "getTechnology" , (PyCFunction)PyDataBase_getTechnology , METH_NOARGS , "Return the Technology" }
|
||||
, { "getRootLibrary", (PyCFunction)PyDataBase_getRootLibrary, METH_NOARGS , "Return the root library" }
|
||||
, { "getCell" , (PyCFunction)PyDataBase_getCell , METH_VARARGS, "Return a Cell" }
|
||||
, { "destroy" , (PyCFunction)PyDataBase_destroy , METH_NOARGS
|
||||
, "Destroy associated hurricane object The python object remains." }
|
||||
, {NULL, NULL, 0, NULL} /* sentinel */
|
||||
|
|
|
@ -224,15 +224,15 @@ extern "C" {
|
|||
|
||||
extern PyObject* PyDbU_setPhysicalsPerGrid ( PyObject* , PyObject* args )
|
||||
{
|
||||
double gridsPerLambda = 0.0;
|
||||
unsigned int power = 0;
|
||||
double physicalsPerGrid = 0.0;
|
||||
unsigned int power = 0;
|
||||
|
||||
HTRY
|
||||
if (not PyArg_ParseTuple(args,"di:DbU.setPhysicalsPerGrid", &gridsPerLambda, &power) ) {
|
||||
if (not PyArg_ParseTuple(args,"di:DbU.setPhysicalsPerGrid", &physicalsPerGrid, &power) ) {
|
||||
PyErr_SetString ( ConstructorError, "DbU.setPhysicalsPerGrid(): Invalid/bad type parameters ." );
|
||||
return NULL;
|
||||
}
|
||||
DbU::setPhysicalsPerGrid(gridsPerLambda,(DbU::UnitPower)power);
|
||||
DbU::setPhysicalsPerGrid(physicalsPerGrid,(DbU::UnitPower)power);
|
||||
HCATCH
|
||||
|
||||
Py_RETURN_NONE;
|
||||
|
|
|
@ -1046,7 +1046,7 @@ namespace Hurricane {
|
|||
// Class : "Hurricane::CellWidget".
|
||||
|
||||
|
||||
int CellWidget::_initialSide = 250;
|
||||
int CellWidget::_initialSide = 500;
|
||||
|
||||
|
||||
CellWidget::CellWidget ( QWidget* parent )
|
||||
|
@ -1088,8 +1088,10 @@ namespace Hurricane {
|
|||
QFont font = Graphics::getNormalFont();
|
||||
_textFontHeight = QFontMetrics(font).ascent();
|
||||
|
||||
if (Graphics::isHighDpi()) resize( Graphics::toHighDpi(_initialSide)
|
||||
, Graphics::toHighDpi(_initialSide) );
|
||||
if (Graphics::isHighDpi()) {
|
||||
resize( Graphics::toHighDpi(_initialSide)
|
||||
, Graphics::toHighDpi(_initialSide) );
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
|
Loading…
Reference in New Issue