13 March 2020 at 12:09 #6035
I am attempting to use Nazca to create an electron-beam lithography mask that has sub-1-nm fracture grid. I am using KLayout as my GDS viewier. KLayout GDS files normally default to a 1-nm grid; in KLayout, it is straightforward to change this by using “File>>Save as…” and changing the database unit in the resulting dialog box. Setting it to 1e-5 allows geometry to be defined to 0.01 nm, for example (provided I understand this correctly).
A separate thread discussed how to change the database unit in Nazca (https://nazca-design.org/forums/topic/changing-gds-database-units/), so I gave that a try and changed gds_base.gds_db_unit to 1e-11 from the default 1e-9. However, this caused all of the patterns to shrink by a factor of 100 as well.
I attempted to correct this by using the “scale” keyword argument in the .put() method, to just scale everything back up. This worked in a simple case, but cells with deeper than 1 level of hierarchy don’t scale properly; they are rounded to the original database unit.
See the code below:
import nazca as nd nd.gds_base.gds_db_unit = 1e-11 nd.add_layer(name='one',layer=1,accuracy=1e-5) nd.add_layer(name='two',layer=2,accuracy=1e-5) nd.strt(length=1.15e-3,width=1,layer='one').put(scale=100) with nd.Cell() as x: nd.strt(length=1.15e-3,width=1,layer='two').put() x.put(0,0,scale=100) nd.export_gds(filename='tinyguy.gds')
The strt object in layer ‘one’ is scaled properly and has the proper length (1.15nm) but the strt object in layer ‘two’, which is inside of the ‘x’ instance, is rounded down to 1nm.
Is there a more proper way to do this?
Thanks in advance for your help.13 March 2020 at 17:09 #6037
I was able to find the problem with my code. The “nd.gds_base.gds_db_user” variable also needs to be reduced by the same amount as “nd.gds_base.gds_db_unit”, then the GDS shapes scale properly without using the “scale” keyword argument when putting the cell and sub-1-nm geometry is drawn correctly.
So the following code has the expected behavior:
import nazca as nd unit=1e-5 nd.gds_base.gds_db_unit = unit*1e-6 nd.gds_base.gds_db_user = unit nd.clear_layers() nd.add_layer(name='one',layer=1,accuracy=1e-5) nd.add_layer(name='two',layer=2,accuracy=1e-5) nd.strt(length=1.15e-3,width=1e-3,layer='one').put() with nd.Cell() as x: nd.strt(length=1.15e-3,width=1e-3,layer='two').put() x.put(0,0) nd.export_gds(filename='tinyguy.gds')14 March 2020 at 17:09 #6041
What would we be without garbagebags?
Thanks for updating with the solution.
You must be logged in to reply to this topic.