mirror of https://github.com/KLayout/klayout.git
72 lines
2.3 KiB
Ruby
72 lines
2.3 KiB
Ruby
|
|
|
||
|
|
|
||
|
|
# create one level of recursion
|
||
|
|
# unless the level is deeper than the maximum level, create a new cell and instantiate this in
|
||
|
|
# the given upper cell four times rendering the Sierpinski curve.
|
||
|
|
|
||
|
|
def create_recursion( layout, cell_id, layer_id, rec_level )
|
||
|
|
|
||
|
|
if rec_level > 20
|
||
|
|
|
||
|
|
# max. recursion depth reached: just paint a straight line
|
||
|
|
edge = RBA::Edge.new_pp( RBA::Point::new_xy( 0, 0 ), RBA::Point::new_xy( 3000, 0 ) )
|
||
|
|
layout.cell( cell_id ).shapes( layer_id ).insert_edge( edge )
|
||
|
|
|
||
|
|
else
|
||
|
|
|
||
|
|
# create a new cell
|
||
|
|
new_cell = layout.add_cell( "level" + rec_level.to_s )
|
||
|
|
cell = layout.cell( cell_id )
|
||
|
|
|
||
|
|
# and add four instances of it
|
||
|
|
insts = [
|
||
|
|
RBA::CellInstArray::new_inst_cplx( new_cell, RBA::CplxTrans::new_mrmu( 1.0 / 3.0, 0.0, false, RBA::DPoint::new_xy( 0.0, 0.0 ) ) ),
|
||
|
|
RBA::CellInstArray::new_inst_cplx( new_cell, RBA::CplxTrans::new_mrmu( 1.0 / 3.0, 60.0, false, RBA::DPoint::new_xy( 1000.0, 0.0 ) ) ),
|
||
|
|
RBA::CellInstArray::new_inst_cplx( new_cell, RBA::CplxTrans::new_mrmu( 1.0 / 3.0, -60.0, false, RBA::DPoint::new_xy( 1500.0, 1000 * Math::sin( Math::PI / 3.0 ) ) ) ),
|
||
|
|
RBA::CellInstArray::new_inst_cplx( new_cell, RBA::CplxTrans::new_mrmu( 1.0 / 3.0, 0.0, false, RBA::DPoint::new_xy( 2000.0, 0.0 ) ) )
|
||
|
|
]
|
||
|
|
insts.each { |i| cell.insert( i ) }
|
||
|
|
|
||
|
|
# recursively create new cells on this one
|
||
|
|
create_recursion( layout, new_cell, layer_id, rec_level + 1 )
|
||
|
|
|
||
|
|
end
|
||
|
|
|
||
|
|
end
|
||
|
|
|
||
|
|
app = RBA::Application.instance
|
||
|
|
mw = app.main_window
|
||
|
|
|
||
|
|
# create a new layout
|
||
|
|
mw.create_layout( 0 )
|
||
|
|
view = mw.current_view
|
||
|
|
|
||
|
|
# create a new layer in that layout
|
||
|
|
layout = view.cellview( 0 ).layout
|
||
|
|
linfo = RBA::LayerInfo.new
|
||
|
|
layer_id = layout.insert_layer( linfo )
|
||
|
|
|
||
|
|
# create a layer view for that layer
|
||
|
|
ln = RBA::LayerPropertiesNode::new
|
||
|
|
ln.dither_pattern = 0
|
||
|
|
ln.fill_color = 0xffff00
|
||
|
|
ln.frame_color = 0xffff00
|
||
|
|
ln.width = 1
|
||
|
|
ln.source_layer_index = layer_id
|
||
|
|
view.insert_layer( view.end_layers, ln )
|
||
|
|
|
||
|
|
# create a top cell and start the recursion on this
|
||
|
|
topcell_id = layout.add_cell( "top" )
|
||
|
|
create_recursion( layout, topcell_id, layer_id, 1 )
|
||
|
|
|
||
|
|
# select his cell as the top cell, fit all and switch on all hierarchy levels
|
||
|
|
view.select_cell_path( [topcell_id], 0 )
|
||
|
|
view.update_content
|
||
|
|
view.zoom_fit
|
||
|
|
view.max_hier
|
||
|
|
|
||
|
|
# run the application
|
||
|
|
RBA::Application.instance.exec
|
||
|
|
|
||
|
|
|