Make a circle array


I'd like to know if there is a way to make circle arrays?
For example, I make a cell and draw a small square 10nm x 10nm, and I want to make a circle array in radius 1 mm with this square, if it is possible?

Thank you very much in advance.


  • Hi,

    That's kind of a challenge because you would create 100000x100000 (10^10) squares. So flat shape generation rules out. GDS does not support anything except matrix arrays, so you cannot just draw it.

    I tried the Fill utility which errors out with bad alloc (memory overflow). So finally there is only analytic generation of these arrays through an algorithm.


  • Hello I encountered the similar problem, would you please let me know how you did it finally?

  • I did not solve, just suggest a solution path.

  • Things I find in the Forum's

    # Honey PCell # # This sample PCell implements a library called "HoneyPCellLibrary" with a single PCell that # provides a honeycomb array module HoneyPCellLibrary include RBA # Remove any definition of our classes (this helps when # reexecuting this code after a change has been applied) HoneyPCellLibrary.constants.member?(:HoneyPCellLibrary) && remove_const(:HoneyPCellLibrary) HoneyPCellLibrary.constants.member?(:HoneyPCell) && remove_const(:HoneyPCell) # The PCell declaration for ?????? class HoneyPCell < PCellDeclarationHelper include RBA def initialize # Important: initialize the super class super # declare the parameters # l : Layer # sq : size of square to be arrayed # nr : Number of rows # nc: Number of Columns # p: Pitch param(:l, TypeLayer, "Layer", :default => LayerInfo::new(1, 0)) param(:sq, TypeDouble, "Square size", :default => 5, :unit => "µm") param(:nc, TypeInt, "Number of Columns", :default => 5) param(:nr, TypeInt, "Number of Rows", :default => 5) param(:p, TypeDouble, "Pitch", :default => 20, :unit => "µm") end def display_text_impl # Provide a descriptive text for the cell ??? "HoneyPCell(L=#{l.to_s},N=#{'%d' % nr.to_i})" end def produce_impl # Define shape step x = 0.0 y = 0.0 # s: vertical stepping pitch s = Math::sqrt((p*p)-((p/2)*(p/2))) # row loop nr.times do |j| # Column loop nc.times do |i| # shapes to be looped # selects all "white" fields in a chess board if (i + j) % 2 == 0 cell.shapes(l_layer).insert(RBA::DBox::new(x, y,x+sq,y+sq )) #Finally, if you want to produce circles instead of boxes use: cell.shapes(l_layer).insert(RBA::DPolygon::ellipse(RBA::DBox::new(x, y,x+sq,y+sq), 100)) end x = x+p/2 # end column loop end x=0 y = y+s # end row loop end end end # The library where we will put the PCell into class HoneyPCellLibrary < Library def initialize # Set the description self.description = "Honey PCell Library" # Create the PCell declarations layout.register_pcell("HoneyPCell", HoneyPCell::new) # That would be the place to put in more PCells ... # Register us with the name "MyLib". # If a library with that name already existed, it will be replaced then. register("HoneyPCellLibrary") end end # Instantiate and register the library HoneyPCellLibrary::new end
Sign In or Register to comment.