vincentlv / DimmiLitho

Include pixel-based mask synthesis, imaging model for optical lithography in Python
MIT License
62 stars 28 forks source link

GDS scale error #4

Open mguthaus opened 2 years ago

mguthaus commented 2 years ago

Hi,

I believe that your GDS parser uses a fixed scale of 0.001 (1000): https://github.com/vincentlv/DimmiLitho/blob/2d3d335bdab8ae628f328c264b655b180881e3a1/litho/mask.py#L110

However, the NanGate library uses a scale of 0.0001 (10000). Therefore, the dimensions of the mask are off by 10x.

If you look at the contact width (layer 10) in the NOR2_X2.gds example, they should have a width of 65nm but instead, we see 650nm if you print out the polygon data.

Matt

mguthaus commented 2 years ago

If you want a discussion of the scaling, it is described here: https://boolean.klaasholwerda.nl/interface/bnf/gdsformat.html#rec_header

And here is the output of the NanGate library cells: GDS II Version 3 Date Modified:110,12,27,19,6,9 Date Last Accessed:110,12,27,19,6,9 Library: NangateOpenCellLibrary Units: 1 user unit=0.0001 database units, 1 database unit=1e-10 meters. End of GDSII Header Found

A 0.065um contact in NOR2_X2.gds is this in the GDS database units:

            BeginBoundary
            Drawing Layer: 10
            Purpose Layer: 0
                    XY Point: 850,950
                    XY Point: 1500,950
                    XY Point: 1500,1600
                    XY Point: 850,1600
                    XY Point: 850,950
            EndBoundary

Which is 650x650 database units. To get this to 0.065nm, you need to divide by 10000, not 1000.

mguthaus commented 2 years ago

When you fix the scaling as above, the ILT then does not work. It produces blank results with this warning on NOR2_X2.gds:

Calculating ILT /home/mrg/litho/DimmiLitho/litho/ilt.py:190: RuntimeWarning: divide by zero encountered in double_scalars stepsize = self.stepSize / np.max(abs(deta)) /home/mrg/litho/DimmiLitho/litho/ilt.py:191: RuntimeWarning: invalid value encountered in multiply newTheta = self.masktheta - stepsize * deta Interation index: 0, Costfunction value: 0.123713.

mguthaus commented 2 years ago

Note, I also had to adjust the m.x_gridsize and m.y_gridsize to 0.25 or else the mask did not have enough resolution.

mguthaus commented 2 years ago

It seems that ILT works but RobustILT fails...

vincentlv commented 1 year ago

Note, I also had to adjust the m.x_gridsize and m.y_gridsize to 0.25 or else the mask did not have enough resolution.

Hi. Sorry for this issue. The unit of x_gridsize is nm, and 0.25 is too small. As a workaround, we can adjust the scaling manually when we parsing the GDS. We can plot mask image to double check. For example, if gridsize is set to 2 nm, and CD is 50 nm, then it will take almost 5 pixels in the image.