Help to give some ideas to write code to add dummy layer

T

Tech11

Guest
Hello everyone,

I need to write one script to add dummy layer to resolve the density
question of verification, but I don't know how to do it, who may help to
give some ideas? Thanks for your help!

Have a good day!

B.R.

Joffre
 
I need to write one script to add dummy layer to resolve the density
question of verification, but I don't know how to do it, who may help to
give some ideas? Thanks for your help!
You can usually do it with DRC verification software. For example, assura has commands generateFill
and generateCustomFill to do it. You would need to create a custom deck.

Doing it with SKILL code is also possible. I would generate a fill pattern the size of the layout,
, then generate a temporary layer covering areas empty of metal, using dbLayerAndNot() and
dbLayerSize() for example, then keep the fill patterns inside that area by dbLayerInside().

I however believe the SKILL solution will be heavy for large layouts.

stéphane
 
Tech11 wrote:
Hello everyone,

I need to write one script to add dummy layer to resolve the density
question of verification, but I don't know how to do it, who may help to
give some ideas? Thanks for your help!
Joffre , here is how to do it with assura.

the assura_tech.lib in your work directory point to a directory containing the
file "techRuleSets". Go to that dir. In the techRuleSets file, add this:

ruleSet( "tile"
(DrcRules "./tile/tile.rul" )
(DrcInclude "./tile/tile.rsf" )
)

Create the directory "tile"

In that directory create a file tile.rul containing this (adapted to your layers
as necessary) this is just an example for an imaginary technology (any
resemblance et coetera ...) :

