def htron(nanowire_width = 0.15, nanowire_spacing = 0.1, meander_num_squares = 5000, heater_num_squares = 1): # Create blank device D = Device(name = 'htron') # Basic calculations extra_meander_width = 2 extra_meander_height = 1 area_per_meander_sq = (nanowire_width+nanowire_spacing)*nanowire_width meander_area = area_per_meander_sq*meander_num_squares meander_total_width = np.sqrt(meander_area/heater_num_squares) meander_total_height = heater_num_squares*meander_total_width meander_size = np.array([meander_total_width, meander_total_height]) heater_size = meander_size meander_size = meander_size + [extra_meander_width,extra_meander_height] # meander_size = heater_size + np.array([meander_extra_width,0]) meander_pitch = nanowire_width + nanowire_spacing # heater_standoff_y = 1 # Create components Meander = pg.snspd_expanded(wire_width = nanowire_width, wire_pitch = meander_pitch, size = meander_size, terminals_same_side = False, connector_width = nanowire_width*4, layer = lys['m2_nw']) # heater_size_actual = heater_size + np.array([0, heater_standoff_y]) Heater = pg.compass(size = heater_size, layer = lys['m3_res']) # Add references to components m = D.add_ref(Meander) h = D.add_ref(Heater) h.center = m.center # Record meta-information heater_area = heater_size[0]*heater_size[1] D.info['nanowire_width'] = nanowire_width D.info['nanowire_pitch'] = nanowire_width + nanowire_spacing D.info['meander_num_squares'] = np.round(m.info['num_squares'],2) D.info['meander_size'] = np.round((m.xsize, m.ysize),2).tolist() D.info['heater_size'] = np.round(heater_size,2).tolist() D.info['heater_area'] = np.round(heater_size[0]*heater_size[1],2) D.info['heater_num_squares'] = np.round(heater_num_squares,2) D.info['overlap_area'] = np.round(m.ysize*heater_size[0],1) D.info['overlap_num_squares'] = np.round(heater_area/area_per_meander_sq,1) D.add_port(name = 1, port = h.ports['N']) D.add_port(name = 2, port = h.ports['S']) D.add_port(name = 3, port = m.ports[1]) D.add_port(name = 4, port = m.ports[2]) return D
# Now we can remove two of the elements we don't want anymore D.remove(mytee2) D.remove(mypoly2) qp(D) #============================================================================== # Save / export to SVG #============================================================================== # For figure-quality publications sometimes you want to save your geometry # as a more convenient vector file format like SVG (for Inkscape, Illustrator, # etc). For that purpose you can use the write_svg() command from phidl.utilities import write_svg D = Device() D << pg.snspd_expanded(layer=1) D << pg.snspd_expanded(layer=2).rotate(45) write_svg(D, filename='MyGeometryFigure.svg') #============================================================================== # Advanced: Using the LRU Cache decorator #============================================================================== # Let's assume you have a Device-making function which takes a long time, # for instance because it requires extensive computations to calculate polygon # points. PHIDL has a LRU cache decorator you can use, similar to the # built-in Python functools.lru_cache. The cache can significantly speed up import time from phidl import device_lru_cache @device_lru_cache
# example-snspd import phidl.geometry as pg from phidl import quickplot as qp D = pg.snspd(wire_width = 0.2, wire_pitch = 0.6, size = (10,8), num_squares = None, turn_ratio = 4, terminals_same_side = False, layer = 0) qp(D) # quickplot the geometry create_image(D, 'snspd') # example-snspd_expanded import phidl.geometry as pg from phidl import quickplot as qp D = pg.snspd_expanded(wire_width = 0.3, wire_pitch = 0.6, size = (10,8), num_squares = None, connector_width = 1, connector_symmetric = False, turn_ratio = 4, terminals_same_side = False, layer = 0) qp(D) # quickplot the geometry create_image(D, 'snspd_expanded') # example-packer1 import phidl.geometry as pg from phidl import quickplot as qp import numpy as np np.random.seed(5) D_list = [pg.ellipse(radii = np.random.rand(2)*n+2) for n in range(50)] D_list += [pg.rectangle(size = np.random.rand(2)*n+2) for n in range(50)] D_packed_list = pg.packer(