It looks like you're new here. If you want to get involved, click one of these buttons!
Here is a DRC script to generate dummies for the chip finishing.
Although dummies are often a box, I have included an example with a polygon (a cross shape).
I have imagined all those dummies and theyr do not target a specific process and they will probably not fit with your target dummies density.
For further options, you can have a look at : https://www.klayout.de/doc-qt5/about/drc_ref_layer.html#k_37
or https://www.klayout.de/forum/discussion/550/using-the-fill-tool
Anyhow, it will generate the dummies cells directly on the toplevel cell.
Does anyone could help to improve my script to generate all those dummies in a separate cell called "DUMMIES_TOP" ? It would help a lot.
Thanks, BRgds,
Laurent
########################
# DUMMIES generation
########################
tstart = Time.now
if $in_gds
if $topcell
source($in_gds,$topcell)
else
source($in_gds)
end
end
if $report_file
report($report_file)
else
report("DUMMIES generation runset", File.join(File.dirname(RBA::CellView::active.filename), "dumm.lydrc"))
end
require "logger"
log_file(File.join(File.dirname(RBA::CellView::active.filename), "log_DUMM.txt"))
# options
########################
# KLAYOUT setup
########################
# Use a tile size of 1mm
tiles(1000.um)
# Use a tile border of 10 micron:
#tile_borders(10.um)
no_borders
# hierarchical
deep
# Use 8 CPU cores
threads(8)
verbose(true)
# layers definitions
########################
info("Layers definitions")
NWELL = input(1,0)
ACTIVE = input(2,0)
POLY = input(3,0)
METAL1 = input(10,0)
METAL1_dmyblk = input(10,2)
METAL2 = input(20,0)
METAL2_dmyblk = input(20,2)
METAL3 = input(30,0)
METAL3_dmyblk = input(30,2)
METAL4 = input(40,0)
METAL4_dmyblk = input(40,2)
EXTENT_ALL = source.extent
EXCL_DIFPL = (NWELL + ACTIVE + POLY).sized(2.0)
ACT_fill = fill_pattern("DUMM_ACT")
hull = [ RBA::DPoint::new(1, 0), RBA::DPoint::new(1, 1), RBA::DPoint::new(0, 1), RBA::DPoint::new(0, 2),
RBA::DPoint::new(1, 2), RBA::DPoint::new(1, 3), RBA::DPoint::new(2, 3), RBA::DPoint::new(2, 2),
RBA::DPoint::new(3, 2), RBA::DPoint::new(3, 1), RBA::DPoint::new(2, 1), RBA::DPoint::new(2, 0)]
ACT_fill.shape(2, 1, polygon(hull))
ACT_fill.origin(-1, -1)
(EXTENT_ALL - EXCL_DIFPL).fill(ACT_fill, hstep(4.0), vstep(4.0))
POLY_fill = fill_pattern("DUMM_POLY")
POLY_fill.shape(3, 1, box(0, 0, 3, 3))
POLY_fill.origin(-3, -3)
(EXTENT_ALL - EXCL_DIFPL).fill(POLY_fill, hstep(4.0), vstep(4.0))
M1_fill = fill_pattern("DUMM_METAL1")
M1_fill.shape(10, 1, box(0, 0, 3, 1))
M1_fill.origin(-1.0, -1.0)
(EXTENT_ALL - (METAL1.sized(3.0)) - METAL1_dmyblk).fill(M1_fill, hstep(4.0), vstep(2.0))
M2_fill = fill_pattern("DUMM_METAL2")
M2_fill.shape(20, 1, box(0, 0, 1, 3))
M2_fill.origin(-1.0, -1.0)
(EXTENT_ALL - (METAL2.sized(3.0)) - METAL2_dmyblk).fill(M2_fill, hstep(2.0), vstep(4.0))
M3_fill = fill_pattern("DUMM_METAL3")
M3_fill.shape(30, 1, box(0, 0, 3, 1))
M3_fill.origin(-1.0, -1.0)
(EXTENT_ALL - (METAL3.sized(3.0)) - METAL3_dmyblk).fill(M3_fill, hstep(4.0), vstep(2.0))
M4_fill = fill_pattern("DUMM_METAL4")
M4_fill.shape(40, 1, box(0, 0, 1, 3))
M4_fill.origin(-1.0, -1.0)
(EXTENT_ALL - (METAL4.sized(3.0)) - METAL4_dmyblk).fill(M4_fill, hstep(2.0), vstep(4.0))
time = Time.now
hours = ((time - tstart)/3600).to_i
minutes = ((time - tstart)/60 - hours * 60).to_i
seconds = ((time - tstart) - (minutes * 60 + hours * 3600)).to_i
info("DRC finished at : #{time.hour}:#{time.min}:#{time.sec} - DRC duration = #{hours} hrs. #{minutes} min. #{seconds} sec.\n")
$stdout.write "DUMMIES generation finished at : #{time.hour}:#{time.min}:#{time.sec} - DRC duration = #{hours} hrs. #{minutes} min. #{seconds} sec.\n"
Comments
Hi Laurent,
as a sample how this can be done, here is my Metal1 fill implementation for the IHP sg13g2 PDK. It puts the Metal1 fill in the cell "METAL1_FILL":
This will need version 0.30.3. Note however, that the fill feature has a small bug in 0.30.3 that may degrade performance and produce too many fill instances (https://github.com/KLayout/klayout/issues/2112). That is going to be fixed in 0.30.4.
Matthias