drcExtractRules(
layerDefs( "df2"
nweli = layer( "NWELL" )
diffi = layer( "DIFF" )
pdiffi = layer( "PDIFF" )
ndiffi = layer( "NDIFF" )
od2i = layer( "OD2" )
polyi = layer( "POLY1" )
ppi = layer( "PIMP" )
npi = layer( "NIMP" )
coi = layer( "CONT" )
m1i = layer( "METAL1" type("drawing") )
via1i = layer( "VIA12" )
m2i = layer( "METAL2" type("drawing") )
via2i = layer( "VIA23" )
m3i = layer( "METAL3" type("drawing") )
via3i = layer( "VIA34" )
m4i = layer( "METAL4" type("drawing") )
via4i = layer( "VIA45" )
m5i = layer( "METAL5" type("drawing") )
via5i = layer( "VIA56" )
m6i = layer( "METAL6" type("drawing") )
viadi = layer( "VIAD" )
mdi = layer( "MD" type("drawing") )
cbi = layer( "PAD" )
cbdi = layer( "CBD" )
ubmi = layer( "UBM" )
rpoi = layer( "RPO" )
ntni = layer( "NTN" )
plmidei = layer( "PLMIDE" )
dnwi = layer( "DNW" )
vtmpi = layer( "VTM_P" )
vtmni = layer( "VTM_N" )
hrii = layer( "HRI" )
m1sloti = layer( "METAL1" type("slot") )
m2sloti = layer( "METAL2" type("slot") )
m3sloti = layer( "METAL3" type("slot") )
m4sloti = layer( "METAL4" type("slot") )
m5sloti = layer( "METAL5" type("slot") )
m6sloti = layer( "METAL6" type("slot") )
mdsloti = layer( "MD" type("slot") )
m1dmy = layer( "METAL1" type("dummy") )
m2dmy = layer( "METAL2" type("dummy") )
m3dmy = layer( "METAL3" type("dummy") )
m4dmy = layer( "METAL4" type("dummy") )
m5dmy = layer( "METAL5" type("dummy") )
m6dmy = layer( "METAL6" type("dummy") )
mddmy = layer( "MD" type("dummy") )
ctm2i = layer( "CTM2" type("drawing") )
ctm3i = layer( "CTM3" type("drawing") )
ctm4i = layer( "CTM4" type("drawing") )
ctm5i = layer( "CTM5" type("drawing") )
hotwl = layer( "HOTWL" )
excl = layer( "EXCL" )
drcdmy = layer( "DRCDUMMY" )
rwdmy = layer( "RWDUMMY" )
dpdmy = layer( "DPDUMMY" )
pldmy = layer( "PLDUMMY" )
sdi = layer( "SDI" )
esd1dmy = layer( "ESD1DUMMY" )
esd2dmy = layer( "ESD2DUMMY" )
esd3dmy = layer( "ESD3DUMMY" )
ctmdmy = layer( "CTMDUMMY" )
rlppdmy = layer( "RLPPDUMMY" )
dmn2v = layer( "DMN2V" )
dmp2v = layer( "DMP2V" )
esexcl = layer( "ESEXCL" )
vardmy = layer( "VARDUMMY" )
pmdmy = layer( "PMDMY" )
fwi = layer( "FW" )
lwi = layer( "LW" type("drawing") )
esdi = layer( "ESD" )
inddmy = layer( "INDDUMMY" type("drawing") )
dmexcldmy1 = layer( "DMEXCL" type("dummy1") )
dmexcldmy2 = layer( "DMEXCL" type("dummy2") )
dmexcldmy3 = layer( "DMEXCL" type("dummy3") )
dmexcldmy4 = layer( "DMEXCL" type("dummy4") )
dmexcldmy5 = layer( "DMEXCL" type("dummy5") )
dmexcldmy6 = layer( "DMEXCL" type("dummy6") )
dmexcldmyall = layer( "hilite" type("drawing") )
)
;-----------------------------------------------------------------------------------
fillkeepout=0 /*microns*/
ivIf(switch("keep1u") then fillkeepout=fillkeepout+1 )
ivIf(switch("keep2u") then fillkeepout=fillkeepout+2 )
ivIf(switch("keep4u") then fillkeepout=fillkeepout+4 )
ivIf(switch("keep8u") then fillkeepout=fillkeepout+8 )
ivIf(switch("keep16u") then fillkeepout=fillkeepout+16 )
ivIf(switch("keep32u") then fillkeepout=fillkeepout+32 )
m6f=geomCat( geomSize( geomOr( m6 inddmy vardmy dmexcldmy6 dmexcldmyall )
fillkeepout ) )
m6fill = generateRectangle( m6f tileSize 4 tileSpacing 1 keepOut )
m5f=geomCat( geomSize( geomOr( m5 inddmy vardmy dmexcldmy5 dmexcldmyall )
fillkeepout ) )
m5fill = generateRectangle( m5f tileSize 4 tileSpacing 1 keepOut )
m4f=geomCat( geomSize( geomOr( m4 inddmy vardmy dmexcldmy4 dmexcldmyall )
fillkeepout ) )
m4fill = generateRectangle( m4f tileSize 4 tileSpacing 1 keepOut )
m3f=geomCat( geomSize( geomOr( m3 inddmy vardmy dmexcldmy3 dmexcldmyall )
fillkeepout ) )
m3fill = generateRectangle( m3f tileSize 4 tileSpacing 1 keepOut )
m2f=geomCat( geomSize( geomOr( m2 inddmy vardmy dmexcldmy2 dmexcldmyall )
fillkeepout ) )
m2fill = generateRectangle( m2f tileSize 4 tileSpacing 1 keepOut )
m1f=geomCat( geomSize( geomOr( m1 inddmy vardmy dmexcldmy1 dmexcldmyall )
fillkeepout ) )
m1fill = generateRectangle( m1f tileSize 4 tileSpacing 1 keepOut )
;m6f=geomCat( geomSize( geomOr( m6 inddmy vardmy dmexcldmy6 dmexcldmyall )
fillkeepout ) )
polyf=geomCat( geomSize( geomOr( poly inddmy vardmy dmexcldmy1 dmexcldmyall )
fillkeepout ) )
polyfill = generateRectangle( polyf tileSize 4 tileSpacing 1 keepOut )
;
-----------------------------------------------------------------------------------
);drc rules



In case you have not run assura DRC before, do it. Now edit the file
~/.drc.Last.state , and add in there a section like:

