Home Forums Nazca Questions and Answers Sub-1-nm geometry

This topic contains 2 replies, has 2 voices, and was last updated by  Ronald 2 weeks, 1 day ago.

Viewing 3 posts - 1 through 3 (of 3 total)
  • Author
    Posts
  • #6035

    garbagebag
    Member

    Hello,

    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.

     

    #6037

    garbagebag
    Member

    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')
    #6041

    Ronald
    Keymaster

    What would we be without garbagebags?

    Thanks for updating with the solution.

    Romald

Viewing 3 posts - 1 through 3 (of 3 total)

You must be logged in to reply to this topic.