It looks like you're new here. If you want to get involved, click one of these buttons!
Hello,
I want to make a big array of instance from macro file.
When I make one cell, and make it and array by myself, even if it is super big, it creates really fast.
However, when I try to make it from the macro code, it takes a lot of time. sometime, when the input(size of column) is too big, the program stops working.
I used for loop for this implementation.
here is my code.
row and col will be input from initialize method.
and this code is running in the produce_impl method.
'''
row.times do |i| # x axis
col.times do |j| # y axis
# lb_u => Left Below point of upper PCell // ru_u => Right Upper point of upper PCell
# lu_l => Left Upper point of Lower PCell // rb_l => Right Below point of Lower PCell
# Upper PCell
# s_1
# rule 1
puts "#{cnt}"
cnt += 1
x_s_1_lb_u = j * width
y_s_1_lb_u = i*h_whole # Since it is half squre, so it should go up for the next row as 1.5 times of whole hight
x_s_1_ru_u = x_s_1_lb_u + width
y_s_1_ru_u = y_s_1_lb_u + viaSource/2
# s_2
# rule 2
x_s_2_lb_u = x_s_1_lb_u
y_s_2_lb_u = y_s_1_lb_u
x_s_2_ru_u = x_s_1_ru_u
y_s_2_ru_u = y_s_2_lb_u + ohmSource/2
# s_3
# rule 3, 4
x_s_3_lb_u = x_s_1_lb_u
y_s_3_lb_u = y_s_1_lb_u
x_s_3_ru_u = x_s_1_ru_u
y_s_3_ru_u = y_s_3_lb_u + pPlus/2
# s_4
# rule 5
#### need to edit!!
x_s_4_lb_u = x_s_1_lb_u
y_s_4_lb_u = y_s_2_ru_u + 1.5 # 1.5 is temporary default value
x_s_4_ru_u = x_s_1_ru_u
y_s_4_ru_u = y_s_4_lb_u + pGate
# s_5
# rule 6
x_s_5_lb_u = x_s_1_lb_u
x_s_5_ru_u = x_s_1_ru_u
y_s_5_ru_u = y_s_4_lb_u + 0.75 # 0.75 is temporary default value
y_s_5_lb_u = y_s_5_ru_u - nSource
# s_6
# rule 7
x_s_6_lb_u = x_s_1_lb_u
y_s_6_lb_u = y_s_1_lb_u
x_s_6_ru_u = x_s_1_ru_u
y_s_6_ru_u = y_s_5_ru_u + nChan
# s_7
# rule 8, 11
x_s_7_lb_u = x_s_1_lb_u
x_s_7_ru_u = x_s_1_ru_u
y_s_7_ru_u = y_s_6_ru_u + jFET
y_s_7_lb_u = y_s_7_ru_u - ohmGate
# s_8
# rule 9, 10
x_s_8_lb_u = x_s_1_lb_u
x_s_8_ru_u = x_s_1_ru_u
y_s_8_ru_u = y_s_7_ru_u
y_s_8_lb_u = y_s_8_ru_u - viaGate
# Lower PCell
x_s_1_lu_l = x_s_1_lb_u
y_s_1_lu_l = -y_s_1_lb_u + i*h_whole*2
x_s_1_rb_l = x_s_1_ru_u
y_s_1_rb_l = -y_s_1_ru_u + i*h_whole*2
x_s_2_lu_l = x_s_2_lb_u
y_s_2_lu_l = -y_s_2_lb_u + i*h_whole*2
x_s_2_rb_l = x_s_2_ru_u
y_s_2_rb_l = -y_s_2_ru_u + i*h_whole*2
x_s_3_lu_l = x_s_3_lb_u
y_s_3_lu_l = -y_s_3_lb_u + i*h_whole*2
x_s_3_rb_l = x_s_3_ru_u
y_s_3_rb_l = -y_s_3_ru_u + i*h_whole*2
x_s_4_lu_l = x_s_4_lb_u
y_s_4_lu_l = -y_s_4_lb_u + i*h_whole*2
x_s_4_rb_l = x_s_4_ru_u
y_s_4_rb_l = -y_s_4_ru_u + i*h_whole*2
x_s_5_lu_l = x_s_5_lb_u
y_s_5_lu_l = -y_s_5_lb_u + i*h_whole*2
x_s_5_rb_l = x_s_5_ru_u
y_s_5_rb_l = -y_s_5_ru_u + i*h_whole*2
x_s_6_lu_l = x_s_6_lb_u
y_s_6_lu_l = -y_s_6_lb_u + i*h_whole*2
x_s_6_rb_l = x_s_6_ru_u
y_s_6_rb_l = -y_s_6_ru_u + i*h_whole*2
x_s_7_lu_l = x_s_7_lb_u
y_s_7_lu_l = -y_s_7_lb_u + i*h_whole*2
x_s_7_rb_l = x_s_7_ru_u
y_s_7_rb_l = -y_s_7_ru_u + i*h_whole*2
x_s_8_lu_l = x_s_8_lb_u
y_s_8_lu_l = -y_s_8_lb_u + i*h_whole*2
x_s_8_rb_l = x_s_8_ru_u
y_s_8_rb_l = -y_s_8_ru_u + i*h_whole*2
# Upper PCell
cell.shapes(layout.layer(1000, 0)).insert(RBA::Box::new(x_s_1_lb_u/dbu, y_s_1_lb_u/dbu, x_s_1_ru_u/dbu, y_s_1_ru_u/dbu))
cell.shapes(layout.layer(1000, 0)).insert(RBA::Box::new(x_s_8_lb_u/dbu, y_s_8_lb_u/dbu, x_s_8_ru_u/dbu, y_s_8_ru_u/dbu))
cell.shapes(layout.layer(1001, 0)).insert(RBA::Box::new(x_s_2_lb_u/dbu, y_s_2_lb_u/dbu, x_s_2_ru_u/dbu, y_s_2_ru_u/dbu))
cell.shapes(layout.layer(1001, 0)).insert(RBA::Box::new(x_s_7_lb_u/dbu, y_s_7_lb_u/dbu, x_s_7_ru_u/dbu, y_s_7_ru_u/dbu))
cell.shapes(layout.layer(1002, 0)).insert(RBA::Box::new(x_s_4_lb_u/dbu, y_s_4_lb_u/dbu, x_s_4_ru_u/dbu, y_s_4_ru_u/dbu))
cell.shapes(layout.layer(1003, 0)).insert(RBA::Box::new(x_s_3_lb_u/dbu, y_s_3_lb_u/dbu, x_s_3_ru_u/dbu, y_s_3_ru_u/dbu))
cell.shapes(layout.layer(1004, 0)).insert(RBA::Box::new(x_s_5_lb_u/dbu, y_s_5_lb_u/dbu, x_s_5_ru_u/dbu, y_s_5_ru_u/dbu))
cell.shapes(layout.layer(1005, 0)).insert(RBA::Box::new(x_s_6_lb_u/dbu, y_s_6_lb_u/dbu, x_s_6_ru_u/dbu, y_s_6_ru_u/dbu))
# puts"#{x_s_5_lb_u}, #{y_s_5_lb_u}, #{x_s_5_ru_u}, #{y_s_5_ru_u}"
# Lower PCell
cell.shapes(layout.layer(1000, 0)).insert(RBA::Box::new(x_s_1_lu_l/dbu, y_s_1_lu_l/dbu, x_s_1_rb_l/dbu, y_s_1_rb_l/dbu))
cell.shapes(layout.layer(1000, 0)).insert(RBA::Box::new(x_s_8_lu_l/dbu, y_s_8_lu_l/dbu, x_s_8_rb_l/dbu, y_s_8_rb_l/dbu))
cell.shapes(layout.layer(1001, 0)).insert(RBA::Box::new(x_s_2_lu_l/dbu, y_s_2_lu_l/dbu, x_s_2_rb_l/dbu, y_s_2_rb_l/dbu))
cell.shapes(layout.layer(1001, 0)).insert(RBA::Box::new(x_s_7_lu_l/dbu, y_s_7_lu_l/dbu, x_s_7_rb_l/dbu, y_s_7_rb_l/dbu))
cell.shapes(layout.layer(1002, 0)).insert(RBA::Box::new(x_s_4_lu_l/dbu, y_s_4_lu_l/dbu, x_s_4_rb_l/dbu, y_s_4_rb_l/dbu))
cell.shapes(layout.layer(1003, 0)).insert(RBA::Box::new(x_s_3_lu_l/dbu, y_s_3_lu_l/dbu, x_s_3_rb_l/dbu, y_s_3_rb_l/dbu))
cell.shapes(layout.layer(1004, 0)).insert(RBA::Box::new(x_s_5_lu_l/dbu, y_s_5_lu_l/dbu, x_s_5_rb_l/dbu, y_s_5_rb_l/dbu))
cell.shapes(layout.layer(1005, 0)).insert(RBA::Box::new(x_s_6_lu_l/dbu, y_s_6_lu_l/dbu, x_s_6_rb_l/dbu, y_s_6_rb_l/dbu))
end
end
'''
Firstly, I calculated all four points of boxes, and then, put them on the layers.
I found if I take cell.shapes out (Just simply commented them out), the running speed increased a lot, but still took a lot of time.
but when I put them in the double for loop, if I input big number when I create this instance, CPU runs a lot and it almost runs infinitely.
I know this is really inefficient way to create many cells as one instance.
I hope there is any other efficient way to create big array of cells.
Thank you very much ![]()
Comments
Hi,
first of all you can speed up your code by taking out a few calls from your loop, e.g.
From what I see, your code multiplies the same pattern, so you can write
It should be faster then as it precomputes the box and uses a single call to move it to the target position.
You should also take out the "puts" - it will consume a lot of time.
If this is still too slow, consider creating a cell containing the precomputed geometry and using an instance array to place it:
Matthias