vuiDRCFormAdditionalFunctionsTable = '(
flattenCell nil
joinableNets nil
changeLabel nil
mustJoinNet nil
outFile (nil df2TechFile "" df2LibName "MyFirstSony" path
"/home/jdoe/cdsworkdir/" hierarchy "backward" layers ("outLayer( m1fill
\"METAL1\" type(\"dummy\") )" "outLayer( m2fill \"METAL2\" type(\"dummy\") )"
"outLayer( m3fill \"METAL3\" type(\"dummy\") )" "outLayer( m4fill \"METAL4\"
type(\"dummy\") )" "outLayer( m5fill \"METAL5\" type(\"dummy\") )" "outLayer(
m6fill \"METAL6\" type(\"dummy\") )
"))
deleteCellText nil
)


And in the DRC options, be sure you have toggled on the "output error lib" and
the "overwrite". Assura is cautious about modifying an existing database, so
look in the manual and read carefully the errors if it refuses to write in the
lib at first.

As you have noticed, the "hilite" layer is used in a creative way there. You may
prefer to add layers to the tech rather than do such trick.
 
On Tue, 18 Apr 2006 11:42:14 +0200, "S. Badel"
<stephane.badel@REMOVETHISepfl.ch> wrote:

I need to write one script to add dummy layer to resolve the density
question of verification, but I don't know how to do it, who may help to
give some ideas? Thanks for your help!

You can usually do it with DRC verification software. For example, assura has commands generateFill
and generateCustomFill to do it. You would need to create a custom deck.

Doing it with SKILL code is also possible. I would generate a fill pattern the size of the layout,
, then generate a temporary layer covering areas empty of metal, using dbLayerAndNot() and
dbLayerSize() for example, then keep the fill patterns inside that area by dbLayerInside().

I however believe the SKILL solution will be heavy for large layouts.

stéphane
The dbLayer procedures do not flatten the hierarchy, so they are of
limited use. I would go with the DRC tool approach. If you don't want to
use Assura, there is always Diva's density check and area fill. The
geomArrayShapes command not as sophisticated as the Assura fill
generators, but it gets the job done for most cases.

Create a fill cell:
rep = dbOpenCellViewByType("Lib" "filler" "layout" "maskLayout" "w")
dbCreateRect(rep list("m1" "boundary") list(0:0 0.3:0.3))
dbCreateRect(rep list("m1" "drawing1") list(0:0 0.15:0.15))
dbCreateRect(rep list("m1" "drawing2") list(0.05:0.075 0.1:0.37))
dbCreateRect(rep list("m1" "drawing3") list(0.075:0.05 0.37:0.1))

Tweak the fill cell to be appropriate for your process size.

Then a DRC deck:
drcExtractRules(
; remove the old fill so it does not interfere
geomErase("m1" "fill")
; collect the layer to fill
m1 = geomOr("m1")
; measure the density in the area occupied by m1
lowdensity = drc(m1 geomExtent(m1) coverage < 0.4 windowSize(10)
stepSize(2.5))
; keep fill shapes at least 0.1 from real m1
fillarea = geomAndNot(lowdensity geomSize(m1 0.1))
; get the fill shapes
filler = geomArrayShapes(fillarea "filler layout"
("m1" "drawing1") ("m1" "boundary"))
; only use fill shapes that are completely inside fillarea
fill = geomInside(filler fillarea)
if( avSwitch("connectFill")
then
conv = geomArrayShapes(met1 "filler layout"
("m1" "drawing2") ("m1" "boundary"))
conh = geomArrayShapes(met1 "filler layout"
("m1" "drawing3") ("m1" "boundary"))
; select connectors that touch two fill shapes
conv = geomOverlap(conv fill keep > 1)
conh = geomOverlap(conh fill keep > 1)
; merge it all together
fill = geomOr(fill conv conh)
)
; save to the design
saveDerived(fill ("m1" "fill"))
)

If it does not work quite the way you want, play with it some.
 

Welcome to EDABoard.com

Sponsor

Back
Top