I wrote a PCell program for a MEMS project recently. The code imitates virtuoso automatic generated PCell program. It looks lengthy and run very slowly.
How can i make it more effective?
1. How to retrieve PCell parameters more simply. Here is my let paragraph, looks ugly:
let((p1_d1 p1_r2 p1_r3 v1_r p1_leaf_style p1_leaf_l p1_leaf_w p1_leaf_hd
p1_notch_w p1_slot_angle p1_slot_ir p1_slot_or p1_slot p2_notch_angle
p2_notch_ir p2_notch_or p2_notch ang ang0 ang1 angi inita DPI x y i num
p1 p2 p3 p4 sides
pcInst pcParameters pcParamProp pcLayer pcPurpose
) ;local parameters
(pcLib = (pcCellView~>lib))
;Retrieve pCell parameters
(pcParameters = ((pcCellView~>parameters)~>value))
(pcParamProp = car(exists(prop pcParameters
((prop~>name) == "P1_Visible")
)
))
(p1v = (pcParamProp~>value));P1_Visible
(pcParamProp = car(exists(prop pcParameters
((prop~>name) == "P2_Style")
)
))
(p2s = (pcParamProp~>value));P2_Style
(pcParamProp = car(exists(prop pcParameters
((prop~>name) == "P1_D1")
)
))
(p1_d1 = (pcParamProp~>value));P1_D1
(pcParamProp = car(exists(prop pcParameters
((prop~>name) == "P2_D1")
)
))
(p2_d1 = (pcParamProp~>value));P2_D1
(pcParamProp = car(exists(prop pcParameters
((prop~>name) == "P1_R2")
)
))
(p1_r2 = (pcParamProp~>value));P1_R2
(pcParamProp = car(exists(prop pcParameters
((prop~>name) == "P2_R2")
)
))
(p2_r2 = (pcParamProp~>value));P2_R2
(pcParamProp = car(exists(prop pcParameters
((prop~>name) == "P1_R3")
)
))
(p1_r3 = (pcParamProp~>value));P1_R3
(pcParamProp = car(exists(prop pcParameters
((prop~>name) == "P2_R3")
)
))
(p2_r3 = (pcParamProp~>value));P2_R3
(pcParamProp = car(exists(prop pcParameters
((prop~>name) == "V1_R")
)
))
(v1_r = (pcParamProp~>value)) ;V1_R
(pcParamProp = car(exists(prop pcParameters
((prop~>name) == "V1_L")
)
))
(v1_l = (pcParamProp~>value));V1_L
(pcParamProp = car(exists(prop pcParameters
((prop~>name) == "V3_D")
)
))
(v3_d = (pcParamProp~>value));V3_D
(pcParamProp = car(exists(prop pcParameters
((prop~>name) == "V3_SP")
)
))
(v3_sp = (pcParamProp~>value));V3_SP
(pcParamProp = car(exists(prop pcParameters
((prop~>name) == "V3_EE")
)
))
(v3_ee = (pcParamProp~>value));V3_EE
(pcParamProp = car(exists(prop pcParameters
((prop~>name) == "P1_Leaf_Style")
)
))
(p1_leaf_style = (pcParamProp~>value)) ;P1_Leaf_Style
(pcParamProp = car(exists(prop pcParameters
((prop~>name) == "P1_Leaf_L")
)
))
(p1_leaf_l = (pcParamProp~>value)) ;P1_Leaf_L
(pcParamProp = car(exists(prop pcParameters
((prop~>name) == "P1_Leaf_W")
)
))
(p1_leaf_w = (pcParamProp~>value)) ;P1_Leaf_W
(pcParamProp = car(exists(prop pcParameters
((prop~>name) == "P1_Leaf_HD")
)
))
(p1_leaf_hd = (pcParamProp~>value)) ;P1_Leaf_HD
(pcParamProp = car(exists(prop pcParameters
((prop~>name) == "P1_Notch_W")
)
))
(p1_notch_w = (pcParamProp~>value)) ;P1_Notch_W
(pcParamProp = car(exists(prop pcParameters
((prop~>name) == "P2_Notch_W")
)
))
(p2_notch_w = (pcParamProp~>value)) ;P2_Notch_W
2. How to fill shape A with array of circular shape B efficiently,
make sure B is inside A and the distance of B edge to A edge should be larger than 3um?
I tried to use dbCreateEllipse in multiple loops. And it took several minutes to get a final result, seems very inefficient.